Co to jest domowa liczba?
Na przykład weź HP (4). Najpierw znajdź czynniki pierwsze. Pierwotne czynniki 4 ( w kolejności numerycznej od najmniejszej do największej, zawsze ) to 2, 2. Weź te czynniki jako liczbę dosłowną. 2, 2 staje się 22. Ten proces faktoringu trwa aż do liczby pierwszej.
number prime factors
4 2, 2
22 2, 11
211 211 is prime
Po osiągnięciu liczby pierwszej sekwencja kończy się. HP (4) = 211. Oto dłuższy przykład z 14:
number prime factors
14 2, 7
27 3, 3, 3
333 3, 3, 37
3337 47, 71
4771 13, 367
13367 13367 is prime
Wyzwanie polega na utworzeniu programu, który obliczy HP (x) na podstawie x i zrobi to jak najszybciej . Możesz użyć dowolnych zasobów innych niż lista znanych liczb pierwszych w domu.
Uwaga: liczby te stają się bardzo duże bardzo szybko. Przy x = 8 HP (x) przeskakuje aż do 3331113965338635107. HP (49) jeszcze nie został znaleziony.
Szybkość programu zostanie przetestowana na Raspberry Pi 2, uśredniając następujące dane wejściowe:
16
20
64
65
80
Jeśli masz Raspberry Pi 2, sam sprawdź czas programu, a następnie uśrednij czasy.
źródło
Odpowiedzi:
Mathematica, HP (80) w ~ 0,88s
Funkcja anonimowa. Pobiera liczbę jako dane wejściowe i zwraca liczbę jako dane wyjściowe.
źródło
1
końcu nie powinno tam być ...CompositeQ
za!PrimeQ
(co zapewnia również, że twoja odpowiedź nie zapętla się wiecznie na wejściu1
).HP(80)
w tak krótkim czasie, nie mając gdzieś liczb pierwszych? Mój laptop i7 zajmuje wiele godzin, aby przeprowadzić kontrolę pierwotności, a także znaleźć czynniki pierwsze,HP(80)
kiedy się pojawi47109211289720051
.PyPy 5.4.1 64bit (linux), HP (80) ~ 1.54s
Wersja 32-bitowa będzie nieco wolniejsza.
Używam czterech różnych metod faktoryzacji z ustalonymi empirycznie punktami przerwania:
Przez jakiś czas próbowałem znaleźć czystą przerwę między ECF a MPQS, ale wydaje się, że nie ma takiej. Jednak jeśli n zawiera mały czynnik, ECF zwykle znajdzie go prawie natychmiast, więc zdecydowałem się przetestować tylko kilka krzywych, zanim przejdę do MPQS.
Obecnie jest tylko ~ 2x wolniejszy niż Mathmatica, co z pewnością uważam za sukces.
home-prime.py
Przykładowe czasy
Średnia z 5 wynosi około 0,39 s.
Zależności
mpqs.py
pochodzi bezpośrednio z mojej odpowiedzi na najszybsze rozkładanie na czynniki pierwsze z kilkoma bardzo drobnymi modyfikacjami.mpqs.py
my_math.py
pochodzi z tego samego posta, compqs.py
, ale dodałem także do generatora liczb niepowiązanych, którego użyłem w odpowiedzi na pytanie Znajdź największą lukę między dobrymi liczbami pierwszymi .moja_math.py
źródło
Python 2 + primefac 1.1
Nie mam Raspberry Pi do przetestowania.
Wypróbuj online
primefac
Zwraca listę wszystkich głównych czynnikówn
. W swojej definicji wołaisprime(n)
, która wykorzystuje kombinację podziału próby, metody Eulera i testu pierwszeństwa Millera-Rabina. Polecam pobranie pakietu i przejrzenie źródła.Próbowałem użyć
n = n * 10 ** int(floor(log10(f))+1) + f
zamiast konkatenacji ciągów, ale jest to znacznie wolniejsze.źródło
pip install primefac
działało dla mnie, chociaż 65 i 80 nie wydają się działaćfork
w systemie Windows, z powodu ing w tle.primefac
było dość zabawne, ponieważ jest wiele komentarzy zTODO
orfind out why this is throwing errors
# This occasionally throws IndexErrors.
Tak, ponieważ usunął zaznaczenie, że zastosowano więcej wygładzeń niż czynników pierwszych.DO#
Jest to bardziej zoptymalizowana wersja poprzedniego kodu, z usuniętymi niepotrzebnymi nadmiarowymi częściami.
Wyjście (na moim laptopie i7):
Przetestuj online
źródło
Perl + ntheory, HP (80) w 0,35 s na PC
Bez Raspberry Pi pod ręką.
Testem pierwszeństwa jest ES BPSW, plus pojedynczy losowy MR dla większych liczb. Przy tym rozmiarze moglibyśmy użyć
is_provable_prime
(n-1 i / lub ECPP) bez zauważalnej różnicy prędkości, ale zmieniłoby się to dla wartości> 300 cyfr bez rzeczywistych korzyści. Faktoring obejmuje próbę, moc, Rho-Brent, P-1, SQUFOF, ECM, QS w zależności od wielkości.W przypadku tych danych wejściowych działa on z tą samą prędkością, co kod Charlesa Pari / GP na stronie OEIS. ntheory ma szybsze faktoring dla małych liczb, a moje P-1 i ECM są całkiem dobre, ale QS nie jest świetna, więc spodziewałbym się, że Pari będzie w pewnym momencie szybszy.
źródło
use feature "say";
.