Eratostenovo sito u Python & C++
โก Pametni saลพetak
Eratostenovo sito je klasiฤni algoritam prostih brojeva koji filtrira sloลพene brojeve iterativnim oznaฤavanjem viลกekratnika svakog prostog broja, ostavljajuฤi samo proste brojeve unutar odabrane gornje granice za brzo pretraลพivanje.

ล to je Eratostenovo sito?
Eratostenovo sito je najjednostavnije sito prostih brojeva. To je algoritam za proste brojeve koji se koristi za otkrivanje svakog prostog broja unutar zadane granice. Postoji nekoliko prostih sita, ukljuฤujuฤi Eratostenovo sito, Atkinovo sito i Sundaramovo sito.
Rijeฤ "sito" odnosi se na pribor koji filtrira tvari. U istom duhu, algoritam sita u Python i drugi jezici odnose se na metodu koja filtrira proste brojeve iz popisa cijelih brojeva.
Ovaj algoritam filtrira proste brojeve koristeฤi iterativni pristup. Proces filtriranja zapoฤinje s najmanjim prostim brojem. Prost broj je prirodni broj veฤi od 1 koji ima samo dva djelitelja, i to 1 i sam broj. Numbers Brojevi koji nisu prosti nazivaju se sloลพeni brojevi.
Zaลกto koristiti Eratostenovo sito?
U metodi Eratostenovog sita, prvo se odabire mali prosti broj, a zatim se filtriraju svi njegovi viลกekratnici. Proces se izvodi u petlji kroz zadani raspon, uฤinkovito proizvodeฤi svaki prosti broj do n bez izvoฤenja probnog dijeljenja na svakom kandidatu.
Zbog toga je sito brลพe od provjere primarnosti jednog broja odjednom. ล iroko se koristi u teoriji brojeva, kriptografiji, hashiranju i kompetitivnom programiranju gdje se mnogo prostih brojeva mora brzo generirati.
Na primjer:
Uzmimo raspon brojeva od 2 do 10.
Nakon primjene Eratostenovog sita, dobit ฤe se popis prostih brojeva 2, 3, 5, 7.
Eratostenovo sito algoritma
Ovo je algoritam za Eratostenovo sito:
Korak 1) Napravite popis brojeva od 2 do zadanog raspona n. Poฤinjemo s 2 jer je to najmanji i prvi prosti broj.
Korak 2) Odaberite najmanji broj na popisu, x (u poฤetku je x jednak 2), proฤite kroz popis i filtrirajte odgovarajuฤe sloลพene brojeve oznaฤavanjem svih viลกekratnika odabranog broja.
Korak 3) Zatim odaberite sljedeฤi prosti ili najmanji neoznaฤeni broj na popisu i ponovite korak 2.
Korak 4) Ponovite prethodni korak dok vrijednost x ne bude manja ili jednaka kvadratnom korijenu iz n (x <=).
Biljeลกka: Matematiฤko razmiลกljanje je priliฤno jednostavno. Raspon brojeva n moลพe se faktorizirati kao:
n = a * b
Opet, n = *
= (faktor manji od ) * (faktor veฤi od
)
Dakle, barem jedan od glavni faktori ili oba moraju biti <= Stoga, prolazeฤi do
bit ฤe dovoljno.
Korak 5) Nakon ta ฤetiri koraka, preostali neoznaฤeni brojevi bit ฤe svi prosti brojevi u zadanom rasponu n.
Obraฤeni primjer
Primjer:
Uzmimo primjer i vidimo kako to funkcionira.
Za ovaj primjer, pronaฤi ฤemo popis prostih brojeva od 2 do 25. Dakle, n = 25.
Korak 1) U prvom koraku uzet ฤemo popis brojeva od 2 do 25 buduฤi da smo odabrali n = 25.
Korak 2) Zatim odabiremo najmanji broj na popisu, x. U poฤetku je x = 2 jer je to najmanji prosti broj. Zatim prolazimo kroz popis i oznaฤavamo viลกekratnike broja 2.
Viลกekratnici broja 2 za zadanu vrijednost n su: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24.
Biljeลกka: Plava boja oznaฤava odabrani broj, a ruลพiฤasta boja oznaฤava eliminirane viลกekratnike.
Korak 3) Zatim biramo sljedeฤi najmanji neoznaฤeni broj, a to je 3, i ponavljamo zadnji korak oznaฤavajuฤi viลกekratnike broja 3.
Korak 4) Korak 3 ponavljamo na isti naฤin dok ne dobijemo x = ili 5.
Korak 5) Preostali neoznaฤeni brojevi su prosti brojevi od 2 do 25.
Pseudo-Code
Sljedeฤi pseudokod obuhvaฤa osnovnu strukturu Eratostenovog sita prije nego ลกto ga prevedemo u stvarni kod.
Begin
Declare a boolean array of size n and initialize it to true
For all numbers i : from 2 to sqrt(n)
IF bool value of i is true THEN
i is prime
For all multiples of i (i<n)
mark multiples of i as composite
Print all unmarked numbers
End
Eratostenovo sito C/C++ Code Primjer
Ispod je potpuni C++ implementacija Eratostenovog sita koje ispisuje svaki prosti broj do odabrane gornje granice.
#include <iostream>
#include <cstring>
using namespace std;
void Sieve_Of_Eratosthenes(int n)
{
// Create and initialize a boolean array
bool primeNumber[n + 1];
memset(primeNumber, true, sizeof(primeNumber));
for (int j = 2; j * j <= n; j++) {
if (primeNumber[j] == true) {
// Update all multiples of i as false
for (int k = j * j; k <= n; k += j)
primeNumber[k] = false;
}
}
for (int i = 2; i <= n; i++)
if (primeNumber[i])
cout << i << " ";
}
int main()
{
int n = 25;
Sieve_Of_Eratosthenes(n);
return 0;
}
Izlaz:
2 3 5 7 11 13 17 19 23
Sita Eratostena Python Primjer programa
Sljedeฤe Python Program implementira isti algoritam koristeฤi booleovu listu i while petlju.
def SieveOfEratosthenes(n): # Create a boolean array primeNumber = [True for i in range(n+2)] i = 2 while (i * i <= n): if (primeNumber[i] == True): # Update all multiples of i as false for j in range(i * i, n+1, i): primeNumber[j] = False i += 1 for i in range(2, n): if primeNumber[i]: print(i) n = 25 SieveOfEratosthenes(n)
Izlaz:
2 3 5 7 11 13 17 19 23
Segmentirano sito
Vidjeli smo da Eratostenovo sito prolazi kroz cijeli raspon brojeva. Stoga mu je potrebno O(n) memorijskog prostora za pohranu brojeva. Situacija postaje komplicirana kada pokuลกavamo pronaฤi proste brojeve u ogromnom rasponu, jer nije izvedivo dodijeliti tako veliki memorijski blok za veฤi n.
Algoritam se moลพe optimizirati uvoฤenjem nekih novih znaฤajki. Ideja je podijeliti raspon brojeva u manje segmente i izraฤunati proste brojeve u tim segmentima jedan po jedan. Ovo je uฤinkovit naฤin smanjenja sloลพenosti prostora. Ova metoda se naziva a segmentirano sito.
Optimizacija se moลพe postiฤi na sljedeฤi naฤin:
- Pomoฤu jednostavnog sita pronaฤite proste brojeve od 2 do
i pohraniti ih u niz.
- Podijelite raspon [0โฆn-1] u viลกe segmenata najviลกe veliฤine
.
- Za svaki segment, iterirajte kroz segment i oznaฤite viลกekratnike prostih brojeva pronaฤenih u koraku 1. Ovaj korak zahtijeva O(
) maksimalno.
Redovno sito zahtijeva O(n) pomoฤnog memorijskog prostora, dok segmentirano sito zahtijeva O(), ลกto je znaฤajno poboljลกanje za veliko n. Metoda ima i nedostatak, jer ne poboljลกava vremensku sloลพenost.
Analiza sloลพenosti
Razumijevanje prostorne i vremenske sloลพenosti pomaลพe vam u odabiru izmeฤu obiฤnog sita i segmentiranog sita za danu veliฤinu problema.
Sloลพenost prostora:
Jednostavni algoritam Eratostenovog sita zahtijeva O(n) memorijskog prostora. Segmentirano sito zahtijeva O() pomoฤni prostor.
Sloลพenost vremena:
Vremenska sloลพenost regularnog algoritma Eratostenova sita je O(n*log(log(n))). Razlog ove sloลพenosti objaลกnjen je u nastavku.
Za zadani broj n, vrijeme potrebno za oznaฤavanje sloลพenog broja (tj. broja koji nije prost) je konstantno. Dakle, broj ponavljanja petlje jednak je:
n/2 + n/3 + n/5 + n/7 + โฆโฆโ
= n * (1/2 + 1/3 + 1/5 + 1/7 +โฆโฆ.โ)
Harmonijska progresija zbroja prostih brojeva moลพe se izvesti kao log(log(n)):
(1/2 + 1/3 + 1/5 + 1/7 +โฆโฆ.โ) = log(log(n))
Dakle, vremenska sloลพenost ฤe biti:
T(n) = n * (1/2 + 1/3 + 1/5 + 1/7 + โฆโฆโ)
= n * log(log(n))
Dakle, vremenska sloลพenost je O(n * log(log(n))).
Zatim ฤete saznati viลกe o Pascalov trokut.







