Ich suche einen schnelleren Code als folgenden um die nächste Primzahl nach einer beliebigen anderen Zahl zu ermitteln. Also, ich ruf die Funktion mit 3100 auf, und der Code gibt mir die erste Primzahl >= 3100 zurück.
Also nicht, alle Primzahlen von 0 - unendlich sondern immer eine rauspicken.
Procedure _NextPrime(num.l)
Protected prime.l, i.l, start.l
Repeat
x = Round(Sqr(num), 1)
For i = 2 To x
If num%i = 0 : prime = #False : Break
Else : prime = #True : EndIf
Next
If prime = #False : num + 1
Else
Break : EndIf
ForEver
ProcedureReturn num
EndProcedure
Procedure _NextPrime(num.l)
Protected prime.l, i.l, start.l
num + 1
Repeat
i = 2
While i * i < num
If num%i = 0 : prime = #False : Break
Else : prime = #True : EndIf
i + 1
Wend
If prime = #False : num + 1
Else
Break : EndIf
ForEver
ProcedureReturn num
EndProcedure
Probiers mal so aus, ich hab jetzt aber keine Geschwindigkeitstest gemacht!
Sollte aber schneller sein, schon allein weil ich kein Sqr() brauche...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Also Du könntest z.B. erstmal die nächste ungerade Zahl ermitteln (If Int(zahl / 2) * 2 <> zahl), und von da an nur in Zweierschritten weiterlaufen, denn gerade Zahlen können sowieso keine Primzahlen sein (mal abgesehen von der 2).
Außerdem können sämtliche Zahlen, die hinten mit einer 5 enden, auch keine Primzahlen sein (abgesehen von der 5 selbst). Das kannst Du z.B. checken indem Du If Int(zahl / 5) * 5 <> zahl machst.
Mit diesen beiden Checks reduzierst Du den Suchraum schonmal auf 40%.
Gibt glaub noch ein paar mehr Regeln, z.B. mit Quersummen und sowas, aber da kenne ich mich jetzt auch nicht so gut aus. Gibt da z.B. Regeln wie man rausfinden kann, ob eine Zahl durch 3 teilbar ist usw.
ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Man kann auch einfach eine kleine Liste der ersten Primzahlen in eine DataSection packen
und durch diese teilen bevor man in Zweierschritten durch die ungeraden Zahlen läuft.
Je größer diese kleine Liste wird, desto schneller geht's natürlich.