[学习笔记] 扩展欧几里得算法(exgcd)

https://www.cnblogs.com/FUXyao/p/14754914.html

https://www.cnblogs.com/SXqwq/p/18286786/exgcd

由于笔者太菜,本文中术语使用可能有误。

用来求二元一次不定方程的整数解。

\[a x + b y = c \]

(这个方程有整数解的[充要条件](?)是 \(\gcd ( a, b ) | c\)。)

我们只需要求出方程 \(a x + b y = \gcd ( a, b )\) 的解,再同乘一个 \(\frac { c } { \gcd ( a , b ) }\) 得到原方程的解。

现在我们只讨论 \(a x + b y = \gcd ( a, b )\)

为了求得一组整数解,我们考虑围绕一个不变的 \(\gcd ( a, b )\) 去改变 \(a, b\),不断推出是原 \(a, b\) 时的解。

这使我们联想到求 \(\gcd\) 的过程。于是我们假设已经求出了 \(b, a \bmod b\) 时的解,考虑由它求出 \(a, b\) 时的解。

\[b x' + ( a \bmod b ) y' = a x + b y \]

\[b x' + (a \bmod b) y' = bx'+(a - b \lfloor \frac a b \rfloor)y' = ay' + b ( x' - \lfloor \frac a b \rfloor y' ) \]

于是 \(x = y', y = x' - \lfloor \frac a b \rfloor y'\)(应该要用大括号括起来,但我不会写,先写成这样吧)是 \(a, b\) 时的[一组解](???)。

考虑边界是什么。当 \(b = 0\) 时,方程是 \(a x = a\),于是有 \(x = 1\);此时直接令 \(y = 0\) 即可。

于是可以写出如下代码(在求 gcd 的过程中添加了一些东西)来求出 \(a x + b y = \gcd ( a, b )\) 的[一组解](?):

// 咕咕咕

记得写怎么用 exgcd 证上面那个结论。

记得写通解。

记得写用不等式来求出解的范围(求通解式子里的那个 \(k\) 的范围)。

当模数不是质数时,不能用费马小定理求乘法逆元,但如果满足模数与一个数互质,就可以用 exgcd 来求它的乘法逆元。

具体地,


\[x + k \cdot dx \geq 0 \ k \geq \frac {-x} {dx} \]

\[y - k \cdot dy \geq 0 \ k \leq \frac {y} {dy} \]

\[\frac {-x} {dx} \leq k \leq \frac {y} {dy} \]

\(k\) 是整数。

\[\lceil \frac {-x} {dx} \rceil \leq k \leq \lfloor \frac {y} {dy} \rfloor \]

如果是 \(> 0\) 就要把向上取整改成向下取整再 \(+ 1\),把向下取整改成向上取整再 \(- 1\)


2024.10.25

posted @ 2024-10-25 15:21  huangkxQwQ  阅读(1)  评论(0编辑  收藏  举报