Cunningham-Ketten zählen

14

Primzahlen haben die Menschen schon immer fasziniert. Vor 2300 Jahren schrieb Euklid in seinem "Elements"

Eine Primzahl ist diejenige, die nur von einer Einheit gemessen wird.

was bedeutet, dass eine Primzahl nur durch 1(oder durch sich selbst) teilbar ist .

Die Leute haben immer nach Beziehungen zwischen Primzahlen gesucht und sich ziemlich seltsame (wie "interessante") Dinge ausgedacht.

Zum Beispiel ist eine Sophie Germain-Primzahl eine Primzahl, pfür die 2*p+1auch eine Primzahl gilt.

Eine sichere Primzahl ist eine Primzahl, pfür die (p-1)/2es sich auch um eine Primzahl handelt, die genau die Rückwärtsbedingung einer Sophie Germain-Primzahl ist.

Diese beziehen sich auf das, wonach wir bei dieser Herausforderung suchen.

Eine Cunningham-Kette vom Typ I ist eine Reihe von Primzahlen, bei denen jedes Element mit Ausnahme der letzten eine Sophie Germain-Primzahl ist und jedes Element mit Ausnahme der ersten eine sichere Primzahl ist . Die Anzahl der Elemente in dieser Kette wird als Länge bezeichnet .

Dies bedeutet , dass wir mit einem Apostroph beginnen pund berechnen q=2*p+1. Wenn auch qPrimzahl ist, haben wir eine Cunnigham-Kette vom Typ I der Länge 2. Dann testen wir 2*q+1und so weiter, bis die nächste generierte Zahl zusammengesetzt ist.

Cunningham-Ketten vom Typ II werden nach fast demselben Prinzip gebaut, mit dem einzigen Unterschied, dass wir sie 2*p-1in jeder Phase überprüfen .

Cunningham-Ketten können eine Länge von 1 haben , was bedeutet, dass weder 2 * p + 1 noch 2 * p-1 Primzahlen sind. Das interessiert uns nicht .

Einige Beispiele für Cunningham-Ketten

2startet eine Kette vom Typ I der Länge 5.

2, 5, 11, 23, 47

Die nächste konstruierte Zahl wäre die, 95die keine Primzahl ist.
Dies sagt uns auch, dass 5, 11, 23und 47starten Sie keine Kette vom Typ I , da es vorhergehende Elemente haben würde.

2startet auch eine Kette vom Typ II der Länge 3.

2, 3, 5

Weiter wäre 9, was nicht Primzahl ist.

Versuchen wir es mit 11Typ II (wir haben ihn von Typ I ausgeschlossen) ).
Nun, 21wäre der nächste, was nicht primitiv ist, also hätten wir Länge 1 für diese "Kette", die wir bei dieser Herausforderung nicht mitzählen.

Herausforderung

Ein Programm schreiben , oder die Funktion , dass bei einer Reihe nals Eingabe, schreibt / kehrt die Startnummer der n - ten Cunningham Ketten von Typ I oder II von wenigstens Länge 2 von einem Leerzeichen , gefolgt von der Art der Ketten gefolgt es beginnt ( I oder II ), gefolgt von einem Doppelpunkt, gefolgt von der Länge dieses Kettentyps. Beginnt eine Primzahl beide Kettenarten (Typ I und Typ II), wird zuerst die Kette vom Typ I gezählt.

Beispiel: 2 I:5

Denken Sie daran, dass ndies Teil einer zuvor gestarteten Kette eines beliebigen Typs sein kann. In diesem Fall sollte dies nicht als Startnummer einer Kette dieses Typs angesehen werden.

Schauen wir uns an, wie das beginnt

Wir beginnen mit 2. Da es überhaupt die erste Primzahl ist, können wir sicher sein, dass es keine Kette gibt, die mit einer niedrigeren Primzahl beginnt, die enthält 2.
Die nächste Nummer in einer Kette von Typ würde ich sein 2*2+1 == 5. 5ist prime, also haben wir schon eine Kette von mindestens Länge 2.
Wir zählen das als die erste Kette. Was ist mit Typ II? Nächste Nummer wäre 2*2-1 == 3. 3ist prime, also eine Kette von mindestens Länge 2 auch für Typ II.
Wir zählen das als die zweite Kette. Und wir sind fertig für2 .

Nächste Primzahl ist 3. Hier sollten wir prüfen, ob in einer Kette eine niedrigere Primzahl begonnen hat.
Überprüfen Sie für Typ I: (3-1)/2 == 1. 1ist keine Primzahl, also könnte 3 ein Ausgangspunkt für eine Kette vom Typ I sein.
Lassen Sie uns das überprüfen. Als nächstes wäre 3*2+1 == 7. 7ist prim, also haben wir eine Kette vom Typ I von mindestens Länge 2. Wir zählen das als die dritte Kette.
Jetzt prüfen wir, ob 3in einer Typ II-Kette eine niedrigere Primzahl begonnen hat. (3+1)/2 == 2. 2ist eine Primzahl, daher kann 3 nicht als Startnummer für eine Kette vom Typ II angesehen werden. Das wird also nicht gezählt, auch wenn die nächste Nummer 3in dieser Kette danach wäre5ist prime. (Das wussten wir natürlich schon, und Sie können und sollten sich natürlich überlegen, wie Sie diese Prüfungen durchführen.)

