{"id":7058,"date":"2022-05-30T06:00:30","date_gmt":"2022-05-30T04:00:30","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7058"},"modified":"2022-05-29T08:07:53","modified_gmt":"2022-05-29T06:07:53","slug":"ordenacion-de-los-racionales","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/ordenacion-de-los-racionales\/","title":{"rendered":"Ordenaci\u00f3n de los racionales"},"content":{"rendered":"<p>En este ejercicio, representamos las fracciones mediante pares de n\u00fameros de enteros.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   fraccionesOrd :: Integer -> [(Integer,Integer)]\n<\/pre>\n<p>tal que <code>(fraccionesOrd n)<\/code> es la lista con las fracciones propias positivas ordenadas, con denominador menor o igual que <code>n<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> fraccionesOrd 4\n   [(1,4),(1,3),(1,2),(2,3),(3,4)]\n   \u03bb> fraccionesOrd 5\n   [(1,5),(1,4),(1,3),(2,5),(1,2),(3,5),(2,3),(3,4),(4,5)]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (sort, sortBy)\nimport Data.Ratio ((%), numerator, denominator)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nfraccionesOrd1 :: Integer -> [(Integer,Integer)]\nfraccionesOrd1 n = \n  [(x,y) | (_,(x,y)) <- sort [(fromIntegral x\/fromIntegral y,(x,y))\n                              | y <- [2..n], \n                                x <- [1..y-1], \n                                gcd x y == 1]]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nfraccionesOrd2 :: Integer -> [(Integer,Integer)]\nfraccionesOrd2 n = \n  map snd (sort [(fromIntegral x\/fromIntegral y,(x,y))\n                 | y <- [2..n], \n                   x <- [1..y-1], \n                   gcd x y == 1])\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nfraccionesOrd3 :: Integer -> [(Integer,Integer)]\nfraccionesOrd3 n = \n  sortBy comp [(x,y) | y <- [2..n], x <- [1..y-1], gcd x y == 1]\n  where comp (a,b) (c,d) = compare (a*d) (b*c)\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nfraccionesOrd4 :: Integer -> [(Integer,Integer)]\nfraccionesOrd4 n = \n  [(numerator x, denominator x) | x <- racionalesOrd4 n]\n  \n-- (racionalesOrd4 n) es la lista con los racionales ordenados, con\n-- denominador menor o igual que n. Por ejemplo,\n--    \u03bb> racionalesOrd4 4\n--    [1 % 4,1 % 3,1 % 2,2 % 3,3 % 4]\nracionalesOrd4 :: Integer -> [Rational]\nracionalesOrd4 n =\n  sort [x % y | y <- [2..n], x <- [1..y-1], gcd x y == 1]\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_fraccionesOrd :: Positive Integer -> Bool \nprop_fraccionesOrd (Positive n) =\n  all (== fraccionesOrd1 n)\n      [fraccionesOrd2 n,\n       fraccionesOrd3 n,\n       fraccionesOrd4 n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_fraccionesOrd\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> length (fraccionesOrd1 2000)\n--    1216587\n--    (3.65 secs, 2,879,842,368 bytes)\n--    \u03bb> length (fraccionesOrd2 2000)\n--    1216587\n--    (3.36 secs, 2,870,109,640 bytes)\n--    \u03bb> length (fraccionesOrd3 2000)\n--    1216587\n--    (8.83 secs, 5,700,519,584 bytes)\n--    \u03bb> length (fraccionesOrd4 2000)\n--    1216587\n--    (4.12 secs, 5,181,904,336 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Ordenacion_de_los_racionales.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este ejercicio, representamos las fracciones mediante pares de n\u00fameros de enteros. Definir la funci\u00f3n 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, \u03bb> fraccionesOrd 4 [(1,4),(1,3),(1,2),(2,3),(3,4)] \u03bb> 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)&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[2],"tags":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7058"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=7058"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7058\/revisions"}],"predecessor-version":[{"id":7059,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7058\/revisions\/7059"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}