关于扩展欧几里得算法和逆元
关于扩展欧几里得算法和逆元
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就完事了