¿Cuál es el algoritmo más rápido para generar números primos y su complejidad?

Puedes usar las matemáticas védicas …

Dice que si un número n es primo, entonces debe satisfacer esta fórmula.

(2 ^ (n-1)) mod n == 1

También se puede escribir de esta manera.

((2 ^ (n-1)) mod n) – 1 = 0

Prueba de la fórmula

Para n = 5, 2 ^ 4 mod 5 = 16 mod 5 = 1. Satisface la fórmula anterior.

Para n = 13, 2 ^ 12 mod 13 = 4096 mod 13 = 1. También satisface

Del mismo modo, podemos verificar todos los demás números primos.

Tome un ejemplo cuando el número no es primo

Para n = 6, 2 ^ 5 mod 6 = 32 mod 6 = 2 ≠ 1 … por lo tanto, no cumple con la fórmula anterior …

Complejidad del tiempo.

Dado que el operador de potencia y módulo tarda un tiempo constante … Por lo tanto, la fórmula toma tiempo constante para verificar si el número es primo o no.

Complejidad de tiempo = O (1).

Sugerencia: las matemáticas védicas son conocidas por la computación.

Supongamos que desea generar números primos en secuencia a partir de un valor fijo pequeño (como 2): esto elimina los algoritmos técnicamente correctos pero tontos como ‘ while (1) printf("2\n"); ‘y no trae pruebas de primalidad.

En la práctica, el tamiz segmentado de Eratóstenes usando una rueda pequeña (30 o 210) es el algoritmo más rápido. Implementaciones ligeramente diferentes pueden ser más rápidas en diferentes rangos. El programa actual más rápido que conozco (y he comparado muchos de ellos) es primesieve. yafu (también un SoE) también es bastante rápido, aunque no está claro cómo separarlo del programa principal. Primegen (SoA) y Perl / ntheory (SoE) son aproximadamente 2 veces más lentos, con Primegen comenzando bien pero disminuyendo mucho a medida que aumentan los tamaños. Los tamices monolíticos como los utilizados en Pari o innumerables ejemplos de código funcionan un poco más lento para los tamices pequeños, pero disminuyen la velocidad muy rápidamente en comparación a medida que crece el tamaño.

Las páginas de Wikipedia para el Tamiz de Eratóstenes y el Tamiz de Atkin son lecturas útiles.

El estándar SoE tiene complejidad O (n log log n). Es posible usar ruedas sin restricciones para reducir esto a O (n), pero esto rara vez se hace ya que no funciona más rápido en la práctica. El algoritmo básico es bastante simple y tiene solo 4 líneas de código en la mayoría de los idiomas (obtener los detalles correctos de las 4 líneas es sorprendentemente difícil según los ejemplos que se encuentran en los foros: el pseudocódigo de Wikipedia lo tiene bien). La página de Primesieve tiene algunos ejemplos de cómo escribir un tamiz segmentado básico.

El SoA se implementa ocasionalmente, aunque rara vez sigue el algoritmo completo (el primegen de Bernstein sí, pero la mayoría tiene una versión simple que solía estar en Wikipedia y es mucho más lenta). El algoritmo completo está mucho más involucrado que el SoE, y la página de Wikipedia ahora tiene texto que está bastante cerca del documento S0A. Tenga en cuenta que tiene una rueda mod-30 integrada en las matemáticas (es decir, omite los múltiplos de 2, 3 y 5 en el bucle, algo que también es común en las implementaciones rápidas de SoE). El algoritmo es O (n). Los autores presentan una modificación que puede ejecutarse en O (n / log log n) pero similar al Pritchard Wheel Sieve para el SoE, resulta más lento en la práctica. Como se mencionó en un párrafo anterior, aunque la complejidad asintótica se ve bien, es un tanto engañosa (comparar el SoA con un SoE estándar) y tampoco sigue en la práctica: las constantes en este caso son lo suficientemente altas como para importar.

Tamiz de Eratóstenes.

Esto generará primos O (n / log (n)) en O ( n log log n ). Dudo que cualquier otro algoritmo pueda acercarse.

More Interesting

¿Cuál es la conclusión del algoritmo de Dijkstra?

¿Cuál es el significado de la complejidad del tiempo pseudo polinomial? Vi que Knapsack se ejecuta en tiempo pseudo polinomial. Leí sobre esto aquí: tiempo pseudo-polinomial pero no puedo seguirlo. Quiero comprender el concepto de tiempo de ejecución pseudo polinomial y cómo se ejecuta la mochila en tiempo de pseudo polinomio.

En programación de computadoras, ¿por qué es importante la clasificación? ¿Cuándo se utilizan los algoritmos de clasificación en la codificación real?

¿Cuáles son los algoritmos propuestos para la detección de revisiones falsas en el análisis de sentimientos?

¿Las personas aprenden algoritmos antes de aprender JavaScript?

¿Cuáles son algunos algoritmos / métodos de aprendizaje automático altamente efectivos?

¿Debería centrarme en el aprendizaje de algoritmos y estructuras de datos en profundidad, o aprender una habilidad como desarrollo web o desarrollo móvil usando Nanodegree?

Cómo convertir la salida de números complejos generada por el algoritmo FFT en frecuencia vs amplitud

¿Cuáles son algunas de las cosas que los algoritmos de aprendizaje automático pueden hacer pero los algoritmos de aprendizaje profundo no pueden hacer?

Cómo verificar si un cuadrado dibujado está cerrado (tiene los 4 lados dibujados)

¿Es la calificación de revisión un factor en el algoritmo de 'Yelp Sort' de Yelp?

¿Qué algoritmo puedo usar para hacer que una imagen se vea más caricaturesca?

He estado haciendo programación competitiva durante años, pero ahora me encuentro despistado en mi clase de Algoritmos. ¿Qué tengo que hacer?

¿Mattermark está utilizando datos para entrenar algoritmos de aprendizaje automático y modelos predictivos que pueden buscar / identificar nuevas empresas potenciales en una etapa temprana que tienen el potencial de interrumpir la industria?

Cómo encontrar la mediana de m matrices ordenadas