中国剩余定理笔记与模板

中国剩余定理

结论

方程组xci(modmi)(i=1,2,3,,n)x \equiv c_i \pmod{m_i} \quad (i=1, 2, 3, \ldots, n).其中mim_i[两两互质]{.underline}。

中国剩余定理是说,这样的线性同余方程组的通解是x=x0+Mt, tZx=x_0+Mt, \, t \in Z.其中M=i=1nmiM=\prod\limits_{i=1}^{n}m_i,即所有模数的乘积;x0=(i=1nciMiMimi1) mod Mx_0={ \left( \sum\limits_{i=1}^{n} c_i M_i {M_i}_{m_i}^{-1} \right) \bmod M }.其中Mi=MmiM_i=\frac{M}{m_i},即MiM_i是除掉第ii个模数mim_i之外所有模数的积;Mimi1{M_i}_{m_i}^{-1}MiM_i关于模数mim_i的逆元。显然模M意义下,解有且只有一个,即x0x_0

证明

只需要证明下面三个子命题,就可以得到通解必须是上面的所述。

  1. 证明x0x_0是一个特解。
  2. 所有解都可以表示成x0+Mtx_0+Mt

子命题1的证明

对于第ii个方程xci(modmi)x \equiv c_i \pmod{m_i},求和式x0=(j=1ncjMjMjmj1) mod Mx_0 = \left( \sum\limits_{j=1}^{n} c_j M_j {M_j}_{m_j}^{-1} \right) \bmod M(为了避免歧义,把求和式中的枚举下标换成j了)。

  1. j=ij=i,则cjMjMjmj1 mod mi=ci mod mic_j M_j {M_j}_{m_j}^{-1} \bmod m_i = c_i \bmod m_i.因为Mjmj1{M_j}_{m_j}^{-1}就是MjM_j在模mjm_j意义下的逆元,当你计算他们的乘积模mjm_j时,自然等于1了。
  2. jij \neq i,而MjM_j是除了mjm_j之外所有模数的乘积,自然含有因数mim_i了,因此,cjMjMjmj1 mod mi=0c_j M_j {M_j}_{m_j}^{-1} \bmod m_i = 0
    所以这个求和式在模mim_i意义下只有第ii项有贡献,且贡献恰好是cic_i.因此,满足第ii个方程,由于ii是任意的,所以x0x_0满足所有方程,是方程组的一个特解。

子命题2的证明

假设有一个解x1x_1
则显然有x1x00(modmi)(i=1,2,3,,n)x_1-x_0 \equiv 0 \pmod{m_i} \quad (i=1, 2, 3, \ldots, n).
因此x1x0=lcm(m1,m2,m3,,mn)×t=Mt(tZ)x_1-x_0=lcm(m_1,m_2,m_3,\ldots,m_n) \times t=Mt \quad (t \in Z).
于是任意解都可以表示成x0+Mtx_0+Mt的形式。

Code

// m两两互质
// 当模数是long long的时候,两个数相乘要用__int128
// 当模数是__int128的时候,使用ex_gcd解线性同余方程组或者使用快速模乘防止爆__int128
bool chinese_remainder_theory(int n, ll c[], ll m[], ll &x, ll &k) {
	ll &M = k;
	ll Mi, inv_Mi;
	__int128 t;
	M = 1; x = 0;
	for (int i= 0; i < n; ++i) M *= m[i];
	for (int i = 0; i < n; ++i) {
		Mi = M/m[i];
		multiplicative_inverse(Mi,m[i],inv_Mi); // 肯定存在
		t = c[i]%M;
		t = t*Mi%M;
		t = t*inv_Mi%M; // 防止爆long long
		x = (x+(ll)t)%M;
	}
	return true;
}
posted @ 2019-09-09 00:56  我云知世就是力量  阅读(205)  评论(0)    收藏  举报