Crivello di Eratostene

Da testwiki.
Versione del 16 gen 2025 alle 14:52 di imported>Mat4free (rb)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Template:F Il crivello di Eratostene è un antico algoritmo per il calcolo dei numeri primi fino a un certo numero prefissato. Deve il proprio nome al matematico Eratostene di Cirene, che ne fu l'ideatore. È ancora utilizzato per il calcolo dei numeri primi da molti programmi per computer, per via della sua semplicità. Pur non essendo particolarmente efficiente, infatti, è piuttosto semplice da implementare in un qualsiasi linguaggio di programmazione.

Algoritmo

Animazione del crivello
Animazione del crivello

Il procedimento è il seguente: si scrivono tutti i numeri naturali a partire da 2 fino n in un elenco, detto setaccio. In seguito si cancellano (setacciano) tutti i multipli del primo numero del setaccio escluso lui stesso. Si prende poi il primo numero non cancellato maggiore di 2 e si cancellano tutti i suoi multipli eccetto lui, e si ripete questa operazione fino a che il primo numero non cancellato maggiore di 2 non presenta multipli nell'elenco. I numeri che restano sono i numeri primi minori o uguali a n.

È come se si utilizzassero dei setacci a maglie via via più larghe: il primo lascia passare solo i numeri non multipli di 2, il secondo solo i non multipli di 3, e così via.

Nel caso n=50, ad esempio, il procedimento di setacciatura si conclude con il numero 7 perché 7 è il massimo primo il cui quadrato non supera 50; si può provare che il procedimento di setacciatura per ricercare i primi fino a un certo numero n cessa sempre quando si supera la radice quadrata di n. Ogni numero a del setaccio iniziale, contenente tutti i numeri naturali non superiori a un dato n, cade dal setaccio che corrisponde al più piccolo dei suoi divisori primi.

Se indichiamo con p il più piccolo divisore primo di a si ha:

a=pr con rp.

Se ne deduce che a=prpp=p2, da cui p è sempre minore o uguale alla radice quadrata di a.

Una implementazione dell'algoritmo di Eratostene in Haskell che calcola l'n-esimo numero primo:

-- Una lista infinita di numeri primi prodotta
-- attraverso il metodo del crivello di Eratostene.
crivello :: [Int]
crivello = crivello' [2..]
  where
    crivello' :: [Int] -> [Int]
    crivello' (p:ps) = p : crivello' [i | i <- ps, mod i p /= 0]
    crivello' _ = undefined

-- Estrai il n-esimo numero primo.
eratostene :: Int -> Int
eratostene n = crivello !! n

Esempio

Per trovare tutti i numeri primi minori di 30, si può procedere come segue:

  • Scrivere la lista di tutti i numeri interi da 2 a 30:
  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
  • Cancellare dalla lista i multipli di 2:
  2  3     5     7     9    11    13    15    17    19    21    23    25    27    29
  • Il primo numero della lista dopo il 2 è il 3; cancellare dalla lista i multipli di 3:
  2  3     5     7          11    13          17    19          23    25          29
  • Il primo numero della lista dopo il 3 è il 5; cancellare dalla lista i rimanenti multipli di 5:
  2  3     5     7          11    13          17    19          23                29
  • Il primo numero della lista dopo il 5 è il 7: non essendoci più suoi multipli, i numeri restanti sono i numeri primi cercati.


Altri progetti

Template:Interprogetto

Collegamenti esterni

Template:Collegamenti esterni

Template:Algebra Template:Teoria dei numeri Template:Portale