StartAlgorytmyAlgorytmy arytmetyczneTest pierwszości - test Fermata
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Test pierwszości - test Fermata
Ocena użytkowników:+++++ / 5
SłabyŚwietny 
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

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:
schemat blokowy - test Fermata


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
Implementacja w Ada
Implementacja w Ada
++++- / 1
Tomasz Lubiński C# MS Visual Studio .net
Implementacja w C#
Implementacja w C#
++++- / 1
Tomasz Lubiński C/C++
Implementacja w C/C++
Implementacja w C/C++
+++-- / 2
Marian C/C++ C++
Implementacja w C/C++
Implementacja w C/C++
++--- / 2
Tomasz Lubiński Delphi/Pascal
Implementacja w Delphi/Pascal
Implementacja w Delphi/Pascal
++++- / 2
Tomasz Lubiński Java
Implementacja w Java
Implementacja w Java
++++- / 2
_marass_ Php
Implementacja w Php
Implementacja w Php
++++- / 1
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: środa, 26 maja 2010 22:27

Komentarze

 
photo
0 # Fariia 2009-07-20 22:43
Wielkie dzięki ta strona bardzo mi pomogła
Odpowiedz | Odpowiedz z cytatem | Cytować
 

Dodaj komentarz

Kod antysapmowy
Odśwież