中国剩余定理是关于求解一元线性同余方程组的方法,用形式化的描述就是: 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]
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