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)的逆元

原文地址:https://www.cnblogs.com/maomao9173/p/10322960.html