Porównanie sposobów rozkładu liczby na czynniki pierwsze

W filmie z sekcji „Film samouczek” 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().

Linia 1. def rozklad otwórz nawias okrągły Q zamknij nawias okrągły dwukropek. Linia 2. from math import sqrt. Linia 3. from time import time. Linia 4. t0 znak równości time otwórz nawias okrągły zamknij nawias okrągły. Linia 6. kratka górna granica sprawdzanych dzielników. Linia 7. g znak równości int otwórz nawias okrągły sqrt otwórz nawias okrągły Q zamknij nawias okrągły zamknij nawias okrągły plus 1. Linia 9. kratka tablica czynników pierwszych. Linia 10. tab znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 12. kratka licznik sprawdzonych dzielników. Linia 13. dzielniki znak równości 0. Linia 15. for p in range otwórz nawias okrągły 2 przecinek g zamknij nawias okrągły dwukropek. Linia 16. dzielniki plus znak równości 1. Linia 17. while Q procent p znak równości znak równości 0 dwukropek. Linia 18. tab kropka append otwórz nawias okrągły p zamknij nawias okrągły. Linia 19. Q znak równości Q prawy ukośnik prawy ukośnik p. Linia 20. if Q znak równości znak równości 1 dwukropek. Linia 21. break. Linia 22. if Q znak równości znak równości 1 dwukropek. Linia 23. break. Linia 25. if Q zamknij nawias ostrokątny 1 dwukropek. Linia 26. tab kropka append otwórz nawias okrągły Q zamknij nawias okrągły. Linia 28. t1 znak równości time otwórz nawias okrągły zamknij nawias okrągły. Linia 29. print otwórz nawias okrągły f apostrof Znaleziono czynniki pierwsze dwukropek otwórz nawias klamrowy tab zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 30. print otwórz nawias okrągły f apostrof Czas w sekundach dwukropek otwórz nawias klamrowy t1 minus t0 dwukropek kropka 6f zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 31. print otwórz nawias okrągły f apostrof Sprawdzone dzielniki otwórz nawias klamrowy dzielniki zamknij nawias klamrowy apostrof zamknij nawias okrągły.

Możemy przetestować program dla kilku liczb:

Linia 1. rozklad otwórz nawias okrągły 44100 zamknij nawias okrągły. Linia 2. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 2 przecinek 2 przecinek 3 przecinek 3 przecinek 5 przecinek 5 przecinek 7 przecinek 7 zamknij nawias kwadratowy. Linia 3. kratka Czas w sekundach dwukropek 0 kropka 000015. Linia 4. kratka Sprawdzone dzielniki dwukropek 6. Linia 6. rozklad otwórz nawias okrągły 44103241230 zamknij nawias okrągły. Linia 7. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 2 przecinek 3 przecinek 5 przecinek 97 przecinek 587 przecinek 25819 zamknij nawias kwadratowy. Linia 8. kratka Czas w sekundach dwukropek 0 kropka 003861. Linia 9. kratka Sprawdzone dzielniki dwukropek 25818. Linia 11. rozklad otwórz nawias okrągły 372036854775807 zamknij nawias okrągły. Linia 12. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 3 przecinek 3 przecinek 13 przecinek 3179802177571 zamknij nawias kwadratowy. Linia 13. kratka Czas w sekundach dwukropek 2 kropka 584548. Linia 14. kratka Sprawdzone dzielniki dwukropek 19288255. Linia 16. rozklad otwórz nawias okrągły 13372036854775807 zamknij nawias okrągły. Linia 17. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 13 przecinek 19 przecinek 271 przecinek 439 przecinek 5849 przecinek 77801 zamknij nawias kwadratowy. Linia 18. kratka Czas w sekundach dwukropek 0 kropka 007574. Linia 19. kratka Sprawdzone dzielniki dwukropek 77800. Linia 21. rozklad otwórz nawias okrągły 413372036854775807 zamknij nawias okrągły. Linia 22. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 1051 przecinek 15263 przecinek 25769053939 zamknij nawias kwadratowy. Linia 23. kratka Czas w sekundach dwukropek 87 kropka 726839. Linia 24. kratka Sprawdzone dzielniki dwukropek 642940149.

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).

