转载自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html

说明:

  1. 以下所有除法为向下取整除法,a / b 记为floor(a / b)。
  2. 以下所有涉及运算的数均为整数。
  3. gcd(a, b)表示a与b的最大公约数。
  4. lcm(a, b)表示a与b的最小公倍数。
  5. a % b 表示a / b的余数。
  6. 模运算结果一定为正,如果a % p < 0,让a加上p再模p,即(a + p) % p。
  7. a | b表示a整除b,也就是b % a = 0。
  8. 两个互质数的和(或差)与原来的数仍然是互质数。

欧几里德算法 

简介:

  欧几里德算法又称辗转相除法,用于计算两个整数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 }
View Code

相关文章: