如何求解这个方程:(ax + by = gcd (a, b))?
(∵gcd(a, b) = gcd (b, a \% b))
(∴)易证 $ gcd(a, b)$ 总是可以化为 (gcd (a',0))的形式
对于原方程(a'*x + 0*y = gcd (a',0)) (根据定义(gcd(a',0) = a'))
存在解为({x=1,y=0})
设$gcd(a_1,b_1) (为当前的)gcd(,)gcd(a_2,b_2)(为向下迭代后的)gcd$
({x1,y1})是当前解,({x2,y2})是下一次(gcd)的解
$$a_1x_1 + b_1y_1 = gcd(a_1,b_1)$$
$$=gcd (a_2,b_2)$$
$$= gcd(b_1,a_1%b_1)$$
$$ = b_1*x2 + a_1 % b_1 *y2$$
由于(a\%x = a-x*(a/x))
原式可以化简为:
$$a_1x_1 +b_1y_1 = b_1x_2+(a_1-(a_1/b_1)b_1)*y_2$$
$$a_1x_1 +b_1y_1 = a_1y_2+b_1x_2-(a_1/b_1)b_1y_2$$
$$a_1x_1 +b_1y_1 = a_1y_2+b_1(x_2-(a_1/b_1)*y_2)$$
我们已知下一次迭代得到的解(x_2,y_2)和(a_1,b_1)(边界为最终解({x=1,y=0 }))
那么就可以据此,系数对应,求出当前解:
$$x_1=y_2,y_1=x_2-(a_1/b_1)*y_2$$
经过层层迭代,就可以得到最终解。
代码:
int exgcd (int a1, int b1, int &x2, int &y2) {
//传址引用修改x2, y2
if (b1 == 0) {
x2 = 1, y2 = 0;
return a1;//边界情况
}
int div = exgcd (b1, a1 % b1, x2, y2);//向下递归
int x1 = y2, y1 = x2 - y2 * (a1 / b1);
return div;//返回约数 (可能没啥用QwQ关键求的是方程解)
}