elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


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

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
[SRC] isPrime
« 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


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

madpitbull_99
Colaborador
***
Desconectado Desconectado

Mensajes: 1.911



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #1 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))


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



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

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

DoEvents! :P
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #3 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!¡.
« Última modificación: 23 Noviembre 2011, 11:34 am por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #4 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
En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #5 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
« Última modificación: 23 Noviembre 2011, 16:25 pm por RyogiShiki » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


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

Muchas gracias por todos vuestros aportes :)

Saludos
En línea

тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #7 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
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #8 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
« Última modificación: 23 Noviembre 2011, 18:32 pm por Delerice » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [SRC] isPrime
« Respuesta #9 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¡.
« Última modificación: 23 Noviembre 2011, 21:21 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcion isprime() [Python]
Scripting
isseu 9 5,528 Último mensaje 12 Junio 2009, 13:49 pm
por link87
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines