Contingut Números Primos de Sophie Germain

Anuncio
Nombres_primers_de_Sophie_Germain
Contingut
• 1 Números Primos de Sophie Germain
• 2 Aplicación Directa en Generación de Números
Aleatorios
• 3 Algoritmo
• 4 Parametrizaciones
• 5 Tests
• 6 ENGLISH VERSION
• 7 Prime Numbers Of Sophie Germain
• 8 Random Number Generation
• 9 Algorithm
• 10 Settings
Números Primos de Sophie Germain
En teoría de números, un número primo p es un primo Sophie Germain si 2p + 1 es también un número
primo. Por ejemplo, 23 es un número primo de Sophie Germain porque es primo y 2 x 23 +1 = 47, que
también es primo. Estos números llevan el nombre de la matemática francesa Marie-Sophie Germain.
Un número primo de Sophie Germain p > 3 es de la forma 6k-1 o en forma equivalente, p ? 5 (mod 6) porque es su primo coincidente seguro 2p+1. Notamos que ºotra forma para un primo p > 3 es 6k+1 o, en
forma equivalente p ? 1 (mod 6), y ese 3|(2p+1) ? por supuesto excluyendo p del dominio de Sophie
Germain. Esto se puede demostrar trivialmente utilizando aritmética modular.
Está conjeturado que existen infinitos números primos de Sophie Germain, pero igual que la conjetura de los
primos gemelos, no está aún probado.
Los primeros números primos de Sophie Germain son :
2, 3, 5, 11, 23, 29, 41, 53, 83, 89, 113, 131, 173, 179, 191, 233, ?... (secuencia A005384 en O
Los mayores números primos de Sophie Germain conocidos son 648621027630345 × 2^253824?1 y
620366307356565 × 2^253824?1. Ambos tienen 76424 dígitos decimales y fueron encontrados en
Noviembre de 2009 por Zoltán Járai, Gabor Farkas, Timea Csajbok, János Kasza y Antal Járai. El record
precedente había sido batido 6 semanas antes, 607095 × 2^176311?1 con 53081 dígitos, encontrado por Tom
Wu utilizando el programa LLR. Antes de eso el record era 48047305725 × 2^172403?1 con 51910 dígitos,
encontrado por David Underbakke en Enero de 2007 utilizando los programas TwinGen y LLR. Y antes de
eso, el récord pertenecía al mismo equipo del récord de Noviembre 2009, 137211941292195 × 2^171960?1
con 51780 dígitos, encontrado en Mayo de 2006.
Una estimación heurística (llevada a cabo por G. H. Hardy y J. E. Littlewood) para el número de primos de
Sophie Germain existentes menores que n es 2C2 n / (ln n)2 donde C2 es el gemelo primo constante,
aproximadamente 0.660161. Para n = 10^4, esta estimación predice 156 primos Sophie Germain, que tiene
20% de error comparado al valor exacto 190. Para n = 10^7, la estimación predice 50822 que es aún 10%
diferente del valor exacto 56032.
Una secuencia {p, 2p + 1, 2(2p + 1) + 1, ...} de 1 ó más números primos de Sophie Germain, terminando con
un primo que no tiene que ser un Sophie Germain, se llama una cadena de Cunningham de primer tipo. Cada
término de una secuencia así es un número primo de Sophie Germain y un número primo seguro (safe
prime), excepto por el primero y el último.
Contingut
1
Nombres_primers_de_Sophie_Germain
Si un número primo de Sophie Germain p es congruente con 3 (mod 4), entonces su número primo seguro
coincidente 2p+1 será un divisor del número de Marsenne 2^p-1.
Los primos Sophie Germain fueran mencionados en el teatro ?Proof? y en la posterior película.
Aplicación Directa en Generación de Números Aleatorios
Los primos Sophie Germain tienen una aplicación practica en la generación de números pseudo-aleatórios.
La expansión decimal de 1/q producirá una cadena q-1 de dígitos pseudo-aleatórios, si q es el número primo
seguro de un número primo de Sophie Germain p, donde p es congruente con 3, 9, 11 (mod 20). Por esto,
números primos 'aceptables' son 7, 23, 47, 59, 167, 179, etc (correspondiendo a p = 3, 11, 23, 29, 83, 89,
etc.). El resultado es una cadena de tamaño q-1 (incluyendo zeros iniciales); para saber más sobre esto, ver la
secuencia OEIS A000355. Por ejemplo con q=23 se genera los dígitos pseudo-aleatórios 0, 4, 3, 4, 7, 8, 2, 6,
0, 8, 6, 9, 5, 6, 5, 2, 1, 7, 3, 9, 1, 3. Estos dígitos no sirven para objetivos criptográficos, porque se puede
deducir cada uno de ellos a partir de su antecesor en la cadena de dígitos.
Algoritmo
Main
Datos a introducir: 1) cantidad de numeros aleatorios 2) número de decimales que tiene que tener cada uno
de los numeros aleatorios 3) semilla
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int cantidad_números= scan.nextInt();
int número_de_decimales = scan.nextInt();
int semilla = scan.nextInt();
RNG generador = new RNG();
int q=generador.calcular_q(cantidad_números, numero_de_decimales, semilla);
generador.imprimeNum(q, cantidad_números, numero_de_decimales);
}
Random Number Generator
public RNG(){
Calcula el número q necesario para generar un número aleatorio.
public int calcular_q(int lon, int nd, int se){
lon = lon*nd*se;
int S;
lon=(lon-1)/2+1;
for (S=lon;;S++){
if (primo(S)){
if (primo(2*S+1)){
if (S%20 == 3 || S%20 == 9 || S%20 == 11)
return 2*S+1;
}
}
}
}
Devuelve si un número x es primo.
Números Primos de Sophie Germain
2
Nombres_primers_de_Sophie_Germain
public boolean primo(int x){
for(int i=2; i<=Math.sqrt(x); i++){
if (x%i == 0) return false;
}
return true;
}
Imprime por pantalla lon números aleatorios (entre 0 y 1) con nd decimales. Esta parte del programa genera
un vector con todas las cifras decimales del inverso de q (1/q). Va extrayendo cifras de la cadena de nd en nd
para obtener los decimales de cada uno de los números aleatorios hasta obtener la cantidad deseadfa (lon).
public void imprimeNum(int q, int lon, int nd){
lon = lon*nd;
java.math.BigDecimal qf = new java.math.BigDecimal(q);
java.math.BigDecimal r=new java.math.BigDecimal(1);
java.math.BigDecimal resultat = r.divide(qf, lon, BigDecimal.ROUND_FLOOR);
try {
BufferedWriter out = new BufferedWriter(new FileWriter("resultado.txt"));
out.write(""+lon); //escribir la longitud primero
out.newLine();
char[] vecChar = new char[lon];
java.math.BigDecimal m = new java.math.BigDecimal("10");
java.math.BigDecimal sub;
String enter;
for (int i=0; i<lon; i++){
resultat = resultat.multiply(m);
enter = Integer.toString(resultat.intValue());
sub = new java.math.BigDecimal(enter);
resultat = resultat.subtract(sub);
vecChar[i] = enter.charAt(0);
}
System.out.println(vecChar);
for(int j=0; j<lon; ){
System.out.print("0.");
out.write("0.");
for (int k=0; k<nd; k++){
System.out.print(vecChar[j]);
out.write(vecChar[j]);
j++;
}
System.out.println();
out.newLine();
}
} catch (IOException e) {
System.out.println("Error al escribir el fichero " +e.getMessage());
}
}
Parametrizaciones
Las seguintes parametrizaciones han passado los testes de números aleatórios.
Parametrización 1:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 1;
Algoritmo
3
Nombres_primers_de_Sophie_Germain
Parametrización 2:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 2;
Parametrización 3:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 3;
Parametrización 4:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 20;
Parametrización 5:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 5;
Parametrización 6:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 6;
Parametrización 7:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 7;
Parametrizaciones
4
Nombres_primers_de_Sophie_Germain
Parametrización 8:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 8;
Parametrización 9:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 35;
Parametrización 10:
Numeros Aleatorios: 3000;
Dígitos Decimales: 6;
Semilla: 10;
Tests
SEMILLA
1
2
3
20
5
6
7
8
35
10
FREQUENCIES
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
SERIE
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
GAP
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
YULE-WALKER
Si
Si
Si
Si
Si
Si
No
Si
Si
Si
DISTANCIES
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
AUTOCORRELACIO
No (44/50)
No (41/50)
No (44/50)
Si (45/50)
Si (46/50
No (41/50)
No (44/50)
No (44/50)
Si (48/50)
No (41/50)
KOLMOGOROV
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
ENGLISH VERSION
Tests
5
M
Si
Si
Si
Si
Si
Si
Si
Si
N
Si
Nombres_primers_de_Sophie_Germain
Prime Numbers Of Sophie Germain
A number p is a prime number of Sophie Germain if 2p+1 is also a prime number. For example, 23 is a prime
number because 2*23 +1 is 47, and it is a prime number too.
A prime number of Sophie Germain p>3 have the form 6k-1 (or, the same, p?5 (mod 6) ).
Is speculated that there are infinitely prime numbers of Sophie Germain, but like the speculation of twin
prime, are not proved.
Some of the firsts prime numbers of Sophie Germain are:
2, 3, 5, 11, 23, 29, 41, 53, 83, 89, 113, 173?.
Around 1825 Sophie Germain proved that the first case of Fermat's Last Theorem is true for such primes.
The biggest knowed prime numbers are 648621027630345 × 2^253824?1 y 620366307356565 ×
2^253824?1. Both have 76424 decimal numbers and were found in November 2009 for Zoltán Járai, Gabor
Farkas, Timea Csajbok, János Kasza y Antal Járai
Random Number Generation
The prime numbers of Sophie Germain have a practical implementation generating pseudo-random numbers.
The decimal growth of 1/q will build a chain q-1 of pseudo-random digits, if q is the safe prime of a Sophie
Germain prime p, with p congruent to 3,9 or 11 (mod 20).
Sophie Germain primes numbers have a practical application in the generation of pseudo-random numbers.
The decimal expansion of 1/q will produce a stream of q ? 1 pseudo-random digits, if q is the safe prime of a
Sophie Germain prime p, with p congruent to 3, 9, or 11 (mod 20).
These ?suitable? prime numbers q are 7, 23, 47, 59, 167, 179, etc. (corresponding to p = 3, 11, 23, 29, 83, 89,
etc.). The result is a stream of length q ? 1 digits (including leading zeros). So, for example, using q = 23
generates the pseudo-random digits 0, 4, 3, 4, 7, 8, 2, 6, 0, 8, 6, 9, 5, 6, 5, 2, 1, 7, 3, 9, 1, 3.
Note that these digits are not appropriate for cryptographic purposes, as the value of each can be derived
from its predecessor in the digit-stream.
Algorithm
Main
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int cantidad_números= scan.nextInt();
int número_de_decimales = scan.nextInt();
int semilla = scan.nextInt();
RNG generador = new RNG();
int q=generador.calcular_q(cantidad_números, numero_de_decimales, semilla);
Prime Numbers Of Sophie Germain
6
Nombres_primers_de_Sophie_Germain
generador.imprimeNum(q, cantidad_números, numero_de_decimales);
}
Random Number Generator
public RNG(){
Calculate the number q required to generate a random number.
public int calcular_q(int lon, int nd, int se){
lon = lon*nd*se;
int S;
lon=(lon-1)/2+1;
for (S=lon;;S++){
if (primo(S)){
if (primo(2*S+1)){
if (S%20 == 3 || S%20 == 9 || S%20 == 11)
return 2*S+1;
}
}
}
}
Returns whether a number x is prime.
public boolean primo(int x){
for(int i=2; i<=Math.sqrt(x); i++){
if (x%i == 0) return false;
}
return true;
}
Prints lon desired random numbers (between 0 and 1) with nd places.
public void imprimeNum(int q, int lon, int nd){
lon = lon*nd;
java.math.BigDecimal qf = new java.math.BigDecimal(q);
java.math.BigDecimal r=new java.math.BigDecimal(1);
java.math.BigDecimal resultat = r.divide(qf, lon, BigDecimal.ROUND_FLOOR);
try {
BufferedWriter out = new BufferedWriter(new FileWriter("resultado.txt"));
out.write(""+lon); //escribir la longitud primero
out.newLine();
char[] vecChar = new char[lon];
java.math.BigDecimal m = new java.math.BigDecimal("10");
java.math.BigDecimal sub;
String enter;
for (int i=0; i<lon; i++){
resultat = resultat.multiply(m);
enter = Integer.toString(resultat.intValue());
sub = new java.math.BigDecimal(enter);
resultat = resultat.subtract(sub);
vecChar[i] = enter.charAt(0);
}
System.out.println(vecChar);
for(int j=0; j<lon; ){
System.out.print("0.");
out.write("0.");
for (int k=0; k<nd; k++){
System.out.print(vecChar[j]);
out.write(vecChar[j]);
Algorithm
7
Nombres_primers_de_Sophie_Germain
j++;
}
System.out.println();
out.newLine();
}
} catch (IOException e) {
System.out.println("Error al escribir el fichero " +e.getMessage());
}
}
Settings
Setting 1: Random Numbers: 3000; Decimal Digits: 6; Seed: 1;
Setting 1: Random Numbers: 3000; Decimal Digits: 6; Seed: 20;
Settings
8
Descargar