Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
460to464
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
460to464
460to464
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Primzahlen

Primzahlen
01.08.2004 10:15:03
Nepumuk
Hallo Forum,
da heute erwartungsgemäß nicht viel los ist in den Foren, eine kleine Frage.
Kennt jemand einen schnelleren Algorithmus um festzustellen, ob eine Zahl prim ist oder nicht. Zur Zeit verwende ich das:


Private Function IsPrim(ByVal lng_pruefzahl As LongAs Boolean
    Dim lng_counter As Long
    If lng_pruefzahl Mod 2 = 0 Then Exit Function
    If lng_pruefzahl Mod 3 = 0 Then Exit Function
    If lng_pruefzahl Mod 5 = 0 Then Exit Function
    If lng_pruefzahl Mod 7 = 0 Then Exit Function
    For lng_counter = 10 To CLng(lng_pruefzahl ^ 0.5) Step 10
        If lng_pruefzahl Mod (lng_counter + 1) = 0 Then Exit Function
        If lng_pruefzahl Mod (lng_counter + 3) = 0 Then Exit Function
        If lng_pruefzahl Mod (lng_counter + 7) = 0 Then Exit Function
        If lng_pruefzahl Mod (lng_counter + 9) = 0 Then Exit Function
    Next
    IsPrim = True
End Function


Gruß
Nepumuk

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Primzahlen
ransi
guten morgen nepumuk
Ich hab da sowas in java.
ist von irgendeiner matheseite.
ICH kann mit dem quellcode nichts anfangen, aber vieleicht kannst du das ja in vba umstricken.
https://www.herber.de/bbs/user/9111.htm
Ransi
AW: Primzahlen
01.08.2004 11:32:51
Nepumuk
Hallo Ransi,
vielen Dank für deine Antwort. Meine Kenntnisse von Java möchte ich als rudimentär bezeichnen, aber soweit ich es verstehe, ist es ein ähnlicher Algorithmus.
Gruß
Nepumuk
AW: Primzahlen
K.Rola
Hallo Nepumuk,
die Function liefert bei 2,3, 5 und 7 FALSE, was ja nicht sein dürfte. Von der
Geschwindigkeit her gibts kaum Unterschiede zu anderen Algorithmen.
Gruß K.Rola
Anzeige
AW: Primzahlen
01.08.2004 11:34:20
Nepumuk
Hallo K.Rola,
vielen Dank für den Hinweis. Ich habe die ganze Zeit mit großen Zahlen getestet. Da ist mir das garnicht aufgefallen.
Gruß
Nepumuk
AW: Primzahlen
01.08.2004 11:43:46
Nepumuk
Liebste Nancy,
vielen Dank für deine Antwort. Dass das Programm nur bis zur Quadratwurzel des Wertes rechnen muss, ist durch diesen Ausdruck: lng_pruefzahl ^ 0.5 schon verwirklicht. Natürlich wäre es schneller die Zahl nur durch Primzahlen zu teilen. Aber da müsste ich entweder eine ziemlich große Liste bereithalten bzw. diese erst erzeugen, was zur Laufzeit der Prüfung doch zu viel Zeit in Anspruch nimmt. Ich denke, ich werde versuchen das ganze in C++ als DLL zu schreiben.
Gruß
Nepumuk
Anzeige
AW: Primzahlen
FP
Hallo Nepumuk,
für 1.000.000 Überprüfungen der Zahl 4877 hat diese Funktion 2,9 Sekunden gebraucht
( Deine Funktion 3,3 Sekunden )

Function IsPrim(lngZahl As Long) As Boolean
Dim l   As Long
Dim lw  As Long
If lngZahl Mod 2 = 0 Then
IsPrim = (lngZahl = 2)
Exit Function
End If
lw = CLng(lngZahl ^ 0.5)
For l = 3 To lw Step 2
If lngZahl Mod l = 0 Then Exit For
Next
IsPrim = (l > lw - 1)
End Function

Servus aus dem Salzkammergut
Franz
AW: Primzahlen
NE
*Lach* hier auf meiner ollen Kiste passiert wundersames,
habe begonnen bei 1000 und bei der Mille aufgehört.
F steht für Franz, N für Nepumuk ;-)
F 0,110000000000582
N 0,110000000000582
F 0,819999999999709
N 0,880000000004657
F 8,56999999999971
N 8,45999999999913
F 85,2400000000052
N 84,5899999999965
Grüsse Nancy
Anzeige
AW: Primzahlen
01.08.2004 14:59:48
Nepumuk
Hallo,
ich habe den Test mit der Zahl 999.999.937 gemacht. 10.000 Testläufe mit dem Programm von Franz benötigen 5,52344 Sekunden mit meinem 5,55469 Sekunden. Damit steht fest, dass das Programm von Franz etwas schneller ist.
Gruß
Nepumuk
confus ...
NE
Okay, hab mal den Rechner gewechselt ;-)
um noch bissel zu verwirren ... bei mir ist Nepumuk bei seiner Konstellation schneller
F 10,8589999999967
N 10,3280000000013
cu Nancy
Sub x()
Dim i As Boolean, start#, ende#, x&
start = Timer
For x = 1 To 10000
i = IsPrim(999999937)
Next
ende = Timer
Debug.Print "F", ende - start
start = Timer
For x = 1 To 10000
i = Prim(999999937)
Next
ende = Timer
Debug.Print "N", ende - start
End Sub

