# Test de primalidad de Miller-Rabin

El test de primalidad de Miller-Rabin es un test de primalidad, es decir, un algoritmo para determinar si un número dado es primo, similar al test de primalidad de Fermat. Su versión original fue propuesta por G. L. Miller, se trataba de un algoritmo determinista, pero basado en la no demostrada hipótesis generalizada de Riemann; Michael Oser Rabin modificó la propuesta de Miller para obtener un algoritmo probabilístico que no utiliza resultados no probados.

## Conceptos matemáticos

De forma similar a las pruebas Fermat y Solovay-Strassen, la prueba de primalidad de Miller-Rabin comprueba si una propiedad específica, que se sabe que es verdadera para los números primos, se satisface para el número a prueba.

### Probables primos fuertes

Dado un entero impar n > 2, escribimos n como 2$^s$⋅d + 1 donde s y d son enteros positivos y d es impar. Sea a un número entero tal que 0 < a < n. Entonces, diremos que n es probable primo fuerte para la base a si se cumple alguna de las siguientes relaciones de congruencia:
* $a^{d}\equiv 1{\pmod {n}}$;
* $a^{2^{r}\cdot d}\equiv -1{\pmod {n}}$ para algún 0 ≤ r < s.
La idea detrás del test de Miller-Rabín es que cuando n es un primo impar, pasa el test debido a dos resultados:
* por el pequeño teorema de Fermat, $a^{n-1}\equiv 1{\pmod {n}}$ (esta propiedad por sí sola es una noción más débil probable primo débil para la base a, sobre la cual está basado el test de primalidad de Fermat);
* las únicas raíces cuadradas del 1 módulo n son 1 y −1.
Por contraposición, si n no es un probable primo fuerte para alguna base a, entonces n es compuesto y a es llamado un testigo de la propiedad de que n es compuesto.
Sin embargo, esta propiedad no es una caracterización exacta de los números primos. Si n es compuesto, puede haber una base a para la cual n sea probable primo fuerte, en cuyo caso se llama un pseudoprimo fuerte y a se lo denomina un mentiroso fuerte.
El test probabilístico de Miller-Rabin se basa en la comprobación para diferentes bases de que un número dado es probable primo fuerte.

### Elección de bases

Afortunadamente, ningún número compuesto es un pseudoprimo fuerte para todas las bases al mismo tiempo. Sin embargo, no se conoce una forma sencilla de encontrar un testigo. Una solución ingenua es probar todas las bases posibles, lo que produce un algoritmo determinista ineficiente. La prueba de Miller determinista es una variante más eficiente de esto.
Otra solución es elegir una base al azar. Esto produce una rápida prueba probabilística. Cuando n es compuesto, la mayoría de las bases son testigos, por lo que la prueba detectará n como compuesto con una probabilidad razonablemente alta, mayor que 0.75. Podemos reducir rápidamente la probabilidad de un falso positivo a una tasa arbitrariamente pequeña, combinando el resultado de tantas bases elegidas independientemente como sea necesario para lograr dicha tasa. En esto consiste el test probabilístico de Miller-Rabin. El número de bases a probar no depende de n.
Para hacer el test a un n arbitrariamente grande, elegir bases al azar es esencial, ya que no conocemos la distribución de testigos y mentirosos fuertes entre los números 1, 2, …, n−1.

### Demostraciones

Aquí una demostración de que cuando n es un primo impar, las únicas raíces cuadradas de 1 módulo n son 1 y −1.
* Demostración
* Sea x tal que $x^{2}\equiv 1{\pmod {n}}$, luego $x^{2}-1\equiv 0{\pmod {n}}$, como $x^{2}-1=(x-1)(x+1)$, obtenemos $(x-1)(x+1)\equiv 0{\pmod {n}}$. Esto quiere decir que $n|(x-1)(x+1)$. Como n es primo, $n|x-1$ o $n|x+1$, es decir $x\equiv 1{\pmod {n}}$ o $x\equiv -1{\pmod {n}}$.
Aquí una demostración de que si n es un primo impar, entonces n es probable primo fuerte para cualquier base a.
* Demostración
* Consideremos la sucesión $a^{2^{s}\cdot d},a^{2^{s-1}\cdot d},\dots ,a^{2d},a^{d}$ y observemos que cada término de la sucesión es el cuadrado del siguiente.
* Por el teorema de Fermat $a^{2^{s}\cdot d}=a^{n-1}\equiv 1{\pmod {n}}$. Luego $(a^{2^{s-1}\cdot d})^{2}\equiv 1{\pmod {n}}$ y por lo tanto $a^{2^{s-1}\cdot d}$ es una raíz cuadrada de 1 módulo n. Por lo anterior obtenemos que $a^{2^{s-1}\cdot d}\equiv \pm 1{\pmod {n}}$.
* Si $a^{2^{s-1}\cdot d}\equiv -1{\pmod {n}}$, obtenemos el resultado. En caso contrario $a^{2^{s-1}\cdot d}\equiv 1{\pmod {n}}$, luego $(a^{2^{s-2}\cdot d})^{2}\equiv 1{\pmod {n}}$ y por lo tanto $a^{2^{s-2}\cdot d}$ es una raíz cuadrada de 1 módulo n y en consecuencia $a^{2^{s-2}\cdot d}\equiv \pm 1{\pmod {n}}$.
* Iterando el razonamiento anterior concluimos que alguno de los términos de la sucesión $a^{2^{r}\cdot d}$ es congruente a -1 módulo n o bien todos los términos son congruentes a 1, en particular $a^{d}\equiv 1{\pmod {n}}$, con lo cual n resulta ser probable primo fuerte.

## Test de Miller–Rabin

El algoritmo se puede escribir en pseudocódigo de la siguiente manera. El parámetro k determina la precisión de la prueba. Cuanto mayor sea el número de rondas (k es el número de rondas), mayor precisión tendrá el resultado.
Pseudocódigo estilo Python:

## Complejidad

El tiempo de ejecución de este algoritmo es $O(k\ln ^{3}n)$, donde n es el número testeado y k es el número de rondas realizadas; por lo tanto, este es un algoritmo eficiente, de tiempo polinomial respecto a la cantidad de dígitos de n. La multiplicación basada en transformada rápida de Fourier puede reducir el tiempo de ejecución a $O(k\ln ^{2}(n)\ln(n)\ln(\ln \ln n))$.

## Fiabilidad del test

Debido a su baja probabilidad de fallo, es el test más utilizado en la práctica, a la hora de aplicaciones en criptografía de clave pública.
Se puede demostrar que un número que pasa una prueba de ser probable primo fuerte tiene una probabilidad de 3/4 de ser primo. Luego, que la probabilidad de que un número compuesto pase h iteraciones del test con bases escogidas al azar es menor a ${\tfrac {1}{4^{h}}}$. En la práctica, la probabilidad parece ser mucho menor, según un artículo de Damgård, Landrock y Pomerance.
Asumiendo correcta la hipótesis generalizada de Riemann, se puede demostrar que, n es probable primo fuerte para a tal que $0\leq a\leq 2\ln ^{2}n$ entonces n es un número primo. Con esto se tiene un test determinístico de primalidad de costo $O(\ln ^{4}n)$.