25. Congruencias

Las congruencias expresan formalmente que dos enteros dejan el mismo resto al dividir por un módulo. Esta relación permite razonar con clases de números, simplificar cálculos y modelar ciclos de forma rigurosa.

25.1 Introducción

En el tema anterior usamos el módulo para trabajar con restos. Ahora daremos un paso más preciso: en lugar de decir que 17 y 2 tienen el mismo resto al dividir por 5, escribiremos que son congruentes módulo 5.

La congruencia es útil porque conserva exactamente la información que importa en un cálculo modular y descarta las diferencias que son múltiplos completos del módulo. Es el lenguaje de relojes, índices circulares, códigos de control y buena parte de la criptografía.

25.2 Definición de congruencia

Sean a y b enteros y sea m un entero positivo. Decimos que a es congruente con b módulo m si m divide a la diferencia a - b. Se escribe:

a ≡ b (mod m) si y solo si m | (a - b).

Se lee: «a es congruente con b módulo m».
El símbolo | significa «divide».

La condición indica que a - b es un múltiplo de m. Por eso, al dividir a y b por m, ambos terminan con el mismo resto.

25.3 Ejemplos elementales

17 ≡ 2 (mod 5), porque 17 - 2 = 15 y 5 | 15.

42 ≡ 0 (mod 7), porque 42 - 0 = 42 y 7 | 42.

-3 ≡ 2 (mod 5), porque -3 - 2 = -5 y 5 | -5.

El último caso aclara una idea importante: los números negativos no son un problema. Aunque JavaScript devuelva -3 % 5 como -3, matemáticamente -3 y 2 representan la misma clase módulo 5.

25.4 Congruencia y mismo resto

Para m positivo, las dos afirmaciones siguientes son equivalentes:

a ≡ b (mod m).

a y b dejan el mismo resto al dividir por m.

Por ejemplo, al dividir 17 y 42 por 5 se obtiene resto 2 en ambos casos; por lo tanto, 17 ≡ 42 (mod 5). Esta equivalencia permite elegir la definición más cómoda: divisibilidad para demostrar propiedades y restos para calcular ejemplos.

25.5 No es igualdad ordinaria

El símbolo ≡ no es el signo =. La igualdad afirma que dos números son el mismo entero; la congruencia afirma que se comportan igual respecto de un módulo determinado.

17 ≠ 2, pero 17 ≡ 2 (mod 5).

17 ≡ 5 (mod 6), pero 17 ≢ 5 (mod 5).

La segunda línea muestra que siempre debemos indicar el módulo. Una misma pareja de números puede ser congruente para un módulo y no serlo para otro.

25.6 Comprobar congruencias en JavaScript

Una forma directa de comprobar una congruencia es normalizar ambos residuos y compararlos.

function modulo(a, m) {
  if (!Number.isInteger(m) || m <= 0) throw new Error("m debe ser positivo");
  return ((a % m) + m) % m;
}

function sonCongruentes(a, b, m) {
  return modulo(a, m) === modulo(b, m);
}

console.log(sonCongruentes(17, 2, 5));  // true
console.log(sonCongruentes(-3, 2, 5));  // true
console.log(sonCongruentes(17, 5, 5));  // false

También se podría comprobar que (a - b) % m === 0 cuando m es positivo. Normalizar los residuos suele hacer más evidente qué clase representa cada número.

25.7 Una relación de equivalencia

Para un módulo fijo m, la congruencia tiene tres propiedades que definen una relación de equivalencia:

Reflexiva: a ≡ a (mod m).
Simétrica: si a ≡ b (mod m), entonces b ≡ a (mod m).
Transitiva: si a ≡ b (mod m) y b ≡ c (mod m), entonces a ≡ c (mod m).

Estas propiedades permiten agrupar los enteros en conjuntos disjuntos cuyos elementos son indistinguibles bajo el módulo elegido. Más adelante estudiaremos las relaciones de equivalencia de forma general.

25.8 Por qué las propiedades son verdaderas

La demostración se apoya solo en las reglas de divisibilidad. Para la reflexividad, a - a = 0 y cualquier m positivo divide a 0. Para la simetría, si m divide a - b, también divide su opuesto b - a.