Private Function Prim(ByVal lng_pruefzahl As Long) As Boolean
Dim lng_counter As Long
If lng_pruefzahl Mod 2 = 0 Then Exit Function
If lng_pruefzahl Mod 3 = 0 Then Exit Function
If lng_pruefzahl Mod 5 = 0 Then Exit Function
If lng_pruefzahl Mod 7 = 0 Then Exit Function
For lng_counter = 10 To CLng(lng_pruefzahl ^ 0.5) Step 10
If lng_pruefzahl Mod (lng_counter + 1) = 0 Then Exit Function
If lng_pruefzahl Mod (lng_counter + 3) = 0 Then Exit Function
If lng_pruefzahl Mod (lng_counter + 7) = 0 Then Exit Function
If lng_pruefzahl Mod (lng_counter + 9) = 0 Then Exit Function
Next
Prim = True
End Function

Function IsPrim(lngZahl As Long) As Boolean
Dim l As Long
Dim lw As Long
If lngZahl Mod 2 = 0 Then
IsPrim = (lngZahl = 2)
Exit Function
End If
lw = CLng(lngZahl ^ 0.5)
For l = 3 To lw Step 2
If lngZahl Mod l = 0 Then Exit For
Next
IsPrim = (l > lw - 1)
End Function
Anzeige
AW: Primzahlen
01.08.2004 15:04:56
Nepumuk
Hallo Nancy,
wenn du ein Programm öfters hintereinander laufen lässt, wirst du immer etwas andere Ergebnisse bekommen. Je nachdem wie viele Ressource dir dein System gerade zur Verfügung stellen kann.
Gruß
Nepumuk
AW: Primzahlen
NE
Hallo Nepumuk,
hm jetz wo Du's sagst, leuchtet mir das ein, Danke :-)
Aber auf dem andren PC [sh. andres Post] das war ein einmaliger Lauf mit deinen Daten ...
lg Nancy
AW: Primzahlen
01.08.2004 15:24:14
Nepumuk
Hallo Nancy,
ich bekomme mit deiner Konstellation folgende Ergebnisse:
F 5,5154999999977
N 5,8435000000026
F 5,5074999999997
N 5,8284999999996
F 5,5155000000013
N 5,8359999999993
Gruß
Nepumuk
Anzeige
AW: Primzahlen
NE
Nepumuk,
klarer Fall, wir sollten die Rechner tauschen, dein Code scheint meinem PC irgendwie hier besser zu gefallen ;;-))
lg Nancy
AW: Primzahlen
01.08.2004 15:38:09
Nepumuk
Hallo Nacy,
keine Chance, ich habe erst letzte Woche ein Dualbord mit 2 3,2Ghz Prozessoren eingebaut. Das hat mich fast einen Monatslohn gekostet. :-((
Gruß
Nepumuk
AW: Primzahlen
NE
Hi Nepumuk,
darauf wollte ich gar nicht hinaus, was ich meinte, was nützt es Dir aber, wenn DEIN PC DICH NICHT mag, aber dafür MEINER umso mehr ?
Sieh's mal unter dem Aspekt ;;-)))
Okay, Schluss jetz aber, genug rumgealbert ;-)
lieben Gruss
Nancy
AW: Primzahlen
Sigi
Hallo Franz und alle anderen,
ich wollte gerade deine Funktion abkupfern und stelle fest, dass noch ein kleiner
Wurm drin ist! Ungerade Quadratzahlen (9, 25, 49, 121, etc.) werden als Primzahlen
erkannt!?
Hier mit Korrektur ...

Function IsPrim(lngZahl As Long) As Boolean
Dim l   As Long
Dim lw  As Long
If lngZahl Mod 2 = 0 Then
IsPrim = (lngZahl = 2)
Exit Function
End If
IsPrim = True
lw = CLng(lngZahl ^ 0.5)
For l = 3 To lw Step 2
If lngZahl Mod l = 0 Then
IsPrim = False
Exit For
End If
Next
End Function

Gruß
Sigi
Anzeige
AW: Primzahlen
FP
Hallo Sigi,
nimm lieber gleich das:

Function IsPrim(lngZahl As Long) As Boolean
Dim l       As Long
Dim lMax    As Long
Select Case lngZahl
Case 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 33, 37, 41, 43, 47, _
53, 59, 61, 67, 71, 73, 79, 83, 89, 97
IsPrim = True
Exit Function
Case Else
If lngZahl Mod 2 = 0 Then Exit Function
If lngZahl Mod 3 = 0 Then Exit Function
If lngZahl Mod 5 = 0 Then Exit Function
If lngZahl Mod 7 = 0 Then Exit Function
If lngZahl Mod 11 = 0 Then Exit Function
If lngZahl Mod 13 = 0 Then Exit Function
If lngZahl Mod 17 = 0 Then Exit Function
If lngZahl Mod 19 = 0 Then Exit Function
If lngZahl Mod 23 = 0 Then Exit Function
If lngZahl Mod 29 = 0 Then Exit Function
If lngZahl Mod 33 = 0 Then Exit Function
If lngZahl Mod 37 = 0 Then Exit Function
If lngZahl Mod 41 = 0 Then Exit Function
If lngZahl Mod 43 = 0 Then Exit Function
If lngZahl Mod 47 = 0 Then Exit Function
If lngZahl Mod 53 = 0 Then Exit Function
If lngZahl Mod 59 = 0 Then Exit Function
If lngZahl Mod 61 = 0 Then Exit Function
If lngZahl Mod 67 = 0 Then Exit Function
If lngZahl Mod 71 = 0 Then Exit Function
If lngZahl Mod 73 = 0 Then Exit Function
If lngZahl Mod 79 = 0 Then Exit Function
If lngZahl Mod 83 = 0 Then Exit Function
If lngZahl Mod 89 = 0 Then Exit Function
If lngZahl Mod 97 = 0 Then Exit Function
End Select
lMax = CLng(lngZahl ^ 0.5)
For l = 101 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 103 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 107 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 109 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
IsPrim = (l > lMax - 1)
End Function

Servus aus dem Salzkammergut
Franz
Anzeige
AW: Primzahlen
Sigi
Hallo Franz,
ist diese Funktion schneller? Ansonsten gefällt mir der kurze Code der alten Funktion.
Gruß
Sigi
AW: Primzahlen
FP
Hallo Sigi,
Benchmark: 1.000.000 x Prüfung ob 65521 Prim -> 6,73 Sekunden
der kurze Code benötigt dafür 9,14 Sekunden
Hier noch einmal beide Codes: IsPrim wurde korrigiert - habe mich verschrieben, Prim ist natürlich 31 und nicht 33 ;-)

