Ciao a tutti. Sono di nuovo alle prese con i numeri primi.
Ho creato un programma in C che, tramite il crivello di Eratostene trova il numero di numeri primi tra 3 e un numero.
Il sostanza, il programma immagazzina in un vettore tutti i numeri dispari tra 3 e N, poi trovo tutti i numeri primi compresi tra 3 e la radice quadrata di N e li metto in una lista.
A questo punto cancello dal vettore tutti i numeri multipli dei primi nella lista e i numeri rimanenti sono i primi.
A questo punto, però, mi si pone un problema: La consegna iniziale dell'esercizio, era di trovare il numero di numeri primi tra 3 e un numero N con
N tra le 14 e le 19 cifre quindi un
long int.
Se non sbaglio a fare i conti:
Mettendo come N il numero 12345678912345 (14 cifre), e immagazzinando nel vettore solo i dispari, dovrei fare:
(12345678912345 / 2) = 6,17283946 × 10^12
cosi trovo il numero dei dispari, e poi:
(6,17283946 × 10^12) * 8 = 4.93827156 × 10^13
Infatti ogni long int è 8 byte.
Se non sbaglio a contare gli "zeri" dovrebbe essere un numero vicino a 50'000'000'000'000 Byte --> 50 TeraByte.
Qualcuno ha 50 Tera Byte di RAM da prestarmi? 
Il mio pensiero, a l'inizio, fu quello di dividere il vettore in blocchi da poche decine di migliaia di numeri e poi, per compensare un po sotto l'aspetto velocità, avrei messo dei thread che cancellavano i numeri (il thread1 cancella tutti i multipli di 3 e 5, il thread2 cancella tutti i multipli di 7 e 11 e così via).
Secondo voi è la soluzione ottimale o dovrei optare per un programma più CPU Bound?
Il fatto è che mi piaceva l'idea del crivello di Eratostene per prendere un po più di famigliarità con le liste e i puntatori.
Grazie a tutti e buone feste!