我恨數論spa
由於打這篇的時候覺得a|b是a是b的倍數,可是懶得改了,索性定義 a|b 爲 a是b的倍數遞歸
咳咳,那麼進入正題,如何證實gcd,也就是 gcd(a,b) = gcd(b,a%b)?io
首先,設gc
p = a/b,c = a mod bco
則a = p*b + cgcd
m = gcd(a,b),n = gcd(b,c)
由於m = gcd(a,b),因此 a | m 且 b | m
由於 b | m
因此 b * p | m // a|b,則a*k|b (k爲整數)
由於a | m
因此a - b * p | m // a|b,則k*b - a | b (k爲整數)
由於 a = p*b + c
因此 c = a - p*b
因此 c | m
由於c | m,且b | m
因此m爲 c,b的公約數
由於n爲 c,b的最大公約數
因此m <= n
由於n = gcd(b,c)
因此 b | n , c | n
由於 b | n
因此 b * p | n
由於 c | n
因此 b * p + c | n
由於 a = b * p + c
因此a | n
由於a | n,且 b | n
則n爲a,b的公約數
由於m爲a,b的最大公約數
因此 n <= m
由於m <= n
因此m = n
因此gcd(a,b) = gcd(b,c)
因此gcd(a,b) = gcd(b,a%b)
總體思路是:
先設出一個關係,而後經過關係證實它們的另外一個關係
從gcd(a,b)轉換獲得b,c是公約數關係,
從gcd(b,c)轉換獲得a,b是公約數關係,
分別獲得它們的大小關係,最後求公共解集,獲得兩個gcd相等
而後把c帶上去,獲得咱們要證的式子
證完了gcd,下面能夠證exgcd
exgcd 能夠求
ax + by = gcd(a,b) 中的x,y
那麼,咱們設
ax1 + by1 = gcd(a,b)
由gcd得出
ax1 + by1 = gcd(b,a mod b)
設bx2 + a mod b y2 = gcd(b,a mod b)
下面用x2開始化簡:
gcd(b, a mod b) = b * x2 + a mod b *y2
gcd(b, a mod b) = b * x2 + (a - floor(a/b) * b) * y2
gcd(b, a mod b) = b * x2 + a * y2 - floor(a/b) * b * y2
gcd(b, a mod b) = a * y2 + b * x2 - floor(a/b) * b * y2
gcd(b, a mod b) = a * y2 + b * (x2 - floor(a/b) * y2)
因此
ax1 + by1 = gcd(b, a mod b) = bx2 + a mod b y2 = a * y2 + b * (x2 - floor(a/b) * y2)
因此第一個式子與最後一個式子等量代換獲得
x1 = y2
y1 = x2 - floor(a/b) * y2
而後能夠經過以上等價式子寫出遞歸,獲得x一、y1。