Calcolatore di Numeri Primi – Algoritmo di Crivello di Eratostene
Guida Completa agli Algoritmi per il Calcolo delle Tabelle di Numeri Primi
I numeri primi rappresentano uno dei concetti fondamentali della teoria dei numeri, con applicazioni critiche in crittografia, informatica teorica e matematica pura. Questo articolo esplora gli algoritmi più efficienti per generare tabelle di numeri primi, analizzandone complessità computazionale, implementazione pratica e casi d’uso ottimali.
1. Fondamenti Teorici dei Numeri Primi
Un numero primo è un numero naturale maggiore di 1 che ha esattamente due divisori distinti: 1 e sé stesso. Le proprietà fondamentali includono:
- Teorema Fondamentale dell’Aritmetica: Ogni numero intero maggiore di 1 è un numero primo o può essere rappresentato come prodotto di numeri primi
- Infinità dei Primi: Dimostrata da Euclide (Elementi, Libro IX, Proposizione 20)
- Distribuzione: Il teorema dei numeri primi descrive la distribuzione asintotica: π(n) ~ n/ln(n)
2. Algoritmi Classici per la Generazione di Primi
2.1 Crivello di Eratostene (Sieve of Eratosthenes)
L’algoritmo più antico conosciuto (III secolo a.C.) con complessità O(n log log n):
- Crea una lista di numeri da 2 a n
- Inizia con il primo numero p nella lista
- Elimina tutti i multipli di p
- Ripeti con il prossimo numero non eliminato
2.2 Divisione per Tentativi (Trial Division)
Metodo elementare con complessità O(n√n):
3. Algoritmi Avanzati per Grandi Intervalli
| Algoritmo | Complessità | Limite Pratico | Vantaggi |
|---|---|---|---|
| Crivello di Eratostene | O(n log log n) | 108 | Semplice, memoria ottimizzata |
| Crivello di Atkin | O(n / log log n) | 1012 | Teoricamente più veloce per n molto grandi |
| Test di Miller-Rabin | O(k log3 n) | 1020+ | Probabilistico, adatto per numeri molto grandi |
| Curve Ellittiche (ECPP) | O((log n)6) | 1050+ | Deterministico per numeri estremamente grandi |
3.1 Crivello di Atkin (2004)
Algoritmo moderno che miglior il crivello tradizionale:
- Basato su congruenze quadratiche modulo 60
- Elimina i multipli solo dopo aver identificato i primi
- Implementazione complessa ma più efficiente per n > 1010
3.2 Test di Primalità Probabilistici
Il test di Miller-Rabin (1976) con parametro k:
4. Ottimizzazioni Pratiche
4.1 Segmented Sieve
Tecnica per gestire intervalli di memoria limitati:
- Dividi l’intervallo [2, n] in segmenti di dimensione √n
- Genera i primi fino a √n con crivello normale
- Applica il crivello a ciascun segmento usando i primi trovati
4.2 Wheel Factorization
Riduce il numero di divisioni necessarie:
- Usa moduli 2, 3, 5 per saltare multipli noti
- Riduce le operazioni del 77% (2×3×5=30)
- Implementazione comune nei crivelli moderni
5. Applicazioni nella Crittografia
I numeri primi sono fondamentali per:
- RSA: Basato sulla difficoltà di fattorizzare il prodotto di due primi grandi
- Diffie-Hellman: Usa primi per generare chiavi condivise
- Curve Ellittiche: Operazioni su campi finiti con caratteristica prima
| Algoritmo Crittografico | Dimensione Prima Tipica (bit) | Sicurezza Equivalente (bit) |
|---|---|---|
| RSA | 2048 | 112 |
| DSA | 2048-3072 | 112-128 |
| ECDSA (curva P-256) | 256 | 128 |
| Post-Quantum (NTRU) | Varia | 128-256 |
6. Implementazione in Linguaggi Moderni
Confronto delle prestazioni per n=108:
- C++ (GCC -O3): ~0.5s con crivello segmentato
- Python (NumPy): ~2.1s con ottimizzazioni vettoriali
- JavaScript (Web Worker): ~3.8s con typed arrays
- Rust: ~0.4s con allocazioni ottimizzate
7. Risorse Accademiche e Standard
Per approfondimenti scientifici:
- NIST FIPS 186-5 – Standard per la generazione di numeri primi in crittografia (DSA, RSA)
- Handbook of Applied Cryptography (Università di Waterloo) – Capitolo 4: Primalità e Fattorizzazione
- MIT Lecture Notes – Algoritmi avanzati per la generazione di primi (Bernstein)
8. Errori Comuni nell’Implementazione
- Overflow degli interi: Usare tipologie a 64-bit per n > 232
- Memoria insufficiente: Il crivello richiede O(n) memoria (usare segmented sieve)
- Ottimizzazioni premature: Profilare prima di ottimizzare (regola 80/20)
- Threading non sicuro: Le strutture dati condivise devono essere thread-safe
9. Benchmark e Confronto Pratico
Test eseguiti su un sistema con Intel i9-12900K (2022):
| Algoritmo | n=106 | n=108 | n=1010 |
|---|---|---|---|
| Crivello di Eratostene (Naive) | 12ms | 1.4s | OOM |
| Crivello Segmentato | 15ms | 1.8s | 22s |
| Crivello di Atkin | 28ms | 2.1s | 25s |
| Divisione per Tentativi | 450ms | 45s | 78m |
10. Future Direzioni di Ricerca
Aree attive di studio:
- Algoritmi quantistici: L’algoritmo di Shor (1994) fattorizza in tempo polinomiale
- Crivelli sublineari: Algoritmi con complessità o(n1/2+ε)
- Primi deterministici: Test polinomiali per numeri generali (AKS, 2002)
- Hardware specializzato: FPGA/ASIC per generazione ultra-veloce