Sieve of Eratosthenes Algoritme: Python, C++ Eksempel

The Sieve of Eratosthenes er den enkleste primtallssilen. Det er en primtallsalgoritme for รฅ sรธke i alle primtallene i en gitt grense. Det er flere primtallssikter. For eksempel - Sieve of Eratosthenes, Sieve of Atkin, Sieve of Sundaram, etc.

Ordet "silโ€ betyr et redskap som filtrerer stoffer. Dermed er silalgoritmen inn Python og andre sprรฅk refererer til en algoritme for รฅ filtrere ut primtall.

Denne algoritmen filtrerer ut primtallet i en iterativ tilnรฆrming. Filtreringsprosessen starter med det minste primtallet. Et primtal er et naturlig tall som er stรธrre enn 1 og har bare to divisorer, nemlig 1 og selve tallet. Tallene som ikke er primtall kalles sammensatte tall.

I sikten til Eratosthenes-metoden velges fรธrst et lite primtall, og alle multiplene av det blir filtrert ut. Prosessen kjรธrer pรฅ en slรธyfe i et gitt omrรฅde.

For eksempel:

La oss ta tallomrรฅdet fra 2 til 10.

Sil av Eratosthenes-algoritmen

Etter รฅ ha brukt Sieve of Eratosthenes, vil den produsere listen over primtall 2, 3, 5, 7

Sil av Eratosthenes-algoritmen

Algoritme Sieve of Eratosthenes

Her er algoritmen for Sieve of Eratosthenes:

Trinn 1) Lag en liste over tall fra 2 til det gitte omrรฅdet n. Vi starter med 2 da det er det minste og fรธrste primtallet.

Trinn 2) Velg det minste tallet pรฅ listen, x (til รฅ begynne med er x lik 2), gรฅ gjennom listen og filtrer de tilsvarende sammensatte tallene ved รฅ merke alle multiplene av de valgte tallene.

Trinn 3) Velg deretter neste primtall eller det minste umerkede tallet pรฅ listen og gjenta trinn 2.

Trinn 4) Gjenta forrige trinn til verdien av x skal vรฆre mindre enn eller lik kvadratroten av n (x<=Algoritme Sieve of Eratosthenes).

OBS: Det matematiske resonnementet er ganske enkelt. Tallomrรฅdet n kan faktoriseres som-

n=a*b

Igjen, n =Algoritme Sieve of Eratosthenes*Algoritme Sieve of Eratosthenes

= (faktor mindre enn Algoritme Sieve of Eratosthenes) * (faktor stรธrre enn Sil av Eratosthenes-algoritmen)

Sรฅ minst en av de viktigste faktorer eller begge mรฅ vรฆre <=Algoritme Sieve of Eratosthenes. Dermed krysser til Algoritme Sieve of Eratosthenes vil vรฆre nok.

Trinn 5) Etter disse fire trinnene vil de gjenvรฆrende umerkede tallene vรฆre alle primtall pรฅ det gitte omrรฅdet n.

Eksempel:

La oss ta et eksempel og se hvordan det fungerer.

For dette eksempelet finner vi listen over primtall fra 2 til 25. Sรฅ n=25.

Trinn 1) I det fรธrste trinnet vil vi ta en liste med tall fra 2 til 25 ettersom vi valgte n=25.

Algoritme Sieve of Eratosthenes

Trinn 2) Deretter velger vi det minste tallet pรฅ listen, x. Til รฅ begynne med er x=2 da det er det minste primtallet. Deretter gรฅr vi gjennom listen og merker multiplene av 2.

Multiplene av 2 for den gitte verdien av n er: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24.

Sil av Eratosthenes-algoritmen

OBS: Blรฅ farge angir det valgte tallet, og rosa farge angir eliminerte multipler

Trinn 3) Deretter velger vi det nest minste umerkede tallet, som er 3, og gjentar det siste trinnet ved รฅ merke multiplene av 3.

Sil av Eratosthenes-algoritmen

