1. 程式人生 > 實用技巧 >歐幾里得演算法

歐幾里得演算法

作用

又稱輾轉相除法, 迭代求兩數 \(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\) 的最大公因數.