Jak wyciągnąć
modulo 
Niech będzie liczbą nieparzystą...
Pytamy, czy istnieje taka liczba całkowita że
![]() |
(1) |
Jeśli ta kongruencja ma rozwiązanie całkowite to na pewno istnieje rozwiązanie
Wtedy liczba
też jest rozwiązaniem. Jak jednak rozstrzygnąć, czy kongruencja (1) w ogóle ma rozwiązania?
W przypadku, gdy jest liczbą pierwszą, dysponujemy praktycznym algorytmem, który rozstrzyga, czy kongruencja (1) ma rozwiązanie - oparty jest on na tzw. kryterium Eulera. Jest ono ściśle związane z małym twierdzeniem Fermata. To słynne twierdzenie mówi, że jeśli
nie dzieli się przez liczbę pierwszą
to wówczas

Jeśli kongruencja (1) ma rozwiązanie to możemy napisać

a zatem ostatecznie
![]() |
(2) |
Kryterium Eulera stanowi, że powyższe rozumowanie można odwrócić: jeśli zachodzi kongruencja (2), to kongruencja (1) ma rozwiązanie. Warto w tym miejscu dodać, że potęgowanie modulo
łatwo wykonać efektywnie nawet wtedy, gdy liczby
oraz
są ogromne! Oto zarys metody. Najpierw zapisujemy wykładnik
w układzie dwójkowym:

Ponieważ

więc wystarczy wykonać kolejnych podnoszeń do kwadratu, a na koniec
mnożeń - wszystkie operacje wykonujemy modulo
a więc na liczbach mniejszych od
Załóżmy teraz, że liczba przeszła test Eulera. Nasuwa się teraz pytanie: jak znaleźć
spełniające kongruencję (1)?
Jeśli to wystarczy przyjąć

Pokazuje to poniższy rachunek

(na mocy (2)).
Jeżeli natomiast to nieco komplikując powyższą metodę (szczegóły pominiemy), można obliczyć
spełniające (1), o ile mamy do dyspozycji taką liczbę
że kongruencja
![]() |
(3) |
nie ma rozwiązań. Taką liczbę nazywamy nieresztą kwadratową modulo
. Łatwo udowodnić, że w ciągu liczb
jest dokładnie
niereszt. Dla pozostałych liczb
z powyższego ciągu kongruencja (3) ma rozwiązanie - nazywamy je resztami kwadratowymi modulo
. I tak np. dla
liczby
są resztami kwadratowymi, a liczby
nieresztami kwadratowymi. Natomiast dla
niereszty kwadratowe to
a reszty kwadratowe to
Nieresztę kwadratową
której używamy we wzmiankowanym powyżej algorytmie pierwiastkowania modulo
łatwo znaleźć praktycznie nawet dla bardzo dużych liczb pierwszych
Wystarczy mianowicie wylosować liczbę
i sprawdzić, czy jest nieresztą kwadratową, stosując, na przykład, kryterium Eulera. W przypadku niepowodzenia losujemy i testujemy inną liczbę
Prawdopodobieństwo wylosowania niereszty w każdej próbie wynosi
a zatem przeciętnie bardzo szybko znajdziemy nieresztę. Jest to przykład algorytmu zrandomizowanego. Rzucając
razy symetryczną monetą, możemy, oczywiście, wyrzucić same reszty (niektórzy mówią reszki), ale prawdopodobieństwo tego jest małe.
A może lepiej testować po kolei liczby aż do skutku, czyli do napotkania niereszty? Niech więc
oznacza najmniejszą nieresztę kwadratową modulo
Najlepszy wynik bezwarunkowy pochodzi od D.A. Burgessa

dla każdego i
Natomiast przy założeniu uogólnionej hipotezy Riemanna N.C. Ankeny pokazał oszacowanie znacznie lepsze

Tak więc prymitywny algorytm testowania kolejnych liczb jest (warunkowo) bardzo efektywny.
Podsumujmy nasze dotychczasowe rozważania: jeśli moduł jest liczbą pierwszą, to w zasadzie potrafimy poradzić sobie zarówno z rozstrzygnięciem, czy
jest resztą kwadratową modulo
jak i ze znalezieniem wszystkich rozwiązań kongruencji (1) w zbiorze
(są dwa takie rozwiązania).
A jak jest dla liczb złożonych Rozpatrzymy najprostszy przypadek, gdy
jest iloczynem dwóch różnych liczb pierwszych. Do dzisiaj nie jest znana żadna efektywna uniwersalna metoda rozstrzygania, czy kongruencja (1) ma rozwiązanie. Załóżmy jednak, że dobra wróżka rzekła: Tak, kongruencja
jest rozwiązalna, a Twoje zadanie to znaleźć jej wszystkie rozwiązania
w zbiorze
. Załóżmy dalej, że jakimś cudem wypisaliśmy wszystkie (cztery - wynika to z chińskiego twierdzenia o resztach) rozwiązania kongruencji (1):

Ponieważ kongruencja ma dokładnie dwa rozwiązania
w zbiorze
więc dla pewnych
mamy
a zatem liczba
dzieli się przez
Oczywiście,
nie dzieli się przez
gdyż
A zatem

Liczby NWD NWD
NWD
potrafimy obliczyć, bardzo efektywnie stosując najsłynniejszy algorytm na świecie - algorytm Euklidesa. W ten sposób znaleźliśmy nietrywialny dzielnik
liczby
Najbardziej pomógł nam cud (a nie wróżka). Tym samym naszkicowaliśmy główną myśl dowodu twierdzenia, że kompletne rozwiązanie kongruencji (1) dla modułu złożonego
jest co najmniej tak trudne, jak rozkład
na czynniki pierwsze. Natomiast samo tylko rozstrzygnięcie, czy (1) ma rozwiązanie, wydaje się istotnie łatwiejsze niż rozkład na czynniki, ale jak już wspomnieliśmy wcześniej, nikt nie umie zrobić efektywnie nawet tego.