中国剩余定理CRT
正整数m1,m2,…,mk两两互素,对b1,b2,…,bk的同余式组为
{
x
≡
b
1
m
o
d
m
1
x
≡
b
2
m
o
d
m
2
⋮
x
≡
b
k
m
o
d
m
k
\begin{cases} x \equiv b_1\; mod \;m_1\\ x \equiv b_2\; mod \;m_2\\ \quad\quad\vdots\\ x \equiv b_k\; mod \;m_k\\ \end{cases}
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x≡b1modm1x≡b2modm2⋮x≡bkmodmk
在mod M
M
=
∏
i
=
1
k
m
i
M = \prod_{i = 1}^{k}m_i
M=i=1∏kmi
的情况下有唯一解
x
=
(
∑
i
=
1
k
b
i
M
i
M
i
′
)
m
o
d
M
x = (\sum_{i=1}^k b_iM_iM'_i)\;mod\;M
x=(i=1∑kbiMiMi′)modM
其中
M
i
=
M
m
i
M_i = \frac{M}{m_i}
Mi=miM
M i ′ = M i − 1 m o d m i M'_i = M_i^{-1}\;mod\;m_i Mi′=Mi−1modmi
python代码实现:
import gmpy2
def crt(b,m):
#判断是否互素
for i in range(len(m)):
for j in range(i+1,len(m)):
if gmpy2.gcd(m[i],m[j]) != 1:
print("m中含有不是互余的数")
return -1
#乘积
M = 1
for i in range(len(m)):
M *= m[i]
#求M/mi
Mm = []
for i in range(len(m)):
Mm.append(M // m[i])
#求Mm[i]的乘法逆元
Mm_ = []
for i in range(len(m)):
_,a,_ = gmpy2.gcdext(Mm[i],m[i])
Mm_.append(int(a % m[i]))
#求MiM'ibi的累加
y = 0
for i in range(len(m)):
print(Mm[i] * Mm_[i] * b[i])
y += (Mm[i] * Mm_[i] * b[i])
y = y % M
return y