Para la transitividad, si a - b = mk y b - c = ml, al sumar obtenemos a - c = m(k + l). Por lo tanto m divide a - c y se concluye que a ≡ c (mod m).

25.9 Clases de equivalencia

La clase de equivalencia de a módulo m contiene todos los enteros congruentes con a. Se denota [a]m, o simplemente [a] cuando el módulo es claro.

[2]5 = {..., -8, -3, 2, 7, 12, 17, ...}.

Todos son de la forma 2 + 5k, con k entero.

Aunque cada clase contiene infinitos enteros, módulo m solo existen m clases distintas. Se pueden representar con los residuos 0, 1, ..., m - 1.

25.10 Partición de los enteros módulo 5

Los enteros se separan en cinco clases sin superponerse:

[0] = {..., -5, 0, 5, 10, ...}.
[1] = {..., -4, 1, 6, 11, ...}.
[2] = {..., -3, 2, 7, 12, ...}.
[3] = {..., -2, 3, 8, 13, ...}.
[4] = {..., -1, 4, 9, 14, ...}.

Cada entero pertenece a una y solo una de estas clases. En programación, una clase puede verse como todos los valores que llevan al mismo índice circular.

25.11 Sumar y restar congruencias

Las congruencias se pueden sumar y restar. Si a ≡ b (mod m) y c ≡ d (mod m), entonces:

a + c ≡ b + d (mod m).
a - c ≡ b - d (mod m).

17 ≡ 2 (mod 5) y 9 ≡ 4 (mod 5).
Entonces 17 + 9 ≡ 2 + 4 ≡ 1 (mod 5).

La última reducción usa que 6 ≡ 1 (mod 5). En cálculos largos podemos reemplazar valores por residuos pequeños en cualquier paso.

25.12 Multiplicar congruencias

También se preserva la multiplicación: si a ≡ b (mod m) y c ≡ d (mod m), entonces ac ≡ bd (mod m).

17 ≡ 2 (mod 5) y 9 ≡ 4 (mod 5).
17 · 9 ≡ 2 · 4 ≡ 8 ≡ 3 (mod 5).

153 mod 5 = 3.

Esto explica por qué conviene reducir después de cada operación: trabajar con 2 y 4 es más simple que trabajar con 17 y 9, y el resultado modular es el mismo.

25.13 Potencias y sustitución

Si a ≡ b (mod m), entonces an ≡ bn (mod m) para todo entero n no negativo. Basta aplicar repetidamente la propiedad de multiplicación.

12 ≡ 2 (mod 5).
Por lo tanto 124 ≡ 24 = 16 ≡ 1 (mod 5).

No hace falta calcular 124 = 20736 para conocer su residuo.

La regla permite reemplazar bases grandes por representantes pequeños y es fundamental para calcular potencias modulares eficientemente.

25.14 Sustituir dentro de expresiones

Las operaciones permitidas muestran que se puede sustituir un número por otro congruente dentro de un polinomio con coeficientes enteros. Si a ≡ b (mod m), entonces P(a) ≡ P(b) (mod m).

Si n ≡ 1 (mod 3), entonces:
n² + 2n + 4 ≡ 1² + 2·1 + 4 = 7 ≡ 1 (mod 3).

Esta técnica es frecuente en demostraciones de divisibilidad: se analiza un número mediante sus pocos residuos posibles en lugar de revisar todos los enteros.

25.15 Dividir no siempre está permitido

A diferencia de la aritmética ordinaria, no se puede cancelar cualquier factor de una congruencia. Por ejemplo:

2 · 1 ≡ 2 · 4 (mod 6), porque 2 ≡ 8 (mod 6).
Pero 1 ≢ 4 (mod 6).

El factor 2 no puede cancelarse porque comparte un divisor con 6. La cancelación es válida cuando el factor es coprimo con el módulo; los próximos temas desarrollarán el máximo común divisor y los inversos modulares que explican esta condición.

25.16 Divisibilidad expresada con congruencias

Una divisibilidad se puede escribir como una congruencia con cero:

