Wyznaczanie liczb pierwszych – Sito Eratostenesa
Liczby pierwsze od dawna interesują matematyków oraz hakerów. Są one bowiem wykorzystywane do szyfrowania różnego rodzaju newralgicznych danych takich jak hasła czy numery karty kredytowych. Z nastaniem ery elektroniki ich znaczenie znacznie we współczesnej matematyce znacznie wzrosło. Liczba pierwsza jest liczbą naturalną większa o jedynki i mającą dokładnie dwa dzielniki: 1 oraz samą siebie. Do liczb pierwszych należą: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41… Jak widać nie ma żadnej zależności pomiędzy kolejnymi cyframi. Co więcej operując na coraz większych cyfrach będziemy znajdować coraz mniej liczb pierwszych.
Sito Eratostenesa
Lista kroków:
Krok 1: Ustaw wszystkie elementy tablicy liczb na true
Krok 2: i ← 2;
Krok 3: Jeśli i ≥ n, to idź do kroku 11;
Krok 4: w ← i + i;
Krok 5: Jeśli w > n, to idź do kroku 9;
Krok 6: Tablica[w] ← false;
Krok 7: w ← w + i;
Krok 8: Idź do kroku 5;
Krok 9: i ← i + 1;
Krok 10: Idź do kroku 3;
Krok 11: i ← 2;
Krok 12: Jeśli i > n, to zakończ;
Krok 13: Jeśli T[i] = true, to pisz i;
Krok 14: i ← i + 1;
Krok 15: Idź do kroku 12;
Pascal:
program sito eratostenesa;
const n = 100;
var
tablica : array[2..n] of boolean;
i, w : integer;
begin
for i := 2 to n do tablica[i] := true;
i := 1;
repeat
i := i + 1;
w := 2 * i;
repeat
tablica[w] := false;
w := w + i;
until (w > n);
until i > sqrt(n);
for i := 2 to n do
begin
if (tablica[i]) then
write(i, ' ');
end;
end.
C#:
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
int n = 0;
Console.Write("Podaj liczbe: ");
n = Convert.ToInt32(Console.ReadLine());
bool[] tab = new bool[n+1];
for (int i = 2; i * i <= n; i++)
{
if (tab[i] == true)
{
continue;
}
for (int j = 2 * i; j <= n; j += i)
{
tab[j] = true;
}
}
Console.WriteLine("Liczby pierwsze z zakresu [0," + n + "]: ");
for (int i = 2; i <= n; i++)
{
if (tab[i] == false)
{
Console.Write(i + " ");
}
}
Console.ReadKey();
}
}
}
C++:
#include <iostream>
using namespace std;
const int n = 100;
bool numbersTable[n + 1];
int main()
{
for (int i = 2; i*i <= n; ++i )
{
if (numbersTable[i] == true)
continue;
for (int j = 2*i ; j <= n; j += i)
numbersTable[j] = true;
}
cout << "Liczby pierwsze z przedziału od 2 do " << n << ":" << endl;
for (int i = 2; i <= n; i++)
if (numbersTable[i] == false)
cout << i << endl;
return 0;
}Fot: Wikipedia.