GCD
GCD
import math
print(math.gcd(48, 18)) # 6
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
Extended GCD
Extended GCD 會回傳 g, x, y,使得:
手算流程
用輾轉相除法得到 gcd 後,再一步一步回推即可得到係數
e.g. a = 48, b = 18
2 |48|18| 1
|36|12|
-------
2 |12| 6|
|12| |
-------
| 0| |
得到 gcd=6
由 a = 48, b = 18 得到 x = -1, y = 3
驗算:
\[a*x + b*y = 48 * (-1) + 36 * 3 = 6 = \gcd(a, b)\]Python
def extended_gcd(a, b):
# 回傳 (g, x, y),使得 a*x + b*y = g = gcd(a, b)
if b == 0:
return a, 1, 0
g, x1, y1 = extended_gcd(b, a % b)
x = y1
y = x1 - (a // b) * y1
return g, x, y
g, x, y = extended_gcd(48, 18)
print(g, x, y) # gcd 與係數 (x, y)
print(48 * x + 18 * y) # 會等於 g