欧几里德扩展方程 详解

本文详细介绍了欧几里德扩展方程的概念、原理及求解步骤,并通过实例展示了如何使用该方法解决实际问题。重点在于理解方程背后的数学逻辑与实践应用。

作用:

欧几里德扩展方程是用来求解二元一次线性方程的。ax+by=c
(a、b、c为已知数)
对于给定方程:
ax+by=c,令g=gcd(a,b)
因为a是g的倍数,b也是g的倍数,所以令a=m*g , b=n*g,则:
ax+by=g(m*x+n*y)=c
所得的结果c必然是g的倍数。
当且仅当mx+ny=1时,右边有最小值。而此时mn必定是互质的。
所以我们经常求的最小整数解就是求方程ax+by=gcd(a,b)的解。

解方程步骤:

对于方程
ax+by=gcd(a,b)
由欧几里德算法
gcd(a,b)=gcd(b,a%b)
分别用b和a%b去替换ab,则可以得到一对新的解:x’和y’
bx’+(a%b)y’=gcd(b,a%b)
因为两式右边都相等,所以我们让两式左边相等
ax+by=bx’+(a%b)y’
假设我们的a/b=k余a%b,则a%b=a-kb,那么上式可变为
ax+by=bx’+ay’-kby’
我们让对应项系数相等
x=y’
y=x’+ky’
这里我们可以发现,后一次的结果是由前一次结果决定的
一直化简下去会发现,方程会变成一个特解:
即x=1,y=0的情况。
最后我们再反过来求得最后的xy即可。

代码实现:

//ax+by=gcd(a,b)=c
void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
        return ;
    }
    exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-y*(a/b);
}

因为x,y加了引用,所以最后xy的值会在递归后改变,就求得了最后的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值