Test na liczbę pierwszą
Chyba wszyscy lubimy liczby pierwsze. Szczególne wrażenie robią te naprawdę duże, wydają się skrywać w sobie jakąś nadzwyczajną tajemnicę: dlaczego akurat one stały się swego rodzaju wybrańcami spośród innych liczb i mają tak niezwykłe właściwości?
Matematycy od dawna zastanawiają się, jak sprawdzać, czy liczba jest pierwsza. Dawniej robili to tylko (a może aż) z ciekawości i poczucia doniosłości zadania. W dzisiejszych czasach mają także bardziej praktyczne motywacje. Przykładowo, na potrzeby algorytmu RSA chcielibyśmy umieć sprawdzać, czy liczba mająca około 500 cyfr jest pierwsza, czy też złożona.
Powszechnie stosowany i w praktyce najszybszy jest test pierwszości Millera–Rabina (w skrócie test MR), wymyślony w 1980 roku.
Wykorzystuje on losowość i opiera się na następującym pomyśle.
Powiedzmy, że chcemy sprawdzić, czy liczba
jest pierwsza. Okazuje
się, że jeżeli
jest złożona, to co najmniej połowa liczb ze zbioru
jest świadkami złożoności tej liczby (to zresztą bardzo
mało dokładne oszacowanie). Nazwa bierze się stąd, że jeżeli dla pewnej liczby
istnieje liczba
będąca jej świadkiem złożoności,
to wiadomo, że
jest liczbą złożoną.
Stosunkowo łatwo jest sprawdzić, czy dana liczba
jest świadkiem
złożoności dla
ale nie będziemy teraz wchodzić w szczegóły, co to
znaczy i jak się to robi. Co więcej, odpowiednie obliczenia można wykonać
szybko – jeżeli liczba
ma
cyfr, to algorytm sprawdzający, czy
jest świadkiem złożoności dla
wykonuje mniej więcej
operacji. To znaczy, że dla
będącej liczbą pięćsetcyfrową
wykona on mniej więcej
czyli 125 milionów operacji. Nasz
domowy komputer potrzebuje na to mniej więcej jednej setnej sekundy – czyli nie
jest źle.
Zatem aby sprawdzić, czy liczba
jest pierwsza, postępujemy tak: losujemy
z przedziału od 1 do
i sprawdzamy, czy
jest
świadkiem złożoności dla
Jeżeli jest, to wiemy, że
jest
złożona. Jeśli nie, to
przeszła pierwszą próbę i sprawdzamy
dalej. Ponieważ dla dowolnego
świadkowie złożoności
to przynajmniej połowa liczb z przedziału od 1 do
więc
prawdopodobieństwo, że liczba złożona
przejdzie pojedynczą
próbę, jest nie większe niż
Losujemy więc kolejne
i znów
sprawdzamy, czy jest ono świadkiem złożoności dla
Jeżeli liczba
jest złożona, to prawdopodobieństwo przejścia 30 testów bez
znalezienia świadka złożoności jest mniejsze niż
(czyli
również mniejsze niż
). Po 100 testach prawdopodobieństwo
tego, że błędnie uznamy liczbę złożoną za pierwszą, jest już mniejsze
niż szansa na to, że w ciągu następnej minuty wielki meteoryt uderzy
w Ziemię i zakończy wszelkie nasze matematyczne dywagacje. Czyli
mamy pewność zupełnie wystarczającą. Przeprowadzenie 100 testów
zajmie na domowym komputerze nie więcej niż sekundę – to bardzo
niewiele.
Matematykom jednak problem testowania pierwszości nadal nie dawał spokoju. Chcieli mieć metodę dającą pewność absolutną, obliczającą wynik w sensownym czasie, a nie tylko wystarczającą do celów praktycznych.
Powiemy, że algorytm jest wielomianowy, jeżeli dla danych rozmiaru
wykonuje co najwyżej
operacji, gdzie
to pewien
wielomian. Czyli, na przykład, test MR jest algorytmem wielomianowym, gdyż
dla liczby o
cyfrach wykonuje co najwyżej
operacji dla
pewnej stałej
Algorytmy wielomianowe są umownie uważane za szybkie, a te o większej złożoności – za wolne. W informatyce teoretycznej dla danego problemu bardzo ważnym pytaniem jest, czy da się skonstruować algorytm wielomianowy rozwiązujący go, który podaje poprawną odpowiedź zawsze, a nie tylko z dużym prawdopodobieństwem. Dla problemu testowania pierwszości pytanie to do niedawna było problemem otwartym. Test MR nie jest rozwiązaniem, ponieważ zawiera element losowości.
Chociaż przez wiele lat nie udawało się znaleźć odpowiedzi, większość
matematyków wierzyła w istnienie wielomianowego testu pierwszości. Aż
wreszcie w roku 2002 trzech naukowców z Uniwersytetu w Kampurze ogłosiło
znalezienie pierwszego takiego algorytmu. Nazwano go algorytmem AKS, od
pierwszych liter nazwisk twórców: Agrawal, Kayal, Saxena. To był wielki sukces
– kwestia trudności testowania pierwszości została ostatecznie rozstrzygnięta.
Autorzy otrzymali za to osiągnięcie m.in. nagrodę Gödla – najbardziej
prestiżowe wyróżnienie w dziedzinie informatyki teoretycznej. Co ciekawe,
test AKS działa w praktyce wolniej niż test MR. Po pewnych poprawkach dla
liczby o
cyfrach wykonuje rzędu
operacji, a oryginalny
algorytm jest nawet jeszcze nieco wolniejszy. To nie umniejsza jednak
doniosłości wyniku.
Opis algorytmu mieści się na zaledwie kilku stronach, co jest zupełnie niespotykane dla osiągnięć matematycznych tej trudności. Co więcej, używa (po paru poprawkach) jedynie elementarnej matematyki. Opiera się na kilku bardzo sprytnych spostrzeżeniach. Korzystając z okazji, przyjrzyjmy się temu algorytmowi z lotu ptaka. Głównym pomysłem jest następujące spostrzeżenie.
Dowód. Kongruencję z lematu rozumiemy jako równość modulo
współczynników przy odpowiednich potęgach
W wyrażeniu
współczynnik przy
to
Wystarczy więc zastanowić się, kiedy
dzieli
dla
oraz czy
Gdy
jest pierwsza, to łatwo sprawdzić,
że liczby
oraz
są podzielne przez
(ten
ostatni fakt to małe twierdzenie Fermata), więc teza jest prawdziwa.
Przypuśćmy teraz, że
jest
złożona i liczba pierwsza
dzieli
Niech
będzie
takim maksymalnym wykładnikiem, że
Wówczas jednak
mamy

