Qualcuno può fornire uno pseudocodice fattibile da qualsiasi implementazione prime-counting function? Inizialmente ho tentato di codificare lo Hardy-Wright algorithm, ma i suoi fattori fattoriali hanno iniziato a generare un traboccamento miserabile, e molti altri sembrano destinati a produrre problemi simili. Ho setacciato Google per trovare soluzioni pratiche, ma, nel migliore dei casi, ho trovato matematica molto esoterica che non ho mai visto implementata nei programmi convenzionali.Implementazione fattibile di una funzione di conteggio principale
risposta
La funzione di conteggio primo pi (x) calcola il numero di numeri primi non superiori a x e ha affascinato i matematici per secoli. All'inizio del diciottesimo secolo, Adrien-Marie Legendre diede una formula usando una funzione ausiliare phi (x, a) che conta i numeri non superiori a x che non vengono colpiti setacciando con il primo un primes; per esempio, phi (50,3) = 14 per i numeri 1, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 e 49. La funzione phi può essere calcolata come phi (x, a) = phi (x, a-1) - phi (x/P (a), a-1), dove phi (x, 1) è il numero di interi dispari che non superano x e P (a) è l'a-esimo numero primo (contando da P (1) = 2).
function phi(x, a)
if (phi(x, a) is in cache)
return phi(x, a) from cache
if (a == 1)
return (x + 1) // 2
t := phi(x, a-1) - phi(x // p[a], a-1)
insert phi(x, a) = t in cache
return t
Una matrice p memorizza l'a-esima per a a, calcolata da setacciatura. La cache è importante; senza di esso, il tempo di esecuzione sarebbe esponenziale. Dato phi, la formula di conteggio primi di Legendre è pi (x) = phi (x, a) + a - 1, dove a = pi (floor (sqrt (x))). Legendre ha usato la sua formula per calcolare pi (10^6), ma ha segnalato 78526 invece della risposta corretta di 78498, che, anche se errata, era sorprendentemente vicina per un complicato calcolo manuale.
Nel 1950, Derrick H. Lehmer dato un algoritmo migliorato per i numeri primi conteggio:
function pi(x)
if (x < limit) return count(primes(x))
a := pi(root(x, 4)) # fourth root of x
b := pi(root(x, 2)) # square root of x
c := pi(root(x, 3)) # cube root of x
sum := phi(x,a) + (b+a-2) * (b-a+1)/2
for i from a+1 to b
w := n/p[i]
lim := pi(sqrt(w))
sum := sum - pi(w)
if (i <= c)
for j from i to lim
sum := sum - pi(w/p[j]) + j - 1
return sum
Ad esempio, tav (10^12) = 37607912018. Anche con questi algoritmi e loro varianti moderne, e computer molto veloci, rimane terribilmente noioso calcolare valori elevati di pi; al momento della stesura, il più grande valore noto è pi (10^24) = 18435599767349200867866.
Per utilizzare questo algoritmo per calcolare l'n-esimo, un corollario al Teorema numero primo limita l'n-esimo P (n) tra n log n e n (log n + log log n) per n> 5, quindi calcola pi ai limiti e usa bisezione per determinare l'n-esimo, passando alla setacciatura quando i limiti sono vicini.
Discuto di numeri primi in più voci allo my blog.
Dal primo snippet di codice è implicito che phi (x, a) = t, ma qui hai memorizzato phi (x, a-1) = t (Se quest'ultimo era vero, allora ci sarebbe un algoritmo molto più veloce per questo). L'avrei modificato io stesso, ma abbiamo la restrizione stupida della modifica deve essere più di 6 caratteri. –
@StrategyThinker: Grazie per la correzione. Fisso. – user448810
Recentemente, sono stati calcolati pi (10^25) e pi (10^26). Vedi [pagina 40 qui] (http://dalspace.library.dal.ca/handle/10222/60524). – qwr
Wikipedia potrebbe aiutare anche. L'articolo su prime counting contiene alcuni indicatori. Per cominciare, raccomanderei l'algoritmo di Meissel nella sezione "Algoritmi per la valutazione di π (x)", che è uno degli algoritmi più semplici che non genera tutti i numeri primi.
Trovo anche utile il libro di Pomerance e Crandall "Prime numbers a computational perspective". Questo libro ha una descrizione dettagliata e abbastanza accessibile dei metodi di conteggio dei primi. Ma tieni presente che l'argomento per sua natura è un po 'troppo avanzato per la maggior parte del lettore qui.
- 1. C++: implementazione personalizzata Funzione principale
- 2. Rottura funzione principale all'interno di una funzione figlio (PHP Preferibilmente)
- 3. Chiamare una funzione prima principale
- 4. Implementazione della funzione di inserimento
- 5. Implementazione di una funzione di attivazione softmax per reti neurali
- 6. Java - Implementazione di una lista circolare round robin e conteggio del numero di elementi dell'elemento?
- 7. due varianti di funzione principale di Python
- 8. Conteggio dell'associazione figlio principale schiacciato in LINQ
- 9. Lo script di Python deve definire una funzione come principale?
- 10. Coda prioritaria con una funzione di ricerca - Implementazione più rapida
- 11. Come definire una funzione come implementazione di callback in JSDoc?
- 12. Funzione conteggio in XPath
- 13. Implementazione di una HashMap
- 14. Utilizzare la funzione principale di R
- 15. funzione principale Python
- 16. Implementazione dell'ultima funzione
- 17. Hai bisogno di citare dal livello di legalità della funzione principale, come una funzione template
- 18. Sigabrt on Funzione principale
- 19. Implementazione di "mostra" per la funzione
- 20. funzione principale Haskell
- 21. Un thread per client. Fattibile?
- 22. Implementazione della funzione nulla
- 23. La funzione principale() rientranti?
- 24. Funzione implementazione interfaccia
- 25. Denominazione di una variabile di conteggio
- 26. Implementazione di una LinkedHashMap simultanea
- 27. Implementazione di una funzione di evidenziazione per una ricerca live in JavaScript/JQuery
- 28. Ambito di una variabile esterna principale C
- 29. Implementazione della funzione base64 JQuery
- 30. Java Reflection: creare una classe di implementazione
Siamo spiacenti, questo non è McDonalds - non hai richieste qui. Hai domande. Informazioni su problemi di programmazione esatti ... Si prega di leggere la [FAQ] – ppeterka
se è vero che 'floor (x/j) * j == x - (x% j)'. Quindi la formula che si collega diventa 'pi (x) = (-1) + SUM {j = 3..}} (((j-2)!)% J)' (?). Quindi usa la moltiplicazione modulare (ad esempio '5!% 7 == (((((2 * 3)% 7) * 4)% 7) * 5)% 7'). –
@SeverynKozak La ragione per cui dicono che non si tratta di una questione di programmazione è perché la tua domanda non contiene codice. –