2021-08-14 扩展欧几里得算法

扩展欧几里得算法是用来求一个线性方程  ax+by==gcd(a,b)  的解的算法,当然这个解并不一定唯一,但是当你算出一组解之后你就可以算出这个方程的通解,下面来证明

ax+by == gcd(a,b)   ——1方程

bx'+(a%b)y' == gcd(b,a%b)  ——2方程

因为 a%b==a-a/b*b           

带入第二个方程就可以得到       ay'  +  b(x' -  a/b*y') == gcd(b,a%b)

与第一个方程构成恒等式   x==y'     y==x'-a\b*y'

这样我们就可以递归下去直到边界,   边界条件就是      a==0 ,b==1  gcd(a,b)==a    此时x==1,y==0;

void Exgcd(int a,int b,int &d,int &x,int &y){
    if(!b){d=a;x=1;y=0;return;}
    Exgcd(b,a%b,d,y,x),y-=a*x/b;
}

通解   (x0+k*b',y0-k*a')  ,其中b'=b/gcd   a'=a/gcd

这样我们就可以得到一组解 (x0,y0)     接下来就可以用     (x0+k*b',y0-k*a')     ,其中b'=b/gcd   a'=a/gcd

至于为什么成立,将通解代入  ax+by=gcd 当中,你会发现 会被抵消掉,最后还是变形成 ax0+by0=gcd

另  我们可以使用阔欧算法求解某个数的逆元    即当 a与MOD互素时     ax+MOD*y=1   用扩展欧几里得求出的x即为a在摸MOD意义下的逆元

(需要注意的是   x可能为负数  将其转化为整数即可)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值