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算法的实现是递归,所以要特别注意栈溢出。

1.最简单的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);
}

ACM中常用的gcd算法

int GCD(int a, int b)
{
    if (a%b == 0)
    {
        return b;
    }
    return GCD(b, a%b);
}

*or*

int GCD(int a, int b)
{
    return (a%b ==0)? b:GCD(b, a%b);
}

经过优化的gcd算法(分成奇偶两种情况):

int gcd(int x,int y )
{
    if(x < y) return gcd(y,x);  /// x>y
    if( y == 0) return x;  ///if y=0, x is GCD
    else
    {
        if( !(x%2) )
        {
            if( !(y%2) )  ///x,y both even
                return 2*gcd(x >> 1, y >> 1);
            else      /// x is even, y is odd
                return gcd(x >> 1, y );
        }
        else
        {
            if( !(y%2) )  ///x is  odd,  y is even
                return gcd(x, y >> 1);
            else       /// x, y both odd
                return gcd(y,x-y);
        }
    }
}

详细的gcd:
http://www.cppblog.com/beautykingdom/archive/2009/05/31/86299.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值