1、中国剩余定理简介(Chinese Remainder Theory,CRT)
中国剩余定理是关于求解一元线性同余方程组的方法,用形式化的描述就是:
m
1
,
m
2
,
m
n
m_1,m_2,m_n
m1,m2,mn是两两互素的n个整数,有下面的同余方程组:
{
x
≡
a
1
m
o
d
m
1
x
≡
a
2
m
o
d
m
2
.
.
.
x
≡
a
n
m
o
d
m
n
(
m
1
,
m
2
,
⋯
,
m
n
)
两两互素
\left\{ \begin{array}{lr} x\equiv a_1 \mod m_1& \\ x \equiv a_2 \mod m_2\\ ... \\ x\equiv a_n \mod m_n & \end{array} \right. (m_1,m_2,\cdots,m_n)两两互素
⎩
⎨
⎧x≡a1modm1x≡a2modm2...x≡anmodmn(m1,m2,⋯,mn)两两互素
现在定义
M
=
∏
i
=
1
n
m
i
M=\prod_{i=1}^{n}m_i
M=∏i=1nmi,
m
i
′
=
M
m
i
m^\prime_i=\frac{M}{m_i}
mi′=miM,显然
M
i
M_i
Mi是整数。
令
t
i
m
i
′
≡
1
m
o
d
m
i
t_im^\prime_i\equiv 1 \mod m_i
timi′≡1modmi
那么同余方程组的解为
x
≡
∑
i
=
1
n
a
i
t
i
m
i
′
m
o
d
M
x\equiv \sum_{i=1}^{n} a_it_im^\prime_i \mod M
x≡i=1∑naitimi′modM
下面给出几个例子:
a is [0, 2, 4, 0]
m is [5, 7, 9, 11]
m ′ m^\prime m′ is [693, 495, 385, 315]
t is [2, 3, 4, 8]
a is [1, 5, 5]
m is [5, 7, 9]
m ′ m^\prime m′ is [63, 45, 35]
t is [2,5, 8]
a is [2, 5, 7, 18]
m is [5, 7, 11, 19]
m ′ m^\prime m′ is [1463, 1045, 665, 385]
t is [2 4 9 4]
2、CRT变换是同态的
CRT变换具有加法同态和乘法同态。
我们假设存在
m
=
[
m
1
,
m
2
,
⋯
,
m
n
]
\mathbf{m}=[m_1,m_2,\cdots,m_n]
m=[m1,m2,⋯,mn],其元素是两两互素的。
域
Z
M
=
[
0
,
1
,
2
,
⋯
,
M
]
Z_M=[0,1,2,\cdots, M]
ZM=[0,1,2,⋯,M],其中
M
=
∏
i
=
1
n
m
i
M=\prod_{i=1}^{n}m_i
M=∏i=1nmi
那么
Z
M
Z_M
ZM中的元素可以有
Z
m
1
×
Z
m
2
×
⋯
×
Z
m
n
Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}
Zm1×Zm2×⋯×Zmn中的元素来唯一表示。
从
Z
m
1
×
Z
m
2
×
⋯
×
Z
m
n
Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}
Zm1×Zm2×⋯×Zmn到
Z
M
Z_M
ZM的变换为crt变换,反方向为icrt变换。
我们使用一个向量来表示
Z
m
1
×
Z
m
2
×
⋯
×
Z
m
n
Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}
Zm1×Zm2×⋯×Zmn中的元素。第i维的值是模
m
i
m_i
mi的。
令
x
,
y
∈
Z
M
x ,y \in Z_M
x,y∈ZM,
a
=
i
c
r
t
(
x
)
\mathbf{a}=\mathbf{icrt}(x)
a=icrt(x),
b
=
i
c
r
t
(
y
)
\mathbf{b}=\mathbf{icrt}(y)
b=icrt(y)
加法
定义 c = a + b \mathbf{c}=\mathbf{a}+\mathbf{b} c=a+b,其中 c i = ( a i + b i ) m o d m i c_i=(a_i+b_i) \mod m_i ci=(ai+bi)modmi
我们说中国剩余定理有加法同态,表示为:
x
+
y
≡
c
r
t
(
c
)
m
o
d
M
x+y \equiv \mathbf{crt}(\mathbf{c}) \mod M
x+y≡crt(c)modM
证明:
由于当
n
>
2
n \gt 2
n>2时可以归约到
n
=
2
n=2
n=2的情况,所以,下面只证明
m
=
[
m
1
,
m
2
]
\mathbf{m}=[m_1,m_2]
m=[m1,m2]的情况。(
k
1
,
k
2
,
⋯
k_1,k_2,\cdots
k1,k2,⋯表示整数)
由中国剩余定理,我们知道
x
=
a
1
t
1
m
1
′
+
a
2
t
2
m
2
′
+
k
1
m
1
m
2
x=a_1t_1m^\prime_1+a_2t_2m^\prime_2 + k_1m_1m_2
x=a1t1m1′+a2t2m2′+k1m1m2,
y
=
b
1
t
1
m
1
′
+
a
2
t
2
m
2
′
+
k
2
m
1
m
2
y=b_1t_1m^\prime_1+a_2t_2m^\prime_2 + k_2m_1m_2
y=b1t1m1′+a2t2m2′+k2m1m2.
x + y = ( a 1 + b 1 ) t 1 m 1 ′ + ( a 2 + b 2 ) t 2 m 2 ′ + ( k 1 + k 2 ) m 1 m 2 x+y=(a_1+b_1)t_1m^\prime_1+(a_2+b_2)t_2m^\prime_2 + (k_1+k_2)m_1m_2 x+y=(a1+b1)t1m1′+(a2+b2)t2m2′+(k1+k2)m1m2
c
1
=
a
1
+
b
1
+
k
3
m
1
,
c
2
=
a
2
+
b
2
+
k
4
m
2
c_1=a_1+b_1+k_3m_1,c_2=a_2+b_2+k_4m_2
c1=a1+b1+k3m1,c2=a2+b2+k4m2
所以
c
r
t
(
c
)
=
k
3
m
1
t
1
m
1
′
+
k
4
m
2
t
2
m
2
′
+
x
+
y
+
k
5
m
1
m
2
\mathbf{crt}(c)=k_3m_1t_1m^\prime_1+k_4m_2t_2m^\prime_2+x+y+k_5m_1m_2
crt(c)=k3m1t1m1′+k4m2t2m2′+x+y+k5m1m2
又有
m
1
′
=
m
2
,
m
2
′
=
m
1
m^\prime_1=m_2,m^\prime_2=m_1
m1′=m2,m2′=m1
所以
c
r
t
(
c
)
=
(
k
3
t
1
+
k
4
t
2
+
k
5
)
m
1
m
2
+
x
+
y
\mathbf{crt}(c)=(k_3t_1+k_4t_2+k_5)m_1m_2+x+y
crt(c)=(k3t1+k4t2+k5)m1m2+x+y
即
x
+
y
≡
c
r
t
(
c
)
m
o
d
M
x+y \equiv \mathbf{crt}(\mathbf{c}) \mod M
x+y≡crt(c)modM
乘法
定义
d
=
x
∗
y
\mathbf{d}=x*y
d=x∗y,其中
d
i
=
x
i
y
i
m
o
d
m
i
d_i=x_iy_i \mod m_i
di=xiyimodmi
那么中国剩余定理有乘法同态。表示为:
x
∗
y
≡
c
r
t
(
d
)
m
o
d
M
x*y \equiv \mathbf{crt}(\mathbf{d}) \mod M
x∗y≡crt(d)modM
证明:
x
∗
y
=
(
a
1
t
1
m
1
′
+
a
2
t
2
m
2
′
+
k
1
m
1
m
2
)
(
b
1
t
1
m
1
′
+
a
2
t
2
m
2
′
+
k
2
m
1
m
2
)
x*y=(a_1t_1m^\prime_1+a_2t_2m^\prime_2 + k_1m_1m_2)(b_1t_1m^\prime_1+a_2t_2m^\prime_2 + k_2m_1m_2)
x∗y=(a1t1m1′+a2t2m2′+k1m1m2)(b1t1m1′+a2t2m2′+k2m1m2)
将
m
1
m
2
m_1m_2
m1m2的倍数代换有
x
∗
y
=
a
1
b
1
t
1
2
m
1
′
2
+
a
2
b
2
t
2
2
m
2
′
2
+
k
3
m
1
m
2
x*y=a_1b_1t_1^2m_1^{\prime2}+a_2b_2t_2^2m_2^{\prime2}+k_3m_1m_2
x∗y=a1b1t12m1′2+a2b2t22m2′2+k3m1m2
由于
t
1
m
1
′
≡
1
m
o
d
m
1
,
t
2
m
2
′
≡
1
m
o
d
m
2
t_1m_1^\prime\equiv 1 \mod m_1,t_2m_2^\prime \equiv 1 \mod m_2
t1m1′≡1modm1,t2m2′≡1modm2
有
x
∗
y
=
a
1
b
1
t
1
m
1
′
+
a
2
b
2
t
2
m
2
′
+
k
5
m
1
m
2
x*y=a_1b_1t_1m_1^\prime+a_2b_2t_2m_2^\prime+k_5m_1m_2
x∗y=a1b1t1m1′+a2b2t2m2′+k5m1m2
根据前面的证明,我们知道
x
∗
y
≡
c
r
t
(
d
)
m
o
d
M
x*y \equiv \mathbf{crt}(\mathbf{d}) \mod M
x∗y≡crt(d)modM
下面给出crt和其逆变换icrt的python代码,便于读者验证:
import gmpy2
import numpy as np
#the elements in bases should be co-prime
def crt(a,bases):
bases=np.array(bases,dtype=gmpy2.mpz)
M=np.prod(bases)
m_prime=[np.prod(bases[bases!=bases[i]]) for i in range(len(bases))]
b=[gmpy2.invert(m_prime[i],bases[i]) for i in range(len(bases))]
res=gmpy2.mpz(0)
for i in range(len(bases)):
res=(res+a[i]*b[i]*m_prime[i])%M
res=np.array(res,dtype=int)
return res,M
def icrt(r,bases):
res=[r%bases[i] for i in range(len(bases))]
return res