求最大公约数算法

欧几里德算法:

int gcd(int a,int b)//a>b
{
   if(b==0)return a;
   else return gcd(b,a%b);
}

stein算法:

欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来。

考虑现在的硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过 64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算 128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。


int gcd(int a,int b)//a>b
{
   if(b==0)return a;
   else if(a%2==0&&b%2==0)return 2*stein(a/2,b/2);
   else if(a%2==0)return stein(a/2,b);
   else if(b%2==0)return stein(a,b/2);
   else return  stein((a+b)/2,(a-b)/2);
}

你可能感兴趣的:(算法,平台)