中国剩余定理(CRT)及扩展
中国剩余定理
定义
中国剩余定理 (Chinese Remainder Theorem, CRT) 可以用来解出如下形式的 一元线性同余方程。(其中 \(n_1,n_2\dots n_k\) 两两互质)
这个方程是个什么意思?
该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:
三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。
推导
对于「物不知数」问题,设 \(k_1\) 为一个除 \(3\) 余 \(2\) 的数,\(k_2\) 为一个除 \(5\) 余 \(3\),\(k_3\) 为一个除 \(7\) 余 \(2\) 的数。
由此可得,
由模运算的性质可知,\(a+t\times b\equiv a\pmod b\),在模 \(b\) 的意义下,加上一个 \(b\) 的倍数的数,对答案无影响。
那如果 \(k_2\) 与 \(k_3\) 均是 \(3\) 的倍数的话,
那么同理可得:
很明显其中的 \(k_1+k_2+k_3\) 就可能是 \(x\) 的值,同时对 \(\sum k_i\) 模 \(\prod n_i\) (因为 \(n_i\) 两两互质,所以此时为 \(n_i\) 的最小公倍数)可以得到 \(x\) 的最小整数解。
因为有 \(a+t\times b\equiv a\pmod b\),所以 \(\forall\ i \le k,\ y\in\Z,\ \ x+y\times \prod n_i\equiv x\pmod{n_i}\).
现在的问题转换成了如何求解 \(k_i\).
由上述方程可知,\(k_i\) 会被除 \(n_i\) 的所有的 \(n\) 整除,即 \(k_i\) 是 \(lcm(n_j),j\not=i\) 的倍数,因为 \(n_i\) 两两互质,所以 \(lcm(n_j) = \frac{\prod n}{n_i}\)。
所以 设 \(m_i = \frac{\prod n}{n_i}\),则 \(k_i = m_i\times y\)。然后有:
所以说 \(k_i\) 等于 \(a_i\times [m_i^{-1}]\times m_i\),其中 \([m_i^{-1}]\) 为 \(m_i\) 在模 \(n_i\) 意义下的逆元。
其中有
\( m_i\times y_i\bmod n_i= a_i\bmod n_i\\ a_i\times(m_i\times\frac{y_i}{a_i})\bmod n_i = a_i\bmod n_i\\ m_i\times\frac{y_i}{a_i}\bmod n_i = 1\bmod n_i \)
的推导过程,出现了 \((k\times a)\bmod b = k\times(a \bmod b)\) 的等式。
实现过程
-
先计算出 \(M\) 为 \(\prod_{i=1}^{k}n_i\);
-
对于每个方程组来说,
-
设 \(m_i\) 为 \(\frac{M}{n_i}\);
-
计算出 \(m_i^{-1}\) 为 \(m_i\) 在模 \(n_i\) 下的逆元;
-
-
对于该线性同余方程在模 \(M\) 的唯一解为 \(x = \sum_{i=1}^{k}a_i\times [m_i^{-1}]\times m_i\pmod M\)
int CRT(int* a, int* n, int k)
{
int M = 1, ans = 0;
for (int i = 1; i <= k ; ++ i)
M *= n[i];
for (int i = 1, x, y, Mi; i <= k; ++ i)
{
Mi = M/n[i];
exgcd(Mi, n[i], x, y); // get the inv
ans = (ans + Mi*x*a[i])%M;
}
if (ans < 0) ans += M;
return ans%M;
}
扩展中国剩余定理
扩展中国剩余定理(EXCRT) 还是求解形如如下的线性同余方程,但 \(n_1,n_2\dots n_k\) 两两并不互质。
合并
当 \(k=2\) 时,这时仅存在两个同余方程 \(x\equiv a_1\pmod {n_1}\) 和 \(x\equiv a_2\pmod {n_2}\)。
我们将方程写出 不定方程的形式
可以得到
那么这个等式可以用 扩展欧几里得 来求出一组最小的整数解 \(x_1\) 与 \(x_2\)。将 \(x_1\) 带入 \(a_1+ x_1 \times n_1\) 中得到一个特解 \(x^*\)。
【定理】:我们有一个特解 \(x^*\),那么\(\begin{cases}x\equiv a_1\pmod {n_1}\\x\equiv a_2\pmod {n_2}\end{cases}\) 的通解为 \(x^*+k\sdot\text{lcm}(n_1,n_2)\),即
\[x\equiv x^{*} \pmod {\text{lcm}(n_1,n_2)} \]
由此可以将两个同余方程化作一个等效的同余方程,那么这样进行多次的合并就能将这样的线性同余方程化作一个方程,即答案。
唯一性证明
当然在 RuanXingZhi的博客 中有对其做出证明,了解即可。
接下来唯一需要说明的事情就是:为什么任意一个完全剩余系里面,只会有一个解?这个问题等价于:为什么 \(0, 1,2,\cdots ,\text{lcm}(m_1, m_2)\) 里面,只有一个解?
证明解的唯一性,常常采用这样一种手段:假设 \(x, y\) 都是原问题的解,然后经过一系列推理,得到 \(x=y\),于是解的唯一性就不言而喻了。我们也采用这种手段来解决唯一性问题。设上述集合里面有 \(0\le x,y,\le \text{lcm}(n_1,n_2)\),满足
\[\begin{cases} x\equiv a_1\pmod {n_1}\\ x\equiv a_2\pmod {n_2}\\ \end{cases} \ \ ,\ \ \begin{cases} y\equiv a_1\pmod {n_1}\\ y\equiv a_2\pmod {n_2}\\ \end{cases} \]设 \(x > y\),可以发现
\[\begin{cases} (x-y)\bmod n_1 = 0\\ (x-y)\bmod n_2 = 0\\ \end{cases} \ \ \Rightarrow\ \ \text{lcm}(n_1,n_2)\mid (x-y) \]因为 \(x\) 与 \(y\) 都是小于等于 \(\text{lcm}(n_1,n_2)\) 的数,所以 \(x-y\) 也一定小于等于 \(\text{lcm}(n_1,n_2)\),但是 \(\text{lcm}(n_1,n_2)\) 整除 \(x- y\),所以此时 \(x-y = 0\),即 \(x = y\)。所以在一个完全剩余系中,有且仅有一个解。
转载于:https://www.luogu.com.cn/blog/blue/kuo-zhan-zhong-guo-sheng-yu-ding-li