De Wikipedia:
La complexité de l'algorithme réside dans
O(n(logn)(loglogn))
les opérations sur les bits.
Comment y arrivez-vous?
Que la complexité inclut le loglogn
terme me dit qu'il y a un sqrt(n)
quelque part.
Supposons que j'exécute le tamis sur les 100 premiers nombres ( n = 100
), en supposant que le marquage des nombres comme composites prend un temps constant (implémentation du tableau), le nombre de fois que nous utilisons mark_composite()
serait quelque chose comme
n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2)
Et pour trouver le prochain nombre premier (par exemple pour sauter après 7
avoir barré tous les nombres multiples de 5
), le nombre d'opérations serait O(n)
.
Donc, la complexité serait O(n^3)
. Êtes-vous d'accord?
Réponses:
Votre n / 2 + n / 3 + n / 5 +… n / 97 n'est pas O (n), car le nombre de termes n'est pas constant. [Modifier après votre modification: O (n 2 ) est une limite supérieure trop lâche.] Une limite supérieure lâche est n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (somme des réciproques de tous les nombres jusqu'à n), qui est O (n log n): voir nombre harmonique . Une borne supérieure plus correcte est n (1/2 + 1/3 + 1/5 + 1/7 +…), c'est-à-dire la somme des réciproques de nombres premiers jusqu'à n, qui est O (n log log n). (Voir ici ou ici .)
Le bit "trouver le prochain nombre premier" est seulement O (n) globalement, amorti - vous irez de l'avant pour trouver le nombre suivant seulement n fois au total , pas par pas. Donc, toute cette partie de l'algorithme ne prend que O (n).
Donc, en utilisant ces deux, vous obtenez une limite supérieure d'opérations arithmétiques O (n log log n) + O (n) = O (n log log n). Si vous comptez les opérations sur bits, puisque vous avez affaire à des nombres allant jusqu'à n, ils ont environ log n bits, c'est là que le facteur de log n entre en jeu, donnant O (n log n log log n) opérations sur bits.
la source
Gardez à l'esprit que lorsque vous trouvez un nombre premier
P
pendant le tamisage, vous ne commencez pas à rayer les nombres à votre position actuelle +P
; vous commencez en fait à rayer des chiffres àP^2
. Tous les multiples deP
moins queP^2
auront été barrés par les nombres premiers précédents.la source
p
oup^2
, la complexité est la même (avec des tableaux d'accès direct).SUM (1/p) {p<N} ~ log (log N)
est la raison.n/i
étapes, oùi
est prime => toute la complexité estsum(n/i) = n * sum(1/i)
. Selon les séries harmoniques principales,sum (1/i)
oùi
est premier estlog (log n)
. Au total,O(n*log(log n))
.Je pense que la boucle supérieure peut être optimisée en la remplaçant
n
parsqrt(n)
une complexité temporelle globaleO(sqrt(n)loglog(n))
:la source
isprime
c'est absolument le mauvais nom à utiliser ici.voir l'explication ci-dessus la boucle interne est la somme harmonique de tous les nombres premiers jusqu'à sqrt (n). Ainsi, la complexité réelle de est O (sqrt (n) * log (log (sqrt (n))))
la source