中国剩余定理(CRT)及扩展

大数翻倍法

中国剩余定理

定义

中国剩余定理 (Chinese Remainder Theorem, CRT) 可以用来解出如下形式的 一元线性同余方程。(其中 \(n_1,n_2\dots n_k\) 两两互质)

\[\begin{cases} x\equiv a_1\pmod {n_1}\\ x\equiv a_2\pmod {n_2}\\ \ \ \ \ \vdots\\ x\equiv a_k\pmod {n_k} \end{cases} \]

这个方程是个什么意思?

\[x 模 n_1 等于 a_1, x 模 n_2 等于 a_2, x 模 n_3 等于 a_3,\\ \dots\\ x 模 n_k 等于 a_k \]

古代的「物不知数」问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
是否与之极其相似

该问题最早见于《孙子算经》中,并有该问题的具体解法。宋朝数学家秦九韶于 1247 年《数书九章》卷一、二《大衍类》对「物不知数」问题做出了完整系统的解答。上面具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。

推导

对于「物不知数」问题,设 \(k_1\) 为一个除 \(3\)\(2\) 的数,\(k_2\) 为一个除 \(5\)\(3\)\(k_3\) 为一个除 \(7\)\(2\) 的数。

由此可得,

\[\begin{cases} k_1 \bmod 3 = 2 \\ k_2 \bmod 5 = 3 \\ k_3 \bmod 7 = 2 \end{cases} \]

由模运算的性质可知,\(a+t\times b\equiv a\pmod b\),在模 \(b\) 的意义下,加上一个 \(b\) 的倍数的数,对答案无影响。

那如果 \(k_2\)\(k_3\) 均是 \(3\) 的倍数的话,

\[(k_1+k_2+k_3)\bmod 3 = 2 \]

那么同理可得:

\[\begin{cases} (k_1+k_2+k_3)\bmod 3 = 2,\ \ \ \ \ \ (3\mid k_2,\ 3\mid k_3)\\\\ (k_1+k_2+k_3)\bmod 5 = 3,\ \ \ \ \ \ (5\mid k_1,\ 5\mid k_3)\\\\ (k_1+k_2+k_3)\bmod 7 = 2,\ \ \ \ \ \ (7\mid k_1,\ 7\mid k_2)\\ \end{cases} \]

很明显其中的 \(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\)。然后有:

\[\because k_i =m_i\times y_i,\ \ \ k_i\equiv a_i\pmod{n_i}\\\ \ \therefore a_i\equiv m_i\times y_i\pmod{n_i}\\\\ m_i\times y_i\equiv a_i\pmod {n_i}\\ m_i\times [m_i^{-1}]\equiv 1 \pmod {n_i},\ \ \ \ \ \ [m_i^{-1}] = \frac{y_i}{a_i}\\ \therefore y_i = a_i\times [m_i^{-1}]\\ \]

所以说 \(k_i\) 等于 \(a_i\times [m_i^{-1}]\times m_i\),其中 \([m_i^{-1}]\)\(m_i\) 在模 \(n_i\) 意义下的逆元。

\[x_0 = (a_1[m_1^{-1}]m_1+a_2[m_2^{-1}]m_2+\dots+a_n[m_n^{-1}]m_n)\pmod M \]

其中有
\( 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)\) 的等式。

实现过程

  1. 先计算出 \(M\)\(\prod_{i=1}^{k}n_i\)

  2. 对于每个方程组来说,

    1. \(m_i\)\(\frac{M}{n_i}\)

    2. 计算出 \(m_i^{-1}\)\(m_i\) 在模 \(n_i\) 下的逆元;

  3. 对于该线性同余方程在模 \(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\) 两两并不互质。

\[\begin{cases} x\equiv a_1\pmod {n_1}\\ x\equiv a_2\pmod {n_2}\\ \ \ \ \ \vdots\\ x\equiv a_k\pmod {n_k} \end{cases} \]

合并

\(k=2\) 时,这时仅存在两个同余方程 \(x\equiv a_1\pmod {n_1}\)\(x\equiv a_2\pmod {n_2}\)

我们将方程写出 不定方程的形式

\[x = a_1 + x_1\times n_1 = a_2 + x_2\times n_2 \]

可以得到

\[n_1\times x_1-n_2\times x_2 = a_2 - a_1 \]

那么这个等式可以用 扩展欧几里得 来求出一组最小的整数解 \(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

posted @ 2023-01-11 20:07  Ciaxin  阅读(102)  评论(0编辑  收藏  举报