Fórmula para calcular números primos y optimizar divisores de fuerza bruta

Saludos! En mi tiempo libre decidí investigar el problema de encontrar números primos. El tema es extenso e interesante. Quiero compartir un par de pensamientos al respecto que me vinieron a la mente. Una búsqueda en Internet no reveló tal, señalando su originalidad.

En primer lugar, nunca he encontrado una fórmula matemática para calcular primos en orden. Pero después de todo, si hay algoritmos, entonces es posible componer fórmulas usando funciones lógicas u operadores. Doy a continuación la fórmula más concisa que resultó.

Para alguna secuencia de números ( X m ) = x 1 , x 2 , x 3 , . . . x m a x Introducimos el operador de detección del primer número igual a a:

\ mathbf {Dt_ {a}} (x_ {m}): = \ left \ {\ begin {matrix} m \ \ mathbf {if} \ \ exist \ m: \ forall \, k <m \ x_ {k } \ neq a \ \ mathbf {y} \ x_ {m} = a \\ 0 \ \ mathbf {de lo contrario} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ end {matrix} \ right.

\ mathbf {Dt_ {a}} (x_ {m}): = \ left \ {\ begin {matrix} m \ \ mathbf {if} \ \ exist \ m: \ forall \, k <m \ x_ {k } \ neq a \ \ mathbf {y} \ x_ {m} = a \\ 0 \ \ mathbf {de lo contrario} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ end {matrix} \ right.


Todos los números primos, comenzando con 5, se pueden calcular mediante la fórmula:

Pn=Pn1+2 mathbfDti0( mathbfDtj0((Pn1+2i)modPj+1)),    foralln geqslant3 forallimax geqslant max fracP alphaP alpha12+10 ,,  2 leqslant alpha leqslantn1;  jmax= pi( sqrtPn1+2i)1


Operador  mathbfDtj0 itera sobre j el resto de dividir cada número de candidato por simplicidad con i numero (Pn1+2i) a primos ya encontrados en el rango hasta Pjmax+1 . Los números candidatos se seleccionan en orden del conjunto de números impares mayores que el número primo anterior Pn1 .  pi( sqrtPn1+2i) Es una función pi que muestra el número de primos  leqslant sqrtPn1+2i .
Operador  mathbfDti0 itera sobre i valores de salida del operador  mathbfDtj0 hasta que encuentre 0. Dado que la serie de números primos es infinita, esto sucederá tarde o temprano. A la salida del operador  mathbfDti0 entonces siempre habrá algún número i . Límite inferior imax está determinado por la diferencia máxima de primos adyacentes más pequeños que el deseado. El aumento en esta diferencia ocurre logarítmicamente. El siguiente gráfico muestra la dependencia del crecimiento máximo y promedio.  DeltaP alpha de n para los primeros 100.000 primos. El valor máximo fue muestreado y promediado para cada mil números. imagen
El aumento máximo en la diferencia de primos  deltamax( DeltaP alpha) al valor máximo anterior max( DeltaP alpha) igual a 20 (para la diferencia de primos 31397-31469 = 72 con respecto a la diferencia 25523-25471 = 52). Es en la región donde la derivada del logaritmo de la envoltura  DeltaP alpha todavía lo suficientemente grande, y los números primos ya no son demasiado pequeños. Según este valor, la condición para imax . Graph  deltamax( DeltaP alpha) para los primeros 50,000 primos dados a continuación. Los valores se calcularon por cada mil. imagen
El pico es visible en 20. Con el aumento de n, el gráfico va a menos, mostrando una disminución en la tasa de crecimiento de los números primos grandes.

La segunda consideración es optimizar el cálculo de una secuencia de primos.
El algoritmo establecido en la fórmula anterior es un método mejorado para enumerar divisores. Las mejoras son para excluir números pares de la consideración y verificar la divisibilidad de solo primos más pequeños que sq. Las raíces de los números candidatos. La parte más difícil del algoritmo es el cálculo del conjunto de funciones mod restantes. La complejidad se puede reducir optimizando esta función. Sin embargo, hay una forma aún más efectiva. Dejar (rn1j+1)=r2,r3,...r pi( sqrtPn1) Es una secuencia de residuos que divide el último número primo encontrado en primos desde 3 hasta la raíz del mismo. Haremos secuencias de la forma.

(rni,j+1)=(r2+2i)modP2,(r3+2i)modP3,...(r pi( sqrtPn1)+2i)modP pi( sqrtPn1),(Pn1+2i)modP pi( sqrtPn1+2i)

en orden a partir de i=1 . El último término se calcula si  pi( sqrtPn1+2i) neq pi( sqrtPn1) . Cuando en algún paso del cálculo el resto rni,j+1 se vuelve igual a 0, vaya a la siguiente secuencia. Esto se hace hasta que se encuentra, en el que todos los residuos son distintos de cero. Esto significa encontrar el siguiente número primo. Secuencia (rnj+1) debe guardarse hasta que se encuentre el siguiente número primo. La fórmula recurrente para calcular números primos de esta manera se convierte a:

Pn=Pn1+2 mathbfDti0( mathbfDtj0(rni,j+1)),    foralln geqslant3


En el algoritmo presentado, la operación mod es facilitada: divisible por (rj+1+2i)/Pj+1 veces más divisores. Las únicas excepciones son la aparición de nuevos divisores simples. En la memoria de la computadora, al implementar el algoritmo, es necesario almacenar una matriz de primos en la raíz de lo buscado, así como una matriz variable de residuos. La complejidad del algoritmo en el sentido general (la cantidad de trabajo) puede ser menor que la de otros métodos conocidos. Las operaciones más complejas en él son la extracción de la raíz cuadrada, el cálculo de residuos y la multiplicación. La raíz se puede extraer al entero más cercano. Para obtener residuos, puede usar un algoritmo efectivo basado en la regla general de divisibilidad. La multiplicación se usa solo por 2 números relativamente pequeños i . La complejidad temporal del algoritmo puede reducirse distribuyendo el trabajo de acuerdo con los valores de i . El tamiz segmentado obtenido de esta manera debería funcionar más rápido en computadoras con múltiples subprocesos. Sin embargo, el trabajo realizado será mayor debido al aumento de los dividendos. También puede "atornillar" la factorización de rueda en el algoritmo. Con el tamaño óptimo de las ruedas, esto puede reducir la complejidad en un cierto rango de n , hasta que el hardware se vuelva más lento.

Tal vez alguien sea útil para mis pensamientos.

Source: https://habr.com/ru/post/472036/


All Articles