Ho scritto una funzione, sieve(n)
, che utilizza il setaccio di Eratostene per restituire una matrice di tutti i numeri primi fino a n
.Come posso utilizzare il setaccio di Eratostene per ottenere l'ennesimo numero primo?
sieve(25) # ==> [2, 3, 5, 7, 11, 13, 17, 19, 23]
La fonte per questa funzione può essere letto here.
Voglio refactoring questo ora in modo che sieve(n)
restituirà il primo n
. Non sono sicuro di come lo farei. Non voglio scrivere una funzione completamente nuova e più elaborata, quindi sembra che il metodo migliore sia capire a quale valore il setaccio dovrebbe contare.
Ad esempio, se chiedo il 27 ° primo, l'elenco iniziale di setacci dell'intervallo deve essere compreso tra 2 e (qualcosa che so che il 27 ° primo non è maggiore di). Ma c'è un modo semplice per capire qual è questo valore?
Ho ricercato questa domanda e trovarono this Quora post cui detto che il primo all'ennesimo deve essere compreso tra n*Math.log(n) + n*(Math.log(Math.log(n))-1)
e n*Math.log(n) + n*Math.log(Math.log(n))
(dove Math.log
rubino per il logaritmo naturale), ma semplicemente facendo list
una matrice di numeri tra queste due figure rende la resa setaccio valori strani, come 56
per il 15 ° primo (56 non è primo e la risposta dovrebbe essere 47).
Come potete immaginare, sono totalmente fuori dal mio elemento qui. Se qualcuno potesse offrirmi qualche consiglio lo apprezzerei davvero.
Non dovresti chiedere di generare numeri primi * tra * qualsiasi cosa. L'intero algoritmo è costruito attorno alla consapevolezza di aver trovato tutti i numeri prima di un certo punto prima di andare avanti. Devi chiederlo per trovare i numeri primi da 1 e fino al limite superiore. –
Il seguente approccio sarebbe una soluzione accettabile? Usa il limite superiore che hai menzionato nella tua domanda (ma non ne ero a conoscenza e non ho idea del motivo per cui è corretto) per generare tutti i numeri primi più piccoli del limite e restituire l'elemento 'n-th' della lista. – Codor
@Codor Questo è quello che pensavo avrebbe funzionato, ma ha alcuni risultati molto strani che non capisco. Se imposto il mio elenco iniziale a 2 sul limite superiore, ottengo i numeri primi per un po 'e poi solo un conteggio costante: 267, 268, 269, 270, 271, ecc. È bizzarro. – GreenTriangle