Deo zbornika Učimo algoritme
Eratostenovo sito
Eratostenovo sito (takođe Eratostenovo rešeto) je algoritam koji pronalazi sve proste brojeve u rasponu od 1 do N. Osmislio ga je starogrčki naučnik i upravnik Aleksandrijske biblioteke Eratosten.
Algoritam radi na nizu brojeva od 1 do N. Na početku, iz niza uklanja broj jedan, jer on po definiciji nije prost. Nakon toga, algoritam uzima sljedeći broj u nizu (broj 2), označava ga da je prost i iz niza uklanja sve njegove sadržioce (tj. brojeve djeljive sa 2), jer sigurno nisu prosti. Zatim se ponovo uzima sljedeći broj koji nije izbačen (broj 3) i uklanjaju se svi njegovi sadržioci. Obzirom da je broj 4 uklonjen iz niza, jer je djeljiv sa 2, algoritam će uzeti broj 5. Ovaj postupak će se ponavljati i na kraju će u nizu ostati samo prosti brojevi.
Kada implementiramo Eratostenovo sito, dovoljno je obraditi brojeve koji su manji ili jednaki √N. Dakle, ako tražimo proste brojeve od 1 do 100, dovoljno je da iz niza izbacimo sadržioce brojeva koji su manji ili jednaki 10.
Koraci algoritma
Predstavićemo rad algoritma koji traži sve proste brojeve od 1 do 100. Na početku imamo niz u kojem se nalaze svi brojevi od 1 do 100.
Korak 1
Na početku ćemo izbaciti broj 1, jer po definiciji nije prost. Nakon toga, obilježavamo broj 2 kao prost, i izbacijemo sve njegove sadržioce.
Korak 2
Sljedeći broj koji nije izbačen je 3. Algoritam ga označava da je prost i izbacuje sve njegove sadržioce.
Korak 3
Broj 4 je ranije izbačen, tako da algoritam uzima broj 5 označava ga da je prost i izbacuje sve njegove sadržioce.
Korak 4
Sada izvršavamo isti postupak za broj 7.
Primjećujemo da su u nizu ostali samo prosti brojevi i da se algoritam može zaustaviti nakon broja 7. Brojeve 8, 9 i 10 nećemo obrađivati jer nisu prosti, tj. već su izbačeni iz niza.
Implementacija
Implementacija algoritma Eratostenovo sito u Pythonu:
def nadji_proste_brojeve(n):
prosti = set()
slozeni = set()
for i in range(2, n + 1):
if i not in slozeni:
prosti.add(i)
for j in range(i * i, n + 1, i):
slozeni.add(j)
return prosti
print(nadji_proste_brojeve(100))
Izvor: boljiprogramer.com