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.

  • ๐Ÿ”ข Osnovna ideja: Oznaฤi viลกekratnike svakog prostog broja poฤevลกi od 2 kako bi izolirao proste brojeve do n.
  • ๐Ÿงฎ Veza petlje: Iterirati samo do kvadratnog korijena iz n jer su veฤ‡i faktori veฤ‡ eliminirani.
  • โšก Sloลพenost vremena: Algoritam se izvodi u O(n log log n), ลกto je gotovo linearno za praktiฤne raspone.
  • โœ… Segmentirano sito: Dijeljenje raspona na blokove smanjuje pomoฤ‡nu memoriju s O(n) na O(โˆšn).
  • ๐Ÿงช Upotrijebite sluฤajeve: Kriptografija, hashiranje, kompetitivno programiranje i teorija brojeva oslanjaju se na brzo generiranje prostih brojeva.

Eratostenovo sito u Python

ล 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.

Algoritam Eratostenovog sita

Nakon primjene Eratostenovog sita, dobit ฤ‡e se popis prostih brojeva 2, 3, 5, 7.

Algoritam Eratostenovog sita

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 <=Eratostenovo sito algoritma).

Biljeลกka: Matematiฤko razmiลกljanje je priliฤno jednostavno. Raspon brojeva n moลพe se faktorizirati kao:

n = a * b

Opet, n = Eratostenovo sito algoritma * Eratostenovo sito algoritma

= (faktor manji od Eratostenovo sito algoritma) * (faktor veฤ‡i od Algoritam Eratostenovog sita)

Dakle, barem jedan od glavni faktori ili oba moraju biti <= Eratostenovo sito algoritmaStoga, prolazeฤ‡i do Eratostenovo sito algoritma 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.

Eratostenovo sito algoritma

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.

Algoritam Eratostenovog sita

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.

Algoritam Eratostenovog sita

Korak 4) Korak 3 ponavljamo na isti naฤin dok ne dobijemo x = Algoritam Eratostenovog sita ili 5.

Algoritam Eratostenovog sita

Korak 5) Preostali neoznaฤeni brojevi su prosti brojevi od 2 do 25.

Algoritam Eratostenovog sita

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:

  1. Pomoฤ‡u jednostavnog sita pronaฤ‘ite proste brojeve od 2 do Segmentirano sito i pohraniti ih u niz.
  2. Podijelite raspon [0โ€ฆn-1] u viลกe segmenata najviลกe veliฤine Segmentirano sito.
  3. Za svaki segment, iterirajte kroz segment i oznaฤite viลกekratnike prostih brojeva pronaฤ‘enih u koraku 1. Ovaj korak zahtijeva O(Segmentirano sito) maksimalno.

Redovno sito zahtijeva O(n) pomoฤ‡nog memorijskog prostora, dok segmentirano sito zahtijeva O(Segmentirano sito), ลก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(Analiza sloลพenosti) 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.

Pitanja i odgovori

Bilo koji sloลพeni broj n moลพe se zapisati kao umnoลพak dvaju faktora, a barem jedan faktor mora biti manji ili jednak kvadratnom korijenu iz n. Oznaฤavanje viลกekratnika nakon te toฤke nije potrebno jer je svaki sloลพeni broj veฤ‡ eliminiran.

Regularno sito dodjeljuje O(n) memorije za oznaฤavanje svakog broja, dok segmentirano sito dijeli raspon na blokove veliฤine โˆšn i ponovno koristi memoriju. Segmentirana verzija je poลพeljnija kada je n vrlo veliko, a RAM ograniฤen.

Izvodi se u vremenu O(n log log n), ลกto je blizu linearnom. Generiranje svakog prostog broja ispod deset milijuna traje samo djeliฤ‡ sekunde na modernom prijenosnom raฤunalu, ลกto sito ฤini najbrลพim praktiฤnim izborom za male do srednje raspone.

Moderni AI akceleratori ubrzavaju velika pretraลพivanja prostih brojeva paralelnim koriลกtenjem sita na GPU-ima i TPU-ima. Modeli strojnog uฤenja takoฤ‘er pomaลพu u predviฤ‘anju obeฤ‡avajuฤ‡ih raspona kandidata, smanjujuฤ‡i optereฤ‡enje za Miller-Rabin i druge testove prostih brojeva koji se koriste u generiranju RSA kljuฤeva.

Da. AI tutori generiraju korak po korak traces, vizualiziraju sloลพenu eliminaciju, predlaลพu optimizacije poput faktorizacije kotaฤa i interaktivno objaลกnjavaju dokaze. Pomaลพu uฤenicima da izgrade intuiciju za granice harmonijskih nizova i argumente sloลพenosti iza sita.

Saลพmite ovu objavu uz: