Badanie pierwszości liczby, klasa NP i test Rabina Mateusz Chynowski 11 stycznia 2009 Liczby pierwsze są bardzo istotne zarówno w matematyce, jak i informatyce. W tej drugiej nauce istnieje dość poważny problem niepewnych wyników. Najczęstszymi zagadnieniami dotyczącymi liczb pierwszych są: • problem pierwszości – odpowiadający na pytanie: „Czy dana liczba jest pierwsza?” • problem złożoności – odpowiadający na pytanie: „Czy dana liczba jest złożona?” W algorytmach zwykłych oba rodzaje problemów nie różnią za bardzo. Rozwiązując jedeno z zagadnień rozwiązujemy tym samym drugie. Inaczej jest z algorytmami niedeterministycznymi, czyli takimi, których działania nie możemy przewidzieć. Zawiera ona najczęściej instrukcję choise. Algorytmy losowe należą do algorytmów niedeterministycznych. Zwykłe algorytmy badające pierwszość są wykładnicze. Najłatwiej przekonać się o tym badając pierwszość z definicjii Definicja 1 Liczba pierwsza – liczba naturalna większa od 1, która ma dokładnie dwa dzielniki naturalne: 1 oraz samą siebie. Sprawdzamy zatem, czy dana liczba n nie jest podzielna przez żadną z liczb z przedziału [2;n − 1]. Dla liczby złożonej z k cyfr to n ­ 10k−1. Badanie wymagałoby 10k−1 − 2 działań. Jak widzimy liczba dzieleń wzrasta wykładniczo do wzrostu długości liczby n. Warto wspomnieć, że sito Eratostenesa jest jeszcze gorsze. Wykonuje on wykładniczą liczbę operacji, wykorzystuje on także pamięć wykładniczo. Rysunek 1: Vaughan Robert Pratt W 1975 roku Vaughan Robert Pratt stwierdził, że problem pierwszości należy do klasy NP. Klasę NP tłumaczy się efektywniej przez wprowadzenie definicji klasy P. 1 Definicja 2 Klasa P – rodzina problemów, których rozwiązanie wyliczamy w czasie wielomianowym. Tym samym Definicja 3 Klasa NP – rodzina problemów, których rozwiązanie wyliczane jest algorytmem o czasie wykładniczym, zaś sprawdzenie poprawności wyniku – w czasie wielomianowym. Formalna deficicja klasy NP: Jeżeli problem A należy do klasy NP oraz istnieje wielomian ω i wielomianowy problem B takie, że: m ∈ A ⇔ ∃k r(k) ¬ ω(r(m)) ∧ < m, k >∈ B gdzie r(m) – rozmiar liczby m. Problemy „bardziej skomplikowane” nie należą do klasy NP – to znaczy te problemy, których rozwiązanie jest bardziej szczegółowe od „tak” lub „nie” (np. znalezienie dzielników). Informatycy badają czy klasa problemów P jest równoważna klasie NP. Wystarczyłoby wskazać jedynie, że każdy problem z klasy NP da się rozwikłać algorytmem z klasy P. Mimo starań większośc informatyków jest zdania, że P 6= NP . Do dalszych rozważań potrzebować będziemy potrzebowali definicji pierwiastka pierwotnego: Definicja 4 Pierwiastek pierwotny modulo n – liczba z przedziału < 1, n − 1 >, której potęgi modulo n dają wszystkie liczby z < 1, n − 1 >. Przykład 1 Podnieśmy 2 do kolejnych potęg modulo 5: 21 (mod 5) = 2 22 (mod 5) = 4 23 (mod 5) = 3 24 (mod 5) = 1 Liczba 2 jest pierwiastkiem pierwotnym modulo 5. Zaś: Przykład 2 Sprawdźmy czy 2 jest pierwiastkiem pierwotnym modulo 7: 21 (mod 7) = 2 22 (mod 7) = 4 23 (mod 7) = 1 24 (mod 7) = 2 25 (mod 7) = 4 26 (mod 7) = 1 ... Jak widzimy 2 nie jest już pierwiastekiem pierwotnym modulo 7. 2 Zachodzi Twierdzenie 1 Liczba naturalna m > 1 jest pierwsza wtedy i tylko wtedy, gdy w Zm istnieje pierwiastek pierwotny modulo m. Zatem możemy dość sprawnie decydować czy dana liczba jest pierwsza czy złożona sprawdzając tylko czy istnieje pierwiastek pierwotny. Badaniem czy a jest pierwiastkiem pierwotnym modulo m zajmuje się test Lucasa, który sprawdza: • czy am−1 ≡ 1 (mod m) oraz • czy ∀q | (m − 1) q ∈ P a m−1 q 6≡ 1 (mod m) Definicja 5 Certyfikatem pierwszości liczby n nazywamy ciąg danych świadczących o pierwszości liczby n. Test Lucassa pokazuje, że certyfikatem liczby n może być ciąg danych złożony z pierwiastka pierwotnego modulo n oraz wszystkich dzielników liczby n − 1. Nie jest to jednak najlepszy certyfikat, gdyż powinien on obejmować test pierwszości dzielników. Pratt zauważył, że jeżeli niepełny certyfikat Lucasa uzupełnimy o niepełne certyfikaty pierwszości wymionionych w nim liczb pierwszych, a także o niepełne certyfikaty liczb pierwszych w dołączonych certyfikatach itd., to cerrtyfikat pierwszości stanie się pełny. Rysunek 2: Leonard Adleman Przykład 3 Certyfikatem pierwszości liczby 23 jest: (5, 2, 11(2, 2, 5(3, 2))), gdyż 5 jest pierwiastkiem pierwotnym modulo 23, 22 = 2 ∗ 11. 2 jest liczbą pierwszą z definicji. 2 jest pierwiastkiem pierwotnym modulo 11 oraz 10 = 2 ∗ 5. Analogicznie 3 jest pierwiastkiem pierwotnym modulo 5, a 4 = 22 . Inne algorytmy badające pierwszość: 1976 rok Gary Miller przedstawił test pierwszości w oparciu o hipotezę Riemanna, który został odrzucony 1983 rok Adleman, podali I deterministyczny test pierwszości, który nie jest Pomerance, wykładniczy, ale nie jest też jeszcze wielomianowy Rumeley 2002 rok Manindra podali deterministyczny, wielomianowy test pierwszości Agraval wraz z uczniami 3 Rysunek 3: Manindra Aragraval Twierdzenie 2 (M. Agravala) Przyjmijmy, że liczby naturalne m i a są względnie pierwsze. Liczba m jest pierwsza wtedy i tylko wtedy, gdy wielomian (x − a)m o współczynikach z pierścienia reszt modulo m jest równy wielomianowi xm − a. Autorom testu kłopty sprawiło wykazanie wielomianowości algorytmu. Ostatecznie pokazali, że dla liczb o rozmiarze n algorytm wykonuje conajwyżej c ∗ n12 operacji dla pewnego c = const. Ciężko jest znaleźć jednak zastosowanie praktyczne wyniku prac Agravala. Wykorzystanie algorytmów probabilistycznych wymaga zupełnie innego sposobu myślenia – otrzymujemy odpowiedź „nie” lub „najprawdopodobniej tak”. Taka rodzina algorytmów jest bardzo szybka, jednak za cenę możliwliwości popełnienia błędu. Michael Rabin w 1980 roku podał jeden z najbardziej znanych losowych testów pierwości. Rysunek 4: Michael O. Rabin 4 Micheal Oser Rabin urodził się w 1931 roku w Breslau w Niemczech (dzisiejszy Wrocław). Przed ukończeniem ósmego roku życia przeniósł się do Palestyny. W 1953 roku ukończył studia matematyczne na Uniwersytecie Hebrajskim w Jerozolie. Rabin brał udział w kreowaniu teorii złożoności obliczeniowej. Kształtował pojęcie klasy NP. W 1976 roku został za to uhonorowany wraz z Dana Scott nagrodą Turinga. Osiągnięcia ma również w kryptografii. Michael Rabin otrzymał tytuł doktor honoris causa na wielu uniwersytetach, także na Uniwersytecie Wrocławskim. Uroczyste nadanie tytułu odbyło się 13 lipca 2007 roku. Rozważmy test Fermata (dla danej liczby m): • wylosujmy a < m i sprawdźmy czy am−1 ≡ 1 (mod m) • jeśli tak −→ m prawdopodobnie jest liczbą pierwszą, jeśli nie −→ m jest liczbą złożoną Algorytm ten jest algorytmem Monte Carlo. Definicja 6 Algorytmy Monte Carlo – rodzina algorytów probabilistycznych, których prawdopodobieństwo błędu jest mniejsze od c = const, takiej że c < 1. Przy wielokrotnym powtarzaniu algorytmu M-C prawdopodobieństwo błędu dąży do 0. Twierdzenie 3 Liczba Carmichaela – Liczba naturalna n jest liczbą Carmichaela wtedy i tylko wtedy, gdy: 1. n jest liczbą złożoną, 2. ∀a ∈ N 1 < a < n a 6| n, liczba (an−1 − 1) jest podzielna przez n. Rozważmy liczbę Carmichaela m = p ∗ q ∗ r. Istnieje (p − 1) ∗ (q − 1) ∗ (r − 1) liczb względnie pierwszych z m, zatem prawdopodobieństwo błędu P ¬ (p−1)∗(q−1)∗(r−1) . Ze wzrostem p∗q∗r−1 liczb p, q oraz r P → 1, zatem test Fermata nie jest algorytm Monte Carlo. Twierdzenie Fermata musimy uzupełnić o informacje o liczbach pierwszych. Gary Miller w algorytmie skorzystł z: Twierdzenie 4 Jeżeli m jest liczbą pierwszą, to każda liczba x, której kwadrat przystaje do 1, przystaje modulo m do −1, albo do 1. Każdy zna to twierdzenie z rozwiązania równania x2 = 1 ⇒ x = −1 ∨ x = 1. W dalszych rozważaniach potrzebne nam będzie: Twierdzenie 5 Jeżeli • ∀a 0 < a < m ∧ a 6| m • x2 ≡ 1 am−1 ≡ 1 (mod m), oraz (mod m) tylko dla x ≡ 1 (mod m) ∨ x ≡ −1 5 (mod m), to m jest liczbą pierwszą. Połączmy to twierdzenie z poprzednim oraz z twierdzeniem Fermata. Liczba a świadczy o pierwszości m, jeżeli: an ≡ 1 i (mod m), lub a2 ∗n ≡ −1 (mod m), i ∈ N, i < k. Pojęcie świadczenia o pierwszości pozwala na wprowadzenie twierdzenia: Twierdzenie 6 Liczba m jest pierwsza wtedy i tylko wtedy, gdy każda dodatnia liczba a < m świadczy o pierwszości m. Michael Rabin zaproponował na bazie powyższego twierdzenia test pierwszości m: • wylosuj a ∈ N 0 < a < m i sprawdź, czy świadczy o pierwszości m, • jeżeli świadczy, to przekaż, że m jest prawdopodobnie liczbą pierwszą, w przeciwnym razie przekaż, że m jest liczbą złożoną. Algorytm Rabina popełnia błąd najwyżej z prawdopodobieństwem 21 , zatem jest to algorytm Monte Carlo. Jeżeli m jest liczbą złożoną to najwyżej 41 liczb świadczy o pierwszości m (oczywiście mniejszych od m). Zatem prawdopodobieństwo błędu spada dwukrotnie. Po t-krotnym powtarzaniu testu Rabina otrzymamy prawdopodobieństwo błędu nie przekroczy 41t . 6