感觉自己搞懂这个算法了,记录一下。
对于x = gcd(a, b, &x, &y), 我们假设其递归调用已有解g = gcd(b, a % b, &xx, &yy),则有b * xx + (a % b) * yy == g成立, 用a % b == a - (a / b) * b代换有b * xx + (a - ( a / b) * b) * yy == g, 继而 a * yy + b(xx - (a / b)yy) == g, 于是可以通过递归调用缩小问题,而终点是当b == 0时,gcd(a, b, &x, &y) == a, xx == 1, yy == 0.
int extgcd(int a, int b, int &x, int &y){
if(b != 0){
int retx, rety;
int ret = extgcd(b, a % b, retx, rety);
x = rety;
y = retx - (a / b) * rety;
return ret;
} else {
x = 1, y = 0;
return a;
}
}
经过优化后基本就是网上的代码了
int extgcd(int a, int b, int &x, int &y){
if(b != 0){
int ret = extgcd(b, a % b, y, x);
y -= (a / b) * x;
return ret;
} else {
x = 1, y = 0;
return a;
}
}