Una prueba de primalidad es un algoritmo para determinar si un número de entrada es primo . Entre otros campos de las matemáticas , se utiliza en criptografía . A diferencia de la factorización de enteros , las pruebas de primalidad generalmente no proporcionan factores primos , sino que solo indican si el número de entrada es primo o no. Se considera que la factorización es un problema computacionalmente difícil, mientras que la prueba de primalidad es relativamente sencilla (su tiempo de ejecución es polinomial con respecto al tamaño de la entrada). Algunas pruebas de primalidad demuestran que un número es primo, mientras que otras, como la de Miller-Rabin, demuestran que un número es compuesto . Por lo tanto, estas últimas podrían denominarse con mayor precisión pruebas de composición en lugar de pruebas de primalidad.
Métodos sencillos
La prueba de primalidad más simple es la división por ensayo : dado un número de entrada,, comprueba si es divisible por algún número primo entre 2 y(es decir, si la división no deja resto ). Si es así, entonceses compuesto . De lo contrario, es primo. [ 1 ] Todos los divisoresdebe tener un divisory un divisor primodey por lo tanto buscando divisores primos como máximoes suficiente.
Por ejemplo, consideremos el número 100, cuyos divisores son estos números:
- 1, 2, 4, 5, 10, 20, 25, 50, 100.
Cuando todos los divisores posibles hastaAl realizar pruebas, algunos divisores se descubrirán dos veces . Para observar esto, consideremos la lista de pares de divisores de 100:
- .
Productos anterioresson lo contrario de los productos que aparecieron anteriormente. Por ejemplo,yson recíprocos entre sí. Además, el de los dos divisores,yEsta observación se generaliza a todos: todos los pares divisores decontienen un divisor menor o igual que, por lo que el algoritmo solo necesita buscar divisores menores o iguales apara garantizar la detección de todos los pares divisores. [ 1 ]
Además, 2 es un primo que divide a 100, lo que prueba inmediatamente que 100 no es primo. Todo entero positivo, excepto 1, es divisible por al menos un número primo según el Teorema Fundamental de la Aritmética . Por lo tanto, el algoritmo solo necesita buscar divisores primos menores o iguales a 100..
Para otro ejemplo, consideremos cómo este algoritmo determina la primalidad de 17. Uno tieney los únicos primosson 2 y 3. Ninguno divide a 17, lo que demuestra que 17 es primo. Para un último ejemplo, consideremos 221. Uno tieney los números primosson 2, 3, 5, 7, 11 y 13. Al comprobar cada uno, se descubre que, demostrando que 221 no es primo.
En los casos en que se calcula la lista de primosno es factible, todos los números entreyse puede comprobar de forma sencilla (y lenta) para encontrar divisores. Una mejora sencilla consiste en comprobar la divisibilidad por 2 y solo por los números impares entre 3 y, puesto que la divisibilidad por un número par implica la divisibilidad por 2.
Este método se puede mejorar aún más. Observe que todos los números primos mayores que 5 son de la formapara un número entero no negativoy. De hecho, cada número entero es de la formapara un entero positivoy. Dado que 2 divide, yy 3 divisionesy, los únicos restos posibles módulo 6 para un primo mayor que 3 son 1 y 5. Por lo tanto, una prueba de primalidad más eficiente paraes comprobar sies divisible por 2 o 3, entonces para comprobar todos los números de la formayque sonEsto es casi tres veces más rápido que probar todos los números hasta.
Generalizando aún más, todos los números primos mayores que(elel enésimo número primo) son de la forma, dóndeyes el primordio – el producto del primeroprimos.
Por ejemplo, considere. Todos los números enteros son de la forma, dóndeAhora, 2 divide, 3 divisionesy 5 divisiones. Por lo tanto, todos los números primos mayores que 30 son de la formapara. Por supuesto, no todos los números de la formaconcoprimo ason primordiales. Por ejemplo,no es primo, aunque 17 es coprimo con.
Mientras, dóndees la función totiente de Euler , que comprueba la divisibilidad por todos los primos que son menores queaún es necesario. Se pueden aplicar de forma recursiva observaciones análogas a las anteriores , dando como resultado la Criba de Eratóstenes .
Una forma de acelerar estos métodos (y todos los demás mencionados a continuación) es precalcular y almacenar una lista de todos los números primos hasta un cierto límite, como todos los primos hasta 200. (Dicha lista se puede calcular con la Criba de Eratóstenes o mediante un algoritmo que prueba cada incremento).contra todos los números primos conocidos). Luego, antes de realizar la pruebapara la primacía con un método a gran escala,Primero se puede comprobar si es divisible por algún número primo de la lista. Si es divisible por alguno de esos números, entonces es compuesto y se pueden omitir las demás pruebas.
Una prueba de primalidad simple pero ineficiente utiliza el teorema de Wilson , que establece quees primo si y solo si:
Aunque este método requiere aproximadamenteLas multiplicaciones modulares, [ 2 ] lo hacen poco práctico, los teoremas sobre primos y residuos modulares forman la base de muchos métodos más prácticos.
Pruebas heurísticas
Estas son pruebas que parecen funcionar bien en la práctica, pero no están probadas y, por lo tanto, técnicamente hablando, no son algoritmos. La prueba de primalidad de Fermat y la prueba de Fibonacci son ejemplos sencillos, y son efectivas cuando se combinan. John Selfridge ha conjeturado que si p es un número impar y p ≡ ±2 (mod 5), entonces p será primo si se cumplen las dos condiciones siguientes:
- 2 p −1 ≡ 1 (mod p ),
- f p +1 ≡ 0 (mod p ),
donde f k es el k -ésimo número de Fibonacci . La primera condición es la prueba de primalidad de Fermat usando base 2.
En general, si p ≡ a (mod x² + 4), donde a es un no residuo cuadrático (mod x² + 4), entonces p debe ser primo si se cumplen las siguientes condiciones:
- 2 p −1 ≡ 1 (mod p ),
- f ( x ) p +1 ≡ 0 (mod p ),
f ( x ) k es el k -ésimo polinomio de Fibonacci en x .
Selfridge , Pomerance y Wagstaff ofrecieron conjuntamente 620 dólares por un contraejemplo o prueba de que no existe ninguno, [ 3 ] y el premio ahora debe ser entregado por la Fundación de Teoría de Números .
Pruebas probabilísticas
Las pruebas probabilísticas son más rigurosas que las heurísticas, ya que proporcionan límites demostrables sobre la probabilidad de ser engañado por un número compuesto. Varias pruebas de primalidad populares son pruebas probabilísticas. Estas pruebas utilizan, además del número probado n , otros números a que se eligen al azar de algún espacio muestral ; las pruebas de primalidad aleatorias habituales nunca informan que un número primo sea compuesto, pero es posible que un número compuesto se informe como primo. La probabilidad de error se puede reducir repitiendo la prueba con varios valores de a elegidos independientemente ; para dos pruebas de uso común, para cualquier compuesto n, al menos la mitad de los a detectan la composición de n , por lo que k repeticiones reducen la probabilidad de error a como máximo 2 − k , que se puede hacer arbitrariamente pequeño aumentando k .
La estructura básica de las pruebas de primalidad aleatorias es la siguiente:
- Elige un número al azar .
- Comprueba la igualdad (correspondiente a la prueba elegida) entre a y el número n dado . Si la igualdad no se cumple, entonces n es un número compuesto y a es un indicador de dicha composición, y la prueba finaliza.
- Vuelva al paso uno hasta alcanzar la precisión requerida.
Después de una o más iteraciones, si no se encuentra que n sea un número compuesto, entonces se puede declarar que probablemente sea primo .
Prueba de primalidad de Fermat
La prueba de primalidad probabilística más sencilla es la prueba de primalidad de Fermat (en realidad, una prueba de composición). Funciona de la siguiente manera:
- Dado un entero n , elige un entero coprimo con n y calcula n − 1 módulo n . Si el resultado es distinto de 1, entonces n es compuesto. Si es igual a 1, entonces n puede ser primo.
Si a n −1 (módulo n ) es 1 pero n no es primo, entonces n se llama pseudoprimo en base a . En la práctica, si a n −1 (módulo n ) es 1, entonces n suele ser primo. Pero aquí hay un contraejemplo: si n = 341 y a = 2, entonces
aunque 341 = 11·31 es compuesto. De hecho, 341 es el pseudoprimo más pequeño en base 2 (véase la Figura 1 de [ 4 ] ).
Solo hay 21853 pseudoprimos en base 2 que son menores que 2,5 × 1010 (véase la página 1005 de [ 4 ] ). Esto significa que, para n hasta 2,5 × 1010 , si 2 n −1 (módulo n ) es igual a 1, entonces n es primo, a menos que n sea uno de estos 21853 pseudoprimos.
Algunos números compuestos ( números de Carmichael ) tienen la propiedad de que a n − 1 es 1 (módulo n ) para todo a coprimo con n . El ejemplo más pequeño es n = 561 = 3·11·17, para el cual a 560 es 1 (módulo 561) para todo a coprimo con 561. Sin embargo, la prueba de Fermat se usa a menudo cuando se necesita un análisis rápido de números, por ejemplo, en la fase de generación de claves del algoritmo criptográfico de clave pública RSA .
Prueba de primacía de Miller-Rabin y Solovay-Strassen
La prueba de primalidad de Miller-Rabin y la prueba de primalidad de Solovay-Strassen son variantes más sofisticadas que detectan todos los números compuestos (es decir, para cada número compuesto n , al menos 3/4 (Miller-Rabin) o 1/2 (Solovay-Strassen) de los números a son testigos de la composición de n ). Estas también son pruebas de composición.
La prueba de primalidad de Miller-Rabin funciona de la siguiente manera: Dado un entero n , elija un entero positivo a < n . Sea 2 s d = n − 1, donde d es impar. Si
y
- a pesar de
Entonces n es compuesto y a es un testigo de la composición. De lo contrario, n puede ser primo o no. La prueba de Miller-Rabin es una prueba de primalidad probable fuerte (véase PSW [ 4 ] página 1004).
La prueba de primalidad de Solovay-Strassen utiliza otra igualdad: dado un número impar n , elija algún entero a < n , si
- , dóndees el símbolo jacobino ,
Entonces n es compuesto y a es un testigo de la composición. De lo contrario, n puede ser primo o no. La prueba de Solovay-Strassen es una prueba de primalidad probable de Euler (véase PSW [ 4 ] página 1003).
Para cada valor individual de a , la prueba de Solovay-Strassen es más débil que la prueba de Miller-Rabin. Por ejemplo, si n = 1905 y a = 2, la prueba de Miller-Rabin muestra que n es compuesto, pero la prueba de Solovay-Strassen no. Esto se debe a que 1905 es un pseudoprimo de Euler en base 2, pero no un pseudoprimo fuerte en base 2 (esto se ilustra en la Figura 1 de PSW [ 4 ] ).
Prueba de primalidad de Frobenius
Las pruebas de primalidad de Miller-Rabin y Solovay-Strassen son sencillas y mucho más rápidas que otras pruebas de primalidad generales. Un método para mejorar aún más la eficiencia en algunos casos es la prueba de pseudoprimalidad de Frobenius ; una ronda de esta prueba lleva aproximadamente tres veces más tiempo que una ronda de Miller-Rabin, pero alcanza un límite de probabilidad comparable al de siete rondas de Miller-Rabin.
La prueba de Frobenius es una generalización de la prueba de Lucas de números primos probables .
Prueba de primacía de Baillie-PSW
La prueba de primalidad de Baillie-PSW es una prueba de primalidad probabilística que combina una prueba de Fermat o Miller-Rabin con una prueba de primalidad probable de Lucas para obtener una prueba de primalidad que no tiene contraejemplos conocidos. Es decir, no hay ningún número compuesto n conocido para el cual esta prueba indique que n es probablemente primo. [ 5 ] [ 6 ] Se ha demostrado que no hay contraejemplos para n.
Otras pruebas
Leonard Adleman y Ming-Deh Huang presentaron una variante sin errores (pero con un tiempo de ejecución polinomial esperado) de la prueba de primalidad de curvas elípticas . A diferencia de otras pruebas probabilísticas, este algoritmo produce un certificado de primalidad y, por lo tanto, puede usarse para demostrar que un número es primo. [ 7 ] El algoritmo es prohibitivamente lento en la práctica.
Si se dispusiera de ordenadores cuánticos , la primalidad podría comprobarse asintóticamente más rápido que con ordenadores clásicos. Una combinación del algoritmo de Shor , un método de factorización de enteros, con la prueba de primalidad de Pocklington podría resolver el problema en. [ 8 ]
Pruebas deterministas rápidas
A principios del siglo XX, se demostró que un corolario del pequeño teorema de Fermat podía usarse para probar la primalidad. [ 9 ] Esto dio como resultado la prueba de primalidad de Pocklington . [ 10 ] Sin embargo, como esta prueba requiere una factorización parcial de n − 1, el tiempo de ejecución seguía siendo bastante lento en el peor de los casos. La primera prueba de primalidad determinista significativamente más rápida que los métodos ingenuos fue la prueba de ciclotomía ; se puede demostrar que su tiempo de ejecución es O ((log n ) c log log log n ), donde n es el número a probar para la primalidad y c es una constante independiente de n . Se hicieron varias mejoras adicionales, pero no se pudo demostrar que ninguna tuviera un tiempo de ejecución polinomial. (El tiempo de ejecución se mide en términos del tamaño de la entrada, que en este caso es ~ log n , que es el número de bits necesarios para representar el número n .) Se puede demostrar que la prueba de primalidad de curva elíptica se ejecuta en O((log n ) 6 ), si algunas conjeturas sobre la teoría analítica de números son ciertas. De manera similar, bajo la hipótesis generalizada de Riemann (que Miller, confusamente, llama la " hipótesis extendida de Riemann "), se puede demostrar que la prueba determinista de Miller , que forma la base de la prueba probabilística de Miller-Rabin, se ejecuta en Õ ((log n ) 4 ). [ 11 ] En la práctica, este algoritmo es más lento que los otros dos para tamaños de números que se pueden manejar. Debido a que la implementación de estos dos métodos es bastante difícil y crea un riesgo de errores de programación, a menudo se prefieren pruebas más lentas pero más simples.
En 2002, Manindra Agrawal , Neeraj Kayal y Nitin Saxena inventaron la primera prueba de tiempo polinomial determinista incondicionalmente demostrable para la primalidad . La prueba de primalidad AKS se ejecuta en Õ((log n ) 12 ) (mejorada a Õ((log n ) 7.5 ) [ 12 ] en la revisión publicada de su artículo), que puede reducirse aún más a Õ((log n ) 6 ) si la conjetura de Sophie Germain es verdadera. [ 13 ] Posteriormente, Lenstra y Pomerance presentaron una versión de la prueba que se ejecuta en tiempo Õ((log n ) 6 ) incondicionalmente. [ 14 ]
Agrawal, Kayal y Saxena sugieren una variante de su algoritmo que se ejecutaría en Õ((log n ) 3 ) si la conjetura de Agrawal es verdadera; sin embargo, un argumento heurístico de Hendrik Lenstra y Carl Pomerance sugiere que probablemente sea falsa. [ 12 ] Una versión modificada de la conjetura de Agrawal, la conjetura de Agrawal-Popovych, [ 15 ] aún podría ser verdadera.
Complejidad
En la teoría de la complejidad computacional , el lenguaje formal correspondiente a los números primos se denomina PRIMES. Es fácil demostrar que PRIMES pertenece a Co-NP : su complemento COMPOSITES pertenece a NP porque se puede determinar la composición adivinando un factor de forma no determinista.
En 1975, Vaughan Pratt demostró que existía un certificado de primalidad que se podía comprobar en tiempo polinomial, y por lo tanto que PRIMES estaba en NP , y por consiguiente en Consulte el certificado de primacía para obtener más detalles.
El posterior descubrimiento de los algoritmos de Solovay-Strassen y Miller-Rabin puso a PRIMES en coRP . En 1992, el algoritmo de Adleman-Huang [ 7 ] redujo la complejidad a , que sustituyó el resultado de Pratt.
La prueba de primalidad de Adleman-Pomerance-Rumely de 1983 colocó a PRIMES en QP ( tiempo cuasipolinomial ), que no se sabe que sea comparable con las clases mencionadas anteriormente.
Debido a su tratabilidad en la práctica, los algoritmos de tiempo polinomial que asumen la hipótesis de Riemann y otras evidencias similares, se sospechaba desde hace tiempo, aunque no se había demostrado, que la primalidad podía resolverse en tiempo polinomial. La existencia de la prueba de primalidad AKS finalmente resolvió esta antigua cuestión y colocó a PRIMES en P. Sin embargo, no se sabe si PRIMES es P-completo , y se desconoce si pertenece a clases que se encuentran dentro de P, como NC o L. Se sabe que PRIMES no está en AC 0. [ 16 ]
Métodos basados en la teoría de números
Existen ciertos métodos de teoría de números para comprobar si un número es primo, como la prueba de Lucas y la prueba de Proth . Estas pruebas suelen requerir la factorización de n + 1, n − 1 o una cantidad similar, lo que significa que no son útiles para pruebas de primalidad de propósito general, pero a menudo resultan bastante eficaces cuando se sabe que el número n sometido a prueba tiene una forma especial.
La prueba de Lucas se basa en el hecho de que el orden multiplicativo de un número a módulo n es n − 1 para un número primo n cuando a es una raíz primitiva módulo n . Si podemos demostrar que a es primitivo para n , podemos demostrar que n es primo.
Referencias
- 1 2 Riesel (1994) págs. 2-3
- ↑ Barrus, Mike; Clark, W. Edwin (2021-09-05). "Pruebas de primalidad" . Teoría elemental de números . Matemáticas LibreTexts . Recuperado el 2025-03-14 .
- ↑ Guy, Richard (1994). Problemas sin resolver en teoría de números . Springer-Verlag: Nueva York. pág. 28. ISBN 0387942890.
- 1 2 3 4 5 Pomerance, Carl ; Selfridge, John L .; Wagstaff, Samuel S. Jr. (julio de 1980). "Los pseudoprimos hasta 25·10 9 " (PDF) . Matemáticas de la Computación . 35 (151): 1003–1026 . doi : 10.1090/S0025-5718-1980-0572872-7 .
- ↑ Baillie, Robert; Wagstaff, Samuel S. Jr. (octubre de 1980). "Lucas Pseudoprimes" (PDF) . Mathematics of Computation . 35 (152): 1391– 1417. doi : 10.1090/S0025-5718-1980-0583518-6 . MR 0583518 .
- ↑ Baillie, Robert; Fiori, Andrew; Wagstaff, Samuel S. Jr. (julio de 2021). "Fortalecimiento de la prueba de primalidad de Baillie-PSW". Mathematics of Computation . 90 (330): 1931– 1955. arXiv : 2006.14425 . doi : 10.1090/mcom/3616 . S2CID 220055722 .
- 1 2 Adleman, Leonard M. ; Huang, Ming-Deh (1992). Prueba de primalidad y variedades abelianas sobre cuerpos finitos . Notas de clase en matemáticas. Vol. 1512. Springer-Verlag . ISBN 3-540-55308-8.
- ↑ Chau, HF; Lo, H.-K. (1995). "Prueba de primalidad mediante factorización cuántica". arXiv : quant-ph/9508005 .
- ↑ Pocklington, HC (1914). "La determinación de la naturaleza prima o compuesta de los números grandes mediante el teorema de Fermat". Cambr. Phil. Soc. Proc . 18 : 29–30 . JFM 45.1250.02 .
- ↑ Weisstein, Eric W. "Teorema de Pocklington" . MathWorld .
- ↑ Gary L. Miller (1976). "La hipótesis de Riemann y las pruebas de primalidad" . Journal of Computer and System Sciences . 13 (3): 300– 317. doi : 10.1016/S0022-0000(76)80043-8 .
- ^ Agrawal , Manindra; Kayal, Neeraj; Saxena, Nitin (2004). "Los números primos están en P" (PDF) . Anales de Matemáticas . 160 (2): 781– 793. doi : 10.4007/annals.2004.160.781 .
- ^ Agrawal, Manindra; Kayal, Neeraj; Saxena, Nitin (2004). "PRIMES está en P" (PDF) . Anales de Matemáticas . 160 (2): 781– 793. doi : 10.4007/annals.2004.160.781 .
- ↑ Carl Pomerance y Hendrik W. Lenstra (20 de julio de 2005). "Prueba de primalidad con períodos gaussianos" (PDF) .
- ↑ Popovych, Roman (30 de diciembre de 2008). "Una nota sobre la conjetura de Agrawal" (PDF) .
- ↑ Allender, Eric; Saks, Michael; Shparlinski, Igor (2001). "Un límite inferior para la primalidad" . Journal of Computer and System Sciences . 62 (2): 356– 366. doi : 10.1006/jcss.2000.1725 .
Fuentes
- Crandall, Richard ; Pomerance, Carl (2005). Números primos: una perspectiva computacional (2.ª ed.). Springer. ISBN 0-387-25282-7.Capítulo 3: Reconocimiento de números primos y compuestos, págs. 109–158. Capítulo 4: Demostración de primalidad, págs. 159–190. Sección 7.6: Demostración de primalidad de curvas elípticas (ECPP), págs. 334–340.
- Knuth, Donald (1997). «Sección 4.5.4». El arte de la programación informática . Vol. 2: Algoritmos seminuméricos (3.ª ed.). Addison-Wesley. págs. 391-396 . ISBN 0-201-89684-2.
- Cormen, Thomas H.; Leiserson , Charles E .; Rivest, Ronald L .; Stein, Clifford (2001). «Sección 31.8: Prueba de primalidad». Introducción a los algoritmos (Segunda edición). MIT Press, McGraw-Hill. págs. 887-896 . ISBN 0-262-03293-7.
- Papadimitriou, Christos H. (1993). «Sección 10.2: Primalidad». Complejidad computacional (1.ª ed.). Addison Wesley. pp. 222-227 . ISBN 0-201-53082-1. Zbl 0833.68049 .
- Riesel, Hans (1994). Números primos y métodos informáticos para la factorización . Progress in Mathematics. Vol. 126 (segunda ed.). Boston, Massachusetts: Birkhäuser. ISBN 0-8176-3743-5. Zbl 0821.11001 .
Enlaces externos
- Enlace obsoleto en archive.today (archivado el 20/12/2012) – Implementación de la prueba de primalidad de Solovay-Strassen en Maple
- Cómo distinguir los números primos de los números compuestos, por DJ Bernstein (cr.yp.to)
- Las páginas principales (primes.utm.edu)
- Prueba de primalidad de Lucas con N − 1 factorizado (MathPages.com) en los archivos web de la Biblioteca del Congreso (archivado el 6 de agosto de 2010).
- PRIMABOINCA es un proyecto de investigación que utiliza ordenadores conectados a Internet para buscar un contraejemplo a algunas conjeturas. La primera conjetura ( la conjetura de Agrawal ) fue la base para la formulación del primer algoritmo determinista de prueba de primos en tiempo polinomial ( algoritmo AKS ).
- Pruebas de primalidad
- Algoritmos de clave asimétrica