欧几里得算法(蒟蒻版)

上课写的,比较弱.....

 

补充:x | y表示y能整除x

 

定理1:gcd(an,bn) = n*gcd(a,b);

可以这样想:因为gcd(an,bn)必有一个n的因子,所以可以把an,bn提一个n,为n*gcd(a,b)

 

推论1:如果d | a,d | b,则d|gcd(a,b)

证明:d | a = x,d | b= y;

gcd(dx,dy) = d*gcd (x,y);

gcd(a,b) = d*gcd(x,y);

d | gcd(a,b)=d | d*gcd(x,y)= gcd (x,y);

∴d | gcd(a,b);

 

推论2:gcd(a,b) = gcd(b,a mod b)

证明:设gcd(a,b) = d;

则d | a,d | b;

a mod b = a - qb

∴d | a - qb(这应该明显),d | a mod b;

∵d | b , d | a mod b

d | gcd(b, a mod b){根据推论1}

∴gcd(a,b) | gcd (a, a mod b)

同理可得:

gcd(a,a mod b) |  gcd(a,b)

{

 ∵ gcd (a,a mod b) | a,gcd (a,a mod b) | a mod b,a = qb+a mod b;

∴ gcd(a,a mod b) | b (这应该很明显)

之后你懂得.....

}

 

最后一点,gcd(a,0) = a;

这个是最后算法的结束条件

gcd(a,b) = gcd(b,a mod b)

我举个栗子你就知道了

gcd(an,a) = gcd(a,0) =?

显然等于a。

 

以上这些大部分来至于《算法导论》,然后是代码。

这是递归的写法:

int Gcd(int a, int b)
  {
    if(b == 0)
    return a;
    return Gcd(b, a % b);
  }
View Code

这是迭代的写法:

int Gcd(int a, int b)
  {
    while(b != 0)
    {
     int r = b;
     b = a % b;
     a = r;
    }
   return a;
  }
View Code

 

(完)

posted @ 2015-09-21 21:07  空の芸術  阅读(286)  评论(0)    收藏  举报