扩展欧几里得算法
解二元一次不定方程
$$
ax+by=c
$$
有解的条件: $ \gcd(a,b)\mid c$
(若 $\gcd(a,b)$ 与 $c$ 互质或大于则无法配出,因为 $a$ 与 $b$ 能配出的数为 $\gcd(a,b)$ 的倍数)
对原式两边同除$\gcd(a,b)$,
得到 $a’x+b’y=c’$ 此时 $a’\bot b’$ ,
如此可用 $exgcd$ 来求 $a’x+b’y=1$ 的解,进而对得到的答案分别乘以 $c’$ 即可。
求解可在求解 $\gcd$ 的过程中实现,
先将上式变到未知 $\gcd(a,b)$ 前的 $ax+by=\gcd(a,b)$
代入辗转相除过程:
$$
ax+by
$$
$$
=\gcd(a,b)
$$
$$
=\gcd(b,a\mod \quad b)
$$
$$
=bx’+(a\mod \quad b)y’
$$
$$
\ldots
$$
$$
=1
$$
$$
(a\bot b)
$$
$$
\left{\begin{array}{c}x_n=1\y_n=0\end{array}\right.
$$
看两层间关系:
$$
ax+by
$$
$$
=bx’+(a\mod \quad b)y’
$$
$$
=ay’ +b(x’-\lfloor {a \over b} \rfloor y’)
$$
由此可以看出:
$$
\left{ \begin{array}{c}x=y’\y=x’- \lfloor {a \over b} \rfloor y’\\end{array}\right.
$$
那么我们就可以用最后那一组确定的特解不断向前代直到得到 $ax+by=\gcd(a,b)$ 的解
最后附上一份 $exgcd$ 的代码
1 | #define ll long long |
时间复杂度$\Theta(\log n)$
解同余方程
$$
ax\equiv b\pmod m
$$
考虑先把他转换成普通的方程:
$$
ax=b-my
$$
移项得
$$
ax+my=b
$$
之后便可按解二元一次不定方程的步骤来求解
修订记录
- 2023年4月2日 创建文章