Conteggio delle catene Cunningham


14

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 pper il quale 2*p+1è anche primo.

Un primo sicuro è un primo pper 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 pe calcoliamo q=2*p+1. Se qè anche primo, abbiamo una catena di Cunnigham di tipo I di lunghezza 2. Quindi testiamo 2*q+1e 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-1ad 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

2inizia una catena di tipo I di lunghezza 5.

2, 5, 11, 23, 47

Il prossimo numero costruito sarebbe 95che non è un numero primo.
Questo ci dice anche, che 5, 11, 23e 47non avviare qualsiasi catena di tipo I , perché avrebbe elementi che precedono.

2inizia anche una catena di tipo II di lunghezza 3.

2, 3, 5

Il prossimo sarebbe 9, che non è primo.

Proviamo 11per il tipo II (lo abbiamo escluso dal tipo I in precedenza).
Bene, 21sarebbe 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 ncome 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 npotrebbe 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. 1non è 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 3appare 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 3in 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, 11e 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 2quello 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 :)


3
Hai dimenticato di menzionarlo nella sandbox: è facile dimostrarlo 2e 3sono gli unici numeri primi pper i quali entrambi 2p-1e 2p+1sono numeri primi, quindi 2è l'unico primo che inizia catene non banali di Cunningham di entrambi i tipi.
Peter Taylor,

Va bene. Grazie per l'aiuto:)
Cabbie407,

3
(Commento convertito dalla risposta.) Non ci sono numeri primi se non 2con una lunghezza della catena doppia maggiore di 1. Ecco una prova per eliminazione.
pbeentje,

Bene, grazie per averlo sottolineato di nuovo in modo così dettagliato. Volevi solo commentarlo o pensi che dovrei cambiare la sfida in qualche modo per questo?
Cabbie407,

Solo un'osservazione. Non penso che cambi la sfida in ogni caso, potenzialmente utile solo per il golf: quando viene trovata una catena, non è necessario controllare l'altra.
pbeentje,

Risposte:


2

Javascript, 236 208 byte

28 byte salvati:

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`))}

Salvataggio di 9 byte sulla pfunzione con: p=(n,i=n)=>n%--i?p(n,i):i==1
la tfunzione è stata sostituita eval(...)dall'istruzione direttamente nella ffunzione.


Soluzione precedente:

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)}`)}

Esempio: f(6)

Produzione: 29 I:2

Spiegazione
Sto usando 3 funzioni

1 p : per sapere se n è primo: p=n=>{for(i=n;n%--i&&i;);return 1==i}

2 t : conoscere la lunghezza della catena di Cunningham che inizia con n di tipo I o II a seconda del parametro m che sarà 1 o -1: t=(n,m)=>{for(j=1;p(n=2*n+m);j++);return j}

3 f : conta le catene ( per loop ) quindi visualizza il risultato

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)}`)}

per loop : per ogni numero la catena Cunningham (I poi II se necessario) è valida se

  • il numero è primo
  • il predecessore non è primo
  • il successore è primo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.