Liczba pierwsza jest liczbą naturalną posiadającą dokładnie dwa różne podzielniki - 1 oraz samą siebie.
Wynika stąd, iż liczby 0 (nie dzieli się przez siebie) oraz 1 (ma tylko jeden podzielnik - samą siebie i nie jest on różny od 1) nie są liczbami pierwszymi. Oto kilka początkowych liczb pierwszych:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 ...
Twierdzenie: Liczb pierwszych jest nieskończenie wiele.
Dowód:
Twierdzenie to udowodnił sławny matematyk starożytnej Grecji, Euklides. Założył on, iż zbiór liczb pierwszych jest skończony i zawiera np. n liczb pierwszych:
p1, p2, p3, ..., pn
Następnie utworzył ich iloczyn powiększony o 1 zgodnie ze wzorem:
E = (p1 * p2 * p3 * ... * pn) + 1
Otrzymana liczba E nie jest podzielna przez żadną liczbę pierwszą ze zbioru liczb pierwszych, ponieważ każde takie dzielenie daje resztę 1. Zatem pozostają tylko dwie możliwości:
Liczba E jest nową liczbą pierwszą
Liczba E jest podzielna przez liczbę pierwszą nie zawartą w zbiorze liczb pierwszych.
W obu tych przypadkach otrzymujemy nową liczbę pierwszą, co przeczy twierdzeniu, iż zbiór zawierał wszystkie liczby pierwsze. Skoro tak, to nie może on być zbiorem skończonym. Jest to tzw. dowód przez sprowadzenie do sprzeczności.
Liczba jest pierwsza (ang. prime), jeśli nie posiada dzielników(ang. divisors) innych poza 1 i sobą samą.
Pierwsze rozwiązanie testu na pierwszość (ang. primality test) polega na próbnym dzieleniu liczby p przez liczby z przedziału od 2 do [√p] i badaniu reszty z dzielenia. Powód takiego postępowania jest prosty – jeśli liczba p posiada czynnik większy od pierwiastka z p, to drugi czynnik musi być mniejszy od pierwiastka, aby ich iloczyn był równy p. W przeciwnym razie iloczyn dwóch liczb większych od √p dawałby liczbę większą od p. Zatem wystarczy przebadać podzielność p przez liczby z przedziału <2,[√p]>, aby wykluczyć liczby złożone.
p | liczba badana na pierwszość, p N, p > 1 |
g | – | granica sprawdzania podzielności p. gN |
i | – | kolejne podzielniki liczby p, iN |
K01: | g ← [√p] | ; wyznaczamy granicę sprawdzania podzielności p |
K02: | Dla i = 2,3,...,g wykonuj krok K03 | ; przebiegamy przez przedział <2,[√p]> |
K03: | Jeśli p mod i = 0, to pisz NIE i zakończ | ; jeśli liczba z przedziału <2,[√p]> dzieli p, to p nie jest pierwsze |
K04: | Pisz TAK | ; jeśli żadna liczba z <2,[√p]> nie dzieli p, p jest pierwsze |
K05: | Zakończ |
// Metoda bisekcji #include <iostream> #include <math.h> //---------------------------- using namespace std; int main() { unsigned long long g,i,p; bool t; cin >> p; g = (unsigned long long)sqrt(p); t = true; for(i = 2; i <= g; i++) { if(p % i == 0) { t = false; break; } } if(t) cout << "TAK"; else cout << "NIE"; cout << endl; return 0; }