Prima di tutto - Ho controllato molto in questo forum e non ho trovato qualcosa abbastanza veloce. Cerco di creare una funzione che restituisca i numeri primi in un intervallo specificato. Per esempio ho fatto questa funzione (in C#) usando il setaccio di Eratostene. Ho provato anche setaccio Atkin ma quella Eratostene corre più veloce (nel mio implementazione):Algoritmo veloce per trovare i numeri primi?
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);
}
Si corre circa due volte più veloce di codici & algoritmi che ho trovato ... C'è dovrebbe essere un modo più veloce per trovare i numeri primi, potresti aiutarmi?
In quale range stai cercando per i numeri primi? Solo tra 0 e max int? Inoltre, quanto è ampia la gamma? – Gleno
diciamo qualcosa come miliardi/2 – Ohad
Ci sono 50 minuti primi meno di 10^9, quindi precomputerli ti darebbe una tabella di 200MB. Sarebbe effettivamente più piccolo per memorizzare solo il setaccio (10^9 bit è di 125 MB, e non è necessario memorizzare i bit pari, in modo che si possa inserire tutto in meno di 64 MB). – Gabe