作用
又称辗转相除法, 迭代求两数 (gcd) 的做法
公式
(gcd(a, b) = gcd(b, a \% b))
code
递归写法
int gcd(int a, int b) { return !b ? a : gcd(b, a % b);}
二进制优化
不讲(其实是不会)
inline int gcd(int x, int y) {
int i, j;
if (x == 0) return y;
if (y == 0) return x;
for (i = 0;0 == (x&1); ++i) x >>= 1;
for (j = 0;0 == (y&1); ++j) y >>= 1;
if(j<i) i = j;
while (1) {
if (x < y) x ^= y , y ^= x , x ^= y;
if (0 == (x -= y)) return y << i;
while (0 == (x & 1)) x >>= 1;
}
}
证明
设 (r = a \% b)
所以设 (a = bq + r)
((1)) 设 (d) 是 (a) 和 (b) 的公因数
则 (d | a) 且 (d|b)
所以 (d|(a - bq)), (r = a \% b = a - bq)
所以 (d|r)
所以 (d) 是 (b, r) 的公因数
((2)) 设 (d) 是 (b) 和 (r) 的公因数
则 (d|b) 且 (d|r)
所以 (d|(bq + r))
所以 (d|a)
所以 (d) 是 (a, b) 的公因数
综上, (a,b) 的所有公因数和 (b,r) 的所有公因数是一样的. 那么, (d) 是 (a, b) 的最大公因数, 当且仅当 (d) 是 (b) 和 (r) 的最大公因数.