【数论】如何证实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。

相关文章
相关标签/搜索