我恨数论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。