Was ist eine Home Prime?
Als Beispiel nimm HP (4). Finden Sie zuerst die Primfaktoren. Die Primfaktoren von 4 ( in numerischer Reihenfolge vom kleinsten zum größten, immer ) sind 2, 2. Nehmen Sie diese Faktoren als wörtliche Zahl. 2, 2 wird 22. Dieser Faktorisierungsprozess wird fortgesetzt, bis Sie eine Primzahl erreichen.
number prime factors
4 2, 2
22 2, 11
211 211 is prime
Sobald Sie eine Primzahl erreicht haben, endet die Sequenz. HP (4) = 211. Hier ist ein längeres Beispiel mit 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
Ihre Herausforderung besteht darin, ein Programm zu erstellen, das HP (x) bei gegebenem x berechnet und dies so schnell wie möglich durchführt . Sie können beliebige Ressourcen außer einer Liste bekannter Home-Primzahlen verwenden.
Beachten Sie, dass diese Zahlen sehr schnell sehr groß werden. Bei x = 8 springt HP (x) bis auf 3331113965338635107. HP (49) muss noch gefunden werden.
Die Programmgeschwindigkeit wird auf einem Raspberry Pi 2 getestet, wobei die folgenden Eingaben gemittelt werden:
16
20
64
65
80
Wenn Sie einen Raspberry Pi 2 haben, messen Sie das Programm selbst und mitteln Sie die Zeiten.
quelle
Antworten:
Mathematica, HP (80) in ~ 0,88 s
Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine Zahl als Ausgabe zurück.
quelle
1
am Ende sollte nicht da sein ...CompositeQ
dafür!PrimeQ
(was auch sicherstellt, dass Ihre Antwort bei der Eingabe nicht für immer wiederholt wird1
).HP(80)
in so kurzer Zeit arbeitet, ohne dass die Primzahlen irgendwo fest codiert sind? Mein i7-Laptop benötigt Stunden, um eine Primalitätsprüfung durchzuführen und die Primfaktoren für denHP(80)
Zeitpunkt zu ermitteln, an dem er ankommt47109211289720051
.PyPy 5.4.1 64bit (Linux), HP (80) ~ 1,54s
Die 32bit Version läuft etwas langsamer.
Ich verwende vier verschiedene Faktorisierungsmethoden mit empirisch ermittelten Haltepunkten:
Ich habe eine Weile versucht, einen sauberen Bruch zwischen ECF und MPQS zu finden, aber es scheint keinen zu geben. wie auch immer, falls n jedoch einen kleinen Faktor enthält, wird ECF diesen normalerweise fast sofort finden. Daher habe ich mich dafür entschieden, nur einige Kurven zu testen, bevor ich zu MPQS übergehe.
Derzeit ist es nur ~ 2x langsamer als Mathmatica, was ich sicherlich als Erfolg betrachte.
home-prime.py
Beispiel-Timings
Der Durchschnitt der 5 liegt bei ca. 0,39s.
Abhängigkeiten
mpqs.py
wird direkt aus meiner Antwort auf Fastest semiprime factorization mit ein paar sehr geringfügigen Änderungen übernommen.mpqs.py
my_math.py
stammt aus dem selben Beitrag wiempqs.py
, habe aber auch den unbeschränkten Primzahlengenerator hinzugefügt, den ich in meiner Antwort verwendet habe die größte Lücke zwischen guten Primzahlen zu finden .my_math.py
quelle
Python 2 + Primefac 1.1
Ich habe keinen Raspberry Pi zum Testen.
Probieren Sie es online aus
Die
primefac
Funktion liefert eine Liste aller Primfaktoren vonn
. In seiner Definition nennt esisprime(n)
, die eine Kombination aus Versuchsteilung, Eulers Methode und dem Miller-Rabin-Primalitätstest verwendet. Ich würde empfehlen, das Paket herunterzuladen und die Quelle anzuzeigen.Ich habe versucht,
n = n * 10 ** int(floor(log10(f))+1) + f
anstelle der Verkettung Zeichenfolgen zu verwenden, aber es ist viel langsamer.quelle
pip install primefac
hat für mich gearbeitet, obwohl 65 und 80 auf Windows nicht zu laufen scheinen, weil siefork
im Hintergrund laufen .primefac
war ziemlich lustig, da es viele Kommentare mitTODO
oder gibtfind out why this is throwing errors
# This occasionally throws IndexErrors.
Ja, weil er die Prüfung entfernt hat, dass mehr Glättungsfaktoren als Primfaktoren verwendet werden.C #
Dies ist eine optimierte Version des vorherigen Codes, bei der einige unnötige redundante Teile entfernt wurden.
Ausgabe (auf meinem i7 Laptop):
Online testen
quelle
Perl + ntheory, HP (80) in 0,35 s auf dem PC
Kein Himbeer-Pi zur Hand.
Der Primalitätstest ist ES BPSW plus ein einzelnes MR auf Zufallsbasis für größere Zahlen. In dieser Größe könnten wir verwenden
is_provable_prime
(n-1 und / oder ECPP) ohne merklichen Geschwindigkeitsunterschied verwenden, aber das würde sich für Werte mit mehr als 300 Stellen ohne wirklichen Nutzen ändern. Das Factoring umfasst je nach Größe Trial, Power, Rho-Brent, P-1, SQUFOF, ECM und QS.Für diese Eingaben wird ungefähr dieselbe Geschwindigkeit wie für Charles 'Pari / GP-Code auf der OEIS-Site ausgeführt. ntheory hat ein schnelleres Factoring für kleine Zahlen, und mein P-1 und ECM sind ziemlich gut, aber das QS ist nicht großartig, daher würde ich erwarten, dass Pari irgendwann schneller sein wird.
quelle
use feature "say";
.