Und so prüfen wir auf für 5, 7, 11und so weiter, das Zählen , bis wir die n - te Cunningham Kette von mindestens 2 Länge finden.

Dann (oder vielleicht etwas früher ;)) müssen wir die gesamte Länge der gefundenen Kette bestimmen und das Ergebnis im zuvor genannten Format ausdrucken.

Übrigens: In meinen Tests habe ich keine Primzahl gefunden 2, die beide Kettentypen mit einer Länge größer als einsetzt 1.

Ein- / Ausgabebeispiele

Eingang

1

Ausgabe

2 I:5


Eingang

10

Ausgabe

79 II:3


Eingang

99

Ausgabe

2129 I:2


Die Ausgänge für die Eingänge 1..20

2 I: 5
2 II: 3
3 I: 2
7 II: 2
19 II: 3
29 I: 2
31 II: 2
41 I: 3
53 I: 2
79 II: 3
89 I: 6
97 II: 2
113 I: 2
131 I: 2
139 II: 2
173 I: 2
191 I: 2
199 II: 2
211 II: 2
229 II: 2

Eine Liste der ersten 5000 Ausgänge finden Sie hier .

Das ist Code Golf. Beliebige Leerzeichen sind in der Ausgabe zulässig, aber Typ und Zahlen sollten durch ein einzelnes Leerzeichen und einen Doppelpunkt getrennt sein, wie in den Beispielen gezeigt. Das Verwenden von Schlupflöchern ist nicht zulässig, insbesondere das Abrufen von Ergebnissen aus dem Internet ist nicht zulässig.

Viel Glück :)

Cabbie407
quelle
3
Vergessen im Sandkasten zu erwähnen: Es ist leicht zu beweisen, dass 2und 3die einzigen Primzahlen sind, pfür die beide 2p-1und 2p+1Primzahlen sind, also 2die einzigen Primzahlen, die nicht-triviale Cunningham-Ketten beider Typen starten .
Peter Taylor
Okay. Vielen Dank für Ihre Hilfe:)
Cabbie407
3
(Umgerechneter Kommentar aus der Antwort.) Es gibt keine anderen Primzahlen als 2mit einer doppelten Kettenlänge größer als 1. Hier ist ein Beweis durch Eliminierung.
Beentje
Vielen Dank, dass Sie das noch einmal so ausführlich hervorgehoben haben. Wolltest du das nur bemerken oder denkst du, ich sollte die Herausforderung deswegen irgendwie ändern?
Cabbie407
Nur eine Bemerkung. Ich denke nicht, dass es die Herausforderung in jedem Fall ändert, nur potenziell hilfreich für das Golfen: Wenn eine Kette gefunden wird, muss die andere nicht überprüft werden.
Beentje

Antworten:

2

Javascript, 236 208 Bytes

28 Bytes gespeichert:

p=(n,i=n)=>n%--i?p(n,i):i==1;f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:`+eval(`for(j=1;p(k=2*k+l);j++);j`))}

9 Bytes auf pFunktion mit gespeichert : p=(n,i=n)=>n%--i?p(n,i):i==1
Die tFunktion wurde durch die eval(...)Anweisung direkt in der fFunktion ersetzt.


Vorherige Lösung:

p=n=>{for(i=n;n%--i&&i;);return 1==i};t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j};f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

Beispiel: f(6)

Ausgabe: 29 I:2

Erklärung
Ich benutze 3 Funktionen

1 p : um zu wissen, ob n Primzahl ist: p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t : um die Länge der Cunningham-Kette zu kennen, die mit n vom Typ I oder II beginnt, abhängig von dem m- Parameter, der 1 oder -1 sein wird: t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f : Zählt die Ketten ( für die Schleife ) und zeigt das Ergebnis an

f=n=>{for(k=2,c=0;c<n;k++){p(k)&&!p((k-1)/2)&&p(2*k+1)&&(c++,l=1,r='');p(k)&&c-n&&!p((k+1)/2)&&p(2*k-1)&&(c++,l=-1,r='I');};alert(--k+` I${r}:${t(k,l)}`)}

for-Schleife : Für jede Nummer ist die Cunningham-Kette (I, dann II, falls erforderlich) gültig, wenn

  • Die Zahl ist Primzahl
  • der Vorgänger ist nicht prim
  • der nachfolger ist prime
Hedi
quelle