Funzioni che generano molti numeri primi ei software che

annuncio pubblicitario
Funzioni che generano molti numeri primi e i software che generano
numeri primi al computer
,
2,3,5,11,17,41; 0 2
41, 1, 2, 3, … . , 40
79 1601, 1, 2, 3, … . , 79
2 ; 2, 3, 5, 11, 29; 0 1
Sono tutte funzioni che generano numeri primi sotto le condizioni restrittive indicate nelle formule. Da
verifiche di tipo statistico fatte al computer risulta che in ogni caso queste funzioni continuano a generare
una gran quantità di numeri primi (non solo numeri primi) anche al di fuori dei limiti descritti, quindi
potrebbero essere usate per tentare di trovare i fattori di numeri primi molto grandi. A queste possiamo
aggiungere i numeri primi di Mersenne e di Fermat ovvero:
2 +1, 2 1
1
Per realizzare delle tabelle di numeri primi al computer possiamo usare specifici software come il PARI/GP
e il Mathematica
In PARI/GP:
{primi1() = local(i);
i = 2;
while(i<=100,i++;write("primi1.txt", print(prime(i))));
return(1);}
{primi2() = local(i);
i = 3;
while(i<=100,i = i+2; if(isprime(i), write("primi2.txt",i)));
return(1);}
Mentre in Mathematica abbiamo la funzione
Table[Prime[n], {n, 1, 100}]
Oppure per verificare se un numero è primo o no PrimeQ[numero]
2
Per fattorizzare numeri interi anche molto grandi possiamo ancora usare il Mathematica :
scomposizione = FactorInteger[numero]
In PARI/GP invece per fattorizzare un numero si usa il comando
factor(numero)
e la funzione isprime(numero) per verificare se un numero è primo o no (test di primalità);
nextprime(numero) e precprime(numero) indicano invece rispettivamente il successivo e il precedente
numero primo di un numero dato. Per finire prime(i) indica semplicemente l’i-esimo numero primo.
3
Numeri primi in Java
Per generare numeri primi in JAVA (potentissimo linguaggio di programmazione che consente di gestire
grandi numeri grazie alle librerie java.math.biginteger e java.math.bigdecimal) possiamo usare il seguente
codice:
package primi2;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.*;
public class Main {
public static void main(String[] args) {
long j =1;
BigInteger inizio = new BigInteger("3");
BigInteger passo = new BigInteger("2");
inizio = inizio.add(passo);
System.out.println(inizio);
while(j < 100000){
if( inizio.isProbablePrime(100000000))
System.out.println(inizio);
inizio = inizio.add(passo);
j = j+1;
}
j = j+1;
inizio = inizio.add(passo); }
}
Il programma altro non fa che considerare tutti i numeri dispari e poi verifica se sono dei numeri primi. In
caso affermativo li stampa a video altrimenti passa al numero primo successivo
4
Fattorizzare grandi numeri con JAVA
Con questo codice realizziamo un potente programma di fattorizzazione in JAVA che però richiede di sapere
in anticipo l’ordine di grandezza dei fattori in bit (es : 512- nel nostro caso abbiamo messo 40 per
semplificare e 187 il numero da fattorizzare). Quando viene stampato il resto zero abbiamo trovato un
fattore. Il programma altro non fa che generare numeri casuali primi di una certa grandezza e quindi
verifica se sono fattori del numero p:
package fattore;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.*;
import java.security.*;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
BigInteger p = new BigInteger("187");
long i = 2;
BigInteger fatt = BigInteger.probablePrime(40 ,new SecureRandom());
while( i < 100 ){
fatt = BigInteger.probablePrime(40 , new SecureRandom());
System.out.println("fattore" + fatt);
System.out.println("resto" + p.mod(fatt));
}
}
}
5
Scarica