Test de primalidad AKS
El test de primalidad AKS o algoritmo AKS es un algoritmo determinista que decide en tiempo polinómico si un número natural es primo o compuesto. Fue diseñado por los científicos de computación Manindra Agrawal, Neeraj Kayal y Nitin Saxena del Instituto tecnológico hindú de Kanpur en el año 2002, y eventualmente mejorado por otros investigadores del área. Su descubrimiento pone fin a uno de los más grandes problemas de la teoría de números y teoría de la complejidad computacional.
El problema de la primalidad
editarEl problema de la primalidad consiste en averiguar si un número natural es primo o compuesto. Hay métodos muy antiguos para resolver este problema como la criba de Eratóstenes (200 a. C.) o la división por tentativa, sin embargo estos métodos resultan ineficaces cuando se desea analizar números grandes. Para decidir la primalidad de un número , la criba de Eratóstenes requiere un tiempo de ejecución que es proporcional a . Por otro lado, la cantidad de dígitos que se necesitan para escribir tal número es proporcional a .
En términos de complejidad computacional, se dice que un método eficaz debería requerir un tiempo polinómico respecto a la cantidad de dígitos. En este caso se desea tener un algoritmo que decida en un tiempo proporcional a , si es un número primo o compuesto. Utilizando la notación O grande, esta proporción se abrevia como . El algoritmo AKS es el primer algoritmo que se conoce con estas características.
Historia
editarAntes de que Agrawal, Kayal y Saxena describieran su algoritmo, se hicieron muchos intentos por resolver el problema de la primalidad de manera eficiente. En 1798 Gauss sugirió que para distinguir a los números primos de los números compuestos no era necesario descomponer en factores a estos últimos.
En 1636 Fermat presentó su célebre pequeño teorema de Fermat con el cual se dio a conocer una característica que cumplen todos los números primos. Dicho teorema afirma que cuando es un número primo la siguiente congruencia se cumple:
Este teorema se tomó como fundamento de varios tests de primalidad.
El test de primalidad de Miller-Rabin fue presentado en 1980. El algoritmo sí funciona en tiempo polinomial, pero es probabilista. Por ejemplo, después de realizar el test de Miller-Rabin veces, el algoritmo o bien expide un certificado de que el número es compuesto o bien afirma que el número tiene una alta probabilidad de ser primo. El test de Miller-Rabin requiere un tiempo con una probabilidad de error de en .
En 1983 Leonard Adleman, Carl Pomerance, y Robert Rumely crearon un test de primalidad que sí es determinista pero cuyo tiempo de ejecución era exponencial: . Su algoritmo está basado en teoría muy compleja y una generalización del pequeño teorema de Fermat hacia los números enteros en campos ciclotómicos. Sin embargo, este algoritmo es tan rápido que durante mucho tiempo se usaron variantes para romper marcas en cuanto a comprobar la primalidad de números con más de mil cifras decimales. A pesar de este gran logro, todavía existía la pregunta de si existe algún algoritmo que funcione en tiempo polinómico y que fuera determinista.
En 1992 surgieron otra clase algoritmos basados en curvas elípticas, pero que tampoco eran deterministas.
Finalmente, en 1999 Manindra Agrawal estudió una variante del pequeño teorema de Fermat. Dos años después, él y sus dos estudiantes del IITK comenzaron a analizar todas las propiedades de esta variante hasta que encontraron una caracterización completa de los números primos. Con base en esta caracterización, en el año 2002 presentaron su algoritmo en el artículo PRIMES is in P.
Fundamentos del algoritmo
editarEl algoritmo AKS está basado en una generalización del pequeño teorema de Fermat hacia los polinomios. El teorema afirma que si y son números coprimos, donde es primo, entonces se cumple la congruencia:
Es decir, si se eleva el polinomio a la potencia , y luego se divide por , entonces el residuo de dicha división es . Más aún, si se cumple esta congruencia entonces debe ser un número primo.
A pesar de que esta congruencia caracteriza por completo a los números primos, no es factible aplicarla dado que el cálculo de requiere más tiempo que la criba de Eratóstenes. En su lugar, se utiliza la congruencia:
Es decir, la equivalencia entre los residuos de los polinomios y después de haber sido divididos por y a su vez cada coeficiente por . En lenguaje matemático se abrevia como en el anillo . Algunos números compuestos satisfacen esta congruencia, pero si se elige de manera adecuada y se cumple la congruencia para varios números , entonces debe ser o un número primo o al menos una potencia de un número primo.
El «orden de un número módulo » se denota matemáticamente como . Representa el más pequeño valor de para el cual . El algoritmo AKS selecciona como el más pequeño que cumple (véase Logaritmo binario).
Además de esto, el algoritmo también requiere conocer la función de Euler y el máximo común divisor.
La corrección del algoritmo está garantizada por un teorema que originalmente fue demostrado por los autores y posteriormente resumido por Lenstra, Jr. y Bernstein. En su forma más sencilla, dicho teorema afirma que si , y son enteros positivos, y si un conjunto finito de enteros, entonces es una potencia de un número primo siempre y cuando se cumplan las siguientes condiciones:
- El .
- El .
- El para cada par de elementos que pertenecen a .
- El hecho de que divida a , implica que .
- Para cualquier elemento de se cumple en el anillo .
Descripción formal
editarEl algoritmo se puede expresar en pseudocódigo como sigue:
Algoritmo AKS: Decide si un número natural es un número primo o compuesto |
|
Análisis e implementación
editar- El primer paso se puede efectuar comprobando que para . Esto requiere un tiempo .
- El segundo paso se puede implementar buscando al primer valor de que verifique para cualquier valor de . Como , entonces este paso se efectúa en un tiempo .
- En el tercer paso se puede utilizar el algoritmo de Euclides para buscar el máximo común divisor de dos números. Dado que se necesitan calcular de estos valores, el tiempo necesario es .
- En el cuarto paso solo se necesita comparar los dígitos. Esto necesita un tiempo .
- El quinto paso es el más lento de todos. Se puede utilizar una variante de la exponenciación binaria para calcular la parte izquierda de cada congruencia. Se necesitan calcular de estas congruencias. Por lo tanto este paso requiere un tiempo .
Por lo tanto el algoritmo AKS requiere un tiempo . Es decir, el algoritmo AKS resuelve el problema de la primalidad de manera determinista y en un tiempo polinómico. En la práctica, el algoritmo parece correr en un tiempo . Este tiempo se podría demostrar siempre y cuando se demuestre la conjetura de los números primos gemelos.
Referencias
editar- Manindra Agrawal, Neeraj Kayal, Nitin Saxena (2004). «PRIMES is in P». Annals of Mathematics 160 (2). ISSN 0003-486X , 781-793.
- Folkmar Bornemann (2003). «PRIMES Is in P: A Breakthrough for "Everyman"». Notices of the AMS 50 (5). ISSN 0002-9920 , 545-552.
- José de Jesús Angel Angel, Guillermo Morales-Luna (2008). «El algoritmo de Agrawal, Kayal y Saxena para decidir primalidad». Carta Informativa, Sociedad Matemática Mexicana (55). (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
- Bernstein, Daniel (2003). Proving primality after Agrawal-Kayal-Saxena. Preprint.
- Crandall, R; Papadopoulos, J (2003). «On the implementation of AKS-class primality tests». Advanced Computation Group.