elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 23:47  


Tema destacado: [Overclocking] Récords de overclock del foro

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java (Moderadores: Debci, Leyer)
| | | |-+  [SRC] isPrime
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SRC] isPrime  (Leído 673 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
[SRC] isPrime
« en: 22 Noviembre 2011, 20:53 »

La mejor forma que se me ocurre de hacerlo:

Código
    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


« Última modificación: 23 Noviembre 2011, 17:55 por Delerice » En línea

madpitbull_99
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.898



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #1 en: 22 Noviembre 2011, 21:02 »

Mi alternativa:

Código
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
if (isPrime(x) == true)

Con esto valdría:

Código
if (isPrime(x))


En línea



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

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

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #2 en: 22 Noviembre 2011, 21:05 »

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

DoEvents! :P
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.830


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #3 en: 23 Noviembre 2011, 10:56 »

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
 
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!¡.
« Última modificación: 23 Noviembre 2011, 11:34 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #4 en: 23 Noviembre 2011, 15:17 »

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

DoEvents! :P
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 708


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #5 en: 23 Noviembre 2011, 16:13 »

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
« Última modificación: 23 Noviembre 2011, 16:25 por RyogiShiki » En línea

Debci
Moderador
***
Desconectado Desconectado

Mensajes: 1.945


Actualizate o muere!


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #6 en: 23 Noviembre 2011, 16:14 »

Muchas gracias por todos vuestros aportes :)

Saludos
En línea

тαптяαпсє


Desconectado Desconectado

Mensajes: 737


Usuario EHN


Ver Perfil
Re: [SRC] isPrime
« Respuesta #7 en: 23 Noviembre 2011, 17:02 »

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
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #8 en: 23 Noviembre 2011, 18:11 »

@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
« Última modificación: 23 Noviembre 2011, 18:32 por Delerice » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.830


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #9 en: 23 Noviembre 2011, 20:13 »

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¡.
« Última modificación: 23 Noviembre 2011, 21:21 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.005



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #10 en: 23 Noviembre 2011, 20:47 »

@BlackZeroX
El link está roto. :-\

DoEvents! :-*
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 708


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #11 en: 23 Noviembre 2011, 22:27 »

@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
2 Java Sun JVMs Spec Ver.2
« Última modificación: 24 Noviembre 2011, 00:21 por RyogiShiki » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.830


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #12 en: 24 Noviembre 2011, 04:13 »

@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.
« Última modificación: 24 Noviembre 2011, 04:22 por BlackZeroX (Astaroth) » En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcion isprime() [Python]
Scripting
isseu 9 1,790 Último mensaje 12 Junio 2009, 13:49
por link87
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines