[pyar] Numeros primos
Patricio Molina
patriciomolina en gmail.com
Jue Nov 24 23:40:21 ART 2011
2011/11/24 Patricio Molina <patriciomolina en gmail.com>:
> 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/
>
Una pequeñísima corrección: en el docstring de es_primo(), donde dice
"número entero", debería decir "número primo".
Saludos
--
Patricio Molina
http://patriciomolina.com/
More information about the pyar
mailing list