Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: isseu en 5 Junio 2009, 02:14 am



Título: Funcion isprime() [Python]
Publicado por: isseu en 5 Junio 2009, 02:14 am
Aprendiendo Python y tratando de descubrir alguna forma por mi solo para sacar comprobar si un numero es primo cree esta funcion que compare con otras que aparecen en la red y puedo decir que es mas rapida y gasta menos recursos que las demas
Sacar Primeros 100 digitos Primos:

Código
  1. #/usr/bin/env phyton
  2. import math
  3.  
  4. def isprime(a):
  5. d = True
  6. if a==0 or a==1:
  7.  d=False
  8. b = 2
  9. c = math.sqrt(a)
  10. while b <= c and d == True:
  11.  if a%b==0:
  12.   d = False
  13.  b+=1
  14. return d
  15.  
  16. a=1
  17. while(a<100):
  18. if(isprime(a)==True):
  19.  print str(a)
  20. a+=2


Título: Re: Funcion isprime() [Python]
Publicado por: pucheto en 5 Junio 2009, 03:14 am
Pone a+=2 en vez de a+=1.. los primos nunca van a ser pares...
De todas formas la diferencia es nula, apenas cambia en 0.001 el tiempo


Título: Re: Funcion isprime() [Python]
Publicado por: isseu en 5 Junio 2009, 03:18 am
cualquier milesima vale
muy buena idea


Título: Re: Funcion isprime() [Python]
Publicado por: pucheto en 5 Junio 2009, 03:50 am
Estaba al pedo y me tente :P
Código
  1. import math
  2. import time
  3.  
  4. def isprime(a):        #verifica si a es primo
  5.    d = True
  6.    if a==0 or a==1:
  7.        d=False
  8.    b = 2
  9.    c = math.sqrt(a)
  10.    while b <= c and d == True:
  11.        if a%b==0:
  12.            d = False
  13.        b+=1
  14.    return d
  15.  
  16.  
  17. def loop():            #mientras el tiempo transcurridosea menor q 5 busca primos
  18.    a=1
  19.    count = 0
  20.    now = 0
  21.    start = time.time()
  22.  
  23.    while((now-start)<5):
  24.        if(isprime(a)==True):
  25.            count += 1
  26.        now = time.time()
  27.        a+=2
  28.    return count
  29.  
  30. def main():            #Llama 3 veces a loop() y hace un promedio de los resultados
  31.    runs = 3
  32.    s = 0
  33.    for i in range(0,runs):
  34.        s += loop()
  35.        print "Run",i+1
  36.    s = s/runs
  37.    print "Score: ",s
  38.  
  39. print "Cerra todos los programas q tengas abiertos..."
  40. raw_input("Despues presiona cualquier tecla...")
  41. main()
  42.  
  43.  

39210 primos en 5 segundos! (CPython 2.6)
Haber q resultados les da a los demas..


Título: Re: Funcion isprime() [Python]
Publicado por: pucheto en 5 Junio 2009, 03:56 am
43752 primos en 5 seg si uso IronPython... curioso este ultimo... (el iron python hace alguna optimizacion just in time?)


Título: Re: Funcion isprime() [Python]
Publicado por: h0oke en 5 Junio 2009, 04:01 am
Mmm

aver te dejo esta función para que la compares, es c++ pero puedes adaptarla ya que no se python...

Código
  1. bool EsPrimo(int x)
  2. {
  3.      int PD=2;
  4.      while((PD <= X/2)&&(X%PD!= 0)//*
  5.      {
  6.            PD++;
  7.      }
  8.      if((PD > X/2)&&(X!=1)){return 1;}//*
  9. }

*X/2 tiene que ser división ENTERA.


Título: Re: Funcion isprime() [Python]
Publicado por: h0oke en 5 Junio 2009, 04:20 am
Al parecer leyendo algo de código, el mio quedaría algo asi:

Código
  1. def EsPrimo(x):
  2.     e=FALSE
  3.     PD=2
  4.     while PD<=x//2 and  x%PD!=0:
  5.          PD=PD+1
  6.     if PD>x//2 and x!=1:
  7.          e=TRUE
  8.     return e


Título: Re: Funcion isprime() [Python]
Publicado por: pucheto en 5 Junio 2009, 04:27 am
no pongas PD<=(x/2)... combiene mas usar PD <= math.sqrt(x)
Los números compuestos son divisibles por algún primo menor q su raiz cuadrada.

Para no calcular la raiz tantas veces podes almacenarla en una variable auxiliar.


Título: Re: Funcion isprime() [Python]
Publicado por: isseu en 6 Junio 2009, 15:46 pm
muy bueno el code pucheto, estaba aprendiendo Python y no encontraba mucha info sobre lo de Time,
¿SOLO 17818? (con programas abiertos)


Título: Re: Funcion isprime() [Python]
Publicado por: link87 en 12 Junio 2009, 13:49 pm
mi versión:
Código:
import time, math

def calcularPrimos(tiempo):
    primos = [2]
    start = now = time.time()
    n = 3
    while (now-start) < tiempo :
        es_primo = True
        raiz = math.sqrt(n)
        for p in primos:
            if p > raiz :
                break
            if (n % p) == 0 :
                es_primo = False
                break
        if es_primo:
            primos.append(n)
        now = time.time()
        n += 2
    return primos

pr = calcularPrimos(5) #calculamos primos durante 5 segundos
print len(pr)

89684 primos en 5 segundos. En linux con firefox abierto.

Edit: por cierto, como se hace para que sombree la sintaxis