[SRC] isPrime

Iniciado por Psyke1, 22 Noviembre 2011, 20:53 PM

0 Miembros y 2 Visitantes están viendo este tema.

Psyke1

La mejor forma que se me ocurre de hacerlo:

Código (java) [Seleccionar]
    public static boolean isPrime(int iNum) { // La forma más rápida que se me ocurre
    if (iNum > 1) {
    if (iNum < 6){
    if (iNum == 2 || iNum == 5 || iNum == 3)
    return true;
    } else if (((iNum & 1) == 1) && ((iNum % 10) != 5)) {
long lRaiz = (long) Math.sqrt(iNum);
long x;

for (x=3; x <= lRaiz; x += 2){
if ((iNum % x) == 0)
return false;
};

return true;
    }
    }
    return false;
    }


DoEvents! :P

madpitbull_99

Mi alternativa:

Código (java) [Seleccionar]
public static boolean esPrimo(int numero) {
int aux;
for (int cont = 2; cont < numero; cont++) {
    aux = numero % cont;
    if (aux == 0) {
return false;
    }
}
return true;
}


No hace falta poner el igual en:

Código (java) [Seleccionar]
if (isPrime(x) == true)

Con esto valdría:

Código (java) [Seleccionar]
if (isPrime(x))



«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

Psyke1

Oukei, me comeré el "==" en esos casos.
Gracias.

DoEvents! :P

BlackZeroX

#3
Recuerda que false siempre tiene un valor de 0... y por obvias razones true es igual a -1 (complemento) o cualquier otro numero distinto a 0... pero en si true es -1 para que aplique correctamente el not...




Usando la "criba de Eratóstenes" quedaria:

Código (java) [Seleccionar]


public static boolean isPrime(int iNum) {
   long iRaiz = 0;
   long i = 0;

   if (iNum <= 1) // Por convenio el 1 no es primo... y no puede ser menor a 1
       return false;
   if (iNum == 2)
       return true;

   iRaiz = (long)Math.sqrt(iNum); // Es el NUMERO MAXIMO... segun la "criba de Eratóstenes"

   for ( i = 2; i <= iRaiz; i++) {
       if ((iNum % i) == 0) // ¿Es multiplo?
           return false;
   }
   return true;
}



P.D.: En este lenguaje si sirve bien el or para el if es decir "||" el or binario es solo "|"... el or de vb6 siempre se trata como binario... en java no, esa es la gran ventaja.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Psyke1

Haces prácticamente lo mismo que yo. :silbar:
¿Entonces que? ¿emigramos de el foro de vb al de java? :xD

DoEvents! :P

RyogiShiki

#5
Cita de: BlackZeroX (Astaroth) en 23 Noviembre 2011, 10:56 AM
Recuerda que false siempre tiene un valor de 0... y por obvias razones true es igual a -1 (complemento) o cualquier otro numero distinto a 0... pero en si true es -1 para que aplique correctamente el not...

A que te refieres con esto? Lo que dices está ligado a Java? o no tiene nada que ver? Porque si está ligado a Java entonces eso no es así.

tampoco se mucho que quieres decir con esto:
Cita de: BlackZeroX (Astaroth) en 23 Noviembre 2011, 10:56 AM
P.D.: En este lenguaje si sirve bien el or para el if es decir "||" el or binario es solo "|"... el or de vb6 siempre se trata como binario... en java no, esa es la gran ventaja.

En Java "|" y "||" son muy diferentes usados en expresiones que retornan un valor Booleano. Tal ve te refieras a eso mismo que digo, pero no se.

Saludos


Debci

Muchas gracias por todos vuestros aportes :)

Saludos

тαптяα

Ya viste que no es la forma más rápida.

De hecho se podría poner un ternario dentro del for en el código de madpitbull

Psyke1

#8
@RyogiShiki
BlackZeroX me hizo incapié en eso por este bug de vb:
http://foro.elhacker.net/programacion_visual_basic/vb6_es_tonto-t340559.0.html



Una pequeña prueba para comprobar velocidades.


public class Hello {
   public static boolean isPrime(int iNum) { // La forma más rápida que se me ocurre
    if (iNum > 1) {
    if (iNum < 6){
    if (iNum == 2 || iNum == 5 || iNum == 3)
    return true;
    } else if (((iNum & 1) == 1) && ((iNum % 10) != 5)) {
long lRaiz = (long) Math.sqrt(iNum);
long x;

for (x=3; x <= lRaiz; x += 2){
if ((iNum % x) == 0)
return false;
};

return true;
    }
    }
    return false;
   }

   public static boolean isPrimeB(int iNum) {
       long iRaiz = 0;
       long i = 0;
   
       if (iNum <= 1) // Por convenio el 1 no es primo... y no puede ser menor a 1
           return false;
       if (iNum == 2)
           return true;
   
       iRaiz = (long)Math.sqrt(iNum); // Es el NUMERO MAXIMO... segun la "criba de Eratóstenes"
   
       for ( i = 2; i <= iRaiz; i++) {
           if ((iNum % i) == 0) // ¿Es multiplo?
               return false;
       }
       return true;
   }

   public static boolean esPrimo(int numero) {
    int aux;
    for (int cont = 2; cont < numero; cont++) {
       aux = numero % cont;
       if (aux == 0) {
    return false;
       }
    }
    return true;
   }
   
   public static void main (String args[]) {
    long lIni;
    int x;
   
    //Delerice
    lIni=System.nanoTime();
    for (x=1; x<100001;x++){
    isPrime(x);
    }
    System.out.println("Delerice\t-> "+ (System.nanoTime() - lIni));
   
    //BlackZero
    lIni=System.nanoTime();
    for (x=1; x<100001;x++){
    isPrimeB(x);
    }
    System.out.println("BlackZeroX\t-> "+ (System.nanoTime() - lIni));
   
    //madpitbull_99
    lIni=System.nanoTime();
    for (x=1; x<100001;x++){
    esPrimo(x);
    }
    System.out.println("madpitbull_99\t-> "+ (System.nanoTime() - lIni));
   }
}


Delerice -> 23523055
BlackZero -> 37029891
madpitbull_99 -> 2040883746


DoEvents! :P

BlackZeroX

#9
Cita de: Delerice en 23 Noviembre 2011, 18:11 PM
Una pequeña prueba para comprobar velocidades.

Nunca cambiaras verdad?...

* Yo que tu no me procuparia mucho por la velocidad en java... por ahora.

http://foro.elhacker.net/programacion_visual_basic/vb6_es_tonto-t340559.0.html

Para corregir ese problema aqui se usa || en operaciones binarias se usa |, creo que no se habia entendio bien... y lo del boolean es por LOGICa y Norma general que cualquier valor Diferente de 0 es true pero en si un true Nativamente sera con valor -1 (para que aplique correctamente el operador NOT(!))... ver tabla de verdad de not (Y esto segun tengo entendido es en TODOS los lenguajes).
Es lo mismo que dije arriba...

Cita de: Delerice en 23 Noviembre 2011, 15:17 PM
Haces prácticamente lo mismo que yo. :silbar:
¿Entonces que? ¿emigramos de el foro de vb al de java? :xD

* Claro que si, por el metodo de la criba es mas rapido!¡.
* Ya estas!¡.

Dulces Lunas1¡.
The Dark Shadow is my passion.