[pyar] Numeros primos

Patricio Molina patriciomolina en gmail.com
Jue Nov 24 23:38:11 ART 2011


2011/11/24 Matias Graña <matias.alejo en gmail.com>:
> 2011/11/24 Pablo M. Mana <pablo.m.mana en gmail.com>:
>> El otro dia en la CDC/SoL Fisa comento que los compresores son un
>> herramienta muy poderosa en algunos casos.
>> Y aca por una duda de bucles  se estaba hablando de numeros primos,
>> Walter R. Ojeda Valiente comento algunas cosas que no sabia de como
>> buscar en forma mas eficiente miembros de esta familia de numeros.
>> Nunca hice nada con programacion funcional y este es mi primer
>> intento. ¿Alguien se anima a miralo y decirme donde esta el error ?,
>> la lista p1 deberia contener primos pero hay algun problema con el for
>> anidado.
>>
>>
>> def primos (inicio = 3, fin = 100 ):
>> #""" Halla numeros primos por encima de 7 """
>>    im = [ ( 2 * n + 1 ) for n in range (inicio, fin) ]
>>    l1 = [ o for o in impares if (o % 5 != 0 ) ]
>>    l2 = [ m for m in l1 if ( ( pow( m, 0.5) ) !=  int( pow( m, 0.5)))]
>>    p1 = [ n for n in l2 if (l for l in range(2, int( pow( m, 0.5)))
>> if n%l != 0 )]
>
> Yo veo problemas con los nombres.
> En la primera linea definis im, en la segunda hablas de impares.
> Y en la ultima, imagino que pow(m, 0.5) debería ser pow(n, 0.5).
>
> Matías
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar
>

Si tuviera que implementar algo similar, lo haría así:

>>> def es_primo(n):
...     '''verifica si n es un número entero'''
...     # asegurándose de que n es un entero positivo
...     n = abs(int(n))
...     # 0 y 1 no son primos
...     if n < 2:
...         return False
...     # 2 es el único número primo par
...     if n == 2:
...         return True
...     # todos los demás números pares no son primos
...     if not n & 1:
...         return False
...     # 'range' comienza con 3 y sólo necesita ir hasta la raíz
...     # cuadrada de n con todos los números impares
...     for x in range(3, int(n ** 0.5) + 1, 2):
...         if n % x == 0:
...             return False
...     return True
...
>>> def primos(inicio=3, fin=100):
...     '''
...     devuelve una lista de números primos
...     desde inicio hasta fin
...     '''
...     return [n for n in range(inicio, fin + 1) if es_primo(n)]
...
>>> primos()
[3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
71, 73, 79, 83, 89, 97]

La primera función la obtuve de googleando[0] y traduje sus
comentarios al español. No sé si es más eficiente tu método (una vez
corregido) o el que utiliza es_primo(), en lo personal también le doy
mucha importancia a la legibilidad del código.

Saludos

[0] http://www.daniweb.com/software-development/python/code/216880

-- 
Patricio Molina
http://patriciomolina.com/



More information about the pyar mailing list