中国剩余定理及扩展中国剩余定理
题目 给定数组 \(a,m\),保证所有 \(m\) 互质。请求出模方程组
\[\begin{cases}
x\equiv a_1 \pmod{m_1} \\
x\equiv a_2 \pmod{m_2} \\
\cdots \\
x\equiv a_n \pmod{m_n} \\
\end{cases}
\]
的最小正整数解。
分析 我们令 \(M=\prod_{i=1}^n m_i, w_i = \frac{M}{m_i}, p_i \equiv w_i^{-1} \pmod{m_i}, e_i = w_i p_i\),则有 \(x_0 = e_1a_1 + e_2a_2 + \cdots + e_na_n\) 是原方程组的一个解。这是因为 \(e_i \equiv w_ip_i \equiv 1 \pmod{m_i}\),而对于其它的 \(k\neq i\),总有 \(e_k\equiv w_k\equiv 0 \pmod{m_i}\)。也就是说,对于第 \(i\) 个方程,\(x_0\) 除了第 \(i\) 项为 \(a_i\) 外其他项均为 \(0\)(在模 \(m_i\) 意义下)。这便是中国剩余定理(Chinese Reminder Theorem, CRT),代码如下:
ll CRT(int n, ll *a, ll *m)
{
ll M = 1, res = 0;
for(int i = 1; i <= n; ++i)
M *= m[i];
for(int i = 1; i <= n; ++i) {
ll w = M / m[i], p = inv(w, m[i]);
res = (res + w * p * a[i]) % M;
}
return (res + M) % M;
}
仔细分析,我们就能发现该算法的不足,在于所有 \(m\) 均互质。但如果将这个保证去掉呢?
假定我们已经求得了前 \(k\) 个方程的通解 \(x + r\cdot M(r\in\mathbb{Z}, M=\prod_{i=1}^k m_i)\),现在就要求解 \(x+r\cdot M\equiv a_{k+1}\pmod{m_{k+1}}\),用扩展欧几里得莽干求解 \(r\) 就行了(雾)。这就是扩展中国剩余定理(Extended Chinese Reminder Theorem, exCRT),虽然和 CRT 完全不沾边。。。事实上,我们可以证明当 \(M=LCM_{i=1}^k m_i\) 结论依然成立。代码如下:
ll exCRT(int n, ll *a, ll *m)
{
ll M = m[1], res = a[1], x, y;
for(int i = 2; i <= n; ++i) {
ll d = exgcd(M, m[i], x, y), c = (a[i] - res % m[i] + m[i]) % m[i];
if(c % d) return -1;
x = mul(x, c / d, m[i] / d);
res += x * M, M *= m[i] / d, res = (res % M + M) % M;
}
return res;
}