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