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算法
int GCD(int x,int y)
{
if(y==0) return x;
if(x<y) return GCD(y,x);
else return GCD(y,x%y);
}