扩展欧几里得算法求逆元c语言,关于扩展欧几里得算法和逆元

关于扩展欧几里得算法和逆元

1.扩欧

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

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

a%b=a-(a/b)*b;

联立可得

x1=y2

y1=x2-(a/b)*y2;

递归的边界为b=0

此时x=1,y=0,然后回溯即可。

为什么要x=1,y=0呢?

因为此时gcd(a,b)=gcd(a,0)=a,故a*1+b*0=gcd(a,b)=a;其实y!=0也可以,但是会爆int。

//17.11.6

扩欧的条件是a*x1+b*y1=gcd(a,b),=右边一定是gcd(a,b),如果gcd(a,b)前面有系数k,在求出来一组解之后,再*k就好了。

//2019.3.26

a*x1+b*y1=c,如果c不是gcd(a,b)的倍数,就没有整数解

怎么求最小正整数解呢

在用扩欧求出一组 ax+by=c 特解之后,比如(x2,y2),对于任意一个通解(x1,y1), ax1+by1=ax2+by2, 移项之后,a(x1-x2)=b(y1-y2),令g=gcd(a,b),a'=a/g,b'=b/g,则a'(x1-x2)=b'(y1-y2), 因为 gcd(a',b')=1,  (x1-x2)=kb' ,同理(y1-y2)=k1 a' ,所以x1=x2+kb',所以最小正整数解就是特解x0的 (x0%b'+b')%b', 这样就不用管特解的正负了。

如果对于读入的a,b,c存在小于0的,令flag=-1,x*=flag就完事了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值