设 ax+by=gcd(a,b)
辗转相除得 bx1+(a%b)y1=gcd(b,a%b)
根据上文我们知道
gcd(a,b)=gcd(b,a%b)
所以我们有
ax+by=bx1+(a%b)y1
由公式 a%b=a-floor(a/b)*b // floor(x) 函数 取不大于x 的最大整数
所以我们可以写成
ax+by=bx1+(a−floor[a/b]∗b)y1
合并关于 a,b的 同类项
ax+by=bx1+ay1-(a/b)*y1 *b
ax+by=ay1+(x1-(a/b)*y1) b
由此得出方程解
x=y1
y=x1-floor(a/b) *y1
使用递归解方程 ax+by=gcd(a,b)
当b==0时
ax=gcd(a,0)=a;
则 x=1;
y=0;
在这里插入代码片
void Ex_gcd(int a, int b, int &x, int &y)
{
if(b == 0)//递归出口
{
x = 1;
y = 0;
return;
}
int x1, y1;
Ex_gcd(b, a%b, x1, y1);
x = y1;
y = x1-(a/b)*y1;
}