I numeri primi di Mersenne e di Fermat Di Cristiano Armellini, [email protected] I numeri primi di Mersenne sono i numeri primi generati dalla formula 2 1. Ovviamente non tutti gli interi m generano un numero M(m) che è primo. Si prova che condizione necessaria (ma non sufficiente per m affinché M(m) sia primo è che sia primo il numero m. Di seguito indichiamo il codice sorgente di alcuni programmi in JAVA e in PARI/GP per la ricerca dei primi di Mersenne. L’uso del PARI/GP e del JAVA è dovuto al fatto che con questi linguaggi possiamo manipolare numeri interi di grandi dimensioni Programmi per trovare i numeri primi di Mersenne Applicativo in Java package mersenne; import java.math.BigDecimal; import java.math.BigInteger; import java.math.*; public class Main { public static void main(String[] args) { int j =1; BigInteger mers = new BigInteger("2"); BigInteger merse = new BigInteger("2"); BigInteger un = new BigInteger("1"); while (j < 1000) { j = j+2; merse=(mers.pow(j)).subtract(un); if (merse.isProbablePrime(10000)) { System.out.print(merse); System.out.print("-"); System.out.println(j); } } } } Applicativo in PARI/GP Prima versione {mersenne() = n = 1; while (n < 100 , if(isprime(2^n-1), print("---"); print(2^n-1); print(n); print("---")); n =n+2); } Seconda versione {mersenne2() = n = 1; while (n < 100 , if(isprime(2^(prime(n))-1), print("---"); print(2^n-1); print(n); print("---")); n =n+1); } I numeri primi di Fermat sono quelli esprimibili nella forma 2 1 anche qui non è vero che F(n) è primo per tutti gli n. Analogamente a quanto fatto con i primi di Mersenne riportiamo esempi di applicativi in Java e in PARI/GP per la ricerca dei primi di Fermat: Applicativo in Java package fermat; import java.math.BigDecimal; import java.math.BigInteger; import java.math.*; public class Main { public static void main(String[] args) { int j =1; BigInteger mers = new BigInteger("2"); BigInteger merse = new BigInteger("2"); BigInteger un = new BigInteger("1"); while (j < 1000) { j = j+1; merse=(mers.pow(2.pow(j)).subtract(un); if (merse.isProbablePrime(10000)) { System.out.print(merse); System.out.print("-"); System.out.println(j); } } } } Applicativo in PARI/GP {fermat() = n = 1; while (n < 100 , if(isprime(2^(2^n)-1), print("---"); print(2^n-1); print(n); print("---")); n =n+1); } Ancora non sappiamo se i primi di Fermat e/o di Mersenne sono finiti o infiniti. Per trovare nuovi primi di Mersenne e/o di Fermat occorre l’impiego di calcolatori particolarmente potenti che lavorino per molti mesi (anche anni). L’ultimo numero di Mersenne di 10 milioni di cifre è stato scoperto nel 2006 grazie al famoso programma GIMPS, un software di calcolo distribuito ottimizzato per questo scopo. I programmi che io ho scritto potranno dare qualche utile risultato solo se implementati in supercalcolatori multiprocessore. Un vecchio algoritmo di fattorizzazione 1 1 4 1 4 0 0 1 4 0 1 4 1 4 4 2 1 2√ 1 2√ 0 , 4 4 K intero Programma per generare primi in PARI/GP di qualunque dimensione {primi()= n = 1000; passo = 1; inizio = 9999999999999999999999999999999999; primo = inizio +2; passo = passo+2; while(passo < n, if(isprime(primo), print(primo)); passo = passo+2; primo = primo+2); } Con questo semplice applicativo in PARI/GP si possono generare n numeri primi consecutivi a partire da un numero dispari iniziale. Il numero iniziale dispari può essere di qualunque dimensione