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;[1] Michael Oser Rabin modificó la propuesta de Miller para obtener un algoritmo probabilístico que no utiliza resultados no probados.[2]
Conceptos matemáticos
[editar]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
[editar]Dado un entero impar n > 2, escribimos n como 2s⋅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:
- ;
- 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, (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
[editar]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.[4]
Demostraciones
[editar]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 , luego , como , obtenemos . Esto quiere decir que . Como n es primo, o , es decir o . |
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 y observemos que cada término de la sucesión es el cuadrado del siguiente.
|
Test de Miller–Rabin
[editar]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:
def test_Miller_Rabin(n: int, k: int) -> bool:
s, d = satisfacen n = 2**s * d + 1, d impar
repetir k veces:
a = entero al azar entre 2 y n-1
fpp = False # fuertemente primo en base a
if 1 == a**d % n:
fpp = True
else:
r = 0
while r <= s and fpp == False:
if n - 1 == a**(2**r * d) % n:
fpp = True
if fpp == False: # si no pasa la prueba
return False
# si pasó las k pruebas
return True
Complejidad
[editar]El tiempo de ejecución de este algoritmo es , 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 .
Fiabilidad del test
[editar]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.[5]
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 . En la práctica, la probabilidad parece ser mucho menor, según un artículo de Damgård, Landrock y Pomerance.[6]
Asumiendo correcta la hipótesis generalizada de Riemann, se puede demostrar que, n es probable primo fuerte para a tal que entonces n es un número primo. Con esto se tiene un test determinístico de primalidad de costo .
Referencias
[editar]- ↑ Miller, Gary (1975). «Riemann's Hypothesis and tests for primality». Journal of Computer and System Sciences 13 (3): 300-317. doi:10.1016/S0022-0000(76)80043-8.
- ↑ Rabin, Michael (1980). «Probabilistic algorithm for testing primality». Journal of Number Theory 12 (1): 128-138. doi:10.1016/0022-314X(80)90084-0.
- ↑ F. Arnault (agosto de 1995). «Construyendo números de Carmichael que son fuertes pseudoprimes en varias bases». Journal of Symbolic Computation 20 (2): 151-161. doi:10.1006/jsco.1995.1042.
- ↑
Por ejemplo, en 1995, Arnault da un número compuesto de 397 dígitos para el cual todas las bases menores a 307 son mentirosas fuertes; se informó que este número es primo por la función Maple
isprime ()
, porque implementó la prueba de Miller-Rabin con las bases específicas 2, 3, 5, 7 y 11.[3] - ↑ Menezes, Alfred; van Oorschot, Paul; Vanstone, Scott (2001). «Public-Key Parameters». En CRC, ed. Handbook of applied cryptography (en inglés) (quinta edición). p. 138. ISBN 0-8493-8523-7. Consultado el 14 de febrero de 2016.
- ↑ Damgård, Ivan; Landrock, Peter; Pomerance, Carl (1993). «Average case error estimates for the strong probable prime test». Mathematics of Computation (en inglés) 61 (203): 177-194. doi:10.2307/2152945.
Enlaces externos
[editar]Wikilibros alberga un libro o manual sobre implementaciones del test de primalidad de Miller-Rabin.
- Weisstein, Eric W. «Rabin-Miller Strong Pseudoprime Test». En Weisstein, Eric W, ed. MathWorld (en inglés). Wolfram Research.
- Código del test en C