Hoy leí un artículo:la criba de Eratóstenes genuino - algoritmo utilizado para generar números primos
O'Neill, Melissa E., "Diario de The Genuine Sieve of Eratosthenes", programación funcional, Publicado en línea por la Universidad de Cambridge prensa 09 Oct 2008 doi: 10.1017./S0956796808007004
Se describe un algoritmo de generación de números primos utilizando cola de prioridad:
sieve [] = []
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 .. ]
El algoritmo parece ser correcta, a primera vista, pero no entiendo una cosa:
¿Cómo funciona el PQ se utiliza manejar duplica mínima prioridad?
Hice algunas simulaciones a mano y encontré que podría causar un error.
¡Si alguien pudiera explicarlo, agradeceré su ayuda!
* Números primarios * o números * Prime *? – kennytm
Lo siento, un error de ortografía! – ablmf
Un papel muy hermoso, por cierto. El mundo necesita más de esos. –