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