De Wikipedia:
La complejidad del algoritmo son
O(n(logn)(loglogn))
las operaciones de bits.
¿Cómo llegas a eso?
Que la complejidad incluya el loglogn
término me dice que hay un sqrt(n)
lugar.
Supongamos que estoy ejecutando el tamiz en los primeros 100 números ( n = 100
), suponiendo que marcar los números como compuestos toma un tiempo constante (implementación de matriz), la cantidad de veces que usamos mark_composite()
sería algo así como
n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2)
Y para encontrar el siguiente número primo (por ejemplo, para saltar 7
después de tachar todos los números que son múltiplos de 5
), el número de operaciones sería O(n)
.
Entonces, la complejidad sería O(n^3)
. ¿Estás de acuerdo?
Respuestas:
Su n / 2 + n / 3 + n / 5 +… n / 97 no es O (n), porque el número de términos no es constante. [Editar después de su edición: O (n 2 ) es un límite superior demasiado suelto.] Un límite superior suelto es n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (suma de los recíprocos de todos los números hasta n), que es O (n log n): consulte Número armónico . Un límite superior más adecuado es n (1/2 + 1/3 + 1/5 + 1/7 +…), que es la suma de los recíprocos de los números primos hasta n, que es O (n log log n). (Vea aquí o aquí ).
El bit "encontrar el siguiente número primo" es solo O (n) en total, amortizado ; avanzará para encontrar el siguiente número solo n veces en total , no por paso. Entonces, toda esta parte del algoritmo toma solo O (n).
Entonces, usando estos dos, obtienes un límite superior de operaciones aritméticas O (n log log n) + O (n) = O (n log log n). Si cuenta operaciones de bits, dado que está tratando con números hasta n, tienen aproximadamente log n bits, que es donde entra el factor de log n, lo que da O (n log n log log n) operaciones de bits.
fuente
Tenga en cuenta que cuando encuentra un número primo
P
mientras tamiza, no comienza a tachar números en su posición actual +P
; de hecho, comienzas a tachar los números enP^2
. Todos los múltiplos deP
menos deP^2
habrán sido tachados por números primos anteriores.fuente
p
op^2
, la complejidad es la misma (con matrices de acceso directo).SUM (1/p) {p<N} ~ log (log N)
es la razón.n/i
pasos, dondei
es primo => toda la complejidad essum(n/i) = n * sum(1/i)
. Según la serie de armónicos primos,sum (1/i)
dondei
es primo eslog (log n)
. En totalO(n*log(log n))
,.Creo que el bucle superior se puede optimizar reemplazando
n
consqrt(n)
la complejidad del tiempo totalO(sqrt(n)loglog(n))
:fuente
isprime
es absolutamente el nombre incorrecto para usar allí.consulte la explicación anterior, el ciclo interno es la suma armónica de todos los números primos hasta sqrt (n). Entonces, la complejidad real de es O (sqrt (n) * log (log (sqrt (n))))
fuente