同余方程

在这里插入图片描述
网上查找其他博主的总结了下:
欧几里德算法停止的状态是: a= gcd , b = 0 ,那么,这是否能给我们求解 x y 提供一种思路呢?因为,这时候,只要 a = gcd 的系数是 1 ,那么只要 b 的系数是 0 或者其他值(无所谓是多少,反正任何数乘以 0 都等于 0 但是a 的系数一定要是 1),这时,我们就会有: a1 + b0 = gcd 当然这是最终状态,但是我们是否可以从最终状态反推到最初的状态呢? 假设当前我们要处理的是求出 a 和 b的最大公约数,并求出 x 和 y 使得 ax + by= gcd ,而我们已经求出了下一个状态:b 和 a%b 的最大公约数,并且求出了一组x1 和y1 使得: bx1 + (a%b)y1 = gcd , 那么这两个相邻的状态之间是否存在一种关系呢? 我们知道: a%b = a - (a/b)b(这里的 “/” 指的是整除,例如 5/2=2 , 1/3=0),那么,我们可以进一步得到: gcd = bx1 + (a-(a/b)b)y1 = bx1 + ay1 – (a/b)by1 = ay1 + b(x1 – a/by1) 对比之前我们的状态:求一组 x 和 y 使得:ax + by = gcd ,是否发现了什么? 这里: x = y1 y = x1 – a/by1
然后
一个遗留问题:我们将要求出来的 x,yx,y 仅仅保证满足 ax + by = 1ax+by=1,而 xx 不一定是最小正整数解。有可能太大,也有可能是负数。这依然可以解决,那就是,xx 批量地减去或加上 bb,能保证 ax + by = 1ax+by=1,因为:ax + by = 1 ax+by=1``ax + by + k×ba - k×ba = 1ax+by+k×ba−k×ba=1a(x+kb) + (y-ka)b = 1a(x+kb)+(y−ka)b=1

  1. List item`
  2. #include<bits/stdc++.h>
    using namespace std;
    long long x,y;
    int e_gcd(long long a,long long b){//扩展欧几里得
    if(!b){
    x=1;
    y=0;
    return a;
    }
    long long ans=e_gcd(b,a%b);
    long long temp=x;
    x=y;
    y=temp-a/b*y;
    return ans;
    }
    int main(){
    long long a,b;
    cin>>a>>b;
    e_gcd(a,b);
    cout<<(x%b+b)%b<<endl;//处理为最小正整数
    return 0;
    }插入代码片`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值