Algoritma Euklides: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Djoko (bicara | kontrib)
Tidak ada ringkasan suntingan
 
Nyilvoskt (bicara | kontrib)
k Nyilvoskt memindahkan halaman Algoritme Euklides ke Algoritma Euklides
Tag: Suntingan perangkat seluler Suntingan peramban seluler Suntingan seluler lanjutan
 
(53 revisi perantara oleh 36 pengguna tidak ditampilkan)
Baris 1:
'''AlgoritmaDalam Euklidean''' (juga disebut[[matematika]], '''Algoritmaalgoritme EuklidEuklides''') adalah suatu [[algoritmaalgoritme]] untuk menentukan [[faktor persekutuan terbesar]] (FPB) dari dua [[bilangan bulat]]. AlgoritmaAlgoritme ini adalahdinamai salahsetelah satu[[matematikawan]] algoritma[[Yunani]] yang[[Euklides]] tertua, dan munculmenuliskannya dalam bukuBuku [[ElemenVII Euklid]]dan sekitarBuku X ''[[300Elemen SMEuklides]]''.
Algoritma ini tidak memerlukan [[faktorisasi]].
 
Algoritme Euklides muncul dalam buku ''Elemen'' Euklides sekitar tahun [[300 SM]], menjadikannya salah satu algoritme numerik yang tertua dan masih digunakan secara luas.
==Algoritma dan implementasi==
 
Algoritme Euklides tidak memerlukan [[faktorisasi]].
Diberikan dua bilangan asli ''a'' dan ''b'', periksa apakah ''b'' adalah nol.
 
Jika ya, ''a'' adalah FPB. Jika tidak, ulangi proses tadi menggunakan ''b'' dan
== Deskripsi algoritme ==
sisa setelah ''a'' dibagi oleh ''b'' (ditulis sebagai a ''modulus'' b).
# Diberikan dua bilangan asli <math>a</math> dan <math>b</math>, periksa apakah <math>b</math> adalah nol.
Algoritma ini dapat dinyatakan dengan menggunakan [[rekursi kanan]]:
# Jika ya, <math>a</math> adalah FPB. Jika tidak, ulangi langkah pertama dengan menggunakan <math>b</math> sebagai <math>a</math> yang baru dan sisa setelah <math>a</math> dibagi oleh <math>b</math> sebagai <math>b</math> yang aru.
 
== Contoh ==
Sebagai contoh, FPB dari 1071 dan 1029 yang dihitung dengan menggunakan algoritme ini adalah 21, dengan langkah-langkah sebagai berikut:
 
{|
| align="right" | ''a''
| align="right" | ''b''
| align="right" | sisa setelah ''a'' dibagi oleh ''b''
|-
| colspan="3" |
----
|-
| align="right" | 1071
| align="right" | 1029
| align="right" | 42
|-
| align="right" | 1029
| align="right" | 42
| align="right" | 21
|-
| align="right" | 42
| align="right" | 21
| align="right" | 0
|-
| align="right" | 21
| align="right" | 0
|}
 
Dengan mencatat hasil bagi (yang merupakan bilangan bulat) selama menjalankan algoritme, kita juga dapat menentukan bilangan bulat ''p'' dan ''q'' di mana ''ap''&nbsp;+&nbsp;''bq''&nbsp;=&nbsp;fpb(''a'',&nbsp;''b''). Hal ini dikenal sebagai [[perluasan algoritme Euklides]].
 
== Bukti kebenaran ==
Misalkan <math>a</math> dan <math>b</math> adalah bilangan yang FPB-nya akan ditentukan. Dan misalkan sisa dari pembagian dari ''<math>a</math>'' oleh <math>b</math> adalah <math>t</math>. Maka <math>a = qb + t</math> di mana <math>q</math> adalah hasil bagi (yang merupakan bilangan bulat) dari pembagian tersebut. Sekarang, setiap pembagi dari <math>a</math> dan <math>b</math> juga dapat habis membagi <math>t</math> (karena <math>t</math> dapat ditulis sebagai <math>t = a - qb</math>). Dengan cara yang sama, setiap pembagi dari <math>b</math> dan <math>t</math> juga akan habis membagi <math>a</math>. Maka faktor persekutuan terbesar dari <math>a</math> dan <math>b</math> adalah sama dengan FPB dari <math>b</math> dan <math>t</math>. Oleh karena itu, kita cukup meneruskan proses tadi dengan <math>b</math> dan <math>t</math> saja. Karena <math>t</math> lebih kecil dalam nilai mutlak dari <math>b</math>, kita akan mencapai<math>t = 0</math> setelah sejumlah langkah.
 
== Implementasi ==
Algoritme ini dapat dinyatakan dengan menggunakan [[rekursi kanan]]:
 
{{wikicode}}
'''function''' fpb(a, b)
'''if''' b = 0
Baris 19 ⟶ 53:
 
'''function''' fpb(a, b)
'''while''' b &ne; 0
'''var''' t := b
b := a modulus b
a := t
'''return''' a
 
