Skip to Content

Teorema Chino del Resto

El Teorema Chino del Resto (al que nos referiremos como CRT en el resto de este artículo) fue descubierto por el matemático chino Sun Zi.

Formulación

Sea m=m1m2mkm = m_1 \cdot m_2 \cdots m_k, donde los mim_i son coprimos dos a dos. Además de los mim_i, se nos da un sistema de congruencias

{aa1(modm1)aa2(modm2)aak(modmk)\left{aamp;amp;a1(modm1)aamp;amp;a2(modm2)amp;amp;aamp;amp;ak(modmk)\begin{array}{rcl} a & \equiv & a_1 \pmod{m_1} \ a & \equiv & a_2 \pmod{m_2} \ & \vdots & \ a & \equiv & a_k \pmod{m_k} \end{array}\right.

donde los aia_i son constantes dadas. La forma original del CRT afirma entonces que el sistema de congruencias dado siempre tiene una y exactamente una solución módulo mm.

P. ej. el sistema de congruencias

{a2(mod3)a3(mod5)a2(mod7)\left{aamp;amp;2(mod3)aamp;amp;3(mod5)aamp;amp;2(mod7)\begin{array}{rcl} a & \equiv & 2 \pmod{3} \ a & \equiv & 3 \pmod{5} \ a & \equiv & 2 \pmod{7} \end{array}\right.

tiene la solución 2323 módulo 105105, porque 23mod3=223 \bmod{3} = 2, 23mod5=323 \bmod{5} = 3 y 23mod7=223 \bmod{7} = 2. Podemos escribir todas las soluciones como 23+105k23 + 105\cdot k para kZk \in \mathbb{Z}.

Corolario

Una consecuencia del CRT es que la ecuación

xa(modm)x \equiv a \pmod{m}

es equivalente al sistema de ecuaciones

{xa1(modm1)xak(modmk)\left{xamp;amp;a1(modm1)amp;amp;xamp;amp;ak(modmk)\begin{array}{rcl} x & \equiv & a_1 \pmod{m_1} \ & \vdots & \ x & \equiv & a_k \pmod{m_k} \end{array}\right.

(Como arriba, suponemos que m=m1m2mkm = m_1 m_2 \cdots m_k y que los mim_i son coprimos dos a dos).

Solución para dos módulos

Consideremos un sistema de dos ecuaciones para m1,m2m_1, m_2 coprimos:

{aa1(modm1)aa2(modm2) \left{aamp;a1(modm1)aamp;a2(modm2)\begin{align} a &\equiv a_1 \pmod{m_1} \ a &\equiv a_2 \pmod{m_2} \ \end{align}\right.

Queremos hallar una solución para a(modm1m2)a \pmod{m_1 m_2}. Usando el Algoritmo de Euclides extendido podemos hallar coeficientes de Bézout n1,n2n_1, n_2 tales que

n1m1+n2m2=1.n_1 m_1 + n_2 m_2 = 1.

De hecho n1n_1 y n2n_2 son simplemente los inversos modulares de m1m_1 y m2m_2 módulo m2m_2 y m1m_1. Tenemos n1m11(modm2)n_1 m_1 \equiv 1 \pmod{m_2} así que n1m11(modm2)n_1 \equiv m_1^{-1} \pmod{m_2}, y viceversa n2m21(modm1)n_2 \equiv m_2^{-1} \pmod{m_1}.

Con esos dos coeficientes podemos definir una solución:

a=a1n2m2+a2n1m1modm1m2a = a_1 n_2 m_2 + a_2 n_1 m_1 \bmod{m_1 m_2}

Es fácil verificar que esto es efectivamente una solución calculando amodm1a \bmod{m_1} y amodm2a \bmod{m_2}.

aa1n2m2+a2n1m1(modm1)a1(1n1m1)+a2n1m1(modm1)a1a1n1m1+a2n1m1(modm1)a1(modm1) aamp;amp;a1n2m2+a2n1m1amp;(modm1)amp;amp;a1(1n1m1)+a2n1m1amp;(modm1)amp;amp;a1a1n1m1+a2n1m1amp;(modm1)amp;amp;a1amp;(modm1)\begin{array}{rcll} a & \equiv & a_1 n_2 m_2 + a_2 n_1 m_1 & \pmod{m_1}\ & \equiv & a_1 (1 - n_1 m_1) + a_2 n_1 m_1 & \pmod{m_1}\ & \equiv & a_1 - a_1 n_1 m_1 + a_2 n_1 m_1 & \pmod{m_1}\ & \equiv & a_1 & \pmod{m_1} \end{array}

Nótese que el Teorema Chino del Resto también garantiza que existe solo 1 solución módulo m1m2m_1 m_2. Esto también es fácil de demostrar.

Supongamos que hay dos soluciones distintas xx e yy. Como xai(modmi)x \equiv a_i \pmod{m_i} e yai(modmi)y \equiv a_i \pmod{m_i}, se sigue que xy0(modmi)x − y \equiv 0 \pmod{m_i} y por lo tanto xy0(modm1m2)x − y \equiv 0 \pmod{m_1 m_2} o, de forma equivalente, xy(modm1m2)x \equiv y \pmod{m_1 m_2}. Así que xx e yy son en realidad la misma solución.

Solución para el caso general

Solución inductiva

Como m1m2m_1 m_2 es coprimo con m3m_3, podemos aplicar de forma inductiva y repetida la solución para dos módulos para cualquier cantidad de módulos. Primero se calcula b2:=a(modm1m2)b_2 := a \pmod{m_1 m_2} usando las dos primeras congruencias, luego se puede calcular b3:=a(modm1m2m3)b_3 := a \pmod{m_1 m_2 m_3} usando las congruencias ab2(modm1m2)a \equiv b_2 \pmod{m_1 m_2} y aa3(modm3)a \equiv a_3 \pmod {m_3}, etc.

Construcción directa

Es posible una construcción directa similar a la interpolación de Lagrange.

Sea Mi:=ijmjM_i := \prod_{i \neq j} m_j, el producto de todos los módulos excepto mim_i, y NiN_i los inversos modulares Ni:=Mi1modmiN_i := M_i^{-1} \bmod{m_i}. Entonces una solución del sistema de congruencias es:

ai=1kaiMiNi(modm1m2mk)a \equiv \sum_{i=1}^k a_i M_i N_i \pmod{m_1 m_2 \cdots m_k}

Podemos comprobar que esto es efectivamente una solución calculando amodmia \bmod{m_i} para todo ii. Como MjM_j es un múltiplo de mim_i para iji \neq j, tenemos

aj=1kajMjNj(modmi)aiMiNi(modmi)aiMiMi1(modmi)ai(modmi)aamp;amp;j=1kajMjNjamp;(modmi)amp;amp;aiMiNiamp;(modmi)amp;amp;aiMiMi1amp;(modmi)amp;amp;aiamp;(modmi)\begin{array}{rcll} a & \equiv & \sum_{j=1}^k a_j M_j N_j & \pmod{m_i} \ & \equiv & a_i M_i N_i & \pmod{m_i} \ & \equiv & a_i M_i M_i^{-1} & \pmod{m_i} \ & \equiv & a_i & \pmod{m_i} \end{array}

Implementación

struct Congruence { long long a, m; }; long long chinese_remainder_theorem(vector<Congruence> const& congruences) { long long M = 1; for (auto const& congruence : congruences) { M *= congruence.m; } long long solution = 0; for (auto const& congruence : congruences) { long long a_i = congruence.a; long long M_i = M / congruence.m; long long N_i = mod_inv(M_i, congruence.m); solution = (solution + a_i * M_i % M * N_i) % M; } return solution; }

Solución para módulos no coprimos

Como se mencionó, el algoritmo anterior solo funciona para módulos coprimos m1,m2,mkm_1, m_2, \dots m_k.

En el caso no coprimo, un sistema de congruencias tiene exactamente una solución módulo lcm(m1,m2,,mk)\text{lcm}(m_1, m_2, \dots, m_k), o no tiene solución en absoluto.

P. ej. en el siguiente sistema, la primera congruencia implica que la solución es impar, y la segunda implica que la solución es par. No es posible que un número sea a la vez impar y par, por lo tanto claramente no hay solución.

{a1(mod4)a2(mod6)\left{aamp;1(mod4)aamp;2(mod6)\begin{align} a &amp; \equiv 1 \pmod{4} \ a &amp; \equiv 2 \pmod{6} \end{align}\right.

Es bastante sencillo determinar si un sistema tiene solución. Y si la tiene, podemos usar el algoritmo original para resolver un sistema de congruencias ligeramente modificado.

Una sola congruencia aai(modmi)a \equiv a_i \pmod{m_i} es equivalente al sistema de congruencias aai(modpjnj)a \equiv a_i \pmod{p_j^{n_j}} donde p1n1p2n2pknkp_1^{n_1} p_2^{n_2}\cdots p_k^{n_k} es la factorización prima de mim_i.

Con este hecho, podemos modificar el sistema de congruencias en un sistema que solo tiene potencias de primos como módulos. P. ej. el sistema de congruencias anterior es equivalente a:

{a1(mod4)a20(mod2)a2(mod3)\left{a1amp;(mod4)a20amp;(mod2)a2amp;(mod3)\begin{array}{ll} a \equiv 1 &amp; \pmod{4} \ a \equiv 2 \equiv 0 &amp; \pmod{2} \ a \equiv 2 &amp; \pmod{3} \end{array}\right.

Como originalmente algunos módulos tenían factores comunes, obtendremos algunas congruencias con módulos basados en el mismo primo, aunque posiblemente con distintas potencias de primo.

Se puede observar que la congruencia con el módulo de mayor potencia de primo será la congruencia más fuerte de todas las basadas en el mismo número primo. O bien dará una contradicción con alguna otra congruencia, o ya implicará todas las demás.

En nuestro caso, la primera congruencia a1(mod4)a \equiv 1 \pmod{4} implica a1(mod2)a \equiv 1 \pmod{2}, y por lo tanto contradice la segunda congruencia a0(mod2)a \equiv 0 \pmod{2}. Por lo tanto este sistema de congruencias no tiene solución.

Si no hay contradicciones, entonces el sistema de ecuaciones tiene una solución. Podemos ignorar todas las congruencias excepto las que tienen los módulos de mayor potencia de primo. Estos módulos ahora son coprimos, y por lo tanto podemos resolver este sistema con el algoritmo discutido en las secciones anteriores.

P. ej. el siguiente sistema tiene una solución módulo lcm(10,12)=60\text{lcm}(10, 12) = 60.

{a3(mod10)a5(mod12)\left{aamp;3(mod10)aamp;5(mod12)\begin{align} a &amp; \equiv 3 \pmod{10} \ a &amp; \equiv 5 \pmod{12} \end{align}\right.

El sistema de congruencias es equivalente al sistema:

{a31(mod2)a33(mod5)a51(mod4)a52(mod3)\left{aamp;31(mod2)aamp;33(mod5)aamp;51(mod4)aamp;52(mod3)\begin{align} a &amp; \equiv 3 \equiv 1 \pmod{2} \ a &amp; \equiv 3 \equiv 3 \pmod{5} \ a &amp; \equiv 5 \equiv 1 \pmod{4} \ a &amp; \equiv 5 \equiv 2 \pmod{3} \end{align}\right.

Las únicas congruencias con el mismo módulo primo son a1(mod4)a \equiv 1 \pmod{4} y a1(mod2)a \equiv 1 \pmod{2}. La primera ya implica la segunda, así que podemos ignorar la segunda y resolver en su lugar el siguiente sistema con módulos coprimos:

{a33(mod5)a51(mod4)a52(mod3)\left{aamp;33(mod5)aamp;51(mod4)aamp;52(mod3)\begin{align} a &amp; \equiv 3 \equiv 3 \pmod{5} \ a &amp; \equiv 5 \equiv 1 \pmod{4} \ a &amp; \equiv 5 \equiv 2 \pmod{3} \end{align}\right.

Tiene la solución 53(mod60)53 \pmod{60}, y en efecto 53mod10=353 \bmod{10} = 3 y 53mod12=553 \bmod{12} = 5.

Algoritmo de Garner

Otra consecuencia del CRT es que podemos representar números grandes usando un arreglo de enteros pequeños.

En lugar de hacer muchos cálculos con números muy grandes, lo cual puede ser costoso (pensemos en hacer divisiones con números de 1000 dígitos), se pueden elegir unos cuantos módulos coprimos y representar el número grande como un sistema de congruencias, y realizar todas las operaciones sobre el sistema de ecuaciones. Cualquier número aa menor que m1m2mkm_1 m_2 \cdots m_k se puede representar como un arreglo a1,,aka_1, \ldots, a_k, donde aai(modmi)a \equiv a_i \pmod{m_i}.

Usando el algoritmo anterior, se puede reconstruir de nuevo el número grande cuando se necesite.

Como alternativa, se puede representar el número en la representación de base mixta (mixed radix):

a=x1+x2m1+x3m1m2++xkm1mk1 with xi[0,mi)a = x_1 + x_2 m_1 + x_3 m_1 m_2 + \ldots + x_k m_1 \cdots m_{k-1} \text{ with }x_i \in [0, m_i)

El algoritmo de Garner, que se discute en el artículo dedicado algoritmo de Garner, calcula los coeficientes xix_i. Y con esos coeficientes se puede restaurar el número completo.

Problemas de práctica: