Ich versuche, Primzahlen auf einer einzigen Maschine zu berechnen, in der Größenordnung von 2^30-2^100.
Mein Algorithmus ist unten für jeden Interessierten enthalten.
Ich habe das Python-Code optimiert zu werden O(sqrt(n/2))
(glaube ich) für jede Zahl: es akzeptiert nur ungerade Zahlen, und ich sicher, die Zahl übergeben, um es seltsam in einem anderen Verfahren ist.Primalitätstest dauert länger als Brute-Force-Methode, wie kann ich verbessern?
Ich habe die Fermat Primality Test zu versuchen und beschleunigen den Prozess. Allerdings sind die Zahlen zu groß für die eingebaute math.pow()
Methode, so dass ich Exponentiation durch Squaring verwendet habe.
Dies erfordert jedoch eine sehr lange Zeit für größere Zahlen - die mit roher Gewalt schneller wären.
Ist meine Implementierung falsch?
Die Zeit kommt vom Quadrierungsalgorithmus, sein Wiederholungsstapel verschlingt auch mein Gedächtnis, gibt es einen schnelleren Algorithmus dafür, den ich erforschen sollte?
Um zu berechnen, ob die Nummer 35184372088967 prime ist, dauerte es .00100111 Sekunden mit meinem Brute-Force-Algorithmus, aber dauerte 0,4608 Sekunden, um den Prime-Test zu starten.
Brute-Force-Primzahl-Check:
def isPrime(n):
for i in range(3,int(math.sqrt(n)),2):
if(n%i==0):
return False
return True
Implementierung von Fermat-Algorithmus:
def couldBePrime(n):
if(n>308):
return power(2,n-1)%n==1
else:
return math.pow(2,n-1)%n==1
Potenzierung durch Algorithmus quadriert (Der zeitraubende Teil):
def power(base,exp):
if exp == 0:
return 1
elif exp == 1:
return base
elif (exp & 1) != 0:
return base * power(base * base, exp // 2)
else:
return power(base * base, exp // 2)
Es gibt einige Probleme in Ihrem Code, einige von ihnen im Zusammenhang mit der wissenschaftlichen Modellierung des Problems (am besten behandelt auf CS.SE aber auch on-topic auf SO), einige von ihnen im Zusammenhang mit der Python-Implementierung (Off-Topic) auf CS.SE und am besten behandelt auf SO). Also migriere ich zu Stack Overflow (bitte nicht erneut posten). – Gilles
Geben Sie statt Ihrer Potenzfunktion 'pow (Basis, Exponent, Modulus)' an, um eine modulare Potenzierung durchzuführen. Es ist eine eingebaute Funktion, Sie müssen es nicht selbst schreiben. – user448810