扩展中国剩余定理(EXCRT)

中国剩余定理(CRT)能解决模数互质情况的模线性同余方程组。这是中国剩余定理的原理所决定的。

但当我们的模数不互质时,这个方式显然就寄掉了,因此我们要打破原有的思路,去找一个新的方式解不定方程组,这时我们的扩展中国剩余定理(EXCRT)就出现了

假设我们现在有如下不定方程组

\[\begin{cases} x \equiv r_1(mod \ m_1) \\ x \equiv r_2(mod \ m_2) \\ x \equiv r_3 (mod \ m_3) \\ \cdot \cdot \cdot \cdot \cdot \cdot \cdot\end{cases} \]

我们用扩展中国剩余定理(EXCRT)最重要的任务就是合并方程 (究竟是什么神在出这种鬼畜的解题方式啊!!!正常人能想到合并方程???也许是我太弱了了叭QAQ)

显然我们可以得到 $ x = m_1k_1 + r_1 = m_2k_2 + r_2$ ---------- \((1)\)

则我们移项可得 $ m_1k_1 + m_2k_2 = r_2 - r_1$ ---------- \((2)\)

这里我们 \(m_2k_2\) 的系数变为正,是因为 \(k_2\) 是任意整数,所以前面的系数不会影响整个式子)

我们已知式子 \(m_1p_1 + m_2p_2 = \gcd(m_1,m_2)\)\(d\) 设为 $ \gcd(m_1,m_2) $ 。

根据裴蜀定理,此时我们要进行判断,判断 \(r_2-r_1\) 是否为 \(\gcd(m_1,m_2)\) 的倍数,若是,那么有解,若不是,那么无解。

判断完是否有解后我们可以的到一个显然的式子 \(m_1p_1+m_2p_2+km_1m_2-km_1m_2=m_1p_1+m_2p_2=d=\gcd(m_1,m_2)\)(因为此时 \(k\) 没有任何限制,所以 \(k = \dfrac {p} {r_2-r_1},p \in \mathbb{Z}\)

此时最左边的式子我们可以化简为 \(m_1(p_1+km_2)+m_2(p_2-km_1)=d\)

由于我们要找到原式子的通解,所以此时我们将等式两边同乘 $ \dfrac {r_2-r_1}{\gcd(m_1,m_2)} $

则可以得到式子 \(m_1(\dfrac {p_1(r_2-r_1)}{\gcd(m_1,m_2)} + \dfrac {km_2(r_2-r_1)}{\gcd(m_1,m_2)}) + m_2(\dfrac {p_2(r_2-r_1)}{\gcd(m_1,m_2)}- \dfrac {km_1(r_2-r_1)}{\gcd(m_1,m_2)}) = r_2-r_1\) ---------- \((3)\)

由上面的等式 \((2)\) 得可将 \((3)\) 式右面 \(r_2-r_1\) 的式子代换成 $ m_1k_1 + m_2k_2 $

从而得到的等式 $m_1(\dfrac {p_1(r_2-r_1)}{\gcd(m_1,m_2)} + \dfrac {km_2(r_2-r_1)}{\gcd(m_1,m_2)}) + m_2(\dfrac {p_2(r_2-r_1)}{\gcd(m_1,m_2)}- \dfrac {km_1(r_2-r_1)}{\gcd(m_1,m_2)}) = m_1k_1 + m_2k_2 $

由此我们显然可以得到

\[m_1k_1 = m_1(\dfrac {p_1(r_2-r_1)}{\gcd(m_1,m_2)} + \dfrac {km_2(r_2-r_1)}{\gcd(m_1,m_2)}) \]

\[m_2k_2 = m_2(\dfrac {p_2(r_2-r_1)}{\gcd(m_1,m_2)} - \dfrac {km_1(r_2-r_1)}{\gcd(m_1,m_2)}) \]

消掉第一个式子中的 \(m_1\) 。则我们求得 \(k_1=p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + km_2 \dfrac {(r_2-r_1)}{\gcd(m_1,m_2)}\) ---------- \((4)\)

由于 \(k = \dfrac {p} {r_2-r_1},p \in \mathbb{Z}\) ,因此我们可以使 $ k(r_2-r_1) = \dfrac {p} {r_2-r_1} \cdot (r_2-r_1) = p$ 由此系数化成 \(m_2 \dfrac {1}{\gcd(m_1,m_2)}\) ,本项变成 \(pm_2 \dfrac {1}{\gcd(m_1,m_2)}\)

则得到了\(k_1=p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + pm_2 \dfrac {1}{\gcd(m_1,m_2)}\)

此时我们就求得了原式的一个通解 \(k_1\) 。因为如果直接将式子带入代码中很可能会溢出,所以我们要先将 \(k_1\) 的最小整数解求出。

而求最小正整数解的方法是先将 \(pm_2 \dfrac {1}{\gcd(m_1,m_2)}\) 用模数 \(\dfrac {m_2}{\gcd(m_1,m_2)}\) 先模去成为 \(0\) ,并且同时将 \(p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)}\)\(\dfrac {m_2}{\gcd(m_1,m_2)}\) 模。然后将式子加上模数 \(\dfrac {m_2}{\gcd(m_1,m_2)}\) 防止出现负数,最后再模上 \(\dfrac {m_2}{\gcd(m_1,m_2)}\)\(p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)}\) 不是负数但是加上了模数 \(\dfrac {m_2}{\gcd(m_1,m_2)}\) 的情况模去。

