概念介绍:
用于求解:AX+BY = gcd(A,B)的解
具体过程:
①预先的结论:对于AX+BY = 1,如果A,B互质,该方程X,Y一定有解。
(1)证明:
两边同时%A,得到 BY%A = 1%A
我们先看Y,Y的取值共有这么几类:n*Y+0,n*Y+1,n*Y+2......n*Y+A-1
现在证明此时BY的取值也有这么几类:我们不管n*Y,我们只管0*B,1*B,2*B...(A-1)*B
假设任取两个系数分别为m,n(0<m,n<A) 我们只需证明 (m*B-n*B)!=整数倍的a 即可证明任意两个BY的取值类都不相同。
即(m-n)*B != k*A
因为A,B互质,所以(m-n)必须是A的整数倍左右式才能相等,但是-A<(m-n)<A,证明成功。
因此BY%A可以取到0~A-1的任意余数,自然也可以取到1%A
(2)同时反证法得出不互质一定无解:
若A,B不互质,那么本式子可以化简为(A/gcd(A,B))*X + (B/gcd(A,B))*Y = 1/gcd(A,B)
很显然右式是个小数,左边永远不可能得到一个小数,故此时无整数解。
②从这个结论,我们引申出:
(1)任意A,B,AX+BY = gcd(A,B)一定有解
(2)AX+BY=K*gcd(A,B)一定有解(K为任意整数)
这就是为什么我们可以保证AX+BY=gcd(A,B)有解的原因。
③具体实现:
(1)递归原理
利用递归实现,我们可以从这两个式子来看
ax1+by1=gcd(a,b)--->当前递归所需要求的
bx2+(a%b)y2=gcd(b,a%b)--->下一层递归需要求的
我们来找两个式子中的这两组解有什么关系:
首先,右式相等。
那么,ax1+by1 = bx2+(a%b)y2
我们把a%b写成a-[a/b]*b ([a/b]表示整除,比如5/2=2而不是2.5)
再把右式整理一下,得到:
ax1+by1 = ay2 + b*(x2-[a/b]y2)
所以:
x1 = y2
y1 = x2-[a/b]*y2
我们可以利用下层的x2,y2直接求出当前的x1,y1
(2)递归终点
我们求gcd(a,b)什么时候结束,就是a = gcd,b=0时
此时gcd*x + 0*y = gcd
求得x = 1,y的话就等于0吧,反正都一样。
④代码:(ll 表示long long型,然后这里还有些细节自己思考一下)
void exgcd(ll a,ll b,ll& x,ll& y)
{
if (b==0){x = 1;y = 0;}
else {
exgcd(b,a%b,y,x);
y = y - (a/b)*x;
}
}