La sfida
Implementa il setaccio Sundaram per trovare i numeri primi di seguito n
. Prendi un numero intero di input n
e genera i numeri primi di seguito n
. Puoi presumere che n
sarà sempre inferiore o uguale a un milione.
Setaccio
Inizia con un elenco di numeri interi da
1
an
.Rimuovi tutti i numeri che si trovano nel modulo in
i + j + 2ij
cui:i
ej
sono inferiori an
.j
è sempre maggiore o uguale ai
, che è maggiore o uguale a1
.i + j + 2ij
è inferiore o uguale an
Moltiplica i numeri rimanenti per
2
e aggiungi1
.
Ciò produrrà tutti i numeri primi (tranne 2
, che dovrebbero essere inclusi nell'output) in meno di 2n + 2
.
Ecco un'animazione del setaccio utilizzato per trovare i numeri primi di seguito 202
.
Produzione
L'output dovrebbe essere ogni numero intero primo ≤ n
(in ordine crescente) seguito da una nuova riga:
2
3
5
Dove n
si trova 5
.
Esempi
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Gli ingressi sono indicati da >
.
(i,j)
con i<=j
, ma il risultato non cambia se ignoriamo questo requisito. Possiamo farlo per salvare byte?
i <= j
. Fa solo parte di come funziona il setaccio. Quindi sì, puoi tralasciare il i <= j
codice. @xnor
2n+1
) che non sono del modulo 2(i + j + 2ij)+1
- possiamo testare questa proprietà direttamente sui numeri primi potenziali o il nostro codice deve fare i tempi 2 più 1 ad un certo punto ?
n
è nel complesso. Nella descrizione del metodo, dice che genererà tutti i numeri primi fino a 2 * n + 2
. Ma nella descrizione input / output, dice che l'input è n
, e l'output è tutto pronto n
. Quindi dovremmo applicare il metodo per generare fino a tutti i numeri primi 2 * n + 2
e quindi eliminare quelli più grandi rispetto n
all'output? O dovremmo calcolare la n
descrizione del metodo dall'input n
?
n=30
manca 29 nell'output.