Segue un'interrogazione:Utilizzo di LINQ per generare numeri primi
Il seguente dispositivo di sola lettura genera e visualizza l'elenco dei primi 500 numeri primi. Come si ottimizzarlo utilizzando LINQ parallelo, pur mantenendo una SINGOLA C# DICHIARAZIONE:
MessageBox.Show(string.Join(",",
Enumerable.Range(2, (int)(500 * (Math.Log(500) + Math.Log(System.Math.Log(500)) - 0.5)))
.Where(x => Enumerable.Range(2, x - 2)
.All(y => x % y != 0))
.TakeWhile((n, index) => index < 500)));
ho provato l'introduzione AsParallel()
nonché ParallelEnumerable
nella query, ma non ho visto nessun benefici tangibili su macchine multi-core. La query utilizza ancora un core della CPU pesantemente mentre altri core godono del tempo libero. Qualcuno può suggerire un miglioramento che distribuirà il carico equamente su tutti i core e quindi ridurrà i tempi di esecuzione?
Per gli appassionati di: La seguente formula restituisce un limite superiore che è garantito per essere maggiore di N numeri primi, cioè se controlli fino a questo numero, si certo trovare N innesca più piccolo di lui:
UpperBound = N * (Log(N) + Log(Log(N)) - 0.5) //Log is natural log
Vedi http://stackoverflow.com/questions/1510124/program-to-find-prime-numbers – abatishchev
@abatishchev: La modifica che hai fatto non è valido. La domanda chiede esplicitamente di mantenerla una singola affermazione. Inoltre introduce un errore in fase di compilazione. Lo ripristinerò. Inoltre, il link che hai condiviso è diverso per molteplici ragioni. Per uno, non usa il parallelismo.In secondo luogo, mostra i primi tra x e y mentre questa domanda mostra i primi N primi, che è un concetto totalmente diverso (dato che in questo caso non si ha il limite superiore). – dotNET
@dotNET, sfortunatamente hai ancora un errore nel codice dopo la povera modifica di abatishchev. Manca il paren di chiusura sul metodo Range. –