大整数算法之gcd(最大公约数)

大整数算法之gcd(最大公约数)

欧几里德算法(Euclid)阐述了一种gcd算法。gcd(greatest common divisor),简言之,我们想求gcd(x,y),假设(x>y),如果存在下式:x =  q*y + r,那么则有gcd(x,y) = gcd(y,r) ,其实上式也称为 gcd递归定理,即gcd(a,b) = gcd (b,a mod  b)。
这个递归式看似很简单。实则它还是很值得推敲的,首先,它怎么证明?其次,该算法的运行时间为如何?
在密码学中,欧几里德算法有着相当广泛的应用,譬如求乘法逆元,大整数分解等等。。
在<<编程之美>>一书中,给出了不少gcd算法的简单实现。因为gcd算法的实现是递归,所以要特别注意栈溢出。先做个标记,以后会把栈详细分析一下。
 最简单的gcd算法:
         
1 int  gcd( int  x,  int  y)
2 {
3     if(y == 0return x;    
4     if(x < y)      return gcd(y,x);    
5     else        return gcd(y, x%y); 
6}
 

ACM中常用的gcd算法:
1 int  gcd( int  a,  int  b) return a == 0 ? b : gcd(b % a, a); }  

经过优化的gcd算法(分成奇偶两种情况):
 1 int  gcd( int  x, int  y )
 2 {
 3    if(x < y) return gcd(y,x);  // x>y
 4    if( y == 0return x;  // if y=0, x is GCD 
 5    else
 6    {
 7         if!(x%2) )
 8         {                 
 9           if!(y%2) )  //x,y both even
10               return 2*gcd(x >> 1, y >> 1);    
11           else      // x is even, y is odd
12               return gcd(x >> 1, y );  
13         }

14         else 
15         {
16           if!(y%2) )  // x is  odd,  y is even
17               return gcd(x, y >> 1);
18           else       // x, y both odd
19               return gcd(y,x-y); 
20         }

21    }

22}

23

你可能感兴趣的:(大整数算法之gcd(最大公约数))