Primos

2 views
Skip to first unread message

Marcos

unread,
Sep 5, 2011, 10:56:22 AM9/5/11
to introalg2011-2C
Buenas, definí la función por comprensión primos. (primos.10 =
[1,2,3,5,7])

divisores n = [x|x<-[1..n], n`mod`x==0]

primo :: Int->Bool
primo n = divisores n == [1,n]

primos n = [x|x<-[2..n],primo x]

pero no me sale en una sola linea... intento hacer algo como esto,
pero lo unico q entiendo es que esta re mal...

primos2 n = [x|x<-ys,ys x,ys<-zs n == [1,n], zs<-[1..n],n`mod`x==0]

Walter Alini

unread,
Sep 5, 2011, 12:59:04 PM9/5/11
to introal...@googlegroups.com
Un par de comentarios:

Tu definición de primos no arroja el resultado que das entre
paréntesis. Por lo menos en mi ejecución primos 10 me arrojó
[2,3,5,7], lo cual lo veo muy bien, y tiene que ver con la definición
de la primalidad del número 1
(http://es.wikipedia.org/wiki/NC3%BAmero_primo#Primalidad_del_n.C3.BAmero_1)

Usando tus definiciones, te acerco una en un renglón (en realidad,
cambién un poquito la definición de "primo"). No sé si es la mejor, ni
la más corta o eficiente, pero creo que sirve como primer paso:

primos2 n = [ x | x <- [2..n], length ([ y | y <- [1..x], x `mod` y ==
0]) == 2 ]

--

Explicación:
Empecé con tu definición:

primos n = [ x | x <- [2..n], primo x]

Ahora, reemplazo la definición de primo, por lo que corresponde:

primos n = [ x | x <- [2..n], divisores x == [1,x]]

Acá hice un pequeño cambio, y en vez de pedir que sean ==, pido que
tengan dos elementos (es equivalente, pero a mí personalmente me gusta
más porque no depende del orden de los elementos de la lista):

primos n = [ x | x <- [2..n], length (divisores x) == 2]

Ahora, reemplazo la definición de divisores, teniendo en cuenta de no
mezclar los nombres en ambas definiciones:

primos n = [ x | x <- [2..n], length ([ y | y <- [1..x], x `mod` y == 0]) == 2]


Saludos,

waldo


2011/9/5 Marcos <marcosp...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages