Homomorfismo del teorema chino del resto (homomorfismo de la transformación CRT)

1. Introducción al teorema del resto chino (CRT)

El teorema del resto chino trata sobre el método para resolver un sistema de ecuaciones de congruencia lineal en una variable. La descripción formal es: m 1 , m 2 , mn m_1,m_2,m_nmetro1,metro2,metronorteson n enteros primos por pares y tienen las siguientes ecuaciones de congruencia:
{ x ≡ a 1 mod m 1 x ≡ a 2 mod m 2 ... x ≡ anmod mn ( m 1 , m 2 , ⋯ , mn ) recíproco por pares \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) primo por pares Xa1modificaciónmetro1Xa2modificaciónmetro2...Xanortemodificaciónmetronorte( m1,metro2,,metronorte) Primo mutuo por pares
Ahora defineM = ∏ i = 1 nmi M=\prod_{i=1}^{n}m_iMETRO=yo = 1nortemetroyomi ′ = M mim^\prime_i=\frac{M}{m_i}metroi=metroyom, obviamente M i M_iMETROyo是整数。
timi ′ ≡ 1 mod mi t_im^\prime_i\equiv 1 \mod m_ityometroi1modificaciónmetroyo
Entonces la solución del sistema de ecuaciones de congruencia es
x ≡ ∑ i = 1 naitimi ′ mod M x\equiv \sum_{i=1}^{n} a_it_im^\prime_i \mod MXyo = 1norteayotyometroimodificaciónMETRO

Aquí están algunos ejemplos:

a es [0, 2, 4, 0]
m es [5, 7, 9, 11]
m ′ m^\primemetro es [693, 495, 385, 315]
t es [2, 3, 4, 8]

a es [1, 5, 5]
m es [5, 7, 9]
m ′ m^\primemetro es [63, 45, 35]
t es [2,5, 8]

a es [2, 5, 7, 18]
m es [5, 7, 11, 19]
m ′ m^\primemetro es [1463, 1045, 665, 385]
t es [2 4 9 4]

2. La transformación CRT es homomórfica

La transformada CRT tiene homomorfismos aditivos y multiplicativos.
Suponemos que m = [ m 1 , m 2 , ⋯ , mn ] \mathbf{m}=[m_1,m_2,\cdots,m_n]metro=[ m1,metro2,,metronorte] , cuyos elementos son primos por pares.
CampoZM = [ 0 , 1 , 2 , ⋯ , M ] Z_M=[0,1,2,\cdots, M]zm=[ 0 ,1 ,2 ,,M ] ,其中M = ∏ i = 1 nmi M=\prod_{i=1}^{n}m_iMETRO=yo = 1nortemetroyo
Entonces ZM Z_MzmLos elementos en pueden tener Z m 1 × Z m 2 × ⋯ × Z mn Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}zmetro1×zmetro2××zmetronorteLos elementos en están representados de forma única.
De Z m 1 × Z m 2 × ⋯ × Z mn Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}zmetro1×zmetro2××zmetronortea ZM Z_MzmLa transformación de es la transformación crt, y la dirección opuesta es la transformación icrt.
Usamos un vector para representar Z m 1 × Z m 2 × ⋯ × Z mn Z_{m_1} \times Z_{m_2} \times \cdots \times Z_{m_n}zmetro1×zmetro2××zmetronorteelementos en . El valor de la i-ésima dimensión es módulo mi m_imetroyode.

x , y ∈ ZM x ,y \en Z_Mx ,yzma = icrt ( x ) \mathbf{a}=\mathbf{icrt}(x)a=icrt ( x ) ,b = icrt(y) \mathbf{b}=\mathbf{icrt}(y)b=icrt ( y )
suma

si c = a + b \mathbf{c}=\mathbf{a}+\mathbf{b}C=a+b,其中ci = ( ai + bi ) mod mi c_i=(a_i+b_i) \mod m_iCyo=( unyo+byo)modificaciónmetroyo

Decimos que el teorema del resto chino tiene homomorfismo aditivo, expresado como:
x + y ≡ crt ( c ) mod M x+y \equiv \mathbf{crt}(\mathbf{c}) \mod MX+ylínea ( c )modificaciónMETRO

Prueba:
Desde cuando n > 2 n \gt 2norte>2 se puede reducir an = 2 n=2norte=2 , por lo que lo siguiente solo prueba quem = [ m 1 , m 2 ] \mathbf{m}=[m_1,m_2]metro=[ m1,metro2] situación. (k 1 , k 2 , ⋯ k_1,k_2,\cdotsk1,k2,... indica un número entero)

Del teorema del resto chino, sabemos que
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_2X=a1t1metro1+a2t2metro2+k1metro1metro2,
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_2y=b1t1metro1+a2t2metro2+k2metro1metro2.

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_2X+y=( un1+b1) t1metro1+( un2+b2) t2metro2+( k1+k2) m1metro2

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_2C1=a1+b1+k3metro1,C2=a2+b2+k4metro2
所以
crt ( 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_2línea ( c )=k3metro1t1metro1+k4metro2t2metro2+X+y+k5metro1metro2
Y m 1 ′ = m 2 , m 2 ′ = m 1 m^\prime_1=m_2,m^\prime_2=m_1metro1=metro2,metro2=metro1
所以crt ( 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+ylínea ( c )=( k3t1+k4t2+k5) m1metro2+X+y

x + y ≡ crt ( c ) mod M x+y \equiv \mathbf{crt}(\mathbf{c}) \mod MX+ylínea ( c )modificaciónMETRO

La multiplicación
define d = x ∗ y \mathbf{d}=x*yd=Xy,其中di = xiyimod mi d_i=x_iy_i \mod m_idyo=Xyoyyomodificaciónmetroyo

Entonces el teorema chino del resto tiene un homomorfismo multiplicativo. Expresado como:
x ∗ y ≡ crt ( d ) mod M x*y \equiv \mathbf{crt}(\mathbf{d}) \mod MXycrt ( re )modificaciónMETRO

Descripción:
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)Xy=( un1t1metro1+a2t2metro2+k1metro1metro2) ( segundo1t1metro1+a2t2metro2+k2metro1metro2)
m1 m 2 m_1m_2metro1metro2La sustitución múltiple de
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_2Xy=a1b1t12metro12+a2b2t22metro22+k3metro1metro2
由于t 1 m 1 ′ ≡ 1 mod m 1 , t 2 m 2 ′ ≡ 1 mod m 2 t_1m_1^\prime\equiv 1 \mod m_1,t_2m_2^\prime \equiv 1 \mod m_2t1metro11modificaciónmetro1,t2metro21modificaciónmetro2

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_2Xy=a1b1t1metro1+a2b2t2metro2+k5metro1metro2
Según la prueba anterior, sabemos que
x ∗ y ≡ crt ( d ) mod M x*y \equiv \mathbf{crt}(\mathbf{d}) \mod MXycrt ( re )modificaciónMETRO

El siguiente es el código Python de crt y su transformación inversa icrt, que es conveniente para que los lectores lo verifiquen:

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

Supongo que te gusta

Origin blog.csdn.net/watqw/article/details/132181520
Recomendado
Clasificación