Linia 1. def rozklad podkreślnik 2 otwórz nawias okrągły Q zamknij nawias okrągły dwukropek. Linia 2. from math import sqrt. Linia 3. from time import time. Linia 4. t0 znak równości time otwórz nawias okrągły zamknij nawias okrągły. Linia 6. kratka granice sprawdzanych dzielników. Linia 7. p znak równości 2. Linia 8. g znak równości int otwórz nawias okrągły sqrt otwórz nawias okrągły Q zamknij nawias okrągły zamknij nawias okrągły. Linia 10. kratka zmienne do wyliczania p znak równości 6 asterysk k plus prawy ukośnik minus 1. Linia 11. k znak równości 1. Linia 12. d znak równości minus 1. Linia 14. kratka licznik sprawdzonych dzielników. Linia 15. dzielniki znak równości 0. Linia 17. kratka tablica czynników pierwszych. Linia 18. tab znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 20. while p otwórz nawias ostrokątny znak równości g dwukropek. Linia 21. dzielniki plus znak równości 1. Linia 22. while Q procent p znak równości znak równości 0 dwukropek. Linia 23. tab kropka append otwórz nawias okrągły p zamknij nawias okrągły. Linia 24. Q prawy ukośnik prawy ukośnik znak równości p. Linia 25. if Q znak równości znak równości 1 dwukropek. Linia 26. break. Linia 27. if p otwórz nawias ostrokątny 3 dwukropek. Linia 28. p plus znak równości 1. Linia 29. else dwukropek. Linia 30. p znak równości 6 asterysk k plus d. Linia 31. if d znak równości znak równości 1 dwukropek. Linia 32. d znak równości minus 1. Linia 33. k plus znak równości 1. Linia 34. else dwukropek. Linia 35. d znak równości 1. Linia 37. if Q zamknij nawias ostrokątny 1 dwukropek. Linia 38. tab kropka append otwórz nawias okrągły Q zamknij nawias okrągły. Linia 40. t1 znak równości time otwórz nawias okrągły zamknij nawias okrągły. Linia 41. print otwórz nawias okrągły f apostrof Znaleziono czynniki pierwsze dwukropek otwórz nawias klamrowy tab zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 42. print otwórz nawias okrągły f apostrof Czas w sekundach dwukropek otwórz nawias klamrowy t1 minus t0 dwukropek kropka 6f zamknij nawias klamrowy apostrof zamknij nawias okrągły. Linia 43. print otwórz nawias okrągły f apostrof Sprawdzone dzielniki dwukropek otwórz nawias klamrowy dzielniki zamknij nawias klamrowy apostrof zamknij nawias okrągły.
Linia 1. rozklad podkreślnik 2 otwórz nawias okrągły 44100 zamknij nawias okrągły. Linia 2. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 2 przecinek 2 przecinek 3 przecinek 3 przecinek 5 przecinek 5 przecinek 7 przecinek 7 zamknij nawias kwadratowy. Linia 3. kratka Czas w sekundach dwukropek 0 kropka 000014. Linia 4. kratka Sprawdzone dzielniki dwukropek 4. Linia 6. rozklad podkreślnik 2 otwórz nawias okrągły 44103241230 zamknij nawias okrągły. Linia 7. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 2 przecinek 3 przecinek 5 przecinek 97 przecinek 587 przecinek 25819 zamknij nawias kwadratowy. Linia 8. kratka Czas w sekundach dwukropek 0 kropka 003591. Linia 9. kratka Sprawdzone dzielniki dwukropek 8608. Linia 11. rozklad podkreślnik 2 otwórz nawias okrągły 372036854775807 zamknij nawias okrągły. Linia 12. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 3 przecinek 3 przecinek 13 przecinek 3179802177571 zamknij nawias kwadratowy. Linia 13. kratka Czas w sekundach dwukropek 1 kropka 642628. Linia 14. kratka Sprawdzone dzielniki dwukropek 6429420. Linia 16. rozklad podkreślnik 2 otwórz nawias okrągły 13372036854775807 zamknij nawias okrągły. Linia 17. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 13 przecinek 19 przecinek 271 przecinek 439 przecinek 5849 przecinek 77801 zamknij nawias kwadratowy. Linia 18. kratka Czas w sekundach dwukropek 0 kropka 005434. Linia 19. kratka Sprawdzone dzielniki dwukropek 25935. Linia 21. rozklad podkreślnik 2 otwórz nawias okrągły 413372036854775807 zamknij nawias okrągły. Linia 22. kratka Znaleziono czynniki pierwsze dwukropek otwórz nawias kwadratowy 1051 przecinek 15263 przecinek 25769053939 zamknij nawias kwadratowy. Linia 23. kratka Czas w sekundach dwukropek 58 kropka 880058. Linia 24. kratka Sprawdzone dzielniki dwukropek 214313384.

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.

Dla zainteresowanych

Algorytm szyfrowania RSA bazuje na wyniku mnożenia dwóch dużych liczb pierwszych. Aby go złamać, trzeba znaleźć dla danej liczby Qfaktoryzacja liczby Qliczby 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:

4295229443=6553765539

Słownik

faktoryzacja liczby Q
faktoryzacja liczby Q

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