Ciurul lui Eratostene
De la Wikipedia, enciclopedia liberă
În matematică, ciurul lui Eratostene este un algoritm simplu şi vechi de descoperire a tuturor numerelor prime până la un întreg specificat. Este predecesorul algoritmului modern ciurul lui Atkin, un algoritm mai rapid dar mai complex. A fost creat de Eratostene, un matematician din Grecia antică.
[modifică] Algoritm
- Se scrie o listă a numerelor de la 2 la cel mai mare număr ce urmează a fi testat pentru primalitate. Numim această listă lista A. (Lista de pătrate din partea stângă a imaginii.)
- Se trece numărul 2, primul număr prim găsit, într-o altă listă, cea a numerelor prime găsite. Numim această listă lista B. (Este lista din partea dreaptă a imaginii.)
- Se marchează 2 şi toţi multiplii lui 2 din lista A.
- Primul număr nemarcat din listă este un număr prim. Se trece acest număr în lista B.
- Se marchează acest număr şi toţi multiplii lui din lista A. Marcarea de multipli poate să înceapă de la pătratul numărului, întrucât multiplii mai mici au fost deja marcaţi în paşii anteriori.
- Se repetă paşii 4 şi 5 până când se epuizează toate numerele din lista A.
[modifică] Complexitatea algoritmului şi alte detalii
Marcarea multiplilor unui număr prim poate începe de la pătratul acelui număr, deoarece multiplii mai mici au fost deja marcaţi .
Complexitatea în timp a algoritmului este de O(nloglogn) şi cea în spaţiu este de O(n).[1] Versiunea segmentată a ciurului lui Eratostene, cu optimizări elementare, cum ar fi factorizarea pe roată, utilizează O(n) operaţiuni şi O(n1 / 2loglogn / logn) biţi de memorie.[2]
David Turner a sugerat în 1975 ca ciurul lui Eratostene să fie reprezentat într-o modalitate simplă şi elegantă într-un limbaj de programare funcţională.[3] Ciurul lui Turner, redat în Haskell, este:
prime = ciur [2..] ciur (p : xs) = p : ciur [x | x <− xs, x ‘mod‘ p > 0]
Totuşi, Melissa O'Neill [4] a arătat că complexitatea implementării funcţionale a lui Turner este semnificativ mai mare decât cea a implementărilor în limbaje imperative.
[modifică] Note
- ^ Pritchard, Paul. Linear prime-number sieves: a family tree, pag. 17–35, Sci. Comput. Programming 9:1 (1987).
- ^ A. O. L. Atkin şi D. J. Bernstein. Prime sieves using binary quadratic forms pp. 1023–1030. Mathematics of Computation 73 (2004).
- ^ Turner, David A. (1975). SASL language manual. Tech. rept. CS/75/1., Department of Computational Science, Universitatea St. Andrews.
- ^ O'Neill, Melissa E., "The Genuine Sieve of Eratosthenes", Journal of Functional Programming, Published online by Cambridge University Press 9 octombrie 2008 doi:10.1017/S0956796808007004.


