【數論】如何證實gcd/exgcd

我恨數論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。

相關文章
相關標籤/搜索