exgcd|扩展欧几里得算法|扩展欧几里得算法证明|exgcd求逆元 一文说明白

exgcd

扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=\gcd(a,b)\) 的一组可行解。

部分选自OI Wiki

扩展欧几里得算法

欧几里得算法 的扩展。

扩展欧几里得算法证明

很简单,我们一步一步来(我们定义 \(a\geq b\)):

根据 欧几里得算法 得到 \(\gcd(a,b)=\gcd(b,a\mod b)\) ,所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a \mod b) \times y_2\)

因为 \(a \mod b = a-\lfloor\frac{a}{b}\rfloor \times b\) (这一点很容易理解)

所以 \(a \times x_1 + b \times y_1 = b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\)

\(b \times x_2 + (a-\lfloor\frac{a}{b}\rfloor \times b) \times y_2\) 化简得 \(b \times x_2 + a \times y_2-\lfloor\frac{a}{b}\rfloor \times b \times y_2\)

再整理一下得 \(a \times y_2 + b \times (x_2 -\lfloor\frac{a}{b}\rfloor \times y_2)\)

\(a \times x_1 + b \times y_1\) 一一对应得到:

\[\begin{cases} a \times x_1 + b \times y_1 \\ a \times y_2 + b \times (x_2 -\lfloor\frac{a}{b}\rfloor \times y_2) \end{cases} \]

\[\begin{cases} x_1 = y_1 \\ y_1 = x_2 -\lfloor\frac{a}{b}\rfloor \times y_2 \end{cases} \]

欸,这样不就可以通过递归算出了吗?(可以自己手算一下)

扩展欧几里得算法边界

我们的 扩展欧几里得算法 总需要一个边界,所以我们规定了当 \(b=0\) 时(在 欧几里得算法 中我们也是以b=0为边界,具体可看那篇文章),我们的 \(a \times 1 + b \times 0 = a = \gcd(a,b)\) ,所以当 b=0 时

\[\begin{cases} x = 1 \\ y = 0 \end{cases} \]

扩展欧几里得算法代码

template<typename T> 
void exgcd(T a,T b,T &x,T &y){
	if(b==0){
		x=1,y=0;
		return;
	}
	exgcd(b,a%b,y,x);	// 注意x,y的顺序 
	// 计算x,y
	y-=a/b*x; 
}

例题

青蛙的约会


求逆元

(upd:20230816)

老是会忘,记一下

逆元的定义:

\[ab=1(\mod P) \]

\[\Downarrow \]

\[ab=1+y\cdot P \]

\[\Downarrow \]

\[ab-yP=1 \]

我们是不是可以用exgcd求 b 了

posted @ 2023-05-24 13:34  ZnPdCo  阅读(137)  评论(0编辑  收藏  举报