exgcd证明和最基础应用

如何求解这个方程:\(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关键求的是方程解)
}

用处:作为\(gcd\)的扩展版,它着力求的并不是\(gcd\),而是利用其性质求解形如\(ax + by = gcd (a, b)\)的方程,通常可以把逆元化为这种方程形式用\(exgcd\)快速求解。

(可能还有更多用处)

∵\(A*X\) \(mod\) \(B=1\)

∴\(A*X-B*Y=1\)

若\(B\)是质数,则二者\(gcd\)显然为\(1\)

(\(B\)不是质数逆元就不存在啦\(QwQ\))

代入\(exgcd\),求出来\(X\)的值就是\(A\)关于\(mod\) \(B\)的逆元

上一篇:深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)


下一篇:delhpi:http超时设置(转载)