Euklides pada mulanya merumuskan masalah ini secara geometri, sebagai masalah untuk mencari "satuan" yang dapat dipakai untuk panjang dari dua buah garis, dan algoritmanya berlangsung dengan mengulangi pengurangan dari sisi yang lebih pendek dari sisi yang lebih panjang. Implementasi ini sama dengan implementasi berikut ini, yang cukup tidak efisien dibandingkan dengan cara yang telah dijelaskan di atas:
Sebagai contoh, FPB dari 1071 dan 1029 yang dihitung dengan menggunakan algoritma ini adalah 21, dengan langkah-langkah sebagai berikut:
 
<table>
<tr><td align=right>''a''</td><td align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''b''</td><td align=right>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''t''</td></tr>
<tr><td colspan=3><hr></td></tr>
<tr><td align=right>1071</td><td align=right>1029</td><td align=right>42</td></tr>
<tr><td align=right>1029</td><td align=right>42</td><td align=right>21</td></tr>
<tr><td align=right>42</td><td align=right>21</td><td align=right>0</td></tr>
<tr><td align=right>21</td><td align=right>0</td></tr>
</table>
 
Dengan mencatat hasil bagi (yang merupakan bilangan bulat) selama menjalankan algoritma,
kita juga dapat menentukan bilangan bulat ''p'' dan ''q'' di mana ''ap''&nbsp;+&nbsp;''bq''&nbsp;=&nbsp;fpb(''a'',&nbsp;''b''). Hal ini dikenal sebagai [[Ekstensi Algoritma Euklidean]].
 
Algoritma ini dapat digunakan dalam konteks di mana pembagian bersisa memungkinkan. Ini termasuk [[polinomial cincin]] dalam suatu [[medan]], juga cincin dari [[bilangan bulat Gaussian]], dan dalam [[domain Euklidean]] umum.
 
Euklid pada mulanya merumuskan masalah ini secara geometri, sebagai masalah untuk mencari "satuan" yang dapat dipakai untuk panjang dari dua buah garis, dan algoritmanya berlangsung dengan mengulangi pengurangan dari sisi yang lebih pendek dari sisi yang lebih panjang. Implementasi ini sama dengan implementasi berikut ini, yang cukup tidak efisien dibandingkan dengan cara yang telah dijelaskan di atas:
 
'''function''' fpb(a, b)
'''while''' a &ne; b
'''if''' a > b
a := a - b
'''else'''
b := b - a
'''return''' a
 
==Efisiensi algoritme==
== Bukti kebenaran ==
[[Berkas:Euclidean Algorithm Running Time.svg|thumb|alt="Himpunan garis berwarna yang memancar dari titik nol sistem koordinat ''x''-''y''. Setiap garis melambangkan sebuah himpunan pasangan bilangan yang memerlukan banyak langkah yang sama dalam algoritme Euklidean."|Grafik banyak langkah yang diperlukan algoritme Euklidean untuk mencari fpb(''x'',''y''). Titik-titik yang warnanya cerah (merah dan kuning) menandakan langkah yang dibutuhkan relatif sedikit, sedangkan warna yang gelap (violet dan biru) menunjukkan perlu banyak langkah. Daerah yang paling gelap ada di garis ''y'' = ''Φx'', di mana ''Φ'' adalah [[rasio emas]].]]
 
