Autor Tema: Programa en JAVA que calcule los 4 primeros primos de MERSENNE

0 Usuarios y 1 Visitante están viendo este tema.

08 Septiembre, 2015, 03:19 pm
Leído 2073 veces

ismates

  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
Hola, buenas. No consigo que me salga este programa.

Se le llama primo de Mersenne a un número primo de la forma \( 2^n - 1 \) . Haz un programa que de los cuatro primeros números primos de Mersenne.

He hecho esto, pero está mal.

Código: [Seleccionar]
package org.pc.sesion16;

public class primoMersenne {

public static boolean esPrimo(double n) {

int divisor = 3;
if (n % 2 == 0 && n != 2) {
return false;
} else {
while (divisor <= Math.sqrt(n)) {
if (n % divisor == 0)
return false;
divisor += 2;

}

}

return true;
}

public static void main(String[] args) {

// supongamos que queremos los cuatro primeros
// un primo es de Mersenne si es de la forma 2^n -1
System.out
.println("Listado de los cuatro primeros primos de Mersenne:");
int n = 1;
for (int i = 0; i < 4; n++) {
if (esPrimo(Math.pow(2, n) - 1)) {
System.out.println(Math.pow(2, n) - 1);
i++;
}
}

}

}




Gracias.

08 Septiembre, 2015, 04:45 pm
Respuesta #1

feriva

  • Matemático
  • Mensajes: 8,989
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)


Hola. En Java no he programada nada, en Javascript sí, alguna cosa.

Pero cuando te dicen eso se supone que no sabes cuál es el “n” para el cuarto primo de Mersenne, que es 7. Si en el bucle for haces que se incremente “n” cuatro veces, nunca va a llegar al cuarto primo.

Tienes que poner, por ejemplo, un bucle infinito y dentro del bucle un contador para que “n” llegue hasta donde necesite, sin limitación; y después una orden condicional if para que cuente los primos y para que, de esa manera, cuando ya tenga cuatro, pare.

Saludos.

09 Septiembre, 2015, 12:40 am
Respuesta #2

luis

  • Aprendiz
  • Mensajes: 304
  • Karma: +1/-0
  • Sexo: Masculino

* el argumento n del método esPrimo, ¿no  debería ser entero?

* el método main me parece correcto. creo que feriva se confunde, porque a pesar de ser correcto en el sentido que parece computar lo que quieres computar, está escrito de una forma confusa.

en fin, lo único que veo raro (y que pueda originar el error) es el tipo del argumento de esPrimo; pero la escritura del programa se puede mejorar mucho.


09 Septiembre, 2015, 12:44 am
Respuesta #3

luis

  • Aprendiz
  • Mensajes: 304
  • Karma: +1/-0
  • Sexo: Masculino
ah, ya veo por qué pusiste n como double.

pero luego escribes n % 2, y creo que ahí java espera que sea entero.

vas a tener que decidir cómo querés ver esa potencia. te sugiero que la dejes como entera y la vayas acumulando a lo largo del programa.

09 Septiembre, 2015, 11:33 am
Respuesta #4

feriva

  • Matemático
  • Mensajes: 8,989
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)


* el método main me parece correcto. creo que feriva se confunde, porque a pesar de ser correcto en el sentido que parece computar lo que quieres computar, está escrito de una forma confusa.



Hola, Luis. Es confuso, efectivamente, pero yo me refiero sólo al bucle del final, creo que no debe programarlo así.

el bucle del final es

