Oggi ho letto un articolo:Il vero Crivello di Eratostene - algoritmo utilizzato per generare numeri primi
O'Neill, Melissa E., "The Genuine Sieve of Eratosthenes", ufficiale programmazione funzionale, pubblicato on-line dalla Cambridge University Press 9 ottobre 2008 doi:. 10,1017/S0956796808007004
E 'descritto un algoritmo di generazione di numeri primi utilizzando coda Priorità:
0.123.516,41 milasieve [] = []
sieve (x:xs) = x : sieve' xs (insertprime x xs PQ.empty)
where
insertprime p xs table = PQ.insert (p*p) (map (* p) xs) table
sieve' [] table = []
sieve' (x:xs) table
| nextComposite <= x = sieve' xs (adjust table)
| otherwise = x : sieve' xs (insertprime x xs table)
where
nextComposite = PQ.minKey table
adjust table
| n <= x = adjust (PQ.deleteMinAndInsert n' ns table)
| otherwise = table
where
(n, n':ns) = PQ.minKeyValue table
primes = sieve [2 .. ]
L'algoritmo sembra essere corretta a prima vista, ma non capisco una cosa:
Come funziona il PQ usa gestire duplicato priorità minima?
Ho eseguito alcune simulazioni a mano e ho scoperto che potrebbe causare un errore.
Se qualcuno potrebbe spiegarlo, apprezzerò il vostro aiuto!
* Numeri primari * o numeri * Prime *? – kennytm
Scusa, un errore ortografico! – ablmf
Una carta molto bella, a proposito. Il mondo ha bisogno di più di quelli. –