描述
用于解决 x m o d a 1 = c 1 , x m o d a 2 = c 2 . . . x\mod a_1 = c_1, x \mod a_2 = c_2 ... xmoda1=c1,xmoda2=c2... 求 x x x的问题。
证明
从假设可知,对任何 i ∈ { 1 , 2 , ⋯ , n } i \in \{1, 2, \cdots , n\} i∈{1,2,⋯,n},由于$\forall j \in {1, 2, \cdots , n}, ; j\neq i, ; ; \operatorname{gcd}(m_i, m_j) = 1 , 所 以 ,所以 ,所以\operatorname{gcd}(m_i, M_i) = 1.$ 这说明存在整数 t i t_i ti使得 t i M i ≡ 1 ( m o d m i ) . t_i M_i \equiv 1 \pmod {m_i}. tiMi≡1(modmi).
对于乘积
a
i
t
i
M
i
a_i t_i M_i
aitiMi可知:
:$a_i t_i M_i \equiv a_i \cdot 1 = a_i \pmod {m_i}, $
😒\forall j \in {1, 2, \cdots , n}, ; j\neq i, ; ; a_j t_j M_j \equiv 0 \pmod {m_i}. $
所以
x
=
a
1
t
1
M
1
+
a
2
t
2
M
2
+
⋯
+
a
n
t
n
M
n
x = a_1 t_1 M_1 + a_2 t_2 M_2 + \cdots + a_n t_n M_n
x=a1t1M1+a2t2M2+⋯+antnMn满足:
😒\forall i \in {1, 2, \cdots , n}, ; ; x = a_i t_i M_i + \sum_{j \neq i} a_j t_j M_j \equiv a_i + \sum_{j \neq i} 0 = a_i \pmod {m_i}. $
这说明
x
x
x就是方程组的一个解。
代码
int CRT(int a[],int m[],int n)
{
int M = 1;
int ans = 0;
for(int i=1; i<=n; i++)
M *= m[i];
for(int i=1; i<=n; i++)
{
int x, y;
int Mi = M / m[i];
extend_Euclid(Mi, m[i], x, y);
ans = (ans + Mi * x * a[i]) % M;
}
if(ans < 0) ans += M;
return ans;
}