最大公约数---欧几里得算法

本文介绍了使用欧几里得算法高效求解两个正整数最大公约数的方法,并提供了算法的递归实现。同时,文章还详细解释了扩展欧几里得算法,用于找出能够表示最大公约数的线性组合。

求解两个正整数的最大公约数(Greatest Common Devisor),可以采用循环进行遍历,不过效率很低。所以引入欧几里得算法(Euclid’s algorithm)。

欧几里得算法基于GCD递归引理

对任意非负整数a和任意正整数b,
gcd(a, b) = gcd(b, a mod b)

可以直接写出递归程序:

int GCD(int a, int b)
{   
    if(0 == b)
        return a;
    else
        return GCD(b, a % b);
}
  • 复杂度分析
    运行时间与递归调用的次数成正比。

时间复杂度O(lgb)O(lgb),最坏情况下计算次数N5log10bN≤5log10b

证明:欧几里得算法

  • 扩展欧几里得算法
    可以计算出满足下式的三元组(d,x,y)(d,x,y)
    d=GCD(a,b)=ax+byd=GCD(a,b)=ax+by
int Euclid_extend(int a, int b, int* x, int* y)
{
    if(0 == b)
    {
        *x = 1;
        *y = 0;
        return a;
    }
    else
    {
        int r = Euclid_extend(b,a%b,x,y);
        int temp = *x;
        *x = *y;
        *y = temp - (*y)*(a/b);
        return r;
    }
}

简单证明:
b=0b=0是递归基,易得一组解x=1,y=0x=1,y=0;
b0b≠0时:
首先递归求解:

d=gcd(b,a%b)=bx+(a%b)y              (1)d′=gcd(b,a%b)=bx′+(a%b)y′              (1)

我们知道:
d=gcd(a,b)=d=gcd(b,a%b)             (2)d=gcd(a,b)=d′=gcd(b,a%b)             (2)

a%b=aba/b           (3)a%b=a−b∗⌊a/b⌋           (3)

将(2)(3)式带入(1):
d=bx+(aba/b)y=ay+b(xa/by)d=bx′+(a−b⌊a/b⌋)y′=ay′+b(x′−⌊a/b⌋y′)

所以,令 x=yx=y′ y=xa/byy=x′−⌊a/b⌋y′,就可以满足 d=ax+byd=ax+by

转载于:https://www.cnblogs.com/EIMadrigal/p/9248202.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值