Certyfikat pierwszości

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

W teorii liczb, certyfikat pierwszości albo dowód pierwszości to zwięzły formalny dowód, że dana liczba jest pierwsza, który można szybko zweryfikować – w przeciwieństwie do czasochłonnego przeprowadzenia testu pierwszości. Istnienie certyfikatów pierwszości dowiodło, że problem znajdowania liczb pierwszych leży w klasie NP: problemów których rozwiązania można sprawdzić w czasie wielomianowym.

Certyfikaty Pratta[edytuj | edytuj kod]

Najbardziej znanymi certyfikatami pierwszości (choć nie pierwszymi wynalezionymi) sa tzw. certyfikaty Pratta, wynalezione przez Pratta w 1975 r. Bazują one na odwróceniu małego twierdzenia Fermata z dodanym warunkiem, który uzupełnia to odwrócenie:

Załóżmy, że znamy liczbę całkowitą x taką że:
  • x jest względnie pierwsza z n
  • x n −1 ≡ 1 (mod n)
  • Dla każdej liczby pierwszej p która dzieli n −1, nie zachodzi x(n −1)/p ≡ 1 (mod n).
Wtedy n jest liczbą pierwszą

Znając taką liczbę x (nazywaną świadkiem) i rozkład na czynniki pierwsze n −1, powyższe warunki można szybko sprawdzić: wymaga to liniowej liczby działań na potęgach (bo każda liczba ma mniej dzielników pierwszych niż cyfr), z których każde wymaga O(log n) mnożeń (przy zastosowaniu szybkiego potęgowania).

Niestety powyższy algorytm można oszukać, tak żeby zaakceptował liczbę złożoną. W tym celu można podać mu fałszywy rozkład na czynniki pierwsze n −1, w którym będą znajdowały się liczby złożone. Przykładowo załóżmy, że twierdzimy, że 85 jest pierwsza, podając świadka x= 4 i równanie 84=6×14 jako rozkład n −1. Wtedy:

  • 4 jest względnie pierwsze z 85
  • 485−1 ≡ 1 (mod 85)
  • 4(85−1)/6 ≡ 16 (mod 85), 4(85−1)/14 ≡ 16 (mod 85)

Algorytm wywnioskuje, że 85 jest pierwsza. Zauważmy, że nie możemy samodzielnie szukać rozkładu n −1 na czynniki pierwsze, ponieważ nie znamy algorytmu, który robi to w wielomianowym czasie.

Lepszym sposobem rozwiązania tego problemu jest udostępnienie certyfikatów pierwszości również dla każdego czynnika n −1: w tej samej postaci, ale mniejszych i łatwiejszych do sprawdzenia. Postępujemy w ten sposób rekurencyjnie, aż dojdziemy do czynników o których wiemy że są pierwsze (np. do 2). Kompletny certyfikat ma wtedy postać drzewa ze znanymi liczbami pierwszymi w liściach. Przykładowe drzewo udowadniające że 229 jest liczbą pierwszą, może wyglądać tak:

  • 229 (x=6, 229−1 = 22×3×19)
    • 2 (znana liczba pierwsza)
    • 3 (x=2, 3−1 = 2)
      • 2 (znana liczba pierwsza)
    • 19 (x=2, 19−1 = 2×32)
      • 2 (znana liczba pierwsza)
      • 3 (x=2, 3−1 = 2)
        • 2 (znana liczba pierwsza)

Zauważmy, że iloczyn liczb na każdym poziomie drzewa jest nie większy niż początkowa liczba, a więc drzewo ma rozmiar liniowy. Liczba poziomów jest logarytmiczna, ponieważ n −1 dzieli się przez 2 dla wszystkich nieparzystych liczb pierwszych. Tym samym weryfikacja całego drzewa jest trwa co najwyżej O(log n) razy dłużej niż pierwotny algorytm.

W praktyce generowanie certyfikatów Pratta dla dużych liczb jest trudne do zrealizowania, ponieważ wymaga rozłożenia na czynniki pierwsze n −1. W szczególnych wypadkach jest to łatwe (np. dla liczb Fermata), ale w ogólności używa się certyfikatów łatwiejszych do wygenerowania takich jak certyfikaty Atkin-Goldwasser-Kilian-Morain.

Linki zewnętrzne[edytuj | edytuj kod]