gdyż
dzieli licznik w
-tej potędze, a mianownik
w pierwszej. Liczba
jest względnie pierwsza z
czyli
a zatem
co dowodzi tezy
również dla liczb złożonych.
By rozstrzygnąć, czy
jest pierwsze, wystarczy więc sprawdzić, czy
wielomiany
i
mają wszystkie współczynniki
przystające modulo
Gdybyśmy jednak sprawdzali je po kolei
przy każdej potędze
to wykonalibyśmy przynajmniej rzędu
operacji. To za dużo, więc trzeba obliczać współczynniki
sprytnie.
Kolejny pomysł to sprawdzanie równości (1) modulo wielomian postaci
dla pewnego
czyli
![]() | (2) |
Może się jednak okazać, że niektóre liczby złożone spełniają równość
(2), mimo że nie spełniają równości (1). Rozwiązaniem tego problemu jest
sprawdzanie (2) dla odpowiednio dobranego
i dla wszystkich
dodatnich wartości
nie większych niż
(gdzie
oznacza liczbę liczb mniejszych od
i względnie pierwszych
z
). Okazuje się, że liczba
spełniająca wszystkie takie
równości, musi być pierwsza. Właśnie w wykazaniu prawdziwości tego
spostrzeżenia leży główna trudność techniczna dowodu.
Niech
będzie taką najmniejszą liczbą
że
Algorytm AKS działa według następującego schematu:
- 1.
- jeśli
dla
to zwróć ZŁOŻONA
- 2.
- znajdź taką najmniejszą liczbę
że
- 3.
- jeśli
dla jakiegoś
to zwróć ZŁOŻONA
- 4.
- jeśli
to zwróć PIERWSZA
- 5.
- dla
od
do
wykonuj: jeśli
to zwróć ZŁOŻONA
- 6.
- zwróć PIERWSZA
Bez wielkiej trudności można stwierdzić, że jeśli algorytm zakończy działanie
w jednym z pierwszych pięciu kroków, to odpowiedź jest poprawna. Jeżeli
zwróci wynik w punkcie 1, to zrobi, oczywiście, słusznie. Jeżeli znajdzie
w punkcie 3 taką liczbę
że
to
jest nietrywialnym dzielnikiem
czyli istotnie
jest
złożona. Z kolei jeżeli w punkcie 4 okaże się, że
to znaczy,
że w punkcie 3 sprawdziliśmy wszystkie
i każda była
względnie pierwsza z
czyli faktycznie
jest pierwsza. Jeśli
w punkcie 5 równość modulo
nie jest spełniona, to nie zachodzi
również zależność (1), czyli istotnie
jest złożona. Pozostaje jedna
wątpliwość co do poprawności algorytmu: czy wynik zwracany w punkcie
6 jest poprawny?
Dowód opiera się na analizie funkcji
oraz liczb
spełniających
równanie

dla pewnego konkretnego czynnika pierwszego
liczby
Jeśli
liczba
przeszła testy w punkcie 5, to dla każdej funkcji postaci
oraz
powyższa kongruencja jest prawdziwa.
Można wyprowadzić analogiczne zależności dla innych funkcji
i liczb
i, idąc tym tropem, udowodnić, że algorytm
słusznie zwraca wynik PIERWSZA w punkcie 6. To rozumowanie pozwala
zakończyć dowód poprawności algorytmu, ale wymaga trochę pracy nad
szczegółami.
Czytelnik Uważny chciałby pewnie zapytać, czy istotnie algorytm AKS jest
wielomianowy. Tę sprawę rozwiązuje lemat, z którego wynika, że dla
istnieje
nie większe niż
spełniające
własność z drugiego kroku algorytmu. Analizując dokładnie dalsze kroki (do
czego przydaje się pewne doświadczenie w szacowaniu złożoności),
zauważymy, że ten fakt rzeczywiście pozwala na oszacowanie czasu działania
algorytmu przez wielomian zależny od
Dobrym zadaniem na
początek jest znalezienie sposobu wykonania pierwszego kroku w czasie
wielomianowym od
Te wyniki nie oznaczają bynajmniej, że cała sprawa liczb pierwszych doczekała się ostatecznego zamknięcia. Istnieje naprawdę ogromnie dużo nierozwiązanych problemów dotyczących liczb pierwszych. Wiele z nich ma także znaczenie praktyczne. Chyba najważniejszym takim problemem jest zagadnienie faktoryzacji liczb, czyli znajdowania ich rozkładu na czynniki pierwsze. Do dziś nie ma dla tego problemu żadnych algorytmów działających w zadowalającym czasie, choćby takich, które wykorzystują losowość, albo nawet takich, które wydają się poprawne, ale na razie nie umiemy tego udowodnić.