最大公约数

1)GCD递归定理:

  gcd(a, b) = gcd(b, a % b);

    证明通过证两边的式子互相整除。

   直接应用上面定理的就是欧几里德算法:

View Code
1 typedef long long ll;

2 ll gcd(ll a, ll b) {

3     return b ? gcd(b, a % b) : a;

4 }

   关于时间性能, 连续的斐波那契数是欧几里德算法的最坏情况下的一种输入,所以时间约为O(log(b));

2)扩展GCD:

 推广欧几里德算法能使它计算满足下列条件的整系数x, y:

    d = gcd(a, b) = ax + by

View Code
 1  typedef long long ll;

 2  

 3  void gcd(ll a, ll b, ll& d, ll& x, ll&y)

 4  {

 5      if(!b)

 6      {

 7          d = a; x = 1; y = 0;

 8      }

 9      else

10      {

11          gcd(b, a % b, d, y, x);

12          y -= (a / b) * x;

13      }

14  }

   时间性能和gcd一样。

  关于证明:利用数学归纳法

  归纳基础: b == 0时, gcd(a, 0) == a, 取x == 1, y == 0, 满足等式。

   先设第i次迭代后gcd(b, a % b, d, y, x)返回了正确的结果, 即y' 和 x' 满足:

    by' + (a % b)x' = gcd(b, a % b) = gcd(a, b) = d

   经过 y' -= (a / b) * x 后, 新的数对(x, y)满足:

    ax + by = ax' + b(y' - (a / b) * x') = ax' + by' - bx' * (a / b)

    -> ax' + by' - bx' * (a - (a % b)) / b =  by' + (a % b)x' = d

   得证!

你可能感兴趣的:(最大公约数)