Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Sa 07.07.12 12:37 
Hallo,
Obwohl user profile iconHorst_H, user profile iconMartok und user profile iconjfheins 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! :eyecrazy:
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 user profile iconGammatesters "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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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).
ausblenden 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.
ausblenden volle Höhe Delphi-Quelltext
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}   

{
10^(n-1)+a, 10^(n-1)+a+2, 10^(n-1)+a+6 und 10^(n-1)+a+8
haben Abstand 30 und Beginn bei 1 (1,3,7,9 -> war wohl nichts..)
Deshalb kein Test auf Teilbarkeit 2,3,5 
}

{Primzahlen bis 100
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
}



const
  TestTeiler : array[0..11of integer=
                (7,11,13,17,19,23,29,31,37,41,43,47);
//MAXANZAHL4 = TestTeiler[0]*TestTeiler[1]*TestTeiler[0]*.. )
  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+8then
        begin
        inc(cnt);
        IF cnt <> 0 then
          begin
          // Primzahl, Anzahl der möglichen Vierers, noch verbliebene 
          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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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:
ausblenden 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
Primzahlvierlinge

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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? :nixweiss:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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