Wolna encyklopedia
Sito Eratostenesa to algorytm kolejnego wybierania liczb pierwszych z ciągu liczb naturalnych.
Ze zbioru liczb naturalnych większych od jedności, tj. {2, 3, 4, ...}, wybieramy najmniejszą, czyli 2, i wykreślamy wszystkie jej wielokrotności większe od niej samej, to jest 4, 6, 8, ...
| 2 | 3 | 5 | 7 | 9 | |||||
| 11 | 13 | 15 | 17 | 19 | |||||
| 21 | 23 | 25 | 27 | 29 | |||||
| 31 | 33 | 35 | 37 | 39 | |||||
| 41 | 43 | 45 | 47 | 49 | |||||
| 51 | 53 | 55 | 57 | 59 |
Z pozostałych liczb wybieramy najmniejszą niewykreśloną liczbę (3) i usuwamy wszystkie jej wielokrotności większe od niej samej: 6, 9, 12, ..., przy czym nie przejmujemy się tym, że niektóre liczby (na przykład 6 czy 12) będą skreślane więcej niż raz.
| 2 | 3 | 5 | 7 | ||||||
| 11 | 13 | 17 | 19 | ||||||
| 23 | 25 | 29 | |||||||
| 31 | 35 | 37 | |||||||
| 41 | 43 | 47 | 49 | ||||||
| 53 | 55 | 59 |
Według tej samej procedury postępujemy dla liczby 5.
| 2 | 3 | 5 | 7 | ||||||
| 11 | 13 | 17 | 19 | ||||||
| 23 | 29 | ||||||||
| 31 | 37 | ||||||||
| 41 | 43 | 47 | 49 | ||||||
| 53 | 59 |
Następnie dla 7, 11, 13; aż do sprawdzenia wszystkich niewykreślonych wcześniej liczb.
| 2 | 3 | 5 | 7 | ||||||
| 11 | 13 | 17 | 19 | ||||||
| 23 | 29 | ||||||||
| 31 | 37 | ||||||||
| 41 | 43 | 47 | |||||||
| 53 | 59 |
Dla danej liczby n wszystkie niewykreślone liczby mniejsze od n są liczbami pierwszymi.
| 2 | 3 | 5 | 7 | ||||||
| 11 | 13 | 17 | 19 | ||||||
| 23 | 29 | ||||||||
| 31 | 37 | ||||||||
| 41 | 43 | 47 | |||||||
| 53 | 59 |
Zapis algorytmu
Zapis algorytmu w języku C++
#include <iostream>
using namespace std;
const int n = 100;
bool numbersTable[n + 1]; // tablica o indeksach od 0 do 100 | wszystkie false (czyli: 0);
int main()
{
for (int i = 2; i <= n; i++ ) // przeszukuj liczby od 2 do n, 0 i 1 nie są liczbami pierwszymi
{
if (numbersTable[i] == true) // jeżeli dana liczb jest już wykreślona
continue; // to przejdź do kolejnej
for (int j = 2 * i ; j <= n; j += i) // przejdź od liczby 2 * i do n przesuwając się o i
numbersTable[j] = true; // i każdą z nich usuwaj ze zbioru
}
for (int i = 2; i <= n; i++) // przejdź liczby od 2 do n
if (numbersTable[i] == false) // jeśli liczba nie została usunięta ze zbioru
cout << i << " | "; // to ją wypisz
return 0;
}