I numeri primi hanno sempre affascinato le persone. 2300 anni fa Euclide scrisse nei suoi "Elementi"
Un numero primo è quello misurato da una sola unità.
il che significa che un numero primo è divisibile solo per 1
(o per se stesso).
Le persone hanno sempre cercato relazioni tra numeri primi e hanno escogitato alcune cose piuttosto strane (come in "interessanti").
Ad esempio un primo di Sophie Germain è un numero primo p
per il quale 2*p+1
è anche primo.
Un primo sicuro è un primo p
per il quale (p-1)/2
è anche primo, che è esattamente la condizione arretrata di un primo di Sophie Germain.
Questi sono legati a ciò che stiamo cercando in questa sfida.
Una catena di Cunningham di tipo I è una serie di numeri primi, in cui ogni elemento tranne l'ultimo è un numero primo di Sophie Germain , e ogni elemento tranne il primo è un numero primo sicuro . Il numero di elementi in questa catena è chiamato lunghezza .
Ciò significa che iniziamo con un numero primo p
e calcoliamo q=2*p+1
. Se q
è anche primo, abbiamo una catena di Cunnigham di tipo I di lunghezza 2. Quindi testiamo 2*q+1
e così via, fino a quando il numero generato successivo è composto.
Le catene di Cunningham di tipo II sono costruite seguendo quasi lo stesso principio, l'unica differenza è che controlliamo 2*p-1
ad ogni stadio.
Le catene di Cunningham possono avere una lunghezza di 1 , il che significa che né 2 * p + 1 né 2 * p-1 sono primi. Non siamo interessati a questi .
Alcuni esempi di catene Cunningham
2
inizia una catena di tipo I di lunghezza 5.
2, 5, 11, 23, 47
Il prossimo numero costruito sarebbe 95
che non è un numero primo.
Questo ci dice anche, che 5
, 11
, 23
e 47
non avviare qualsiasi catena di tipo I , perché avrebbe elementi che precedono.
2
inizia anche una catena di tipo II di lunghezza 3.
2, 3, 5
Il prossimo sarebbe 9
, che non è primo.
Proviamo 11
per il tipo II (lo abbiamo escluso dal tipo I in precedenza).
Bene, 21
sarebbe il prossimo, che non è il primo, quindi avremmo la lunghezza 1 per quella "catena", che non contiamo in questa sfida.
Sfida
Scrivi un programma o una funzione che, dato un numero
n
come input, scrive / restituisce il numero iniziale dell'ennesima catena Cunningham di tipo I o II di almeno lunghezza 2 , seguito da uno spazio, seguito dal tipo di catena che inizia ( I o II ), seguito da due punti, seguito dalla lunghezza di quel tipo di catena. Nel caso in cui un numero primo inizi entrambi i tipi di catene (tipo I e tipo II), la catena di tipo I viene conteggiata per prima.Esempio:
2 I:5
Tieni presente che n
potrebbe far parte di una catena precedentemente avviata di qualsiasi tipo, nel qual caso non dovrebbe essere considerato un numero iniziale di una catena di quel tipo.
Diamo un'occhiata a come inizia
Iniziamo con 2
. Dal momento che è il primo numero a tutti possiamo essere sicuri che non ci sia una catena che inizia con un numero primo che contiene 2
.
Il prossimo numero in una catena di tipo I sarebbe 2*2+1 == 5
. 5
è primo, quindi abbiamo già una catena di almeno lunghezza 2.
Lo consideriamo come la prima catena. Che dire del tipo II? Il prossimo numero sarebbe 2*2-1 == 3
. 3
è primo, quindi una catena di almeno lunghezza 2 anche per il tipo II.
Lo consideriamo come la seconda catena. E abbiamo finito per 2
.
Il prossimo primo è 3
. Qui dovremmo verificare se è in una catena che è iniziato un numero primo più basso.
Verificare la presenza di tipo I: (3-1)/2 == 1
. 1
non è un numero primo, quindi 3 potrebbe essere un punto di partenza per una catena di tipo I.
Controlliamo quello. Il prossimo sarebbe 3*2+1 == 7
. 7
è primo, quindi abbiamo una catena di tipo I di almeno lunghezza 2. La contiamo come terza catena.
Ora controlliamo se 3
appare in una catena di tipo II che è iniziato un numero primo inferiore.
(3+1)/2 == 2
. 2
è primo, quindi 3 non può essere considerato come un numero iniziale per una catena di tipo II. Quindi questo non viene conteggiato, anche se il numero successivo dopo 3
in questa catena, che sarebbe5
, è primo. (Naturalmente lo sapevamo già, e tu puoi e dovresti ovviamente pensare al tuo metodo su come eseguire questi controlli.)
E così, controlliamo avanti per 5
, 7
, 11
e così via, fino a quando il conteggio troviamo la catena Cunningham ennesima di almeno 2 lunghezza.
Quindi (o forse qualche tempo prima ;)
) dobbiamo determinare la lunghezza completa della catena che abbiamo trovato e stampare il risultato nel formato precedentemente menzionato.
A proposito: nei miei test non ho trovato nessun primo oltre a 2
quello che ha avviato entrambi i tipi di catene con una lunghezza maggiore di 1
.
Esempi di input / output
Ingresso
1
Produzione
2 I:5
Ingresso
10
Produzione
79 II:3
Ingresso
99
Produzione
2129 I:2
Le uscite per gli ingressi 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
Un elenco delle prime 5000 uscite è disponibile qui .
Questo è il codice golf. Gli spazi bianchi arbitrari sono consentiti nell'output, ma il tipo e i numeri devono essere separati da un singolo spazio e due punti, come mostrato negli esempi. L'utilizzo di scappatoie non è consentito, in particolare ottenendo i risultati dal web è non consentito.
In bocca al lupo :)
:)
2
con una lunghezza della catena doppia maggiore di 1. Ecco una prova per eliminazione.
2
e3
sono gli unici numeri primip
per i quali entrambi2p-1
e2p+1
sono numeri primi, quindi2
è l'unico primo che inizia catene non banali di Cunningham di entrambi i tipi.