歐幾里得演算法
阿新 • • 發佈:2020-07-10
作用
又稱輾轉相除法, 迭代求兩數 \(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\)