Ayuda con 20 primeros numeros perfectos

carlos1990
08 de Marzo del 2004
Necesito crear una aplicacion k me permita hallar los 20 primeros numeros perfectos, un numero perfecto es de la forma 2^n*(2^n-1) cuando (2^n-1) es un numero primo, y consigo hallar los 8 primeros, xo los siguientes ya no les haya. ¿Qué puedo hacer para acelerar la ejecucion?¿alguna otra alternativa?


Aquí stá mi codigo:

void mostrarPerfectos(){
double n=2;
int i=0;
while (i<20){
if (esPrimoValido(n)){
System.out.println(Math.pow(2,n-1)*(Math.pow(2,n)-1));
i++;
n++;
}
else{
n++;
}
}
}







boolean esPrimoValido(double n){//determina si (2^n)-1 es primo
boolean exito=false;
if (esPrimo(Math.pow(2,n)-1)){
exito=true;
}
return exito;



}

boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<n/2+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}



}

leroteje
08 de Marzo del 2004
Hola Carlos1990!
Yo tuve un ejercicio parecido!!

Estuve mucho tiempo dandole vueltas pero no conseguí mucho.

El único consejo que te puedo dar es, que en lugar de comprobar todos los números, compruebes, solo los números impares. Excepto el 2, los restantes números primos son todos impares.

Así que te recomiendo que tratando el 2 como un caso inicial, compruebes a continuación los numero impares. En lugar de n++, tendra que hacer n +=2, a partir de n = 3.

Otra mejora es esta, en la funcion esPrimo

boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<Math.ceil(Math.sqrt(n))+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}

es decir, en lugar de comprobar hasta n/2+1, comprobar hasta la raiz cuadrada de n redondeado hacia arriba. Un ejemplo para que lo entiendas, la raiz de 100 es 10. Por tanto comprobariamos si 100 es primo hasta que n = 11, por ejemplo dividirlo por 25, sería los mismo que por 4, ya hubieramos salido del bucle en n = 4, así que no hace falta seguir.

Bueno no se si me he explicado bien, pero se que es correcto porque es la corrección que tuve yo en mi ejercicio, jejeje.

Espero que te haya servido! Ysi tienes dudas, me lo dices, :-D !!

Saludos!!