Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Psyke1 en 22 Noviembre 2011, 20:53 pm



Título: [SRC] isPrime
Publicado por: Psyke1 en 22 Noviembre 2011, 20:53 pm
La mejor forma que se me ocurre de hacerlo:

Código
  1.    public static boolean isPrime(int iNum) { // La forma más rápida que se me ocurre
  2.     if (iNum > 1) {
  3.     if (iNum < 6){
  4.     if (iNum == 2 || iNum == 5 || iNum == 3)
  5.     return true;
  6.     } else if (((iNum & 1) == 1) && ((iNum % 10) != 5)) {
  7. long lRaiz = (long) Math.sqrt(iNum);
  8. long x;
  9.  
  10. for (x=3; x <= lRaiz; x += 2){
  11. if ((iNum % x) == 0)
  12. return false;
  13. };
  14.  
  15. return true;
  16.     }
  17.     }
  18.     return false;
  19.    }

DoEvents! :P


Título: Re: [SRC] isPrime
Publicado por: madpitbull_99 en 22 Noviembre 2011, 21:02 pm
Mi alternativa:

Código
  1. public static boolean esPrimo(int numero) {
  2. int aux;
  3. for (int cont = 2; cont < numero; cont++) {
  4.    aux = numero % cont;
  5.    if (aux == 0) {
  6. return false;
  7.    }
  8. }
  9. return true;
  10. }

No hace falta poner el igual en:

Código
  1. if (isPrime(x) == true)

Con esto valdría:

Código
  1. if (isPrime(x))


Título: Re: [SRC] isPrime
Publicado por: Psyke1 en 22 Noviembre 2011, 21:05 pm
Oukei, me comeré el "==" en esos casos.
Gracias.

DoEvents! :P


Título: Re: [SRC] isPrime
Publicado por: BlackZeroX 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...



Usando la "criba de Eratóstenes" quedaria:

Código
  1.  
  2. public static boolean isPrime(int iNum) {
  3.    long iRaiz = 0;
  4.    long i = 0;
  5.  
  6.    if (iNum <= 1) // Por convenio el 1 no es primo... y no puede ser menor a 1
  7.        return false;
  8.    if (iNum == 2)
  9.        return true;
  10.  
  11.    iRaiz = (long)Math.sqrt(iNum); // Es el NUMERO MAXIMO... segun la "criba de Eratóstenes"
  12.  
  13.    for ( i = 2; i <= iRaiz; i++) {
  14.        if ((iNum % i) == 0) // ¿Es multiplo?
  15.            return false;
  16.    }
  17.    return true;
  18. }
  19.  
  20.  

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!¡.


Título: Re: [SRC] isPrime
Publicado por: Psyke1 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

DoEvents! :P


Título: Re: [SRC] isPrime
Publicado por: RyogiShiki en 23 Noviembre 2011, 16:13 pm
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:
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


Título: Re: [SRC] isPrime
Publicado por: Debci en 23 Noviembre 2011, 16:14 pm
Muchas gracias por todos vuestros aportes :)

Saludos


Título: Re: [SRC] isPrime
Publicado por: тαптяα en 23 Noviembre 2011, 17:02 pm
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


Título: Re: [SRC] isPrime
Publicado por: Psyke1 en 23 Noviembre 2011, 18:11 pm
@RyogiShiki
BlackZeroX me hizo incapié en eso por este bug de vb:
Código:
http://foro.elhacker.net/programacion_visual_basic/vb6_es_tonto-t340559.0.html


Una pequeña prueba para comprobar velocidades.

Código:
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));
    }
}

Código:
Delerice	-> 23523055
BlackZero -> 37029891
madpitbull_99 -> 2040883746

DoEvents! :P


Título: Re: [SRC] isPrime
Publicado por: BlackZeroX en 23 Noviembre 2011, 20:13 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...

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¡.


Título: Re: [SRC] isPrime
Publicado por: Psyke1 en 23 Noviembre 2011, 20:47 pm
@BlackZeroX
El link está roto. :-\

DoEvents! :-*


Título: Re: [SRC] isPrime
Publicado por: RyogiShiki en 23 Noviembre 2011, 22:27 pm
@BlackZeroX
Cierto. Java hace la diferenciación entre Short-circuit evaluations y ORs inclusivos dependiendo el operador que se use.

Antes de decir lo siguiente Aclarar: En Java no es posible tratar valores booleanos como tipos numéricos de ninguna manera. Al igual que los datos numéricos no pueden ser tratados como resultados booleanos (if(1) o cosas opr el estilo).

Por otro lado por lo que dijiste antes me puse a investigar un poco y en Java (y diversos lenguajes) es poco probable que true llegue a ser -1 (tengo entendido que en vb6 es así) pero esto es más dependiente de la JVM y por ejemplo el tamaño de un booleano no está completamente definido, puede tomar valores entre 1bit y 32bits dependiendo de la implementación de la JVM1. lo que imposibilita mapear el valor de true a -1. Ahora en el caso de los Array de booleanos espacios con true son representados con 1 y los espacios con false representados con 02. Y los compiladores o interprétes de ByteCode deben seguir el ismo patrón.

Saludos

1 O'Reilly - Java In A Nutshell, Java Docs (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
2 Java Sun JVMs Spec Ver.2 (http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#22909)


Título: Re: [SRC] isPrime
Publicado por: BlackZeroX en 24 Noviembre 2011, 04:13 am
@RyogiShiki
No hiba a explicarte esto... pero creo que mejor lo hago...

El -1 es independiente de la arquitectura... si es una de 8 bits, 32 bits, 64 bits, etc, inclusive de como este la JVM como ya mensionaste... esto lo digo por que -1 (TODOS los bits Ensendidos en una arquitectura de 32 un int -1 = 4294967295 (int de 32bits)) es el UNICO que cuando aplicas una operacion Not es es unico que satisface como complemento a 0, por ello tambien digo que es el que se toma de manera NATIVA independientemente del lenguaje o arquitectura... en si true vale cualquier valor distinto de 0 independientemente del lenguaje; pero el unico que safisface a 0 como complemento es -1 (4294967295 en un int de 32 bits) y viceversa... ahora me entiendes mejor?.

@BlackZeroX
Antes de decir lo siguiente Aclarar: En Java no es posible tratar valores booleanos como tipos numéricos de ninguna manera. Al igual que los datos numéricos no pueden ser tratados como resultados booleanos (if(1) o cosas opr el estilo).

En eso es cierto java no permite ningun valor numerico como tipo boolean... en teoria deberia... pero la realidad del lenguaje es otra... para mi es un punto debil a mi juicio... java tiene Pros y Contras... como todo lenguaje.

que extraño...



Dulce sLunas!¡l.