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.