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, p
für die 2*p+1
auch eine Primzahl gilt.
Eine sichere Primzahl ist eine Primzahl, p
für die (p-1)/2
es 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 p
und berechnen q=2*p+1
. Wenn auch q
Primzahl ist, haben wir eine Cunnigham-Kette vom Typ I der Länge 2. Dann testen wir 2*q+1
und 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-1
in 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
2
startet eine Kette vom Typ I der Länge 5.
2, 5, 11, 23, 47
Die nächste konstruierte Zahl wäre die, 95
die keine Primzahl ist.
Dies sagt uns auch, dass 5
, 11
, 23
und 47
starten Sie keine Kette vom Typ I , da es vorhergehende Elemente haben würde.
2
startet 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 11
Typ II (wir haben ihn von Typ I ausgeschlossen) ).
Nun, 21
wä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
n
als 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 n
dies 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
. 5
ist 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
. 3
ist 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
. 1
ist 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
. 7
ist 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 3
in einer Typ II-Kette eine niedrigere Primzahl begonnen hat.
(3+1)/2 == 2
. 2
ist 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 3
in dieser Kette danach wäre5
ist 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
, 11
und 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 :)
quelle
2
und3
die einzigen Primzahlen sind,p
für die beide2p-1
und2p+1
Primzahlen sind, also2
die einzigen Primzahlen, die nicht-triviale Cunningham-Ketten beider Typen starten .:)
2
mit einer doppelten Kettenlänge größer als 1. Hier ist ein Beweis durch Eliminierung.Antworten:
Javascript,
236208 Bytes28 Bytes gespeichert:
9 Bytes auf
p
Funktion mit gespeichert :p=(n,i=n)=>n%--i?p(n,i):i==1
Die
t
Funktion wurde durch dieeval(...)
Anweisung direkt in derf
Funktion ersetzt.Vorherige Lösung:
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
for-Schleife : Für jede Nummer ist die Cunningham-Kette (I, dann II, falls erforderlich) gültig, wenn
quelle