I numeri primi di Mersenne e di Fermat

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