Alla ricerca dei numeri primi di Fermat

Alla ricerca dei numeri primi di Fermat
Di Cristiano Armellini, [email protected]
I numeri primi di Fermat sono i numeri aventi la forma
primo:
2
1 : per alcuni valori interi di n F(n) è
Esempi notevoli già noti a Fermat:
F(0) =3,
F(1)= 5
F(2)= 17
F(3) = 257
F(4) = 65537
Non sono noti altri primi anche perché F(n) cresce troppo rapidamente per essere facilmente calcolato
anche dai computer più potenti del mondo. Ad oggi non sappiamo nemmeno se l’elenco dei numeri primi
in questa forma sia finito o infinito. Ricordiamo alcuni importanti risultati sui numeri primi di Fermat:
Algoritmo di calcolo per F(n)
1
0
1 ….
1
2
Test di Pepin
1
è
|3
1
Proprietà dei primi di F(n)
Se F(n) è composto allora i suoi fattori primi sono sempre esprimibili nella forma 2
intero positivo.
!
1 per qualche k
Lo scopo di questo articolo è quello di proporre il codice di alcuni programmi scritti in Python e in PARI/GP
che ci possono aiutare a calcolare e a trovare i primi di Fermat (è indispensabile l’uso di un
supercalcolatore) e nel caso che F(n) non fosse primo trovare se possibile i suoi fattori.
Programma in Python per cercare i primi di Fermat con il test di Pepin
import math;
def primifermat(n):
M = 2**n;
F = 2**M+1;
k = 3**((F-1)/2) +1;
if k/F == math.floor(k/F):
print ("n", n);
print (F, "primo");
else:
print ("n=", n);
print (F, "non è primo");
Osservazioni :
•
•
•
La funzione math.floor può essere sostituita con la funzione int
if k/F == math.floor(k/F) può essere sostituito con mod(k, F) == 0 o con math.fmod(k, F) == 0:
l’operatore potenza ** può essere sotituito con la funzione math.pow(x, y)
con sagemath.org il codice cambia leggermente
import math;
def primifermat(n):
M = 2**n;
F = 2**M+1;
k = 3**((F-1)/2) +1;
if mod(k, F) == 0:
print "n=", n;
print F, "primo";
else:
print "n=", n;
print F, "non è primo";
In PARI/GP (primalità con il test di Pepin)
{primifermat(n) = local (k);
M = 2^n;
F = 2^M+1;
K = 3^((F-1)/2)+1;
if (K/F == floor(K/F), "primo", "non primo");
}
Nel caso che per qualche n , F(n) non sia primo si può cercare con la funzione
import math;
def fattorifermat(n):
M = 2**n;
F = 2**M +1;
K = 1;
W = 2*K*M+1;
while (F/W != math.floor(F/W) ) or W <= math.floor(math.sqrt(F)):
K = K+1;
W =2* K*M+1;
print(W);
print(F/W);
E in PARI/GP
{fattorifermat(n) = local (k);
M = 2^n;
F = 2^M+1;
K = 1;
W = 2*K*M+1;
while ( (F/W != floor(F/W)) || W < floor(sqrt(F)), K=K+1; W = 2*K*M+1);
print (W);
print(F/W);
}
In questi due ultimi codici ho inserito anche una condizione che mi permette di verificare anche la primalità
del numero di Fermat: nel caso di numeri primi infatti il programma manda in video la scomposizione
banale. Può essere impiegato in logo del test di Pepin perché usa numeri più piccoli anche se è più lento.
Negli ultimi due algoritmi mettendo l'and al posto dell'or si velocizza il calcolo ma nel caso di primi
nell'output viene stampato un numero decimale segno che il numero di Fermat in esame è primo.