gcd推导
欧几里得算法有性质: gcd(a, b)=gcd(b, a%b);
那么如何证明呢~
法1:
我们先假设其成立并且有
gcd(a, b)=gcd(b, a%b)=d;
a=k*b+c即a%b=c(我们假设a>=b, 因为a<b的话那么gcd(b, a%b)就相当于交换一下a, b的位置啦);
那么有d|a=d|k*b+d|c (d|a表示a整除d),即在d是(a, b)的公约数的前提下我们可以得到d也是(b, c)的公约数.
假设(a, b)的公约数集合为A, (b, c)的公约数集合为B, 那么有B为A的子集, 如果我们能再证得A为B的子集的话,那么就有A=B,所以A, B中的最大元素也相等,即gcd(a, b)=gcd(b, c);
对于后者的证明我们不防再假设d'|(b, c), 即d'|b , d'|c, 又 a=k*b+c, 所以有 d'|a=d'|k*b+d'|c, 即在d'是(b, c)公约数的前提下我们可以得到d'也是(a, b)的公约数.
综上所述 A=B, 所以gcd(a, b)=gcd(b, c)=gcd(b, a%b). (其实通过这里我们可以看出gcd()里面参数的顺序也是不影响答案的);
法2:
我们先假设
gcd(a, b)=gcd(b, a%b)=d;
x*d=a, y*d=b;
a=k*b+c即gcd(a, b)=gcd(b, c);
则有 c=a-k*b=x*d-k*y*d=(x-k*y)*d;
这里如果我们能证明 gcd(y, x-k*y)=1的话,我们就能证明gcd(b, c)=d啦(很显然嘛,y与x-k*y互质的话,b与c的最大公约数为d)~
我们假设gcd(y, x-k*y)=gg, y=gg*h, x-k*y=gg*j, 那么x=gg*j+k*y=gg*j+k*gg*h, 所以a=x*d=d*gg*(j+k*h), b=y*d=d*gg*h, 所以有gcd(a, b)>=d*gg;
又因为我们前面假设了gcd(a, b)=d, 所以gg=1, 即gcd(y, x-k*y)=1;
所以原式得证~
⊆