A pesar de las apariencias, rara vez existe un algoritmo “más rápido” claramente definido para algo. Los tiempos de ejecución dependen de recursos computacionales, detalles de implementación y ocasionalmente (¡incluso para algoritmos deterministas!), Suerte. Si eso no es suficiente, a veces podemos creer pero ser incapaces de probar que cierto algoritmo realmente funciona dentro de un cierto número de iteraciones.
Estás preguntando acerca de una prueba determinista, pero permíteme señalar que muy pocas personas ven una necesidad real de tanta insistencia. Las pruebas probabilísticas de primalidad son, en general, mucho más simples de implementar y mantener que las deterministas, y pueden ajustarse fácilmente para que su probabilidad de falla sea menor que 1 en 10 ^ 30; las fallas de hardware y software ocurren a un ritmo mucho más alto que esto, por lo que parece un poco inútil insistir en que el algoritmo teórico subyacente esté “garantizado” para funcionar en un sentido teórico.
Si realmente quieres un algoritmo determinista, tus principales opciones son:
- ¿Qué es la teoría analítica de números?
- ¿La operación Bitwise es importante en Python? Estoy aprendiendo esta parte en Codecademy y no entendí totalmente. ¿Qué es Base 2 y Base 10?
- ¿Cuáles son los problemas finales más interesantes del cálculo?
- ¿Cuáles son las aplicaciones de la teoría de autómatas?
- ¿Es un cierre una función o el entorno en el que se definió dicha función?
Prueba de primaria de curva elíptica (ECP)
Creo que este es el algoritmo más utilizado en la práctica. Ha existido desde antes de AKS (ver más abajo) y aunque es potencialmente inferior a él (no se ha demostrado que sea polinomial), la mayoría de las personas cree que es perfectamente polinomial y, de hecho, más rápido que AKS.
Comprender el ECP requiere un esfuerzo considerable si no tienes experiencia en teoría de números, e implementarlo desde cero también es una tarea no trivial. Obviamente, hay muchos paquetes de ECP que con gusto probarán primos a la derecha y a la izquierda si desea utilizarlos.
http://en.wikipedia.org/wiki/Ell…
Agrawal-Kayal-Saxena (AKS)
Desde una perspectiva teórica, el descubrimiento de AKS fue un verdadero avance: el primer procedimiento de prueba de primalidad polinomial demostrable. Tampoco es terriblemente difícil de entender e implementar. Sin embargo, en la práctica no funciona mejor que sus hermanos no comprobables como ECP. Lenstra y Pomerance descubrieron una variante mejorada, y puede encontrar un tutorial detallado de una implementación aquí:
http://teal.gmu.edu/courses/ECE7…
Prueba de Miller
Básicamente se trata de aplicar la prueba probabilística de Miller-Rabin sobre suficientes “testigos” potenciales para garantizar un resultado incondicionalmente correcto. En general, es más lento que los otros algoritmos, pero para números “pequeños” (ciertamente hasta trillones) es tan simple de implementar y requiere tan pocas iteraciones que posiblemente sea el más rápido y confiable. Citando de Wikipedia:
Cuando el número n que se va a probar es pequeño, no es necesario intentar todo a <2 (ln n ) 2, ya que se sabe que son suficientes conjuntos más pequeños de testigos potenciales. Por ejemplo, Pomerance, Selfridge y Wagstaff, Jaeschke y Buoye han verificado que
- si n <1.373.653, es suficiente para probar a = 2 y 3;
- si n <9.080.191, es suficiente para probar a = 31 y 73;
- si n <4,759,123,141, es suficiente para probar a = 2, 7 y 61;
- si n <2,152,302,898,747, es suficiente para probar a = 2, 3, 5, 7 y 11;
- si n <3.474.749.660.383, es suficiente para probar a = 2, 3, 5, 7, 11 y 13;
- si n <341,550,071,728,321, es suficiente para probar a = 2, 3, 5, 7, 11, 13 y 17.
(Lo que todo esto significa es que la prueba de Miller depende de verificar a su candidato principal p contra varios valores de a, y si verifica contra a = 2, 3, 5, 7, 11, 13 y 17, entonces se garantiza que identificará correctamente ceba hasta 300 billones y más. Esto está usando solo 7 iteraciones simples; dudo que ECP o AKS puedan mejorar significativamente en este rango, si es que lo hacen).
http://en.wikipedia.org/wiki/Mil…