Algoritma Berlekamp–Rabin: Perbedaan antara revisi
Perbaikan presentasi: gambar Commons dan heading matematika |
Perbaikan presentasi: sitasi, referensi, caption, dan atribusi |
||
| Baris 1: | Baris 1: | ||
[[File:Elwyn_R_Berlekamp_2005.jpg|thumb|right|280px|Elwyn | [[File:Elwyn_R_Berlekamp_2005.jpg|thumb|right|280px|Elwyn Berlekamp]] | ||
Dalam [[teori bilangan]], '''algoritma Berlekamp–Rabin''' adalah metode [[Algoritma teracak|probabilistik]] [[Algoritma pencarian akar|pencarian akar]] dari [[polinomial]] pada [[medan berhingga|medan]] <math>\mathbb Z_p</math>. Metode ini ditemukan oleh [[Elwyn Berlekamp]] pada tahun 1970 sebagai tambahan [[algoritma Berlekamp|algoritma]] untuk [[faktorisasi]] polinomial pada medan berhingga. Algoritma kemudian dimodifikasi oleh [[Michael O. Rabin|Rabin]] untuk medan berhingga sebarang pada tahun 1979. Sebelum Berlekamp, metode ini juga ditemukan secara terpisah oleh peneliti lain. | Dalam [[teori bilangan]], '''algoritma Berlekamp–Rabin''' adalah metode [[Algoritma teracak|probabilistik]] [[Algoritma pencarian akar|pencarian akar]] dari [[polinomial]] pada [[medan berhingga|medan]] <math>\mathbb Z_p</math>. Metode ini ditemukan oleh [[Elwyn Berlekamp]] pada tahun 1970<ref name=":0">E. R Berlekamp. [https://www.ams.org/mcom/1970-24-111/S0025-5718-1970-0276200-X/ Factoring polynomials over large finite fields]. ''Mathematics of Computation''. 1970. Vol. 24 (111). hlm. 713–735. doi:10.1090/S0025-5718-1970-0276200-X.</ref> sebagai tambahan [[algoritma Berlekamp|algoritma]] untuk [[faktorisasi]] polinomial pada medan berhingga. Algoritma kemudian dimodifikasi oleh [[Michael O. Rabin|Rabin]] untuk medan berhingga sebarang pada tahun 1979.<ref name=":1">M. Rabin. ''Probabilistic Algorithms in Finite Fields''. ''SIAM Journal on Computing''. 1980. Vol. 9 (2). hlm. 273–280. doi:10.1137/0209024.</ref> Sebelum Berlekamp, metode ini juga ditemukan secara terpisah oleh peneliti lain.<ref>Donald E Knuth. ''The art of computer programming. Vol. 2 Vol. 2''. 1998. ISBN 978-0201896848.</ref> | ||
== Sejarah == | == Sejarah == | ||
Metode ini diusulkan oleh [[Elwyn Berlekamp]] dalam karyanya tahun 1970 tentang faktorisasi polinomial pada medan berhingga. Karya aslinya tidak memiliki bukti [[Kebenaran (ilmu komputer)|kebenaran]] formal dan kemudian disempurnakan dan dimodifikasi untuk medan berhingga sebarang oleh [[Michael O. Rabin|Michael Rabin]]. Pada tahun 1986, René Peralta mengusulkan algoritma serupa untuk mencari akar kuadrat <math>\mathbb Z_p</math>. Perumuman metode Peralita untuk persamaan kubik dibuat pada tahun 2000. | Metode ini diusulkan oleh [[Elwyn Berlekamp]] dalam karyanya tahun 1970<ref name=":0" /> tentang faktorisasi polinomial pada medan berhingga. Karya aslinya tidak memiliki bukti [[Kebenaran (ilmu komputer)|kebenaran]] formal<ref name=":1" /> dan kemudian disempurnakan dan dimodifikasi untuk medan berhingga sebarang oleh [[Michael O. Rabin|Michael Rabin]].<ref name=":1" /> Pada tahun 1986, René Peralta mengusulkan algoritma serupa<ref>Tsz-Wo Sze. ''On taking square roots without quadratic nonresidues over finite fields''. ''Mathematics of Computation''. 2011. Vol. 80 (275). hlm. 1797–1811. doi:10.1090/s0025-5718-2011-02419-1.</ref> untuk mencari akar kuadrat <math>\mathbb Z_p</math>.<ref>R. Peralta. ''A simple and fast probabilistic algorithm for computing square roots modulo a prime number (Corresp.)''. ''IEEE Transactions on Information Theory''. November 1986. Vol. 32 (6). hlm. 846–847. doi:10.1109/TIT.1986.1057236.</ref> Perumuman metode Peralita untuk persamaan kubik dibuat pada tahun 2000.<ref>C Padró, G Sáez. ''Taking cube roots in Zm''. ''Applied Mathematics Letters''. August 2002. Vol. 15 (6). hlm. 703–708. doi:10.1016/s0893-9659(02)00031-9.</ref> | ||
== Pernyataan masalah== | == Pernyataan masalah== | ||
Misalkan <math>p</math> adalah [[bilangan prima]] ganjil, dan misalkan pula polinomial <math display="inline">f(x) = a_0 + a_1 x + \cdots + a_n x^n</math> atas medan <math>\mathbb Z_p</math> dari modulo sisa <math>p</math>. Tujuan pernyataan masalah ini adalah bahwa algoritma Berlekamp harus menemukan semua <math>\lambda</math> di <math>\mathbb Z_p</math> sehingga <math display="inline">f(\lambda)= 0</math> di <math>\mathbb Z_p</math>. | Misalkan <math>p</math> adalah [[bilangan prima]] ganjil, dan misalkan pula polinomial <math display="inline">f(x) = a_0 + a_1 x + \cdots + a_n x^n</math> atas medan <math>\mathbb Z_p</math> dari modulo sisa <math>p</math>. Tujuan pernyataan masalah ini adalah bahwa algoritma Berlekamp harus menemukan semua <math>\lambda</math> di <math>\mathbb Z_p</math> sehingga <math display="inline">f(\lambda)= 0</math> di <math>\mathbb Z_p</math>.<ref name=":1" /><ref name=":2">Alfred J. Menezes, Ian F. Blake, XuHong Gao, Ronald C. Mullin, Scott A. Vanstone. [https://www.springer.com/gp/book/9780792392828 Applications of Finite Fields]. Springer US. 1993. ISBN 9780792392828.</ref> | ||
== Algoritma == | == Algoritma == | ||
=== Pengacakan === | === Pengacakan === | ||
Misalkan <math display="inline">f(x) = (x-\lambda_1)(x-\lambda_2)\cdots(x-\lambda_n)</math>. Menemukan semua akar polinomial ini sama saja dengan mencari faktorisasinya menjadi faktor [[Lincoln Near-Earth Asteroid Research|linear]]. Untuk menemukan faktorisasi tersebut, cukup membagi polinomial menjadi dua pembagi non-trivial dan memfaktorkannya secara rekursif. Lebih lanjut, misalkan polinomial <math display="inline">f_z(x)=f(x-z) = (x-\lambda_1 - z)(x-\lambda_2 - z) \cdots (x-\lambda_n-z)</math>, untuk <math>z</math> setiap anggota <math>\mathbb Z_p</math>. Jika polinomial tersebut dinyatakan sebagai hasilkali <math>f_z(x)=p_0(x)p_1(x)</math>, maka dalam bentuk polinomial awal, mengartikan bahwa <math>f(x) =p_0(x+z)p_1(x+z)</math>. Fungsi yang merupakan menyediakan faktorisasi dibutuhkan dari <math>f(x)</math>. | Misalkan <math display="inline">f(x) = (x-\lambda_1)(x-\lambda_2)\cdots(x-\lambda_n)</math>. Menemukan semua akar polinomial ini sama saja dengan mencari faktorisasinya menjadi faktor [[Lincoln Near-Earth Asteroid Research|linear]]. Untuk menemukan faktorisasi tersebut, cukup membagi polinomial menjadi dua pembagi non-trivial dan memfaktorkannya secara rekursif. Lebih lanjut, misalkan polinomial <math display="inline">f_z(x)=f(x-z) = (x-\lambda_1 - z)(x-\lambda_2 - z) \cdots (x-\lambda_n-z)</math>, untuk <math>z</math> setiap anggota <math>\mathbb Z_p</math>. Jika polinomial tersebut dinyatakan sebagai hasilkali <math>f_z(x)=p_0(x)p_1(x)</math>, maka dalam bentuk polinomial awal, mengartikan bahwa <math>f(x) =p_0(x+z)p_1(x+z)</math>. Fungsi yang merupakan menyediakan faktorisasi dibutuhkan dari <math>f(x)</math>.<ref name=":0" /><ref name=":2" /> | ||
=== Klasifikasi elemen Zₚ === | === Klasifikasi elemen Zₚ === | ||
Menurut [[kriteria Euler]], untuk setiap [[monomial]] <math>(x-\lambda)</math>, berlaku tepat salah satu dari sifat-sifat berikut: | Menurut [[kriteria Euler]], untuk setiap [[monomial]] <math>(x-\lambda)</math>, berlaku tepat salah satu dari sifat-sifat berikut:<ref name=":0" /> | ||
# Monomial sama dengan <math>x</math> jika <math>\lambda = 0</math>, | # Monomial sama dengan <math>x</math> jika <math>\lambda = 0</math>, | ||
| Baris 20: | Baris 20: | ||
# Pembagian monomial <math display="inline">g_1(x)=(x^{(p-1)/2}+1)</math> jika <math>\lambda</math> adalah non-residul kuadrat modulo <math>p</math>. | # Pembagian monomial <math display="inline">g_1(x)=(x^{(p-1)/2}+1)</math> jika <math>\lambda</math> adalah non-residul kuadrat modulo <math>p</math>. | ||
Jadi, jika <math>f_z(x)</math> tidak habis dibagi <math>x</math>, yang dapat diperiksa secara terpisah, maka <math>f_z(x)</math> sama dengan hasilkali dari [[faktor persekutuan terbesar polinomial|faktor persekutuan terbesar]] <math>\operatorname{FPB}(f_z(x);g_0(x))</math> dan <math>\operatorname{FPB}(f_z(x);g_1(x))</math>. | Jadi, jika <math>f_z(x)</math> tidak habis dibagi <math>x</math>, yang dapat diperiksa secara terpisah, maka <math>f_z(x)</math> sama dengan hasilkali dari [[faktor persekutuan terbesar polinomial|faktor persekutuan terbesar]] <math>\operatorname{FPB}(f_z(x);g_0(x))</math> dan <math>\operatorname{FPB}(f_z(x);g_1(x))</math>.<ref name=":2" /> | ||
=== Metode Berlekamp === | === Metode Berlekamp === | ||
Sifat-sifat di atas mengarah pada algoritma berikut: | Sifat-sifat di atas mengarah pada algoritma berikut:<ref name=":0" /> | ||
# Hitung secara eksplisit koefisien <math>f_z(x) = f(x-z)</math>, | # Hitung secara eksplisit koefisien <math>f_z(x) = f(x-z)</math>, | ||
| Baris 40: | Baris 40: | ||
# FPB sama dengan <math>(x-t)</math>, yang berarti tepat salah satu dari bilangan tersebut merupakan residu kuadrat. | # FPB sama dengan <math>(x-t)</math>, yang berarti tepat salah satu dari bilangan tersebut merupakan residu kuadrat. | ||
Pada kasus ketiga, FPB sama dengan <math>(x-z-\beta)</math> atau <math>(x-z+\beta)</math>. Hal ini memungkinkan untuk menulis solusi sebagai <math display="inline">\beta = (t - z) \pmod{p}</math>. | Pada kasus ketiga, FPB sama dengan <math>(x-z-\beta)</math> atau <math>(x-z+\beta)</math>. Hal ini memungkinkan untuk menulis solusi sebagai <math display="inline">\beta = (t - z) \pmod{p}</math>.<ref name=":0" /> | ||
=== Contoh === | === Contoh === | ||
| Baris 51: | Baris 51: | ||
== Bukti kebenaran == | == Bukti kebenaran == | ||
Algoritma menemukan faktorisasi <math>f_z(x)</math> dalam semua kasus, kecuali ketika semua bilangan <math>z+\lambda_1, z+\lambda_2, \ldots, z+\lambda_n</math> adalah residu kuadrat atau non-residu secara bersamaan. Menurut [[teori siklotomi]], peluang kejadiannya untuk kasus ketika <math>\lambda_1, \ldots, \lambda_n</math> juga merupakan semua residu atau non-residu secara bersamaan (yaitu, ketika <math>z=0</math> tidak berhasil) diestimasi sebagai <math>2^{-k}</math>, untuk <math>k</math> adalah jumlah nilai yang berbeda dalam <math>\lambda_1, \ldots, \lambda_n</math>. Dengan cara ini, bahkan untuk kasus galat <math>k=1</math> dan <math>f(x)=(x-\lambda)^n</math>, maka estimasi peluang galatnya adalah <math>1/2</math>, dan untuk kasus [[akar kuadrat]] modular, probabilitas galat setidaknya bernilai <math>1/4</math>. | Algoritma menemukan faktorisasi <math>f_z(x)</math> dalam semua kasus, kecuali ketika semua bilangan <math>z+\lambda_1, z+\lambda_2, \ldots, z+\lambda_n</math> adalah residu kuadrat atau non-residu secara bersamaan. Menurut [[teori siklotomi]],<ref>Marshall Hall. [https://books.google.com/books?id=__JCiiCfu2EC&q=Combinatorial+Theory+hall&pg=PA1 Combinatorial Theory]. John Wiley & Sons. 1998. ISBN 9780471315186.</ref> peluang kejadiannya untuk kasus ketika <math>\lambda_1, \ldots, \lambda_n</math> juga merupakan semua residu atau non-residu secara bersamaan (yaitu, ketika <math>z=0</math> tidak berhasil) diestimasi sebagai <math>2^{-k}</math>, untuk <math>k</math> adalah jumlah nilai yang berbeda dalam <math>\lambda_1, \ldots, \lambda_n</math>.<ref name=":0" /> Dengan cara ini, bahkan untuk kasus galat <math>k=1</math> dan <math>f(x)=(x-\lambda)^n</math>, maka estimasi peluang galatnya adalah <math>1/2</math>, dan untuk kasus [[akar kuadrat]] modular, probabilitas galat setidaknya bernilai <math>1/4</math>. | ||
== Kompleksitas == | == Kompleksitas == | ||
| Baris 61: | Baris 61: | ||
# Mengambil <math>\operatorname{FPB}</math> dari dua polinomial melalui [[algoritma Euklides]] yang bekerja di <math>O(n^2)</math>. | # Mengambil <math>\operatorname{FPB}</math> dari dua polinomial melalui [[algoritma Euklides]] yang bekerja di <math>O(n^2)</math>. | ||
Jadi, seluruh prosedur dapat dilakukan di <math>O(n^2 \log p)</math>. Dengan menggunakan [[transformasi Fourier cepat]] dan algoritma setengah-FPB, maka kompleksitas algoritmanya dapat ditingkatkan menjadi <math>O(n \log n \log pn)</math>. Untuk kasus akar kuadrat modular, derajatnya adalah <math>n = 2</math>, sehingga seluruh kompleksitas algoritma dalam kasus tersebut dibatasi dengan <math>O(\log p)</math> per iterasi. | Jadi, seluruh prosedur dapat dilakukan di <math>O(n^2 \log p)</math>. Dengan menggunakan [[transformasi Fourier cepat]] dan algoritma setengah-FPB,<ref>Aho, Alfred V. [https://archive.org/details/designanalysisof00ahoarich The design and analysis of computer algorithms]. Addison-Wesley Pub. Co. 1974. ISBN 0201000296.</ref> maka kompleksitas algoritmanya dapat ditingkatkan menjadi <math>O(n \log n \log pn)</math>. Untuk kasus akar kuadrat modular, derajatnya adalah <math>n = 2</math>, sehingga seluruh kompleksitas algoritma dalam kasus tersebut dibatasi dengan <math>O(\log p)</math> per iterasi.<ref name=":2" /> | ||
== Referensi == | == Referensi == | ||
< | <references /> | ||
== Sumber dan atribusi == | == Sumber dan atribusi == | ||
[https://id.wikipedia.org/w/index.php?title= | Sebagian konten artikel ini diadaptasi dari [https://id.wikipedia.org/w/index.php?title=Algoritma_Berlekamp–Rabin&oldid=25986958 Wikipedia bahasa Indonesia], revisi 25986958 (2024-07-03T05:23:51Z), yang tersedia berdasarkan lisensi Creative Commons Atribusi-BerbagiSerupa (CC BY-SA). | ||
revisi 25986958 (2024-07-03T05:23:51Z) | |||
Gambar yang ditampilkan berasal dari Wikimedia Commons dan mengikuti ketentuan lisensi masing-masing berkas. Infobox, templat navigasi, kategori sumber, dan elemen teknis Wikipedia lainnya tidak diimpor ke Wiki Unissula. | |||
Atribusi-BerbagiSerupa (CC BY-SA) | |||
Revisi per 23 Agustus 2026 02.51

Dalam teori bilangan, algoritma Berlekamp–Rabin adalah metode probabilistik pencarian akar dari polinomial pada medan . Metode ini ditemukan oleh Elwyn Berlekamp pada tahun 1970[1] sebagai tambahan algoritma untuk faktorisasi polinomial pada medan berhingga. Algoritma kemudian dimodifikasi oleh Rabin untuk medan berhingga sebarang pada tahun 1979.[2] Sebelum Berlekamp, metode ini juga ditemukan secara terpisah oleh peneliti lain.[3]
Sejarah
Metode ini diusulkan oleh Elwyn Berlekamp dalam karyanya tahun 1970[1] tentang faktorisasi polinomial pada medan berhingga. Karya aslinya tidak memiliki bukti kebenaran formal[2] dan kemudian disempurnakan dan dimodifikasi untuk medan berhingga sebarang oleh Michael Rabin.[2] Pada tahun 1986, René Peralta mengusulkan algoritma serupa[4] untuk mencari akar kuadrat .[5] Perumuman metode Peralita untuk persamaan kubik dibuat pada tahun 2000.[6]
Pernyataan masalah
Misalkan adalah bilangan prima ganjil, dan misalkan pula polinomial atas medan dari modulo sisa . Tujuan pernyataan masalah ini adalah bahwa algoritma Berlekamp harus menemukan semua di sehingga di .[2][7]
Algoritma
Pengacakan
Misalkan . Menemukan semua akar polinomial ini sama saja dengan mencari faktorisasinya menjadi faktor linear. Untuk menemukan faktorisasi tersebut, cukup membagi polinomial menjadi dua pembagi non-trivial dan memfaktorkannya secara rekursif. Lebih lanjut, misalkan polinomial , untuk setiap anggota . Jika polinomial tersebut dinyatakan sebagai hasilkali , maka dalam bentuk polinomial awal, mengartikan bahwa . Fungsi yang merupakan menyediakan faktorisasi dibutuhkan dari .[1][7]
Klasifikasi elemen Zₚ
Menurut kriteria Euler, untuk setiap monomial , berlaku tepat salah satu dari sifat-sifat berikut:[1]
- Monomial sama dengan jika ,
- Pembagian monomial jika adalah residu kuadrat modulo ,
- Pembagian monomial jika adalah non-residul kuadrat modulo .
Jadi, jika tidak habis dibagi , yang dapat diperiksa secara terpisah, maka sama dengan hasilkali dari faktor persekutuan terbesar dan .[7]
Metode Berlekamp
Sifat-sifat di atas mengarah pada algoritma berikut:[1]
- Hitung secara eksplisit koefisien ,
- Hitung sisa modulo dengan mengkuadratkan polinomial dan mengambil sisa modulo ,
- Menggunakan eksponensiasi yang dikuadratkan dan polinomial yang dihitung pada langkah sebelumnya, hitung sisa modulo ,
- Jika , maka yang disebutkan diatas memberikan faktorisasi non-trivial dari ,
- Jika tidak, maka semua akar adalah residu atau non-residu secara bersamaan dan harus memilih yang lain.
Jika habis dibagi oleh setiap polinomial primitif atas maka saat menghitung dengan dan akan diperoleh faktorisasi non-trivial dari , sehingga algoritma memungkinkan untuk menemukan semua akar polinomial sebarang atas .
Akar kuadrat modular
Misalkan persamaan mempunyai anggota dan sebagai akarnya. Solusi persamaan ini ekuivalen dengan faktorisasi polinomial atas . Dalam masalah kasus istimewa ini, cukup hitung saja. Untuk polinomial tersebut, ada tepat satu dari sifat-sifat yang berlaku sebagai berikut:
- FPB sama dengan , yang berarti bahwa dan merupakan non-residu kuadratik,
- FPB sama dengan , yang berarti kedua bilangan tersebut merupakan residu kuadratik,
- FPB sama dengan , yang berarti tepat salah satu dari bilangan tersebut merupakan residu kuadrat.
Pada kasus ketiga, FPB sama dengan atau . Hal ini memungkinkan untuk menulis solusi sebagai .[1]
Contoh
Asumsi bahwa persamaan dapat diselesaikan. Caranya adalah dengan memfaktorkan . Nilai dapat dibagi menjadi beberapa kasus dengan memisalkannya sebagai berikut:
- Misalkan , maka . Jadi, . Karena bilangan merupakan non-residu kuadrat, maka perlu dicari nilai lain.
- Misalkan , maka . Jadi, . Karena , maka dan .
Hasil pemeriksaan yang dilakukan secara manual memperlihatkan bahwa dan .
Bukti kebenaran
Algoritma menemukan faktorisasi dalam semua kasus, kecuali ketika semua bilangan adalah residu kuadrat atau non-residu secara bersamaan. Menurut teori siklotomi,[8] peluang kejadiannya untuk kasus ketika juga merupakan semua residu atau non-residu secara bersamaan (yaitu, ketika tidak berhasil) diestimasi sebagai , untuk adalah jumlah nilai yang berbeda dalam .[1] Dengan cara ini, bahkan untuk kasus galat dan , maka estimasi peluang galatnya adalah , dan untuk kasus akar kuadrat modular, probabilitas galat setidaknya bernilai .
Kompleksitas
Misalkan suatu polinomial merupakan polinomial berderajat , maka kompleksitas algoritma dapat diturunkan sebagai berikut:
- Karena menurut teorema binomial mengatakan bahwa , maka dapat dilakukan transisi dari ke dalam waktu .
- Perkalian polinomial dan mengambil sisa dari satu polinomial yang modulo dengan yang lain dapat dilakukan di . Jadi, perhitungan dilakukan di .
- Eksponensial biner bekerja di .
- Mengambil dari dua polinomial melalui algoritma Euklides yang bekerja di .
Jadi, seluruh prosedur dapat dilakukan di . Dengan menggunakan transformasi Fourier cepat dan algoritma setengah-FPB,[9] maka kompleksitas algoritmanya dapat ditingkatkan menjadi . Untuk kasus akar kuadrat modular, derajatnya adalah , sehingga seluruh kompleksitas algoritma dalam kasus tersebut dibatasi dengan per iterasi.[7]
Referensi
- ↑ 1,0 1,1 1,2 1,3 1,4 1,5 1,6 E. R Berlekamp. Factoring polynomials over large finite fields. Mathematics of Computation. 1970. Vol. 24 (111). hlm. 713–735. doi:10.1090/S0025-5718-1970-0276200-X.
- ↑ 2,0 2,1 2,2 2,3 M. Rabin. Probabilistic Algorithms in Finite Fields. SIAM Journal on Computing. 1980. Vol. 9 (2). hlm. 273–280. doi:10.1137/0209024.
- ↑ Donald E Knuth. The art of computer programming. Vol. 2 Vol. 2. 1998. ISBN 978-0201896848.
- ↑ Tsz-Wo Sze. On taking square roots without quadratic nonresidues over finite fields. Mathematics of Computation. 2011. Vol. 80 (275). hlm. 1797–1811. doi:10.1090/s0025-5718-2011-02419-1.
- ↑ R. Peralta. A simple and fast probabilistic algorithm for computing square roots modulo a prime number (Corresp.). IEEE Transactions on Information Theory. November 1986. Vol. 32 (6). hlm. 846–847. doi:10.1109/TIT.1986.1057236.
- ↑ C Padró, G Sáez. Taking cube roots in Zm. Applied Mathematics Letters. August 2002. Vol. 15 (6). hlm. 703–708. doi:10.1016/s0893-9659(02)00031-9.
- ↑ 7,0 7,1 7,2 7,3 Alfred J. Menezes, Ian F. Blake, XuHong Gao, Ronald C. Mullin, Scott A. Vanstone. Applications of Finite Fields. Springer US. 1993. ISBN 9780792392828.
- ↑ Marshall Hall. Combinatorial Theory. John Wiley & Sons. 1998. ISBN 9780471315186.
- ↑ Aho, Alfred V. The design and analysis of computer algorithms. Addison-Wesley Pub. Co. 1974. ISBN 0201000296.
Sumber dan atribusi
Sebagian konten artikel ini diadaptasi dari Wikipedia bahasa Indonesia, revisi 25986958 (2024-07-03T05:23:51Z), yang tersedia berdasarkan lisensi Creative Commons Atribusi-BerbagiSerupa (CC BY-SA).
Gambar yang ditampilkan berasal dari Wikimedia Commons dan mengikuti ketentuan lisensi masing-masing berkas. Infobox, templat navigasi, kategori sumber, dan elemen teknis Wikipedia lainnya tidak diimpor ke Wiki Unissula.