2023/2/22欧几里得算法及其拓展

文章介绍了欧几里得算法(辗转相除法)用于求解两个正整数的最大公约数,其时间复杂度为O(logn)。接着阐述了拓展欧几里得算法,该算法能找出满足a*x+b*y=gcd(a,b)的整数x和y,通过递归方式解决,并在b等于0时找到解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、欧几里得算法

对于两个正整数a,b,若要求他们的最大公约数,从2开始遍历到b(假设a>b)的时间复杂度是O(n),但用欧几里得算法可以将其复杂度降为O(logn)。

文字描述:欧几里得算法也称辗转相除法,即用较大的数对较小的数取余数,余数记作t。若余数t不为零,则继续用b对t取余直到取得余数为0为止(递归出口)。为零时,形参a所代表的数就是二者的最大公约数。

代码如下:


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

二、拓展欧几里得算法

一定存有整数x,y,使a*x+b*y=gcd(a,b)

设a*x1+b*y1=gcd(a,b);----①

根据欧几里得算法我们可以得知:gcd(a,b)=gcd(b,a%b);----②

gcd(b,a%b)=b*x2+(a%b)*y2;----③

对于a%b我们可以将其转换成数学计算符号a-b*(b/a),这里的b/a在数学中是向下取整,但在编程中由于整数类型除法的特性,便可不做特殊处理。

联立上三式可以得出:a*(x1-y2)=b*(x2-y1-b*(b/a)),由于a,b是随机的,所以两边若相等必须括号内为0,即x1=y2,y1=x1-(a / b)*y1。

我们可以用递归的方法求出x,y。递归的出口是b=0,即x=1,y=0,我们直接赋值就可以了。

代码如下:


int exGod(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return a;
}
int g=exGod(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return g;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值