Algoritmos y Estructuras de Datos Herramientas Lenguaje de programación
!Prog C/C++ Rust
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Sistemas Operativos

Aritmética Modular

[date: 07-06-2023 20:24] [last modification: 11-06-2023 20:12]
[words: 1198] [reading time: 6min] [size: 14901 bytes]

Números coprimos

Definición
$a$ y $b$ (enteros) son primos entre sí / coprimos / relativamente primos si y solo si $$\gcd(a,b) = 1.$$

Esta definición también se puede extender a un conjunto de números, siendo estos coprimos dos a dos.

Aritmética modular

Los números enteros se pueden representar en la recta real:

La recta de enteros

Pero si tomamos una estructura como la siguiente:

Reloj de aritmética modular

Los números regresan al 0 cuando se llega a un valor en concreto, llamado módulo. Por este motivo, algunas veces también se le llama aritmética del reloj. Veamos un reloj como ejemplo, que es de módulo 12. Si son las 10 y pasan 4 horas, podemos decir que son las 2, porque $14 \text{ mod } 12 = 2$.

Por tanto, la aritmética modular consiste en encontrar el resto.

Además, también se pueden tomar números negativos:

Reloj de aritmética modular con números negativos

Esta es la definición intuitiva. A continuación de describe la notación y algunos teoremas fundamentales.

Teoremas fundamentales y propiedades de la aritmética modular

La aritmética modular fue introducida en 1801 por Carl Friedrich Gauss1, y consiste en una relación de equivalencia llamada congruencia. Esta es la notación que utilizó Gauss:

Definición
$$ m \, | \, (a - b) \iff a \equiv b \pmod{m} $$ donde $a$, $b$ y $m$ son enteros y $m > 0$.

$a \equiv b \pmod{m}$ se lee como $a$ y $b$ son congruentes módulo $m$, lo que quiere decir que su resta es un múltiplo de $m$.

Otra notación puede ser $[a]_m = [b]_m$.

Teorema
$$ \begin{align*} a \equiv b \pmod{m} \iff& a \text{ mod } m = b \text{ mod } m \\ a \equiv b \pmod{m} \implies& \exists \, k \in \Z \quad / \quad a = b - km \\ \end{align*} $$

Alternativamente, la congruencia se da cuando los restos de dividir entre $m$ son iguales.

Definición
La clase de restos módulo $m$ se denota con $\Z_{/m\Z}$.
Teorema
$$ \begin{rcases} a \equiv b \\ c \equiv d \\ \end{rcases} \implies \begin{cases} a + c &\equiv b + d \\ ac &\equiv bd \\ \end{cases} \pmod{m} $$

La congruencia es una relación de equivalencia, por lo que sigue funcionando lo de sumar y multiplicar por ambos lados valores congruentes. Esto quiere decir que es compatible con las operaciones del anillo de enteros (suma y multiplicación).

Corolario
$$ \begin{align*} (a + b) \text{ mod } m &= [(a \text{ mod } m) + (b \text{ mod } m)] \\ (a \times b) \text{ mod } m &= [(a \text{ mod } m) \times (b \text{ mod } m)] \end{align*} $$

Y este corolario resulta particularmente interesante cuando se trabaja con enteros grandes en módulos pequeños, porque en lugar de sumar dichas cantidades, se pueden sumar los restos, que serán cantidades más pequeñas.

Tipos de números en aritmética modular

Un problema de la aritmética modular es el producto de dos enteros no nulos, puede ser 0 (si el resultado es múltiplo del módulo). Por este motivo, la resolución de ecuaciones se complica.

Por este motivo, es importante distingir los casos donde se puede dar esta situación.

Donde $a$ y $b$ son enteros no nulos.

Resolución de congruencias lineales

En los números enteros, la ecuación lineal de una variable $ax = b$ tiene solución si solo si $a \, | \, b$.

En $\Z_{/m\Z}$, una ecuación lineal es de la forma $ax \equiv b \pmod{m}$ y se puede resolver con el siguiente algoritmo:

  1. Calcula $\gcd(a, m) = d$.
  2. Si $d$ no divide a $b$, entonces no hay soluciones.
  3. Si $d \, | \, b$ podemos distinguir dos casos:
    • Si $d = 1$, es decir, si $a$ y $m$ con coprimos:

      1. Calcular los coeficientes $s$ y $t$ de Bézout.
      2. $\gcd(a, m) = d = 1 \equiv sa + \xcancel{tm} \equiv sa \pmod{m}$.
      3. $sa \equiv 1 \implies asx \equiv bs \implies x \equiv bs \pmod{m}$
      4. La solución es $x \equiv bs \pmod{m}$ y es única.
    • Si $d \not= 1$: Resolver como en el caso anterior: $\frac{a}{d}x \equiv \frac{b}{d} \pmod{\frac{m}{d}}$, dado que $\gcd(\frac{a}{d}, \frac{m}{d}) = 1$.

