欧几里得算法
作用
又称辗转相除法, 迭代求两数 \(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\) 的最大公因数.
时间会刺破青春表面的彩饰,会在美人的额上掘深沟浅槽;会吃掉稀世之珍!天生丽质,什么都逃不过他那横扫的镰刀。
博主写的那么好,就不打赏一下么(打赏在右边)