Módulo (operación mod): definición, resto y uso en programación
Descubre qué es la operación módulo (mod), cómo obtener el resto y su uso en programación: convenciones, ejemplos prácticos y diferencias entre lenguajes.
En matemáticas, el resultado de la operación módulo es el resto de una división aritmética. Como es sabido, una división aritmética de dos enteros produce un cociente y un resto.
Sin embargo, son posibles otras convenciones. Los ordenadores y las calculadoras tienen varias formas de almacenar y representar los números. Su definición de la operación módulo depende del lenguaje de programación y/o del hardware subyacente.
Definición matemática (resto euclidiano)
La definición clásica en aritmética entera se basa en la división euclidiana: dados enteros a y n con n > 0, existen únicos enteros q (cociente) y r (resto) tales que
a = q·n + r, y 0 ≤ r < n.
En ese caso decimos que r es el resto euclidiano y escribimos r = a mod n. Ejemplos:
- 17 mod 5 = 2, porque 17 = 3·5 + 2 y 0 ≤ 2 < 5.
- −7 mod 3 = 2 en la convención euclidiana, porque −7 = (−3)·3 + 2 y 0 ≤ 2 < 3.
Resto vs. módulo en programación: diferencias prácticas
En programación no existe una única convención: algunos lenguajes devuelven un resto que puede ser negativo, otros devuelven siempre un valor no negativo (resto euclidiano). Es importante conocer la convención del lenguaje que uses.
- C/C++: la división de enteros se trunca hacia cero; por tanto el resto tiene el mismo signo que el dividendo. Ejemplo: en C, (−7) % 3 = −1.
- Java: igual que C en cuanto al signo del resto (truncamiento hacia cero). Ejemplo: (−7) % 3 = −1. Java ofrece Math.floorMod para obtener el resto no negativo: Math.floorMod(−7,3) = 2.
- Python: el operador % implementa el resto euclidiano (basado en la división por piso), es decir el resultado tiene el signo del divisor. Ejemplo: (−7) % 3 = 2.
- JavaScript: el operador % devuelve el resto con signo del dividendo (como en C). Ejemplo: −7 % 3 = −1.
- Lenguajes y hardware: algunos microcontroladores o compiladores pueden tener comportamientos específicos; por eso conviene documentarse y, si es necesario, normalizar el resultado.
Propiedades algebraicas y reglas útiles
- Reducción: (a mod n) mod n = a mod n.
- Compatibilidad con suma y producto:
- (a + b) mod n = ((a mod n) + (b mod n)) mod n
- (a · b) mod n = ((a mod n) · (b mod n)) mod n
- Congruencia: a ≡ b (mod n) significa que n divide (a − b). Las clases de congruencia son la base del álgebra modular.
- Inverso multiplicativo: existe el inverso de a modulo n si y sólo si gcd(a,n) = 1. Esto es fundamental en criptografía (RSA, etc.).
- Teoremas relevantes: pequeño teorema de Fermat, teorema de Euler, que permiten simplificar potencias en módulo.
Aplicaciones prácticas
- Comprobar paridad: n mod 2 determina si un número es par o impar.
- Manejo de relojes y tiempo (aritmética circular): por ejemplo, las horas se calculan módulo 12 o 24.
- Estructuras circulares: buffers circulares, índices que “vuelven” al inicio con modulo n.
- Hashing y tablas hash: reducción de grandes enteros al rango de índices disponibles.
- Cifrado y criptografía: operaciones modulares en exponentiaciones y claves públicas/privadas.
- Checksums y códigos de verificación: operaciones modulares para detectar errores simples.
Cómo calcular correctamente en código
Si el lenguaje no garantiza un resto no negativo y necesitas uno, normaliza el resultado. Pseudocódigo:
- r = a % n
- if (r < 0) r = r + abs(n)
- return r
En Java puedes usar Math.floorMod(a, n). En Python el operador % ya realiza este ajuste cuando n > 0.
Terminología y recomendaciones
- En castellano se usan términos como resto, residuo y módulo. En contextos puramente aritméticos es preferible hablar de resto euclidiano (no negativo). En programación, aclara la convención del lenguaje: “operador % (resto con signo del dividendo)” o “módulo euclidiano (resto no negativo)”.
- Cuando escribas código que dependa de propiedades del módulo (por ejemplo, para índices de array), documenta la convención y normaliza si fuese necesario. Esto evita errores sutiles con operandos negativos.
Si quieres, puedo añadir ejemplos concretos en el lenguaje de programación que uses o mostrar algoritmos eficientes para potencias modulares (por ejemplo, exponenciación rápida modular) y casos de uso en criptografía.
Buscar dentro de la enciclopedia