next up previous contents
Next: Szybki algorytm dla problemu Up: Przykłady algorytmów Previous: Problem konika szachowego   Spis rzeczy


Algorytm sprawdzający pierwszość liczby

Treść tego programu zawarta jest w dodatku B. Służy on do sprawdzania czy liczba podana jako parametr wejściowy jest pierwsza. W przypadku gdy tak nie jest, dodatkowo są obliczane niektóre jej dzielniki (co najmniej jeden). Większa część programu jest implementacją częściowej arytmetyki dużych liczb (jedynie kilka potrzebnych operacji). W postaci przedstawionej w tej pracy można operować na liczbach rzędu do \( 10^{131} \) (132 cyfry dziesiętne). Zasada działania algorytmu polega na sekwencyjnym przeszukiwaniu przestrzeni możliwych rozwiązań i sprawdzaniu czy dana liczba jest dzielnikiem liczby sprawdzanej. Ponieważ dysponujemy wieloma procesorami, oczywistą rzeczą jest podzielenie przestrzeni na części i przydzielenie przeszukiwania każdej z nich innemu procesorowi wirtualnemu. Dodatkowe przyspieszenie obliczeń można uzyskać przez zawężenie przeszukiwanej przestrzeni. Jeśli dana jest liczba x, to wystarczy sprawdzać liczby mniejsze od \( \left\lfloor \sqrt{x}\right\rfloor \). Ponieważ obliczenie pierwiastka (nawet przybliżone) jest czasochłonne, dla danych większych od \( 10^{8} \) niniejszy program sprawdza liczby mniejsze od \( 10^{\left\lceil \frac{1}{2}\log _{10}x\right\rceil } \), czyli trochę więcej od \( \left\lfloor \sqrt{x}\right\rfloor \) (dla liczb mniejszych od \( 10^{8} \) jest to ciągle \( \left\lfloor \sqrt{x}\right\rfloor \)). Fakt, że nie trzeba sprawdzać podzielności przez liczby parzyste jeśli liczba nie jest parzysta, pozwala na na dalsze skrócenie czas obliczeń (jeśli liczba jest parzysta, to w czasie stałym można stwierdzić, że jest złożona).

W przypadku, gdy liczba jest pierwsza, nastąpi przejrzenie wszystkich liczb z odpowiedniego zakresu. Jeśli dysponujemy N procesorami wirtualnymi, to dla liczby x algorytm wykona się w \( O\left( \frac{1}{2N}\cdot 10^{\left\lceil \frac{1}{2}\cdot \log _{10}x\right\rceil }\right) \) krokach (liczba obrotów pętli w funkcji testuj).

Samo sprawdzanie czy liczba jest pierwsza można wykonać za pomocą testu Millera-Rabina ([9], strona 940). Algorytm ten jest jednak algorytmem probabilistycznym i z pewnym prawdopodobieństwem podaje złe wyniki. Ponadto w żaden sposób nie otrzymamy za jego pomocą czynników rozkładu sprawdzanej liczby. Rozkład na czynniki można przeprowadzić na przykład za pomocą heurystyki \( \rho \) Pollarda przedstawionej w tej samej książce ([9], strona 947). Jeśli p jest niewielkim czynnikiem n, to za pomocą heurystyki \( \rho \) można go znaleźć średnio po \( \Theta \left( \sqrt{p}\right) \) krokach, a do rozłożenia liczby n na czynniki potrzeba co najwyżej \( n^{\frac{1}{4}} \) operacji arytmetycznych. Jednak także nie ma gwarancji ani czasu działania, ani tego, że zakończy się sukcesem. Dodatkowo heurystykę tą należałoby połączyć z jakimś testem sprawdzającym czy liczba jest pierwsza, czy złożona (na przykład test Millera-Rabina wspomniany wyżej).


next up previous contents
Next: Szybki algorytm dla problemu Up: Przykłady algorytmów Previous: Problem konika szachowego   Spis rzeczy
Łukasz Maśko
2000-04-17