拡張ユークリッド互除法について
ax + by = c
が整数a
, b
, c
を求める必要がある場合、必ずa
とb
の最大公約数g
の倍数にc
はなる
つまり、少なくとも1つの値x
, y
で以下が成立する
pythonでの実装例
再帰を使う
def egcd(a, b):
# Base Case
if a == 0 :
return b, 0, 1
gcd, x1, y1 = egcd(b%a, a)
x = y1 - (b//a) * x1
y = x1
return gcd, x, y
- 戻り値
x
,y
,gcd
が方程式の一つの解になる - MODINTを用いるときは合わなくなるので注意する
再帰を使わない
def egcd(a,b):
x, y, u, v = 1, 0, 0, 1
while b:
k = a // b
x -= k * u
y -= k * v
x, u = u, x
y, v = v, y
a, b = b, a % b
return x, y