擴展歐幾里得算法
已知整數a、b,擴展歐幾里得算法可以在求得a、b的最大公約數的同時,能找到整數x、y,使它們滿足貝祖等式:ax+by=gcd(a,b)
為什么一定存在貝祖等式呢,裴蜀定理如下:
設存在x,y使ax+by=d,d是ax+by取值中的最小正整數,d≠1。再設am+bn=e,則e≥d .若d不整除e,對e做帶余除法.必定存在p,r使e=pd+r.r<d則r=e-pd=(m-px)a+(n-py)b.存在整數m-px,n-py使ax+by=r<d,與d的最小性矛盾。所以d整除e.令m=1,n=0,則d整除a;同理d整除b.所以d=gcd(a,b)
下面給出擴展歐幾里得算法的證明
ax + by = gcd(a, b)
a'x' + b'y' = gcd(a', b') (其中a'= b, b' = a % b,)
我們要得到x,y與x',y'的關系
將a'= b, b' = a % b帶入第一個等式
得:bx' + (a%b)y' = gcd(a', b')
因為a%b = a - b[a/b] ([a/b],取a除以b的整數)所以ay' + b(x' - [a/b]y') = gcd(a', b') = gcd(a,b)(由輾轉相除得)
所以,x,y,x',y'的關系是:
x=y'
y=x' - [a/b] * y'
這樣就可以用遞推公式,不斷向下得到x',y'。
下面給出對應的python代碼
#擴展歐幾里得算法求線性方程的x與y
def exten_(a, b):
if b == 0:
return 1, 0
else:
k = a // b
remainder = a % b
x1, y1 = get_(b, remainder)
x, y = y1, x1 - k * y1
return x, y
擴展歐幾里得算法求乘法逆元
aa'=1(mod b) -> aa'=km+1 -> aa'-kb=1
令x=a' y=-k 即得ax+by=1,即可利用擴展歐幾里得算法求得a'