[pyar] Numeros primos
Adrian Roldan
roldanadrian en gmail.com
Vie Nov 25 01:55:55 ART 2011
El 25 de noviembre de 2011 00:43, claudio canepa <ccanepacc en gmail.com>escribió:
>
>
> 2011/11/25 claudio canepa <ccanepacc 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
>>>
>>
> [snip]
>
>
>> Asi que para funcionar habria que transformar la linea en
>>>
>> p1 = [ n for n in l2 if [l for l in range(2, int( pow( m, 0.5))) if
>> n%l != 0 )] ]
>>
>>
> por otro lado, la lista interna que queres calcular deberia acumular los
>> valores que dividen n, asi que la ultima condicion no deberia estar negada,
>> te quedaria
>>
>> p1 = [ n for n in l2 if (l for l in range(2, int( pow( m, 0.5))) if
>> n%l == 0 )]
>>
>>
> Ug, ahi me olvide la correccion anterior; queda
> p1 = [ n for n in l2 if [l for l in range(2, int( pow( m, 0.5))) if
> n%l == 0 )] ]
>
>
>
>> Pienso que podes expresar esa linea mas claramente usando la funcion
>> all(<iterable>) -> bool ; verdadera si todos los valores en el iterable son
>> verdaderos.
>>
>> Quedaria
>>
>> p1 = [ n for n in l2 if all(n%l != 0 for l in range(2, int( pow( m,
>> 0.5))) ]
>>
>> No criticos, pero ineficientes, es que hay un par de limites demasiado
>> grandes.
>>
>>
> Ermmm.. el limite en la linea que venimos comentand si es critico: tiene
> que ser n , no m , o sea que queda
>
> p1 = [ n for n in l2 if all(n%l != 0 for l in range(2, int( pow( n,
> 0.5))) ]
>
>
>> Hay igual maneras mas eficientes de escribir una funcion asi, haciendo
>> uso de que:
>>
>> - cuando avanzas hacia fin vos vas conociendo los primeros primos
>> - p es primo si y solo si existe q primo, 1<q<sqrt(p) tal que q divide
>> a p
>> Pero tenes que pensarlo antes de empezar a escribir codigo.
>>
>> --
>> claudio
>>
>>
>
> --
> claudio
>
>
> _______________________________________________
> 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
>
Hola gente, pasaba por acá, vi luz y entré.
Como ya te han respondido sobre tu código dejo mi granito de arena respecto
a los primos, con otro enfoque que puede tener el problema. Por lo que veo
querés conocer los primos hasta cierto número y no si uno en particular lo
es. En lugar de comprobar si un número es primo podés "cosecharlos".
Al algoritmo le dicen "Criba de Eratóstenes". Del 2 para arriba te vas
quedando con los primos y descartando los múltiplos que vas calculando. Por
supuesto que mejor explicado esta en wikipedia ( aunque el código en python
que figura creo que no funciona).
Dejo un ejemplo:
final = 100+1 # el +1 por el range() de abajo
lista_primos = [ True for n in range (0, final)] #genero una lista de
booleanos todos verdaderos.
for m in range(2, final) :
if lista_primos[m]:
print m, #imprimo los primos de a uno
k=1
while k*m < final:
lista_primos[k*m]=False # sacode la lista los multiplos
k+=1
Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20111125/39913055/attachment.html>
More information about the pyar
mailing list