中国剩余定理 / 伪拓展中国剩余定理浅谈

以下是 \(\text{arfa}\) 自己从网上和各种地方学过来 , 写下的。
因为 \(\text{EXCRT}\) 的博客大多草草结尾 , 一开始是比较简单 , 后面就懵逼了。 最后的地方参考了 \(\text{时间飞逝's blogs}\)

\(\text{P1 : 中国剩余定理 (CRT)}\)

题目 , 求同余方程 , 即 : (\(m_i \perp m_j\)

\[\begin{cases} x & \equiv a_1 \pmod {m_1} \\ x & \equiv a_2 \pmod {m_2} \\ & \vdots \\ x & \equiv a_n \pmod {m_n} \\ \end{cases}\]

假如有一个序列 \(k_i\) , 使得 \(k_i \equiv 1 \pmod{m_i}\)\(k_i \not \equiv 1 \pmod{m_j}\)。那么显然可知 \(k_ia_i \equiv a_i \pmod{m_1}\)
但是我们要的不是一个序列 , 而是一个定值 , 所以我们设 \(x=\sum\limits^n_{i=1} k_ia_i\) , 但是现在又出现了新问题 , \(x \equiv(\sum\limits^n_{i=1 ,i \not = t}k_ia_i)+k_ta_t \equiv (\sum\limits^n_{i=1 ,i \not = t}k_ia_i)+a_t \pmod{m_t}\)
然后可以想到的是 , 如果 \(\sum\limits^n_{i=1 ,i \not = t}k_ia_i \equiv 0 \pmod{m_t}\) , 又因为两两互质 , 这个 \(k\) 的构造就成立了。

可以注意到 , 如果 \(k_i|m_t\) 的话 , 那么整个式子就变成了 \(\sum\limits^{n}_{i=1,i \not = t} 0a_i=0\) , 那么我们构造的 \(k_i=\prod\limits^n_{j=1} m_j\) 不就可以了?
不不 , \(k_i\) 里面不能包含 \(m_t\) 啊 , 所以 \(k_i=\prod\limits^n_{j=1 , j \not = t} m_j\)
不不 , 还有条件呢 , \(k_i \equiv 1 \pmod {m_i}\) , 这个简单 , 乘上逆元即可 , \(k_ik_i^{-1} \equiv 1 \pmod {m_i}\)。即可得出结论 :
\(k_i=\prod\limits^n_{j=1 , j \not = t} m_j{(\prod\limits^n_{j=1 , j \not = t} m_j)}^{-1}\)
所以说 , 当 \(x=\sum\limits^{n}_{i=1}k_ia_i\) 的时候 , 这些条件都满足 , 即可得到

\[x=\sum\limits^n_{i=1}a_i\prod\limits^n_{j=1 , j \not = i} m_j{(\prod\limits^n_{j=1 , j \not = i} m_j)}^{-1} \]

而逆元可以预处理 , 乘积也可以预处理 , 所以整个的复杂度应该为 \(O(n)\)。当然在线处理 \(O(n \log n)\) 好像没有什么影响。


\(\text{P2 : 拓展中国剩余定理 (EXCRT)}\)

还是求上面那个玩意 , 但是少了条件 \(m_i \perp m_j\) , 多了条件 : 求最小正整数解。然后整个算法跟中国剩余定理就没有关系了。
首先讲一下拓欧吧 , 也就是求 \(ax+by=\gcd(a,b)\) 的解。
\(ax+by=\gcd(a,b)=\gcd(a \mod b,b)=(a \mod b)x+by=(a-\left\lfloor\frac a b\right\rfloor b)x+by=ax-b(y-\left\lfloor\frac a b\right\rfloor x)\)。 如此递归即可。

对于只有两个方程的情况 , 随便搞搞。
改写方程 : (下面那个 \(x_2\) 是负数为了下面好推)

\[\begin{cases} x & = a_1+x_1m_1 \\ x & = a_2+(-x_2)m_2 \\ \end{cases}\]

连立 , 可得 , \(x_1m_1+x_2m_2=a_2-a_1\) 。 根据废鼠定理 , 当 \(x_1\)\(x_2\) 存在解的时候 , \(\gcd(m_1,m_2) \ |\ a_2-a_1\)
假设有解 \(x_1'm_1+x_2'm_2=\gcd(m_1,m_2)\) , 拓欧求出来 \(x_1'\)\(x_2'\) 以后 , 可以求出 \(x_1\)\(x_2\) :

\[\begin{aligned} x_1'm_1+x_2'm_2 & =\gcd(m_1,m_2) \\ (x_1'm_1+x_2'm_2) \times (\frac{a_2-a_1}{\gcd(m_1,m_2)}) & =a_2-a_1 \\ \frac{x_1'(a_2-a_1)}{\gcd(m_1,m_2)}m_1+\frac{x_2'(a_2-a_1)}{\gcd(m_1,m_2)}m_2 & =a_2-a_1 \\ \frac{x_1'(a_2-a_1)}{\gcd(m_1,m_2)}m_1+a_1 & =\frac{-x_2'(a_2-a_1)}{\gcd(m_1,m_2)}m_2+a_2 \\ \end{aligned}\]

可得 , \(x_1=\frac{x_1'(a_2-a_1)}{\gcd(m_1,m_2)}\) , 也就得到 \(x=a_1+\frac{m_1x_1'(a_2-a_1)}{\gcd(m_1,m_2)}\)

假如我们现在已经解了两个方程 , 得到的这个解 , 再进行研究 :

\[\begin{cases} x_{\text{first}} & = a_1+m_1x_1'\frac{(a_2-a_1)}{\gcd(m_1,m_2)} \\ x_{\text{first}} & = a_2-m_2x_2'\frac{(a_2-a_1)}{\gcd(m_1,m_2)} \\ \end{cases}\]

\[\begin{cases} x_{\text{second}} & = a_2+m_2x_2'\frac{(a_3-a_2)}{\gcd(m_2,m_3)} \\ x_{\text{second}} & = a_3-m_3x_3'\frac{(a_3-a_2)}{\gcd(m_2,m_3)} \\ \end{cases}\]

然后把中间两个关于 \(2\) 的拉出来 :

\[\begin{cases} x_{\text{first}} & = a_2-m_2x_2'\frac{(a_2-a_1)}{\gcd(m_1,m_2)} \\ x_{\text{second}} & = a_2+m_2x_2'\frac{(a_3-a_2)}{\gcd(m_2,m_3)} \\ \Delta_x =x_{\text{second}}-x_{\text{first}} & =m_2x_2'\frac{(a_2-a_1)\gcd(m_2,m_3)+(a_3-a_2)\gcd(m_1,m_2)}{\gcd(m_1,m_2)\gcd(m_2,m_3)} \end{cases}\]

后面那个玩意儿 , 可以看作是 \(t \times \text{lcm}(m_3,m_2)\) , 然后从 \(x_{\text{first} \implies x_{\text{second}}}\) 就只是加了一个 \(t\text{lcm}(m_3,m_2)\) 罢了。也就是说 , \(x_{\text{second}}=x_{\text{first}}+t\text{lcm}(m_3,m_2)\) , 通过骚技巧得到 :

\[x_{\text{second}}\equiv x_{\text{first}} \pmod{\text{lcm}(m_3,m_2)} \]

即 :

\[x_{\text{second}}\equiv a_1+m_1x_1'\frac{(a_2-a_1)}{\gcd(m_1,m_2)} \pmod{\text{lcm}(m_3,m_2)} \]

网上的博客太迷惑了 , 所以拓展到多次方程这里很可能有锅。
从早上到下午大概嗑了将近四个钟。

posted @ 2020-03-15 14:08  _ARFA  阅读(134)  评论(0编辑  收藏  举报