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

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

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就完事了

原文地址:https://www.cnblogs.com/war1111/p/7586798.html