m | a si y solo si a ≡ 0 (mod m).

28 ≡ 0 (mod 7), por lo tanto 7 | 28.
29 ≡ 1 (mod 7), por lo tanto 7 no divide a 29.

Esta forma compacta es especialmente útil al construir condiciones de validación o demostrar que una expresión siempre es múltiplo de cierto número.

25.17 Paridad revisitada

La paridad puede expresarse enteramente mediante congruencias módulo 2. Un número es par si n ≡ 0 (mod 2) e impar si n ≡ 1 (mod 2).

Impar + impar: 1 + 1 ≡ 0 (mod 2), resultado par.
Impar · impar: 1 · 1 ≡ 1 (mod 2), resultado impar.
Par · cualquier entero: 0 · r ≡ 0 (mod 2), resultado par.

En tres líneas se justifican reglas conocidas de paridad. Este es un buen ejemplo de cómo las congruencias simplifican razonamientos generales.

25.18 Aplicación: pruebas de divisibilidad decimal

Como 10 ≡ 1 (mod 9), cualquier potencia de 10 también es congruente con 1 módulo 9. Por eso un número decimal es congruente con la suma de sus dígitos módulo 9.

5724 ≡ 5 + 7 + 2 + 4 = 18 ≡ 0 (mod 9).

Por lo tanto, 5724 es divisible por 9.

La conocida regla de sumar dígitos no es un truco aislado: es una consecuencia de las congruencias y de la representación decimal de los números.

25.19 Aplicación: chequeo de ciclos

Supongamos que una tarea se ejecuta cada 7 días y que el día inicial se codifica como 0. Dos fechas están en la misma posición del ciclo exactamente cuando la diferencia entre sus números de día es congruente con 0 módulo 7.

function mismaPosicionSemanal(diaA, diaB) {
  return sonCongruentes(diaA, diaB, 7);
}

console.log(mismaPosicionSemanal(10, 31)); // true: 31 - 10 = 21
console.log(mismaPosicionSemanal(10, 30)); // false

El ejemplo abstrae el ciclo semanal. Para fechas reales también deben considerarse calendarios y zonas horarias, pero la periodicidad se modela con congruencias.

25.20 Aplicación: códigos de control

Algunos identificadores añaden un dígito de control calculado con residuos para detectar errores de escritura. Una versión didáctica puede elegir el dígito necesario para que la suma de todos los dígitos sea congruente con 0 módulo 10.

function digitoDeControlSimple(texto) {
  const suma = [...texto].reduce((total, digito) => total + Number(digito), 0);
  return modulo(-suma, 10);
}

console.log(digitoDeControlSimple("5724")); // 2
// 5 + 7 + 2 + 4 + 2 = 20, y 20 ≡ 0 (mod 10)

Los sistemas reales usan reglas específicas, a menudo con pesos y módulos distintos. La idea común es verificar una congruencia para detectar inconsistencias en los datos.

25.21 Errores frecuentes

  • Confundir a ≡ b (mod m) con a = b.
  • Olvidar especificar el módulo de una congruencia.
  • Comparar restos negativos sin normalizarlos al implementar índices o validaciones.
  • Cancelar un factor sin comprobar si es coprimo con el módulo.
  • Aplicar división modular como si todos los números tuvieran inverso.
  • Usar un código de control didáctico como mecanismo de seguridad.

25.22 Qué debes recordar y conclusión

  • a ≡ b (mod m) significa que m divide a - b; equivale a que a y b tengan el mismo resto al dividir por m.
  • Para cada módulo m hay m clases de equivalencia, representadas por 0 a m - 1.
  • Las congruencias son reflexivas, simétricas y transitivas.
  • Se pueden sumar, restar, multiplicar y elevar a potencias congruencias.
  • No se puede cancelar ni dividir libremente dentro de una congruencia.
  • Las congruencias modelan ciclos, divisibilidad, validaciones y cálculos eficientes.

Las congruencias convierten la intuición de «tener el mismo resto» en una herramienta algebraica precisa. En el próximo tema estudiaremos con más detalle las operaciones en aritmética modular y cómo calcular con clases de residuos.