$$ \gcd(a, m) := d \implies \begin{cases} d \not | \,\, b \implies \textbf{No hay soluciones} \\ d \, | \, b \implies \begin{cases} d = 1 \implies 1 \equiv sa + \xcancel{tm} \equiv sa \pmod{m} \implies x \equiv bs \pmod{m} \textbf{ Solución única} \\ d \ne 1 \implies \frac{a}{d} x \equiv \frac{b}{d} \pmod{\frac{m}{d}} \implies \gcd(\frac{a}{d}, \frac{m}{d}) = 1 = s\frac{a}{d} + \xcancel{t\frac{m}{d}} \equiv s\frac{a}{d} \pmod{\frac{m}{d}} \implies \textbf{$d$ soluciones de la forma: } x_0 + k\frac{m}{d}, k \in [0, d) \end{cases} \\ \end{cases} $$

Función $\Phi$ de Euler

Esta función permite conocer cuantas unidades hay en $\Z_{/m\Z}$, o cuantos números tienen inverso multiplicativo.

Definición
$$ \begin{cases} \Phi(p) = p - 1 \\ \Phi(p^k) = p^{k - 1} \Phi(p) \\ \Phi(n) = \Phi(p_1^{k_1} \ldots p_s^{k_s}) = \Phi(p_1^{k_1}) \ldots \Phi(p_s^{k_s}) \end{cases} $$ donde $p$ es un número primo, $k$ es un número entero y $n = p_1^{k_1} \ldots p_s^{k_s}$.

Pequeño teorema de Fermat

Teorema
Si $p$ es primo y $p \, \not | \, a$, entonces $a^{p-1} \equiv 1 \pmod {p}$.
Corolario
Para cualquier $a$, $a^p \equiv a \pmod{p}$.

Extensión: Teorema de Euler

Teorema
$$ \gcd(a, m) = 1 \iff a^{\Phi(m)} \equiv 1 \pmod{m} $$

Teorema chino de los restos

Con este teorema se pueden resolver sistemas de congruencias lineales.

Teorema
  • Sean $m_1, \ldots, m_k$ primos relativos entre sí.
  • Sean $a_1, \ldots, a_k$ enteros arbitrarios.

$$ \begin{cases} x \equiv a_1 \pmod{m_1} \\ \vdots \\ x \equiv a_k \pmod{m_k} \end{cases} $$

Existe una única solución: $0 \le x < m = m_1 \ldots m_k$

$$ x \equiv a_1 \frac{m}{m_1} \bigg[\frac{m}{m_1}\bigg]^{-1}_{m_1} + \ldots + a_k \frac{m}{m_k} \bigg[\frac{m}{m_k}\bigg]^{-1}_{m_k} $$

Donde $\big[ \frac{m}{m_i} \big]^{-1}_{m_i}$ es el inverso multiplicativo de $\frac{m}{m_i}$ módulo $m_i$.

Exponenciación modular

Por ejemplo, para el criptosistema RSA es necesario realizar potencias con números grandes en aritmética modular, por ejemplo $b^e \text{ mod } n$.

Utilizando la representación de enteros, se puede obtener lo siguiente:

$$ e = \sum_{i = 0}^{k} e_i 2^i = e_0 + e_1 2 + e_2 2^2 + \ldots + e_k 2^k $$

Y aplicando propiedades de las potencias:

$$ \begin{align*} b^e &= b^e_0 \; b^{e_1 2} \; b^{e_2 2^2} \ldots \; b^{e_k 2^k} = b^{2^0} \\ &= (b^{2^0})^{e_0} \; (b^{2^1})^{e_1} \ldots \; (b^{2^k})^{e_k} \end{align*} $$

Por lo que finalmente se puede obtener el siguiente algoritmo:

1def mod_exp(b, e, m):
2    exp = b
3    for bit in e.bits():
4        if bit == 1:
5            exp *= exp
6            exp %= m
7    return exp

Lo que resulta bastante más eficiente que calcular la potencia y después el módulo.

Curiosidades

Aunque este video se centra en otros números, guarda bastante relación, y además, hay una buena explicación sobre la aritmética modular en el 15:52.

Anterior: Números Volver a Mates Discretas Siguiente: Criptografía