k1 = k1 * (r2 - r1) / gcd;//求出式子里的前半部分
k1= (k1 % (m2 / gcd) + (m2 / gcd)) % (m2 / gcd);
//这里的k1要先模式为了防止出现负数的情况

然后我们将现在得到的等式 \((4)\) 带入等式 \((1)\) 则显然可以得到

\[x = m_1(p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + pm_2 \dfrac {1}{\gcd(m_1,m_2)}) + r_1 \]

从而得到最终的式子

\[x = p_1m_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + pm_1m_2 \dfrac {1}{\gcd(m_1,m_2)} + r_1 \]

我们此时显然是知道 \(m_1,m_2,r_1,r_2,p_1,\gcd(m_1,m_2)\) 的值,但我们不知道 \(p\) 的值,那么这时我们只要模上 \(p\) 的系数即可消掉 \(p\) 。即把模数变为 \(m_1m_2 \dfrac {(r_2-r_1)}{\gcd(m_1,m_2)}\)

此时我们就将两个不定方程组合并完成了

\(x \equiv p_1m_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + r_1 (mod \ \dfrac {m_1m_2}{\gcd(m_1,m_2)})\)

则此时新的不定方程的 \(r\)\(p_1m_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + r_1\) , \(m\)\(\dfrac {m_1m_2}{\gcd(m_1,m_2)}\)

所以此时的 \(p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)}\) 显然可以等价为 \(p_1\dfrac {(r_2-r_1)}{\gcd(m_1,m_2)} + pm_1m_2 \dfrac {1}{\gcd(m_1,m_2)}(p \in \mathbb{Z})\) ---------- \((5)\)(此时有模 \(\dfrac {m_1m_2}{\gcd(m_1,m_2)}\) 的条件在,因此我们加不加上 \(pm_1m_2 \dfrac {1}{\gcd(m_1,m_2)}\) 都不会对原式子的值产生影响) 。

因为我们先前求最优整数解的模数是 \(\dfrac {m_2}{\gcd(m_1,m_2)}\), 依然可以把这个式子 \((5)\) 模成我们先前求得最小正整数解 \(x\) ,可以直接乘上去

所以可表示为 \(r = m_1x + r_1\), \(m = \dfrac {m_1m_2} {\gcd(m_1,m_2)}\)

再继续往下合并

最后我们可以合并成唯一一个式子 \(x \equiv r(mod \ m)\)

\(x\) 的最小整数解为 $ x = ( r \ mod \ m + m ) \ mod \ m $

\(r \ mod \ m+m\) 中加 \(m\) 是为了防止出现 \(r\) 为负数的情况)

posted @ 2023-06-15 16:49  觉清风  阅读(50)  评论(3编辑  收藏  举报