前言:仅个人小记。欧几里得算法提供了求解最大公约数的方法,而求解最大公约数是十分有意义的,因为当两个数的最大公约数为1的时候,这两个数就是互质的,即gcd(a,b)=1 等价于 a与b互质,而互质这个性质在数论中则是非常重要。
欧几里得算法(Eculidean Algorithm)指明:a,b最大公约数(Greatest Common Divisor),就等于b,a%b的最大公约数,公式如下
g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b) = gcd(b,a \% b) gcd(a,b)=gcd(b,a%b)
但实际上,不仅仅是最大公约数,普通的公约数(Common Divisor)也吻合上面情况,即有 c d ( a , b ) = c d ( b , a % b ) cd(a,b)=cd(b,a\%b) cd(a,b)=cd(b,a%b)
所以,上述最大公约数的性质只是普通公约数的一个特例。
如果 (a + b) % d = 0,b % d = 0,则必然有 a % d = 0。
证明如下:
因为(a + b) % d = 0 ,b % d = 0,
所以可以令 a + b = kd , b = k’ d, 其中k 和 k’ 都是整数。
进而,a + b = kd ----> a + k’d = kd -----> a = (k-k’)d,即 a 是 d 的整数倍,进而必有 a % d = 0,证毕。
证 c d ( a , b ) = c d ( b , a % b ) cd(a,b)=cd(b,a\%b) cd(a,b)=cd(b,a%b)。
令 a = kb + r,则有 r = a - kb,
若 d 是 a , b的公约数有,则必有 a % d = 0 以及 b % d = 0,进而必有 r % d = 0,所以显然 d 也是 b, r 的公约数
若 d 是 b, r 的公约数, 则必有 a % d = 0 以及 r % d = 0, 即 b %d= 0 以及 (a - kb) % d=0,借助上述引理证明,进而必有 a % d = 0。
若 d 是 a, b 的公约数,则 d 必然是 b, r 的公约数;若 d 是 b, r 的公约数, 则 d 必然是 a, b 的公约数; 即 a, b 的公约数必然是 b, r 的公约数,即 c d ( a , b ) = c d ( b , r ) = c d ( b , a % b ) cd(a,b)=cd(b,r) = cd(b,a\%b) cd(a,b)=cd(b,r)=cd(b,a%b),示意如下图
证毕。
int gcd(int a, int b){
if (b == 0) return a;
return gcd(b,a%b);
}