拓展欧几里得解线性同余方程
裴蜀定理:ax+by=gcd(a,b)必有解
下面用g表示gcd(a,b)
证明:首先,两侧同除g,令a’=a/g,b’=b/g;
则有:ax+by=gcd(a,b) <=> a’x+b’y=1;
(1)根据欧几里得算法,bx+(a%b)y=gcd(a,b)成立
与 ax+by=gcd(a,b)成立 互为充要条件
(2)当欧几里得算法进行到最后一步时,
a=1,b=0,此时令x=1,y=0即构造出一
个特解,使得a’x+b’y=1成立,
(3)对递归过程应用数学归纳法,
证得裴蜀定理成立
证毕
拓展欧几里得算法
上述过程已经给出了解ax+by=gcd(a,b)的方式
解ax+by=gcd(a,b)的算法即为拓展欧几里得算法
代码如下:
il LL exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0){
x=1;y=0;return a; }
LL d=exgcd(b,a%b,x,y);
LL z=x;x=y;y=z-(a/b)*y;
return d;
}
返回值为gcd(a,b)。
事实上就是模拟了上述过程
解方程ax+by=c
一、具体过程
(1)若g|c:
设c’=c/g,先用拓展欧几里得算法解
ax’+by’=gcd(a,b)
两侧同乘c/gcd(a,b)(即c’)
得到a(x’ * c’) + b(y’ * c’)=c’ *g=c
所以x=x’c’,y=y’c’即为ax+by=c的解
(2)若不满足g|c,则无上述过程,此时
该方程无解
LL a=read_ll(),b=read_ll(),c=read_ll();
LL gg=exgcd(a,b,xx,yy);
if(c%gg){
//无解
}
LL cc=c/gg;
xx*=cc,yy*=cc;
其中LL表示long long,read表示快读
二、通解
x=x’c’+kb’ , y=y’c’-ka’表示方程通解
(代入ax+by=c,,kab’-ka’b=0)
其中k取遍整数集合
显然,k越大,x越大,y越小
下面给出计算一些特解的方式:
LL aa=a/gg,bb