Un metodo per trovare i numeri primi

Un metodo poco pratico per trovare tutti i numeri primi
Di Cristiano Armellini, [email protected]
Partiamo da primi due numeri primi dispari p1  3, p2  5
(tutti i numeri primi sono
dispari tranne il 2). Il successivo numero dispari è 7 ma 7 è primo ? Per saperlo dobbiamo
vedere se esistono due interi positivi a, b
tali che 3a 5b  7 . Dovrà però essere (Int è la
funzione parte intera):
0  a  Int (log 3 7)  1
0  b  Int (log 5 7)  1
Quindi la relazione 3a 5b  7 non può essere verificata per a,b che possono assumere
solo i valori 0, 1 allora possiamo dire che 7 è primo.
In alternativa per diminuire le dimensioni dei calcoli si può passare ai logaritmi ovvero
a ln(3)  b ln(5)  ln(7)
0  a  Int (log 3 7)  1
0  b  Int (log 5 7)  1
Il successivo numero dispari dopo il 7 è il 9 ma 9 è primo ? Seguendo la procedura
descritta sopra dobbiamo vedere se l’equazione 3a 5b 7 c  9
ha soluzioni intere nelle
variabili a, b, c con i seguenti vincoli:
0  a  Int (log 3 9)  2
0  b  Int (log 5 9)  1
0  c  Int (log 7 9)  1
Ovviamente
a = 2, b = c = 0 è l’unica soluzione, quindi 9 non è primo. Per il teorema
fondamentale dell’aritmetica l’equazione a variabili intere deve avere sempre una sola
soluzione nel caso che il numero da verificare sia composto o non averne nel caso che sia
primo. Al progredire della lista dei primi i calcoli si fanno sempre più complessi e
articolati e questo dimostra che il metodo è meno efficiente di molti altri sistemi
compreso il crivello di Eratostene anche se è possibile migliorarlo e raffinarlo come ad
esempio si potrebbe trascurare le potenze del 5 in quanto sappiamo che tutti i numeri che
terminano per 5 sono divisibili per 5. Anche qui per diminuire le dimensioni dei numeri in
gioco possiamo facilmente passare ai logaritmi ottenendo:
ln(9)  a ln(3)  b ln(5)  c ln(7)
0  a  Int (log 3 9)  2
0  b  Int (log 5 9)  1
0  c  Int (log 7 9)  1
Decisamente migliore il metodo secondo cui si parte da due numeri primi dispari:

P1= 3, P2 = 5

Si calcola il prodotto Q = P1*P2 = 15

Se prende il successivo numero dispari dopo il 5 che è 7

Poi si calcola con l’algoritmo di Euclide MCD(Q, 7): se è pari a 1 allora vuol dire
che 7 è primo altrimenti non lo è ovvero è composto

Nel nostro caso MCD(15, 7)=1 quindi 7 è primo, P3 = 7

A questo punto aggiorniamo Q = (P1*P2)*P3= 15*7 = 105

Ripetiamo il procedimento con il successivo numero dispari dopo il 7 che è il 9

MCD(105, 9)= 3 quindi 9 non è primo allora Q (produttoria dei primi) rimane 105 e
si va avanti con il successivo candidato dispari, l’11. ecc..
Lo svantaggio di questo metodo è il fatto che la produttoria dei primi Q = P1*P2*P3...
cresce in modo molto evidente e quindi anche se è facile fare prodotti di numeri anche
molto grandi abbiamo bisogno di programmi speciali per maneggiare interi di queste
dimensioni (es Python, Pari/GP). Sapendo che in un numero composto dispari n il fattore
più piccolo deve essere minore della radice quadrata del numero n (per verificare che n è
primo basta provare che non ha fattori tra 2 e la radice quadrata di n) possiamo scrivere:
n primo sse MCD(n, [int n ]!!)  1 o anche MCD(int n , [int n ]!!)  1 (altrimenti il
MCD dà un fattore di n=pq) dove con il simbolo !! intendiamo il semifattoriale per
numeri dispari per avere il prodotto di tutti i dispari minori della parte intera della
redice quadrata di n (sostituibile in modo superfluo con il fattoriale) mentre il MCD
si calcola con l’algoritmo di Euclide costituito da semplici somme e sottrazioni.
Ancora una volta la difficoltà è calcolare il semifattoriale (o anche il fattoriale) di un
numero intero che però può essere trovato passo dopo passo, numero primo dopo numero
primo, sfruttando i risultati dei calcoli precedenti.