扩展欧几里得算法

学习扩展欧几里得算法,我们得先知道欧几里得算法,可以看这里,简单来说就是在 O ( l o g   n ) O(log\ n) O(log n)的时间内,求出 g c d ( a , b ) gcd(a,b) gcd(a,b)

而扩展欧几里得算法相当于是欧几里得算法的逆过程,
扩展欧几里得算法求得是整数 x , y x,y x,y,使得 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
当然 x , y x,y x,y会有多组。

具体的求法是在欧几里得的求法中回溯。
模板题:

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);//a,b交换位置,x,y的位置也改变
    y-=a/b*x;
    return d;
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        int k=exgcd(a,b,x,y);
        printf("%d %d\n",x,y);
    }
    return 0;
}

扩展欧几里得求解ax+by=m的式子(m%gcd(a,b)==0)
这个式子有解的前提: m % g c d ( a , b ) = = 0 m\%gcd(a,b)==0 m%gcd(a,b)==0 ;

然后就是这个方程如果没有对x和y有范围上的要求的话是有无线的解的

我们通过上面的模板可以求解出 ax+by=gcd(a,b)的一个特解 x y 然后等式俩边同时乘以m/gcd(a,b) 那么是不是就变成了ax+by=m的式子 ,此时的x和y也是乘过m/gcd(a,b)的,即此时x y是ax+by=m 的一个特解

现在的问题是怎么求其他的解:

我们让式子 a x + b y = m ax+by=m ax+by=m x + b / g c d ( a , b )         y − a / g c d ( a , b ) x+b/gcd(a,b) \ \ \ \ \ \ \ y-a/gcd(a,b) x+b/gcd(a,b)       ya/gcd(a,b)代入式子得 a x + a ∗ b / g c d ( a , b ) + b y − a ∗ b / g c d ( a , b ) = m ax+a*b/gcd(a,b)+by-a*b/gcd(a,b)=m ax+ab/gcd(a,b)+byab/gcd(a,b)=m 这里是不是 a x + b y = m ax+by=m ax+by=m了 相当于这个式子加一个 a , b a,b a,b 的最小公倍数 然后又减去一个最小公倍数 。
那么特解就是 x + b / g c d ( a , b )       y − a / g c d ( a , b ) x+b/gcd(a,b)\ \ \ \ \ y-a/gcd(a,b) x+b/gcd(a,b)     ya/gcd(a,b)
x = x 0 − d b ∗ k x=x_0-\frac{d}{b}*k x=x0bdk

y = y 0 + d b ∗ k y=y_0+\frac{d}{b}*k y=y0+bdk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chp的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值