Efisiensi komputasional algoritme Euklides telah dipelajari secara menyeluruh.<ref>{{harvnb|Knuth|1997|pp=339–364}}</ref> Efisiensi ini bisa diartikan sebagai banyak langkah pembagian yang perlu dilakukan algoritme, dikali dengan harga komputasi setiap pembagian. Analisis tertua yang diketahui tentang algoritme Euklides berasal dari A. A. L. Reynaud pada tahun 1811,<ref>{{cite book | last = Reynaud |first=A.-A.-L. | year = 1811 | title = Traité d'arithmétique à l'usage des élèves qui se destinent à l'École Polytechnique | url = https://archive.org/details/bub_gb_YySjvK7oudIC | edition = 6th | publisher = Courcier | location = Paris | at = Note 60, p.&nbsp;34 }} Dikutip oleh {{harvtxt|Shallit|1994}}.</ref> yang menunjukkan bahwa banyak langkah pembagian yang dilakukan dengan masukan <math>(u,v)</math> tidak mungkin lebih dari <math>v</math>; dia kemudian memperbaiki batas ini menjadi <math>\frac{v}{2} + 2</math>. Kemudian, pada tahun 1841, [[Pierre Joseph Étienne Finck|P. J. E. Finck]] menunjukkan<ref>{{cite book | last = Finck | first = P.-J.-E. | title = Traité élémentaire d'arithmétique à l'usage des candidats aux écoles spéciales |language=fr | publisher = Derivaux | year = 1841}}</ref> bahwa banyak langkah pembagian tidak mungkin lebih tinggi dari <math>2 \log_2 v + 1</math>, dan artinya algoritme Euklides berjalan dalam waktu polinomial dari ukuran masukannya.<ref name="Shallit">{{cite journal | author-link = Jeffrey Shallit|last=Shallit|first=J. | year = 1994 | title = Origins of the analysis of the Euclidean algorithm | journal = Historia Math. | volume = 21 | pages = 401–419 | doi=10.1006/hmat.1994.1031}}</ref> [[Émile Léger]], pada tahun 1837, mempelajari kasus terburuknya, yaitu ketika masukannya adalah [[bilangan Fibonacci]] yang bersebelahan.<ref name="Shallit" /> Analisis Finck kemudian diperbaiki oleh [[Gabriel Lamé]] pada tahun 1844,<ref>{{cite journal | author-link = Gabriel Lamé|last=Lamé|first=G. | year = 1844 | title = Note sur la limite du nombre des divisions dans la recherche du plus grand commun diviseur entre deux nombres entiers |language=fr | journal = Comptes Rendus Acad. Sci. | volume = 19 | pages = 867–870}}</ref> yang menunjukkan bahwa banyak langkah yang diperlukan untuk menyelesaikan algoritme tidak pernah lebih dari lima kali banyak digit bilangan yang lebih kecil&nbsp;<math>b</math>.<ref>{{cite journal | last = Grossman | first = H. | year = 1924 | title = On the Number of Divisions in Finding a G.C.D | journal = The American Mathematical Monthly | volume = 31 | page = 443 | doi = 10.2307/2298146 | jstor = 2298146 | issue = 9}}</ref><ref>{{cite book | last = Honsberger | first = R. | author-link = Ross Honsberger | year = 1976 | title = Mathematical Gems II | publisher = The [[Mathematical Association of America]] | isbn = 0-88385-302-7 | pages = 54–57}}</ref>
Tidaklah sulit untuk membuktikan bahwa algoritma itu benar. Misalkan ''a'' dan ''b'' adalah bilangan yang FPB-nya akan ditentukan. Dan misalkan sisa dari pembagian dari ''a'' oleh ''b'' adalah ''t''.
Maka ''a''&nbsp;=&nbsp;''qb''&nbsp;+&nbsp;''t'' di mana ''q'' adalah hasil bagi (yang merupakan bilangan bulat) dari pembagian tersebut. Sekarang, setiap pembagi dari ''a'' dan ''b'' juga dapat habis membagi ''t'' (karena ''t'' dapat ditulis sebagai ''t''&nbsp;=&nbsp;''a''&nbsp;&minus;&nbsp;''qb''); Dengan cara yang sama, setiap pembagi dari ''b'' dan ''t'' juga akan habis membagi ''a''. Maka faktor persekutuan terbesar dari ''a'' dan ''b'' adalah sama dengan FPB dari ''b'' dan ''t''. Oleh karena itu, kita cukup meneruskan proses tadi dengan ''b'' dan ''t'' saja. Karena ''t'' lebih kecil dalam nilai mutlak dari ''b'', kita akan mencapai ''t''&nbsp;=&nbsp;0 setelah sejumlah langkah.
 
==Pranala LuarPenggunaan ==
Algoritme ini dapat digunakan dalam konteks di mana pembagian bersisa memungkinkan. Ini termasuk [[polinomial gelanggang]] dalam suatu [[medan (matematika)|medan]], juga gelanggang dari [[bilangan bulat Gauss]], dan dalam [[ranah Euklides]] umum.
* [http://www.cut-the-knot.org/blue/Euclid.shtml Euclid's Algorithm]: Algorithm, generalization, game and related topics
 
* [http://www.cut-the-knot.org/blue/Binary.shtml Binary Euclid's Algorithm (Java)]
== Referensi ==
{{Reflist|30em}}
 
== Bibliografi ==
* {{cite book |author-link=Donald Knuth|last=Knuth|first= D. E.|year=1997|title=[[The Art of Computer Programming]], Volume 2: Seminumerical Algorithms|edition=3rd|publisher=Addison–Wesley| isbn=0-201-89684-2}}
 
== Pranala luar ==
{{Commons category|Euclidean algorithm|Algortime Euklidean}}
* {{MathWorld | urlname=EuclideanAlgorithm | title=Algoritme Euklidean}}
* {{EN}} [http://www.cut-the-knot.org/blue/Euclid.shtml Algoritme Euklides] di cut-the-knot
* {{PlanetMath | urlname=EuclidsAlgorithm | title=Algoritme Euklid}}
* [http://www.cut-the-knot.org/blue/binary.shtml Binary Euclid's Algorithm (Java)]
* [http://www.cut-the-knot.org/blue/EuclidAlg.shtml Euclid's Game (Java)]
 
{{Authority control}}
[[de:Euklidischer Algorithmus]]
 
[[en:Euclidean algorithm]]
[[Kategori:Matematika]]
[[es:Algoritmo de Euclides]]
[[Kategori:Euklides]]
[[fr:Algorithme d'Euclide]]
[[nl:Algoritme van Euclides]]
[[ja:&#12518;&#12540;&#12463;&#12522;&#12483;&#12489;&#12398;&#20114;&#38500;&#27861;]]
[[pl:Algorytm Euklidesa]]
[[pt:Algoritmo de Euclides]]
[[ru:&#1040;&#1083;&#1075;&#1086;&#1088;&#1080;&#1090;&#1084; &#1045;&#1074;&#1082;&#1083;&#1080;&#1076;&#1072;]]