Essendo Python, di solito è meglio restituire un generatore che restituirà una sequenza infinita di numeri primi anziché una lista.
ActiveState ha una lista di anziani Crivello di Eratostene recipes
Qui è uno di loro aggiornato per Python 2.7 utilizzando itertools count con un argomento passo che non esisteva quando la ricetta originale è stato scritto:
import itertools as it
def sieve():
""" Generate an infinite sequence of prime numbers.
"""
yield 2
D = {}
for q in it.count(3, 2): # start at 3 and step by odds
p = D.pop(q, 0)
if p:
x = q + p
while x in D: x += p
D[x] = p # new composite found. Mark that
else:
yield q # q is a new prime since no composite was found
D[q*q] = 2*q
Poiché si tratta di un generatore, è molto più efficiente in termini di memoria rispetto alla generazione di un intero elenco. Poiché individua il composito, è anche efficiente dal punto di vista computazionale.
Esegui questo:
>>> g=sieve()
Poi ogni chiamata successiva torna il prossimo primo:
>>> next(g)
2
>>> next(g)
3
# etc
È quindi possibile ottenere una lista tra i confini (vale a dire, il primo X dal primo al X + Y prime ...) utilizzando islice:
>>> tgt=0
>>> tgt, list(it.islice(sieve(), tgt, tgt+10))
(0, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29])
>>> tgt=1000000
>>> tgt, list(it.islice(sieve(), tgt, tgt+10))
(1000000, [15485867, 15485917, 15485927, 15485933, 15485941, 15485959, 15485989, 15485993, 15486013, 15486041])
Si potrebbe dare un'occhiata a questa domanda: http://stackoverflow.com/questions/567222/simp le-prime-generator-in-python – ashwinjv
Funziona se il numero è 9? Qual è lo scopo della variabile contatore? PS: 'a = a + 1' può essere semplificato a' a + = 1' – pygeek
Soprattutto l'implementazione del setaccio di Erastothen nella risposta accettata (http://stackoverflow.com/a/568618/3646530). Comporta l'uso di generatori. Puoi ottenere maggiori informazioni su cosa è un generatore qui: http://stackoverflow.com/a/231855/3646530 – ashwinjv