Código: [Seleccionar]
int n = 1;
for (int i = 0; i < 4; n++) {
if (esPrimo(Math.pow(2, n) - 1)) {
System.out.println(Math.pow(2, n) - 1);
i++;


Da valor 1 a “n” y después, en el for, “i” va a tomar valores de cero hasta 3, lo que hará en principio que “n” tome valores 2,3,4,5; de momento falta el “n=7” del cuarto primo.

Pero ella incrementa “i” al final del bucle no sé por qué, ahí no lo entiendo, no sé si me pierdo algo.   En cualquier caso, tenemos “i<4”, creo que al menos se puede decir que no dará más de cuatro vueltas, se parará en “i=3”. Y, si no, haga lo que haga, supongo que se para donde sea, ¿no?

Nadie sabe a priori el valor que puede tomar “n” en los primos de Mersenne, si se supiera, se podrían determinar los primos sin necesidad de ordenador; o usando el ordenador sólo como una calculadora para elevar 2 al “n” que fuera y después restarle 1.

Supongamos que le piden los diez primeros primos de Mersenne; el “n” del décimo primo es 89, no puede programar un bucle finito hasta “n=89” porque eso sólo lo sabe si busca el dato en internet; no creo que el ejercicio consista en eso, imagino que tiene que programar un bucle o un contador o lo que sea que pueda dar a "n" todos los valores que hagan falta y hacer que se pare cuando tenga diez primos; el programa es el que tiene que predecir el valor de los “enes”, no el programador, a eso me refiero (suponiendo que yo haya entendido lo que hace el programa en cuanto a los valores que toma "n", que puede ser que no lo interprete bien, claro).



Saludos.

09 Septiembre, 2015, 12:56 pm
Respuesta #5

ismates

  • Nuevo Usuario
  • Mensajes: 9
  • Karma: +0/-0
  • Sexo: Femenino
MUCHAS GRACIAS por vuestra respuesta. He modificado el último bloque y ya si que me sale correcto.

Código: [Seleccionar]
package org.pc.sesion16;

public class PrimoMersenne2 {

public static boolean esPrimo(double n) {
int divisor = 3;
if (n % 2 == 0 && n != 2) {
return false;
} else {
while (divisor <= Math.sqrt(n)) {
if (n % divisor == 0)
return false;
divisor += 2;
}
return true;
}
}

public static void main(String[] args) {

// supongamos que queremos los cuatro primeros
// un primo es de Mersenne si es de la forma 2^n -1
System.out
.println("Listado de los cuatro primeros primos de Mersenne:");
int n = 2;
for (int i = 0; i < 4; n++) {
if (esPrimo(Math.pow(2, n) - 1)) {
System.out.print((Math.pow(2, n) - 1) + "\t");
i++;
}
}

}

}

09 Septiembre, 2015, 05:53 pm
Respuesta #6

luis

  • Aprendiz
  • Mensajes: 304
  • Karma: +1/-0
  • Sexo: Masculino
Da valor 1 a “n” y después, en el for, “i” va a tomar valores de cero hasta 3, lo que hará en principio que “n” tome valores 2,3,4,5; de momento falta el “n=7” del cuarto primo.

Pero ella incrementa “i” al final del bucle no sé por qué, ahí no lo entiendo, no sé si me pierdo algo.

es que usa "i" para contar la cantidad primos que ha encontrado; observa que en el for no se pone "i++" sino "n++". el for incrementa el "i" solamente cuando encuentra un primo, y usa "n" para recorrer todos los naturales. desde mi punto de vista es un muy mal uso del for.


09 Septiembre, 2015, 05:59 pm
Respuesta #7

luis

  • Aprendiz
  • Mensajes: 304
  • Karma: +1/-0
  • Sexo: Masculino
He modificado el último bloque y ya si que me sale correcto.

tres cosas:

* ¿te quedó bien porque modificaste la inicialización de "n" solamente? me llama mucho la atención.

* también me llama la atención que no te genere problemas el double con %, pero bueno, no conozco java y no tengo ganas de buscar en el manual ahora.

* si es un trabajo para aprender a programar, hay por lo menos dos cosas que deberías cambiar: respetar la construcción del for (no es bueno poner "n++" ahí) y evitar el uso de pow (por medio de un acumulador).

saludos

luis

09 Septiembre, 2015, 07:11 pm
Respuesta #8

feriva

  • Matemático
  • Mensajes: 8,989
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)


es que usa "i" para contar la cantidad primos que ha encontrado; observa que en el for no se pone "i++" sino "n++". el for incrementa el "i" solamente cuando encuentra un primo, y usa "n" para recorrer todos los naturales. desde mi punto de vista es un muy mal uso del for.



Ah, ahora lo veo, gracias, Luis.

Saludos.