欧几里得算法

作用

又称辗转相除法, 迭代求两数 \(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\) 的最大公因数.

posted @ 2020-07-10 10:21  Aliemo  阅读(166)  评论(1编辑  收藏  举报