扩展欧几里得的学习(未完成

来源:互联网 发布:15个java小项目 文库 编辑:程序博客网 时间:2024/06/10 12:44
ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return a;}ll r=exgcd(b,a%b,x,y);ll t=y;y=x-(a/b)*y;x=t;return r;}


证明见此图:


到时候可以临时推出代码

上述代码可以求出ax+by=gcd(a,b)的一组解

当求ax+by=c时同理,先求ax+by=gcd(a,b),在判断c是否整除gcd(a,b),如果整除就把x,y乘上倍数,否则无解。

求ax=b(mod L)时,原方程可以整理成ax+Ly=b,套用模板,解出ax+Ly=gcd(a,L),判断是否有解,有解就答案乘以倍数,就可以得到一组解

如果想要最小非负数解,再对x进行如下操作

int t=(L/gcd(a,L);

x=((x%t)+t)%t;

证明:

设ax1+by1=ax2+by2;

移项得 a(x1-x2)=b(y2-y1);

设t=gcd(a,b)

两边同时除以t得

a`(x1-x2)=b`(y2-y1)

注意到此时a`,b`互质

所以(y2-y1)为a`的整数倍

设(y2-y1)=a`k

得(x1-x2)=b`k

而b`=b/gcd(a,b);

x的解集为{x|x=特解+k*(b/gcd(a,b))};

所以

int t=L/(gcd(L,a));

x=(x%t+t)%t就是最小非负解啦~

就是这样,喵~



2 0