Exgcd 和 Excrt 的一些推导
Exgcd
Exgcd 是用来求解二元一次不定方程的算法,即
\[ax+by=c
\]
根据贝祖定理,该方程有解当且仅当 \(\gcd(a,b) \mid c\),所以只用求解
\[ax+by=\gcd(a,b)
\]
又因为
\[\gcd(a,b)=\gcd(b,a \bmod b)
\]
可以先求解
\[bx'+(a\bmod b)y'=\gcd(a,b)
\]
变形得
\[bx'+(a-b \lfloor \frac{a}{b}\rfloor)y' = \gcd(a,b)
\]
\[ay'+b(x'-\lfloor\frac{a}{b}\rfloor y')=\gcd(a,b)
\]
对比方程 \(ax+by=\gcd(a,b)\),得
\[\left \{ \begin{matrix}
x=y'\\
y=x'-\lfloor\frac{a}{b}\rfloor y'
\end{matrix} \right.
\]
在递归求 \(\gcd(a,b)\) 时顺便求出 \(x,y\) 即可。
对于方程 \(ax+by=c\) 的一组特解 \(x_0,y_0\),其通解可表示为
\[\left \{ \begin{matrix}
x=x_0+kb\\
y=y_0-ka
\end{matrix} \right.
\text{ }\text{ }
(k\in\mathbb{Z})
\]
而 Exgcd 求出的是 \(ax+by=\gcd(a,b)\) 的一组特解 \(x_0,y_0\)。
记 \(d=\gcd(a,b)\),方程 \(ax+by=c\) 的通解可表示为
\[\left \{ \begin{matrix}
x=\frac{c}{d}x_0+\frac{b}{d}k \\
y = \frac{c}{d}y_0-\frac{a}{d}k
\end{matrix} \right.
\text{ } \text{ }
(k \in \mathbb{Z})
\]
也可表示为
\[\left \{ \begin{matrix}
x \equiv \frac{c}{d}x_0 \pmod{\frac{b}{d}}\\
y \equiv \frac{c}{d}y_0 \pmod{\frac{a}{d}}
\end{matrix} \right.
\]
这样我们可以求出 \(x,y\) 的最小正整数值。
Exgcd 还可以用来求解线性同余方程,即
\[ax \equiv b \pmod{m}
\]
可转化为二元一次不定方程
\[ax+my=b
\]
使用 Exgcd 求解即可。
Excrt
Excrt 是用来求解线性同余方程组的算法,即
\[\left \{ \begin{matrix}
x \equiv a_1 \pmod{m_1}\\
x \equiv a_2 \pmod{m_2}\\
\dots \dots \dots \\
x \equiv a_n \pmod{m_n}
\end{matrix} \right.
\]
考虑已经求解出前 \(k-1\) 个方程组,如何与第 \(k\) 个方程合并。
记 \(x_0\) 为前 \(k-1\) 个方程组的解,\(M=\text{lcm}_{i=1}^{k-1} m_i\),\(x\) 为前 \(k\) 个方程组的解,有
\[x=x_0+tM \text{ } (t \in \mathbb{Z})
\]
代入原方程,有
\[x_0+tM \equiv a_k \pmod{m_k}
\]
移项得
\[Mt\equiv a_k-x_0 \pmod{m_k}
\]
变为线性同余方程,可以使用 Exgcd 求解出 \(t\) 的最小正整数解。
若该线性同余方程无解,则整个方程组无解。
将 \(t\) 代入原式求出 \(x\),将 \(x_0 \leftarrow x\),\(M \leftarrow \text{lcm}(M,m_k)\)。
这样就完成了一次合并。
依次将 \(n\) 个方程合并,就求出了整个方程组的解。