[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