De hecho, tengo una respuesta a mi pregunta pero no está paralelizada, así que estoy interesado en formas de mejorar el algoritmo. De todos modos, podría ser útil como es para algunas personas.¿La forma más rápida de calcular números primos en C#?
int Until = 20000000;
BitArray PrimeBits = new BitArray(Until, true);
/*
* Sieve of Eratosthenes
* PrimeBits is a simple BitArray where all bit is an integer
* and we mark composite numbers as false
*/
PrimeBits.Set(0, false); // You don't actually need this, just
PrimeBits.Set(1, false); // remindig you that 2 is the smallest prime
for (int P = 2; P < (int)Math.Sqrt(Until) + 1; P++)
if (PrimeBits.Get(P))
// These are going to be the multiples of P if it is a prime
for (int PMultiply = P * 2; PMultiply < Until; PMultiply += P)
PrimeBits.Set(PMultiply, false);
// We use this to store the actual prime numbers
List<int> Primes = new List<int>();
for (int i = 2; i < Until; i++)
if (PrimeBits.Get(i))
Primes.Add(i);
Tal vez podría utilizar múltiples BitArray
s y BitArray.And() juntos?
¿Es este el código actualizado? – Crash893
La forma más rápida que conozco de usar multiprocesamiento en C# es el código que presenté como respuesta a otra pregunta en: http://stackoverflow.com/a/18885065/549617. Encuentra el número total de números primos a mil millones en aproximadamente 0.32 segundos, el número de números primos en el rango de números de 32 bits en aproximadamente 1.29 segundos y el número de números primos a diez mil millones en aproximadamente 3 segundos ** no ** usando enumeración en un Intel i7-2700K (3.5 GHz con cuatro núcleos/ocho hilos, incluido Hyper Threading). Para dar resultados más rápidos que esto, uno debería usar el código C como en https://code.google.com/p/primesieve/. – GordonBGood
Intenté la solución anterior y recibí una excepción: 'operación aritmética resultó en un desbordamiento'. La lista debe ser la lista . –
Devid