Schnell nächste Primzahl finden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Schnell nächste Primzahl finden

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
RocketRider
Beiträge: 109
Registriert: 10.12.2004 19:27
Kontaktdaten:

Beitrag von RocketRider »

Hallo
Sieht nütlich aus :wink:
hab aber keine idee. :(

MfG
RR
Zuletzt geändert von RocketRider am 30.11.2008 20:26, insgesamt 1-mal geändert.
GreenForce-Player - Der alternative Media Player!
Wie viele Tage sind es von Halloween bis Weihnachten?
Okt 31 - Dez 25 = 0 Tage!
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

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

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Quersumme durch 3 Teilbar...
Eine Art Query-Planner soll die Ausführung von Map/Reduce-Funktionen in Hadoop stark beschleunigen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Hier die Liste der Primzahlen von 2 bis 100.000:

=> Primzahlen von 2 bis 100.000
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten