一直在用gcd(),却不理解其中的原因,。今天回过头来,从头学起。
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b,a%b);
}
1. 首先要知道,0 于 n 的最大公约数是 n。所以当b == 0时候,最大公约数就是a。
重要的是要证明:gcd(a, b) = gcd( b, a%b);
2. 设 gcd(a,b) = g。 (a >= b)
则 a = k1g, b = k2g.
设 a/b = n......r ,
则 a%b = a - n*b = r 。
则 r = (k1g - n* k2g ) = g * (k1 - n * k2) .
即证明 : gcd( k2g , g * (k1 - n * k2) ) = g;
即 :gcd(k2 , k1- n*k2 ) = 1;!!
到这里 ,只要证明k2 和 k1 - n*k2 互质,就完毕。 也很简单 ,用反证法。
3. 假设它们不互质,且 k1 - n*k2 = x*k2,
则 k1 = (n + x) k2
则 a = (n + x)k2 * g
b = k2 * g
显然必将得到一个大于 g 的最大公约数,矛盾,得证。