转载自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
说明:
- 以下所有除法为向下取整除法,a / b 记为floor(a / b)。
- 以下所有涉及运算的数均为整数。
- gcd(a, b)表示a与b的最大公约数。
- lcm(a, b)表示a与b的最小公倍数。
- a % b 表示a / b的余数。
- 模运算结果一定为正,如果a % p < 0,让a加上p再模p,即(a + p) % p。
- a | b表示a整除b,也就是b % a = 0。
- 两个互质数的和(或差)与原来的数仍然是互质数。
欧几里德算法
简介:
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。
描述:
设q = a / b,r = a % b。
a,b,q,r满足a = q*b + r,可得gcd(a, b)=gcd(b, r),即gcd(a, b)=gcd(b, a % b)。
第一种证明:
设d = gcd(a, b),d_ = gcd(b, r)。
由题设可得:d | a,d | b。
∵ r = a - qb。
∴ d | r。
∴ d为 b 与 r 的公约数。
∴ d_ >= d。
同理可得:d >= d_。
∴ d = d_。
∴ gcd(a, b) = gcd(b, r) = gcd(b, a % b)
第二种证明:
设d = gcd(a, b)。
设 m = a / d,n = b / d。
由于d | a,d | b,所以m,n为正整数,且m,n互质。
∵ r = a - qb。
∴ r = (m - qn) * d。
∵ b = n * d。
∵ n,(m - qn)互质。(两个互质数的和(或差)与原来的数仍然是互质数,可用反证法证明)
∴ gcd(b, r) = d。
∴ gcd(a, b) = gcd(b, r) = gcd(b, a % b)
扩展欧几里德算法
描述:
设整数a,b满足a > b >= 0,必然存在整数对x,y,使得gcd(a, b) = a * x + b * y成立。
证明:
设q = a / b,r = a % b。
当b = 0时:
∵ 0除以任何数都等于0,即任何数都可以整除0。
∴ gcd(a, b) = a。
∴ x = 1,y = 0(y可以使任意数,这里取0)。
当b != 0时:
设gcd(a, b) = a * x1 + b * y1,gcd(b, r) = b * x2 + r * y2。
∵ gcd(b, r) = gcd(a, b),r = a - q * b。
∴ a * x1 + b * y1 = b * x2 + (a - q * b) * y2 = a * y2 + b * (x2 - q * y2)
∴ x1 = y2,y1 = x2 - q * y2。
∴ 欲求x1,y1,即求x2,y2,不断递归即可。
代码如下:
1 //ax + by = gcd(a, b) = d 2 // 扩展欧几里德算法 3 inline void ex_gcd(LL a, LL b, LL &x, LL &y, LL &d){ 4 if (!b) {d = a, x = 1, y = 0;} 5 else{ 6 ex_gcd(b, a % b, y, x, d); 7 y -= x * (a / b); 8 } 9 }