Ir al contenido principal

Ordenación de los racionales

En este ejercicio, representamos las fracciones mediante pares de números de enteros.

Definir la función

fraccionesOrd :: Integer -> [(Integer,Integer)]

tal que (fraccionesOrd n) es la lista con las fracciones propias positivas ordenadas, con denominador menor o igual que n. Por ejemplo,

λ> fraccionesOrd 4
[(1,4),(1,3),(1,2),(2,3),(3,4)]
λ> fraccionesOrd 5
[(1,5),(1,4),(1,3),(2,5),(1,2),(3,5),(2,3),(3,4),(4,5)]

Soluciones

import Data.List (sort,sortBy)

-- 1ª solución
fraccionesOrd1 :: Integer -> [(Integer,Integer)]
fraccionesOrd1 n =
    [(x,y) | (z,(x,y)) <- sort [(fromIntegral x/fromIntegral y,(x,y))
                                 | y <- [2..n],
                                   x <- [1..y-1],
                                   gcd x y == 1]]

-- 2ª solución
fraccionesOrd2 :: Integer -> [(Integer,Integer)]
fraccionesOrd2 n =
    map snd (sort [(fromIntegral x/fromIntegral y,(x,y))
                   | y <- [2..n],
                     x <- [1..y-1],
                     gcd x y == 1])

-- 3ª solución
fraccionesOrd3 :: Integer -> [(Integer,Integer)]
fraccionesOrd3 n =
    sortBy comp [(x,y) | y <- [2..n], x <- [1..y-1], gcd x y == 1]
    where comp (a,b) (c,d) = compare (a*d) (b*c)