Trinn 4) Vi gjentar trinn 3 pรฅ samme mรฅte til x=Sil av Eratosthenes-algoritmen eller 5.

Sil av Eratosthenes-algoritmen

Trinn 5) De gjenvรฆrende ikke-merkede tallene vil vรฆre primtallene fra 2 til 25.

Sil av Eratosthenes-algoritmen

pseudo-Code

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

Sil av Eratosthenes C/C++ kode eksempel

#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;
} 

Utgang:

2 3 5 7 11 13 17 19 23

Sil av Eratosthenes Python Program eksempel

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)

Utgang:

2
3
5
7
11
13
17
19
23

Segmentert sil

Vi har sett at Sieve of Eratosthenes er nรธdvendig for รฅ kjรธre en slรธyfe gjennom hele tallomrรฅdet. Dermed trenger den O(n) minneplass for รฅ lagre tallene. Situasjonen blir komplisert nรฅr vi prรธver รฅ finne primtal i et stort omrรฅde. Det er ikke mulig รฅ tildele en sรฅ stor minneplass for en stรธrre n.

Algoritmen kan optimaliseres ved รฅ introdusere noen nye funksjoner. Ideen er รฅ dele tallomrรฅdet inn i mindre segmenter og beregne primtall i disse segmentene en etter en. Dette er en effektiv mรฅte รฅ redusere plasskompleksiteten pรฅ. Denne metoden kalles a segmentert sil.

Optimaliseringen kan oppnรฅs pรฅ fรธlgende mรฅte:

  1. Bruk en enkel sil for รฅ finne primtall fra 2 til Segmentert sil og lagre dem i en rekke.
  2. Del omrรฅdet [0...n-1] inn i flere segmenter av stรธrrelse pรฅ det meste Segmentert sil
  3. For hvert segment, iterer gjennom segmentet og merk multiplum av primtall funnet i trinn 1. Dette trinnet krever O(Segmentert sil) ved maks.

Den vanlige sikten krever O(n) ekstra minneplass, mens den segmenterte sikten krever O(Segmentert sil), som er en stor forbedring for en stor n. Metoden har en ulempe ogsรฅ fordi den ikke forbedrer tidskompleksiteten.

Kompleksitetsanalyse

Romkompleksitet:

Den enkle sikten av eratosthenes-algoritmen krever O(n) minneplass. Og den segmenterte silen krever
O(Kompleksitetsanalyse) hjelperom.

Tidskompleksitet:

Tidskompleksiteten til en vanlig sikt av eratosthenes-algoritme er O(n*log(log(n))). Begrunnelsen bak denne kompleksiteten diskuteres nedenfor.

For et gitt tall n er tiden som kreves for รฅ markere et sammensatt tall (dvs. ikke-primtall) konstant. Sรฅ antallet ganger lรธkken kjรธrer er lik-

n/2 + n/3 + n/5 + n/7 + โ€ฆโ€ฆโˆž

= n * (1/2 + 1/3 + 1/5 + 1/7 +โ€ฆโ€ฆ.โˆž)

Den harmoniske progresjonen av summen av primtall kan trekkes fra som log(log(n)).

(1/2 + 1/3 + 1/5 + 1/7 +โ€ฆโ€ฆ.โˆž) = log(log(n))

Sรฅ tidskompleksiteten vil vรฆre-

T(n) = n * (1/2 + 1/3 + 1/5 + 1/7 + โ€ฆโ€ฆโˆž)

= n * log(log(n))

Dermed tidskompleksiteten O(n * log(log(n)))

Deretter vil du lรฆre om Pascals trekant

Sammendrag

  • Silen av Eratosthenes filtrerer ut primtallene i en gitt รธvre grense.
  • Filtrering av et primtall starter fra det minste primtall, "2". Dette gjรธres iterativt.
  • Iterasjonen gjรธres opp til kvadratroten av n, der n er det gitte tallomrรฅdet.
  • Etter disse iterasjonene er tallene som gjenstรฅr primtallene.

Oppsummer dette innlegget med: