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})}\)

posted @ 2023-09-03 14:52  永无岛  阅读(4)  评论(0编辑  收藏  举报