Greatest Common Divisor
Kamu mendapatkan dua bilangan bulat positif a dan b. Kembalikan faktor persekutuan terbesar keduanya: bilangan bulat terbesar yang membagi keduanya tanpa sisa.
Contohnya, bilangan yang membagi 8 dan 12 adalah 1, 2, dan 4, jadi jawabannya adalah 4.
Fungsi
- ainteger
- bilangan bulat positif pertama
- binteger
- bilangan bulat positif kedua
- Mengembalikaninteger
- bilangan bulat terbesar yang membagi a dan b
Batasan
1 ≤ a ≤ 1091 ≤ b ≤ 109
Contoh
- Input
- a = 12b = 18
- Output
- 6
- Penjelasan
- Faktor dari
12adalah 1, 2, 3, 4, 6 dan 12; faktor dari18adalah 1, 2, 3, 6, 9 dan 18. Faktor terbesar yang ada di kedua daftar adalah6.
- Input
- a = 17b = 5
- Output
- 1
- Penjelasan
17dan5sama-sama bilangan prima dan berbeda, jadi satu-satunya pembagi yang mereka miliki bersama adalah1.
- Input
- a = 42b = 42
- Output
- 42
- Penjelasan
- Suatu bilangan membagi dirinya sendiri, dan tidak ada bilangan yang lebih besar dari
42yang dapat membagi42, jadi faktor persekutuan terbesar dari42dan42adalah42.
Pertanyaan lanjutan
Bisakah kamu memperluas algoritma Euclid agar juga mengembalikan bilangan bulat x dan y sehingga a × x + b × y = gcd(a, b)?
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Faktor persekutuan
adanbtidak mungkin lebih besar daripada bilangan yang lebih kecil di antara keduanya. Berapa banyak kandidat yang harus kamu coba untuk dua bilangan yang mendekati10^9?Bilangan apa pun yang membagi
adanbjuga membagia % b. Jadi,gcd(a, b)sama dengangcd(b, a % b), dan pasangan kedua lebih kecil.Terus ganti pasangan
(a, b)dengan(b, a % b). Saat angka kedua mencapai0, angka pertama adalah jawabannya.
Solusi
Mencoba kandidat satu per satu bisa digunakan untuk angka kecil, tetapi dua angka yang mendekati 10^9 dan tidak memiliki faktor yang sama membutuhkan satu miliar percobaan. Aturan Euclid gcd(a, b) = gcd(b, a % b) mengurangi pasangan angka dengan begitu cepat sehingga tidak ada pasangan hingga 10^9 yang membutuhkan lebih dari 43 langkah.
Hitung mundur dari angka yang lebih kecil
Benar, tetapi tidak selesai pada tes terbesar
Intuisi
Tidak ada pembagi bersama yang lebih besar daripada bilangan yang lebih kecil. Mulai d dari min(a, b), lalu turunkan nilainya satu per satu sampai membagi keduanya. Karena kamu mulai dari angka terbesar, pembagi pertama yang ditemukan adalah yang terbesar, dan perulangan selalu berhenti paling lambat di 1. Untuk 12 dan 18, kamu mencoba dari 12 sampai 7, lalu berhenti di 6.
Biayanya satu percobaan untuk setiap kandidat. Untuk bilangan prima 999999937 dan 999999929, jawabannya adalah 1, jadi perulangan berjalan hampir 10^9 kali.
Algoritma
- Tetapkan
dke nilai yang lebih kecil antaraadanb. - Selama
a % dataub % dtidak sama dengan0, kurangidsebanyak 1. - Kembalikan
d.
def gcd(a, b):
d = min(a, b)
while a % d != 0 or b % d != 0:
d -= 1
return dAlgoritma Euclid
Intuisi
Tulis a = q × b + r dengan r = a % b. Bilangan yang membagi a dan b juga membagi r = a - q × b, dan bilangan yang membagi b dan r juga membagi a = q × b + r. Jadi, (a, b) dan (b, r) memiliki pembagi bersama yang sama, termasuk yang terbesar.
Ulangi hingga b bernilai 0. Setiap bilangan membagi 0, jadi gcd(a, 0) = a. Untuk 12 dan 18, pasangan bilangannya menjadi (12, 18), (18, 12), (12, 6), (6, 0), dan jawabannya adalah 6. Jika a lebih kecil, langkah pertama menukar posisi pasangan, jadi kamu tidak perlu mengurutkannya.
Setiap dua langkah setidaknya membagi dua bilangan yang lebih besar, jadi perulangan berjalan sebanyak O(log(min(a, b))) kali.
Algoritma
- Selama
bbukan0, hitungr = a % b. - Tetapkan
a = bdanb = r. - Saat
bmencapai0, kembalikana.
def gcd(a, b):
# gcd(a, b) == gcd(b, a % b), and gcd(a, 0) == a.
while b != 0:
a, b = b, a % b
return a
Jebakan dan kasus tepi
- Memperbarui dengan urutan yang salah.
a = bdiikutib = a % bmenghitungb % b, yang selalu bernilai0. Simpan sisa pembagian terlebih dahulu, atau tetapkan keduanya sekaligus. - Mengembalikan
bsaat perulangan berakhir. Pada saat itu,bbernilai0. - Menghentikan hitung mundur pada
2. Pasangan yang relatif prima seperti17dan5kemudian tidak menemukan jawaban. - Menggunakan pengurangan berulang alih-alih sisa pembagian.
gcd(10^9, 1)kemudian memerlukan satu miliar pengurangan, sedangkan satu%menyelesaikan semuanya.
Pertanyaan yang sering diajukan3
Berapa kompleksitas waktu algoritma Euclid?
O(log(min(a, b))) langkah dan penggunaan ruang O(1). Input paling lambat adalah bilangan Fibonacci berurutan: 701408733 dan 433494437 memerlukan 42 langkah, atau 43 jika bilangan yang lebih kecil diletakkan lebih dulu, jumlah terbanyak untuk pasangan apa pun hingga 10^9.
Apa perbedaan antara FPB dan KPK?
Faktor persekutuan terbesar adalah bilangan terbesar yang membagi kedua input; kelipatan persekutuan terkecil adalah bilangan terkecil yang habis dibagi oleh kedua input. Keduanya memiliki hubungan gcd(a, b) × lcm(a, b) = a × b, jadi lcm adalah a / gcd(a, b) × b.
Berapa gcd dari dua bilangan yang relatif prima?
Yaitu 1: dua bilangan saling prima tepat ketika keduanya tidak memiliki faktor prima yang sama. Dua bilangan prima yang berbeda selalu saling prima, begitu juga dua bilangan bulat berurutan seperti 8 dan 9.
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def gcd(a, b):
# Tulis kodemu di siniTes #1
Tes #2
Tes #3
Argumen
a = 12 b = 18
Output yang diharapkan
6