数论

📅 2026/7/26 21:48:27 👁️ 阅读次数 📝 编程学习
数论

Ex-GCD

使用该算法可求出 \(ax+by=\gcd(a,b)\) 的一组解。

应用:

  • 求解形如 \(ax+by=c\) 的不定方程。

下面讲解详细步骤:

step 1 判定解的情况:方程有解当且仅当 \(c \mid \gcd(a,b)\)

step 2 在求 gcd 的过程中解方程:

我们有

\[ax'+by'\\ =\gcd(a,b)\\ =\gcd(b,a \bmod b)\\ =bx''+(a \bmod b)y''\\ =bx''+(a-\lfloor \frac{a}{b} \rfloor \times b)y''\\ =ay''+b(x''-\lfloor \frac{a}{b} \rfloor y'') \]

比较系数得

\[\begin{cases} x'=y''\\ y'=x''-\lfloor \frac{a}{b} \rfloor y'' \end{cases} \]

即得到 \(x',y'\)\(x'',y''\) 的关系。

这样,当递归到边界时,\(b=0\),则有 \(ax'=a \Rightarrow x'=1\)

因此,将 \(x' \leftarrow 1,y' \leftarrow 0\)(事实上,\(y'\) 可以为任意值,但设为 \(0\) 不容易溢出)即可倒推回出最开始的 \(x',y'\)

得到原来的 \(x'\) 之后,它还不是原方程的解,需要令 \(x \leftarrow \frac{x' \times c}{\gcd}\)。若求最小非负整数解,则应令 \(b\) 除掉 \(\gcd\) 之后让 \(x\) 模它即可,原因可见下面例题的同余方程。

总之,不管需不需要,实现的时候都应该先把 \(a,b,c\) 全都除掉 \(\gcd\),并且让 \(x\)\(b\),这样最保险。