Function IsPrim(lngZahl As Long) As Boolean
Dim l       As Long
Dim lMax    As Long
Select Case lngZahl
Case 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, _
53, 59, 61, 67, 71, 73, 79, 83, 89, 97
IsPrim = True
Exit Function
Case Else
If lngZahl Mod 2 = 0 Then Exit Function
If lngZahl Mod 3 = 0 Then Exit Function
If lngZahl Mod 5 = 0 Then Exit Function
If lngZahl Mod 7 = 0 Then Exit Function
If lngZahl Mod 11 = 0 Then Exit Function
If lngZahl Mod 13 = 0 Then Exit Function
If lngZahl Mod 17 = 0 Then Exit Function
If lngZahl Mod 19 = 0 Then Exit Function
If lngZahl Mod 23 = 0 Then Exit Function
If lngZahl Mod 29 = 0 Then Exit Function
If lngZahl Mod 31 = 0 Then Exit Function
If lngZahl Mod 37 = 0 Then Exit Function
If lngZahl Mod 41 = 0 Then Exit Function
If lngZahl Mod 43 = 0 Then Exit Function
If lngZahl Mod 47 = 0 Then Exit Function
If lngZahl Mod 53 = 0 Then Exit Function
If lngZahl Mod 59 = 0 Then Exit Function
If lngZahl Mod 61 = 0 Then Exit Function
If lngZahl Mod 67 = 0 Then Exit Function
If lngZahl Mod 71 = 0 Then Exit Function
If lngZahl Mod 73 = 0 Then Exit Function
If lngZahl Mod 79 = 0 Then Exit Function
If lngZahl Mod 83 = 0 Then Exit Function
If lngZahl Mod 89 = 0 Then Exit Function
If lngZahl Mod 97 = 0 Then Exit Function
End Select
lMax = CLng(lngZahl ^ 0.5)
For l = 101 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 103 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 107 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
For l = 109 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
Next
IsPrim = (l > lMax - 1)
End Function


Function IsPrim1(lngZahl As Long) As Boolean
Dim l   As Long
Dim lw  As Long
If lngZahl Mod 2 = 0 Then
IsPrim1 = (lngZahl = 2)
Exit Function
End If
lw = CLng(lngZahl ^ 0.5)
For l = 3 To lw Step 2
If lngZahl Mod l = 0 Then Exit Function
Next
IsPrim1 = True
End Function

Servus aus dem Salzkammergut
Franz
Anzeige
AW: Danke!! o.T.
Sigi
noch schneller?
IngoG
Hallo zusammen,
wenn obiger Code schnell ist müsste eigentlich folgender noch schneller sein ;-)
...
For l = 101 To lMax Step 10
If lngZahl Mod l = 0 Then Exit Function
If lngZahl Mod (l+2) = 0 Then Exit Function
If lngZahl Mod (l+6) = 0 Then Exit Function
If lngZahl Mod (l+8) = 0 Then Exit Function
Next
IsPrim = (l &gt lMax - 1)
...
liefert zumindest das selbe ergebnis und hat 3 schleifen weniger
evt ist eine or-verknüpfung noch etwas schneller
Gruß Ingo

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige