Seite 1 von 1

Schnell nächste Primzahl finden

Verfasst: 30.11.2008 17:27
von cxAlex
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.

Code: Alles auswählen

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

Verfasst: 30.11.2008 17:36
von RocketRider
Hallo
Sieht nütlich aus :wink:
hab aber keine idee. :(

MfG
RR

Verfasst: 30.11.2008 17:40
von milan1612

Code: Alles auswählen

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

Verfasst: 30.11.2008 17:50
von ZeHa
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.

Verfasst: 30.11.2008 21:31
von THEEX
Quersumme durch 3 Teilbar...

Verfasst: 01.12.2008 14:28
von NicTheQuick
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.

Verfasst: 01.12.2008 16:19
von helpy
Hier die Liste der Primzahlen von 2 bis 100.000:

=> Primzahlen von 2 bis 100.000