Autor |
Beitrag |
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 07.07.12 12:37
Hallo,
Obwohl Horst_H, Martok und jfheins weiterhin tolle Ergebnisse beim 196-Algorithmus www.entwickler-ecke....ewtopic.php?t=109745 finden, brauche ich erst einmal eine Pause. Ich habe letzte Nacht schon von Palindromen geträumt!
Zur Ablenkung habe ich mein altes Primzahlvierlingsproblem hervorgekramt.
Konkret suche ich n-stellige (wahrscheinliche) Primzahlvierlinge, d.h. Summanden a, so dass 10^(n-1)+a, 10^(n-1)+a+2, 10^(n-1)+a+6 und 10^(n-1)+a+8 Primzahlen sind. a muss dabei natürlich auf 1 enden.
Bisher hatte ich Prof.Forsters "aribas" genutzt und ganz gute Ergebnisse erzielt.
Mit Gammatesters "MPArith" habe ich nun ein kleines Delphi-Programm geschrieben und es rechnet deutlich schneller, dank "MPArith". Eingegeben wird die Stellenzahl des gesuchten Primzahlvierlings und ein Anfangssummand a.
Der Algorithmus ist ganz einfach. Es wird nur geprüft, ob die vier Zahlen wahrscheinlich Primzahlen sind. Wenn nicht, wird a um 30 erhöht, da der kleinste Abstand zwischen zwei Vierlingen 30 ist. Außerdem wird noch geprüft, ob a bei Division mit 7 einen Rest 2, 3 oder 4 lässt. Andernfalls ist eine der vier Zahlen durch 7 teilbar.
Für höhere Stellenzahlen, so ab 50, kann es trotzdem Stunden dauern, bis man ein Ergebnis erhält. Mein Rekord ist 10^115+690074251 als erste Zahl des Vierlings.
Vielleicht kann jemand mal über den Quelltext sehen. Wie ich mich kenne, habe ich bestimmt wieder etwas eingebaut, was das Programm unnötig ausbremst.
Beste Grüße
Mathematiker
Revision 1: Ein ggT-Test mit kleinen Teilern beschleunigt das Programm erheblich.
Revision 2: Erneute Beschleunigung durch zusätzliche ggT-Tests.
Einloggen, um Attachments anzusehen!
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Zuletzt bearbeitet von Mathematiker am So 08.07.12 20:13, insgesamt 2-mal bearbeitet
|
|
Delphi-Laie
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Sa 07.07.12 14:45
Es gibt ja auch Drillinge und Sechslinge bei den Primzahlen.
Ob es auch größere n-linge gibt, konnte ich bisher keine Information darob aufspüren. Allein mit dieser Frage und dem vermuteten Abstand zwischen den einzelnen n-lingen (der wächst ja hierarachisch, also die die beiden Zwillinge sind bei den Vierlingen weiter voneinander entfernt als die Zwillinge, analoges müßte dann auch mit den beiden Vierlingen bei den Achtlingen gelten), aber auch mit "Experimenten" mit verschiedenen Abständen zwischen den Vierlingen, wurde ich nicht fündig.
Zuletzt bearbeitet von Delphi-Laie am Fr 26.08.16 21:03, insgesamt 2-mal bearbeitet
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 07.07.12 15:19
Hallo Delphi-Laie,
Durch Tony Forbes wird im WWW unter der Adresse anthony.d.forbes.goo...ges.com/ktuplets.htm eine Liste der größten bisher entdeckten Primzahl-n-Tupel für n = 3,…,19 geführt. Dabei wird z.B. definiert (alle genannten Zahlen müssen prim sein):
Primzahldrilling {p, p+2, p+4}, {p, p+2, p+6} bzw. {p, p+4, p+6}
Primzahlvierling {p, p+2, p+6, p+8}
Primzahlquintupel {p, p+2, p+6, p+8, p+12} bzw. {p, p+4, p+6, p+10, p+12}
Primzahlachter {p+0, 2, 6, 12, 14, 20, 24, 26}, {p + 0, 2, 6, 8, 12, 18, 20, 26} oder {p + 0, 6, 8, 14, 18, 20, 24, 26}
usw.
Mitunter werden aber Primzahlachter auch mit p, p+2, p+6, p+8, p+30, p+32, p+36 und p+38 definiert, d.h. zwei Primzahlvierlinge im Abstand 30. Die ersten beginnen mit p = 1006301, 2594951, 3919211, 9600551, 10531061, ...
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: Delphi-Laie
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 07.07.12 15:21
Hallo,
etwas Senf gefällig
Du schreibst ja das alle 30 ein Primvierling möglich ist.Dann würde ich doch "einfach" von der Testzahl den Rest zu WheelSize= 30(=2*3*5)*7*11*13*17*19*23*29*31*prim_x*....*prim_n( 53 ?), sodass Wheelsize noch ein int32 oder besser Int64 ist.
Jetzt hast Du die Position P_s innerhalb dieses Rades das sich alle Wheelsize ja wieder holt.
Jetzt suchst ab diesem P_s den ersten möglichen Primvierling ab P_v0, der schon nicht durch 2 bis prim_n teilbar ist.
Nun erhöhst Deine Testzahl t um (P_v0-P_s).
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Wiederhole Miller-Rabin-TestMIt (t), t+2,t+6, t+8 Falls Vierling gefunden dann eintragen/ausgeben wiederhole erhöhe t um 30 erhöhe P_v0 um 30 falls P_v0 > 2*3*5*..prim_n then P_v0 := 1 bis (teste mit (P_v0) AND(P_v0+2)AND (P_v0+6)AND (P_v0+8) mit p=2 bis prim_n auf teilerfremd = wahr) bis JetztIstGenug |
Damit fallen 95% oder mehr der möglichen Primzahlvierlinge schon vor dem Miller-Rabin weg und mod bei 100 Stellen dauert länger als bei int64.
Gruß Horst
EDIT:
Hier mal ein Schnipsel, der die möglichen Vierer testet.
Es bleiben so nur noch um die 4,77 % mögliche Kandidaten übrig.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90:
| program primvier; {$IFDEF FPC} {$MODE Delphi} {$ENDIF}
const TestTeiler : array[0..11] of integer= (7,11,13,17,19,23,29,31,37,41,43,47); MaxAnzahl4_1 :DWORD = 7*11*13*17*19*23*29; MAXANZAHL4_2 :DWORD = 31*37*41*43*47;
var cnt: integer; function istTeilbar(t: int64 ): boolean; var i: integer; begin result := true;
For i := Low(Testteiler) to High(Testteiler) do begin result := result AND ((t MOD Testteiler[i]) <> 0); iF Not(result) then EXIT; end; end; var i,j : DWord; p1 :int64; Begin writeln(MaxAnzahl4_1); writeln(MaxAnzahl4_2); cnt := 0; p1 := 1; For j := 1 to MaxAnzahl4_2 do For i := 1 to MAXANZAHL4_1 do begin IF istTeilbar(p1) AND istTeilbar(p1+2)AND istTeilbar(p1+6)AND istTeilbar(p1+8) then begin inc(cnt); IF cnt <> 0 then begin writeln(p1:20,i:10,cnt:10,cnt/i*100.0:10:3,'%'); end; end; inc(p1,30); IF p1 > 15000 then halt; end; end. 215656441 95041567 541 19 1 5.263% 571 20 2 10.000% 1291 44 3 6.818% 1621 55 4 7.273% 2851 96 5 5.208% 3181 107 6 5.607% 3301 111 7 6.306% 3691 124 8 6.452% 4441 149 9 6.040% 6241 209 10 4.785% 6421 215 11 5.116% 7171 240 12 5.000% 8521 285 13 4.561% 9181 307 14 4.560% 9811 328 15 4.573% 9901 331 16 4.834% 10111 338 17 5.030% 11461 383 18 4.700% 11491 384 19 4.948% 13261 443 20 4.515% 14011 468 21 4.487% 14101 471 22 4.671% 14401 481 23 4.782% 14821 495 24 4.848% Drücken Sie eine beliebige Taste . . . |
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Sa 07.07.12 22:19
Hallo Horst_H,
Danke erst einmal für Deinen Hinweis.
Ich habe nun einige Zeit getüffelt und dachte, da ich es nicht richtig verstanden habe, mit Versuch und Irrtum irgendwie zum Ziel zu gelangen. Es funktioniert nicht, ich stelle mich etwas blöd an.
Es wäre schön, wenn Du mir vielleicht noch etwas genauer Deine Idee erläuterst.
Bei verschiedenen n ist der erste in Frage kommende Summand a von 10^(n-1)+a nicht immer die 1, manchmal ist auch die 11 oder 21. Daher müsste das n doch in die Berechnung einfließen?
Zumindest habe ich die Idee mit dem Produkt 7*11*...*29 (mehr geht nicht, integer!) genutzt und den nächsten Kandidaten z kontinuierlich um 30 erhöht, wenn der ggT(z,7*11*...*29) verschieden 1 ist. Das bringt im Moment etwa 15 % Zeitgewinn.
Beste Grüße
Mathematiker
Nachtrag: Der ggT-Test beschleunigt das Programm mehr als erwartet. In der Revision 1 (erster Beitrag) ist das geänderte Programm.
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 08.07.12 19:07
Hallo,
im Prinzip ist die Nutzung des GCD und einfach dort das Produkt aller Prim Zahlen von 1..100 zu nehmen, auch mein erster Gedanke gewesen.
Aber ich habe wegen der Größe dieser Zahl davon Abstand genommen, weil nicht denke, dass es schnell sein könnte.
Ich habe jetzt ein Feld erzeugt in dem die Abstände ( div 30 ) der möglicher 4-er in Primzahlsiebrad der Größe 223Mio gespeichert sind.Der maximale Abstand ist 77*30= 2310, das ist schon einiges, anstatt alle 30 zu testen.
Nun denn, ich habe bisher nur 1/3 mehr Tempo für Zahlen im Bereich 10^30 ( damit es weniger als 1 Sekunde pro 4-er dauert ) und 60 Sekunden bei Deinem Programm von Hand Abbruch gedrückt, dann ist der Fehler nicht so groß man kann ja mit runterzählen.
Nach 60 Sekunden habe ich bei mir als letztes dies auf dem Bildschirm:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| 100000000000000000000453777211 100000000000000000000456577981 100000000000000000000463041031 100000000000000000000463596061 100000000000000000000467236321 100000000000000000000468464821 100000000000000000000470324671 100000000000000000000472370071 Abbruch bei 100000000000000000000473190241 |
Die Ausgabe Deines Programmes
Du kannst ja Dein Programm ja mit Zeitabbruch kompilieren und vergleichen.
Gruß Horst
P.S:
Dividierern die neuen Intel-Chips nicht wesentlich schneller?
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 08.07.12 19:29
Hallo Horst_H,
vielen Dank für Dein Programm. Jetzt habe ich auch Deine Idee verstanden.
Im Moment "kämpfen" beide Programme auf meinem PC gegeneinander und suchen einen 101stelligen Vierling. Im Moment liegt Dein Programm vorn.
Ich melde mich wieder, wenn ein endgültiges Ergebnis vorliegt.
Beste Grüße
Mathematiker
Nachtrag: Nach einem intensiven Test ergibt sich auf meinem Computer das Ergebnis, dass Dein Programm bis etwa 50-60 Stellen schneller ist, dann allerdings wird der Vorsprung immer geringer. Ab etwa 100stelligen Vierlingen dreht es sich um. Ich habe keine Idee, woran es liegen kann?
Trotzdem ist Dein Vorschlag sehr interessant, vielleicht kann ich ja beide Programme "mischen".
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mo 09.07.12 07:14
Hallo,
Du kannst den Ansatz mit GCD doch beliebig erweitern.
Ich habe im Bereich bis 223 Mio mal mit allen Primzahlen im Bereich 2..1000 getestet
Dann bleiben vom naivem testen alle 30 == 100% nur von ~0,5% übrig.
Ich dachte bei Miller Rabin Test wird zuvor mit kleinen Primzahlen getestet.
Alternativ Sieb des Erathostenes.
www.entwickler-ecke....ownload.php?id=12839
Für das Sieb (30030 lang) den Rest zur Startzahl berechnen
Für die Siebprimzahlen den Rest zur Startzahl berechnen.
Die Positionen von möglichen 4-er sind ja immer die selben innerhalb des Siebes.
Sieb an die richtige Stelle schieben und loslegen.
Sieben, auf 4-er Testen und an Miller-Rabin übergeben.
Das Sieb beackert 1e9-Zahlen wahrscheinlich in 10 Sekunden in solchen Regionen ( jede Primzahl muss sieben, bis 1e9 kommen Zahlen > sqrt (1e9 ) nie zum Einsatz dort sind es 4 Sekunden)
Wäre doch mal einen Versuch wert.
Gruß Horst
Für diesen Beitrag haben gedankt: Mathematiker
|
|
Mathematiker 
      
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 09.07.12 09:14
Hallo Horst_H,
Deine Ideen sind, wie immer, super. Ich nutze jetzt ein Sieb mit 1 Million Zahlen.
Damit beschleunigt sich die Berechnung auf das Dreifache! Wahrscheinlich geht sogar noch mehr.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
|