Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Il crivello di Eratostene
Scritto da Fabrizio Furnari il 07-11-2007 ore 08:44
Intel Parallel Studio XE
Circa 200 anni prima della nascita di Cristo un matematico alessandrino, ma originario di Cirene, svela al mondo un algoritmo — uno dei primi della storia — per l'individuazione dei numeri primi. Il nome del poeta, geografo, astronomo e matematico cirenaico è, come molti avranno già intuito, Eratostene, e l'algoritmo è detto "crivello" ovvero setaccio, per la particolarità del metodo usato. E' un algoritmo semplice e sicuramente bisognoso di miglioramenti, ma ha il pregio di poter essere implementato facilmente con vari linguaggi di programmazione.

Wikipedia ne mostra una versione in pseudo-codice, mentre la versione in Java che riporto di seguito è tratta dalla Rete. Esaminiamo innanzitutto il codice, per poi spiegare come funziona l’algoritmo:
  1. <span style="font-size:1.0em">
  2. public class PrimeSieve {
  3.     public static void main(String[] args) { 
  4.         int N = Integer.parseInt(args[0]);
  5.  
  6.         // initially assume all integers are prime
  7.         boolean[] isPrime = new boolean[N + 1];
  8.         for (int i = 2; i <= N; i++) {
  9.             isPrime[ i ] = true;
  10.         }
  11.  
  12.         // mark non-primes <= N using Sieve of Eratosthenes
  13.         for (int i = 2; i*i <= N; i++) {
  14.  
  15.             // if i is prime, then mark multiples of i as nonprime
  16.             // suffices to consider mutiples i, i+1, ..., N/i
  17.             if (isPrime[ i ]) {
  18.                 for (int j = i; i*j <= N; j++) {
  19.                     isPrime[ i * j ] = false;
  20.                 }
  21.             }
  22.         }
  23.  
  24.         // count primes
  25.         int primes = 0;
  26.         for (int i = 2; i <= N; i++) {
  27.             if (isPrime[ i ]) primes++;
  28.         }
  29.         System.out.println("The number of primes <= " + N + " is " + primes);
  30. </span>
Il listato qui sopra non fa altro che “setacciare” appunto i primi args numeri — per chi non avesse conoscenze di programmazione args è passato come argomento da linea di comando — assumendo da principio che tutti i numeri siano primi, ed eliminando man mano tutti quelli che hanno divisori, o meglio eliminando i multipli dei primi trovati fino a quel punto.

Una versione più moderna e sicuramente più efficace del crivello di Eratostene è il crivello di Atkins, un test di primalità che può essere trovato oltre che su Wikipedia, anche su altri siti. Inoltre rimando alle interessanti letture (e codici) di The Prime Pages, che faranno la gioia di qualsiasi programmatore/matematico che ancora non si sia interessato alla questione.
Precedente: Mac OS X Leopard, la recensione di Ars Technica (1/3)
Successiva: Microsoft e Mozilla sul futuro di JavaScript
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.472 secondi.