Porównanie kodów programów rozkładu liczby na czynniki pierwsze
Porównanie sposobów rozkładu liczby na czynniki pierwsze
W filmie z sekcji „Implementacja algorytmu” przedstawiliśmy zoptymalizowany sposób rozkładu liczby na czynniki pierwsze.
Spróbujmy zapisać funkcję, która będzie wykonywać rozkład dowolnej liczby na czynniki pierwsze z jednoczesnym zliczaniem potencjalnych dzielników i obliczaniem czasu wykonania tych obliczeń. Skorzystamy w tym celu z funkcji time().
Możemy przetestować program dla kilku liczb:
Czas wykonywania obliczeń dla liczb, które mają duże czynniki pierwsze, wyniósł prawie 1,5 minuty. Sprawdzanie kolejnych liczb dopóki, dopóty znaleziony zostanie pierwiastek, nie jest najefektywniejszym możliwym sposobem. Jedną z lepszych metod przedstawimy poniżej.
Drugi sposób rozkładu liczby na czynniki pierwsze
Dla każdej liczby Q możemy określić wszystkie jej dzielniki, sprawdzając jej podzielność przez kolejne liczby pierwsze, a więc 2, 3 oraz liczby postaci:
gdzie:
Za pomocą zmiennej d będziemy w stanie sprawdzić wszystkie dzielniki w jednej pętli (najpierw obliczymy , a następnie i zwiększymy k).
Jak widać, druga wersja rozkładu liczby na czynniki pierwsze jest dużo szybsza. Dla największej z testowanych liczb pierwszych czas obliczeń był o ponad 30% krótszy w stosunku do pierwszego sposobu. Sprawdzono również niemal trzy razy mniej dzielników.
Algorytm szyfrowania RSA bazuje na wyniku mnożenia dwóch dużych liczb pierwszych. Aby go złamać, trzeba znaleźć dla danej liczby Q takie dwie różne liczby e oraz t, których iloczyn wynosi właśnie Q. Będzie wówczas można nazwać t oraz e faktorami liczby Q.
Przykładowo:
Słownik
proces, w którym dla liczby odnajdujemy takie liczby naturalne , różne od oraz różne od (nietrywialne czynniki rozkładu), których iloczyn ; liczby te nazywamy faktorami