Por otro lado, el algoritmo se puede mejorar un poco. Hay métodos muy
optimizados para calcular números primos, pero sin irnos a matemáticas
superiores, podemos mejorar tu proceso. Un número es primo si y sólo
si no es divisible exactamente por todos los números menores que él
(sin contar el 1), y por tanto  si no es divisible exactamente por
todos los primos menores que él (sin contar el 1). Por tanto, basta
con que comprobemos sólo los números primos (que ya has calculado).
Además, sabemos que los números pares no son primos, por lo que
también nos los podemos saltar.

Calculando todos los primos desde 2 hasta n tenemos (spoiler):

http://pastebin.com/fMRH5xKK

Este programa tarda 0.3 s en calcular los primos hasta 15 000, y 13 s
en encontrar los 13 843 primos menores que 150 000. Tu versión tarda
unos 3 segundos para el primer caso.

El proceso se puede encapsular más. Podemos echar mano de la
programación funcional y hacer que isprime devuelva por defecto True,
salvo cuando vea que el número es compuesto, en cuyo caso devolverá
False.

http://pastebin.com/gnFrcpYC

Con esto, hemos reducido el tiempo de cálculo a la mitad.

He probado a considerar sólo los primos menores que la raíz cuadrada
del número, pero en el cálculo de la raíz se tarda más que en lo que
se ahorraría en divisiones. Este programa es un poco más rápido que el
de MonoBOT.

2012/12/26 kausdiv <kaus...@gmail.com>:
> Hola.
> Estoy aprendiendo Python (me gusta muchisimo).
> El problema que todo lo que escribo lo hago al estilo ceniano.  Es decir
> tipo C o java, y quiero adentrarme al estilo pythoniano.
> Por ejemplo este programita que busca los números primos entre 2 números
> dados.
> -------------------------------
> def fprimos(n,x):
>     l=[]
>     for i in range(n,x):
>         isprime=1
>         for k in range(2,i):
>             if i % k ==0 and i<>k:
>                 isprime=0
>                 break
>         if isprime==1:
>             l.append(i)
>     return l
>
> def main():
>     ok=1
>     while ok==1:
>         print " imprime numeros primos desde hasta."
>         print " 0 = Salir "
>         n1=raw_input("Valor inicial ")
>         n2=raw_input("Valor Final ")
>         n1=int(n1)
>         n2=int(n2)
>         if n1==0 or n2==0:
>             ok=0
>         else:
>             print fprimos(n1,n2)
>
> main()
>
> ---------------------------------------
> ¿ como sería el mismo programa pasado a estilo python ?
>
> Gracias amigos.
> P.D.
> No tengo ni idea de ingles como para leer la documentación. :-(
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a