Wpisany przez Tomasz Lubiński
czwartek, 26 kwietnia 2007 21:30
Test pierwszości Fermata to probabilistyczny test umożliwiający sprawdzenie czy dana liczba jest złożona czy prawdopodobnie pierwsza. Jest on jednym z najprostszych testów pierwszości. Oparty jest na małym twierdzeniu Fermata, które mówi, że jeżeli liczba p jest liczbą pierwszą to dla każdego a takiego, że 1≤a<p
a p-1 mod p = 1.
Test Fermata polega na losowym wybraniu liczby a takiej, że 1<a<p i sprawdzeniu czy równość jest prawdziwa (nie ma sensu sprawdzać dla a=1, gdyż dla każdej liczby nierówność będzie prawdziwa). W uproszczeniu możemy to zapisać następująco:
k- określa dokładność testu
p - liczba do sprawdzenia
Algorytm można przedstawić za pomocą następującego schematu blokowego:
Na pierwszy rzut oka trudność sprawiać może obliczenie wartości ap-1 mod p, szczególnie dla dużych wartości p. Szybko i bezproblemowo obliczymy taką wartość używając algorytmu szybkiego potęgowania modularnego lub dużo wolniejszego, ale prostszego algorytmu naiwnego potęgowania modularnego
Przykład
Sprawdzimy z dokładnością k=3 czy liczba p=13 jest pierwsza.
Pierwsza próba, wylosowaliśmy a=12. 1212 mod 13 = 1.
Druga próba, wylosowaliśmy a=3. 312 mod 13 = 1.
Trzecia próba, a=4. 412 mod 13 = 1.
Zatem prawdopodobnie liczba 13 jest liczbą pierwszą.
Sprawdzimy z dokładnością k=3 czy liczba p=63 jest pierwsza.
Pierwsza próba, wylosowaliśmy a=8. 862 mod 63 = 1.
W drugiej próbie wylosowaliśmy a=34. 3462 mod 63 = 22.
Równość nie jest spełniona zatem liczba 63, z całą pewnością nie jest liczbą pierwszą.
a p-1 mod p = 1.
Test Fermata polega na losowym wybraniu liczby a takiej, że 1<a<p i sprawdzeniu czy równość jest prawdziwa (nie ma sensu sprawdzać dla a=1, gdyż dla każdej liczby nierówność będzie prawdziwa). W uproszczeniu możemy to zapisać następująco:
k- określa dokładność testu
p - liczba do sprawdzenia
powtórz k razy:
wylosuj a takie, że 1<a<p
sprawdź czy ap-1 mod p = 1
jeżeli nie to przerwij test - liczba nie jest pierwsza
jeżeli równość była spełniona dla wszystkich prób, liczba prawdopodobnie jest pierwsza
Algorytm można przedstawić za pomocą następującego schematu blokowego:
Na pierwszy rzut oka trudność sprawiać może obliczenie wartości ap-1 mod p, szczególnie dla dużych wartości p. Szybko i bezproblemowo obliczymy taką wartość używając algorytmu szybkiego potęgowania modularnego lub dużo wolniejszego, ale prostszego algorytmu naiwnego potęgowania modularnego
Przykład
Sprawdzimy z dokładnością k=3 czy liczba p=13 jest pierwsza.
Pierwsza próba, wylosowaliśmy a=12. 1212 mod 13 = 1.
Druga próba, wylosowaliśmy a=3. 312 mod 13 = 1.
Trzecia próba, a=4. 412 mod 13 = 1.
Zatem prawdopodobnie liczba 13 jest liczbą pierwszą.
Sprawdzimy z dokładnością k=3 czy liczba p=63 jest pierwsza.
Pierwsza próba, wylosowaliśmy a=8. 862 mod 63 = 1.
W drugiej próbie wylosowaliśmy a=34. 3462 mod 63 = 22.
Równość nie jest spełniona zatem liczba 63, z całą pewnością nie jest liczbą pierwszą.
| Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
| Tomasz Lubiński | Ada | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 | |
| Tomasz Lubiński | C# | MS Visual Studio .net | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Tomasz Lubiński | C/C++ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 2 | |
| Marian | C/C++ | C++ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 2 |
| Tomasz Lubiński | Delphi/Pascal | ![]() | ![]() |
![]() ![]() ![]() ![]() / 2 | |
| Tomasz Lubiński | Java | ![]() | ![]() |
![]() ![]() ![]() ![]() / 2 | |
| _marass_ | Php | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
Poprawiony: środa, 26 maja 2010 22:27



/ 1




Komentarze