Primero de todo - Revisé mucho en este foro y no he encontrado algo suficientemente rápido. Intento hacer una función que me devuelva los números primos en un rango específico. Por ejemplo, hice esta función (en C#) usando el tamiz de Eratóstenes. Probé también tamiz de Atkin pero el Eratóstenes se ejecuta más rápido (en mi aplicación):Algoritmo rápido para encontrar números primos?
public static void SetPrimesSieve(int Range)
{
Primes = new List<uint>();
Primes.Add(2);
int Half = (Range - 1) >> 1;
BitArray Nums = new BitArray(Half, false);
int Sqrt = (int)Math.Sqrt(Range);
for (int i = 3, j; i <= Sqrt;)
{
for (j = ((i * i) >> 1) - 1; j < Half; j += i)
Nums[j] = true;
do
i += 2;
while (i <= Sqrt && Nums[(i >> 1) - 1]);
}
for (int i = 0; i < Half; ++i)
if (!Nums[i])
Primes.Add((uint)(i << 1) + 3);
}
Se extiende alrededor de dos veces más rápido que los códigos & algoritmos que he encontrado ... No debería ser una forma más rápida para encontrar números primos, ¿usted me podría ayudar?
En ¿Qué rango buscas primos? ¿Solo entre 0 y max int? ¿Qué tan ancho es el rango? – Gleno
digamos algo así como mil millones/2 – Ohad
Hay 50M primos menores que 10^9, por lo precomputación de ellos le darían una mesa de 200 MB. En realidad, sería más pequeño almacenar el tamiz (10^9 bits es 125 MB, y no es necesario almacenar los bits pares, por lo que podría caber en menos de 64 MB). – Gabe