excrt
EXCRT
为了契合整个系统,定义 \(\gcd(x,0)=x\)。
欧几里得算法
证明 \(gcd(a,b)=gcd(b,a\ mod \ b)\):
- \(gcd(a,b)|gcd(b,a\ mod \ b):\)
\[a\ mod \ b=a-kb\\
gcd(a,b)|a\\
gcd(a,b)|b\\
\Rightarrow gcd(a,b)|gcd(b,a\ mod \ b)
\]
- \(gcd(b,a\ mod \ b)|gcd(a,b):\)
\[a\ mod \ b+kb=a\\
gcd(b,a\ mod \ b)|gcd(b,a\ mod \ b)\\
gcd(b,a\ mod \ b)|b\\
\Rightarrow gcd(b,a\ mod \ b)|gcd(a,b)
\]
扩展欧几里得算法
扩展欧几里得算法解决的是这样的二元一次不定方程:\(ax+by=\gcd(a,b)\)。
设
\[ax_{1}+by_{1}=\gcd(a,b)\\
bx_{2}+(a \ mod \ b)y_{2}=gcd(b,a\ mod \ b)
\]
由辗转相除法:
\[ax_{1}+by_{1}=bx_{2}+(a \ mod \ b)y_{2}\\
ax_{1}+by_{1}=bx_{2}+(a-\lfloor \frac{a}{b} \rfloor \times b)y_{2}\\
ax_{1}+by_{1}=ay_{2}+b(x_{2}-\lfloor \frac{a}{b} \rfloor y_{2})\\
\]
递归求解 \(bx_{2}+(a \ mod \ b)y_{2}=gcd(b,a\ mod \ b)\)。这个递归显然是有边界的,即 \(b=0\),此时 \(x=1,y=0\) 即是合法解。递归问题解决之后,当前问题的解就是 \(x_{1}=y_{2}\),\(y_{1}=x_{2}-\lfloor \frac{a}{b} \rfloor y_{2}\)。
exgcd
exgcd解决的是这样的二元一次不定方程:\(ax+by=c\)。
首先由裴蜀定理:\(\gcd (a,b)|c\),否则无解。
根据上文,我们已经能解出\(ax_{0}+by_{0}=\gcd(a,b)\)。
那么有:\(a\frac{x_{0}c}{\gcd(a,b)}+b\frac{y_{0}c}{\gcd(a,b)}=c\)。这样我们就找到了一组特解。
接下来考虑通解:
\[a(x_{1}+db)+b(y_{1}-da)=c
\]
因为 \(da,db\) 是整数,所以 \(d\) 一定是 \(\frac{1}{\gcd(a,b)}\) 的倍数。那么通解就是:
\[x=x_{1}+\frac{b}{\gcd(a,b)}k\\
y=y_{1}-\frac{a}{\gcd(a,b)}k\\
\]
这也可以求指定范围解的个数。
CRT/EXCRT
算法流程:每次取出方程组中的两个方程,合并成一个。
如何合并:
\[\left\{
\begin{array}{}
x\equiv r_{1} \pmod{m_{1}} \\
x\equiv r_{2} \pmod{m_{2}}
\end{array}
\right. \\
\Rightarrow a=k_{1}m_{1}+r_{1}=k_{2}m_{2}+r_{2}\\
k_{1}m_{1}-k_{2}m_{2}=r_{2}-r_{1}\\
\]
用exgcd解这个即可,合并后就是 \(x\equiv 解 \pmod{lcm (m_{1},m_{2})}\)。