三分钟学会扩展欧几里得算法

高一学会打扩展欧几里得的代码,然后抄代码抄了三年。

我嘲笑那些嘲笑我连 exgcd 都不会的人,会这个东西有用吗?反正都是背代码。直到这道题在高代的作业里面出现。

辛苦男朋友了。

欧几里得算法

在一个唯一分解环 (UFD) 内,有以下性质:

$$(a, b) = (b, a \bmod{b}) $$

因此可以使用辗转相除法来求两个数的最大公约数。

扩展欧几里得算法

为解决如下问题:

$$ ax + by = (a, b)$$

已知 $a$, $b$,求满足上式的 $x, y$ 。

我们考虑,如果有:

$$ bx_0 + (a \bmod b)y_0 = (b, a \bmod b) $$

即有:

$$ ay_0 + b(x_0 - \lfloor \frac{a}{b} \rfloor y_0 ) = (a, b) $$

于是可以在欧几里得算法递归到底端回传的时候每次更新 $x, y$ 。

计算全部解

上式只是给出了一个合法解。如何求出全部满足条件的 $x, y$ ?

设当前唯一分解环为 $R$,我们声明所有解都有如下形式:

$$ a(x_0 + \frac{b}{(a, b}k) + b(y_0 - \frac{a}{(a, b)}k) = (a, b), k \in R$$

首先,每个满足上述形式的 $x, y$ 都显然合法,我们只需考虑证明不存在其他的解。

若存在 $x_0, x_1, y_0, y_1$ 均为合法解,那么有: $$ a(x_0 - x_1) + b(y_0 - y_1) = 0 $$

也就是,

$$ \frac{a}{(a, b)}(x_0 - x_1) = \frac{b}{(a, b)}(y_0 - y_1)$$

由最大公约数的定义,知 $\frac{a}{(a, b)}$ 与 $\frac{b}{(a, b)}$ 互素。由唯一分解性质可知,$\frac{a}{(a, b)}$ 是 $(y_0 - y_1)$ 的倍数,另一边同理。

于是声明成立。


Hermera