{"id":6495,"date":"2021-06-02T06:00:56","date_gmt":"2021-06-02T04:00:56","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6495"},"modified":"2022-01-26T12:20:45","modified_gmt":"2022-01-26T10:20:45","slug":"productos-de-elementos-de-dos-conjuntos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/productos-de-elementos-de-dos-conjuntos\/","title":{"rendered":"Productos de elementos de dos conjuntos"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   productos :: [Integer] -> [Integer] -> Integer -> [(Integer,Integer)]\n<\/pre>\n<p>tal que (productos as bs c) es la lista de pares (a,b) tales que a  un elementos de as, b es un elemento de bs y su producto es x, donde as y bs son listas (posiblemente infinitas) ordenadas crecientes. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   productos [3,5..] [2,4..] 2000  ==  [(5,400),(25,80),(125,16)]\n   productos [3,5..] [2,4..] 2001  ==  []\n   length (productos [3,5..] [2,4..] (product [1..11]))  ==  59\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (group, inits, nub, sort, subsequences)\nimport Data.Numbers.Primes (primeFactors)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nproductos :: [Integer] -> [Integer] -> Integer -> [(Integer,Integer)]\nproductos as bs c =\n  [(a,b) | a <- takeWhile (<= c) as,\n           c `mod` a == 0,\n           let b = c `div` a,\n           b `pertenece` bs]\n\n-- (pertenece x ys) se verifica si x pertenece a la lista ordenada\n-- creciente ys. Por ejemplo,\n--    pertenece 15 [1,3..]  ==  True\n--    pertenece 16 [1,3..]  ==  False\npertenece :: Integer -> [Integer] -> Bool\npertenece x ys =\n  x == head (dropWhile (< x) ys)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nproductos2 :: [Integer] -> [Integer] -> Integer -> [(Integer,Integer)]\nproductos2 as bs c =\n  [(a,b) | a <- as',\n           let b = c `div` a,\n           b `pertenece` bs']\n  where cs  = divisores c\n        as' = interseccion cs (takeWhile (<=c) as)\n        bs' = interseccion cs (takeWhile (<=c) bs)\n\n-- (divisores x) es el conjunto de divisores de los x. Por ejemplo,\n--   divisores 30  ==  [1,2,3,5,6,10,15,30]\ndivisores :: Integer -> [Integer]\ndivisores = sort\n          . map (product . concat)\n          . sequence\n          . map inits\n          . group\n          . primeFactors\n\n-- (interseccion xs ys) es la intersecci\u00f3n entre las listas ordenadas\n-- crecientes xs e ys. Por ejemplo,\n--    \u03bb> take 10 (interseccion [1,3..] [2,5..])\n--    [5,11,17,23,29,35,41,47,53,59]\ninterseccion :: Ord a => [a] -> [a] -> [a]\ninterseccion = aux\n  where aux as@(x:xs) bs@(y:ys) = case compare x y of\n                                    LT ->     aux xs bs\n                                    EQ -> x : aux xs ys\n                                    GT ->     aux as ys\n        aux _         _         = []\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nproductos3 :: [Integer] -> [Integer] -> Integer -> [(Integer,Integer)]\nproductos3 as bs c = aux as' bs'\n  where aux (x:xs) (y:ys) | x * y == c = (x,y) : aux xs ys\n                          | x * y >  c = aux (x:xs) ys\n                          | otherwise  = aux xs (y:ys)\n        aux _ _           = []\n        cs  = divisores c\n        as' = interseccion cs (takeWhile (<=c) as)\n        bs' = reverse (interseccion cs (takeWhile (<=c) bs))\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La compactaci\u00f3n es\n--    \u03bb> length (productos [3,5..] [2,4..] (product [1..11]))\n--    59\n--    (9.83 secs, 5,588,474,408 bytes)\n--    \u03bb> length (productos2 [3,5..] [2,4..] (product [1..11]))\n--    59\n--    (10.48 secs, 8,942,746,480 bytes)\n--    \u03bb> length (productos3 [3,5..] [2,4..] (product [1..11]))\n--    59\n--    (17.39 secs, 13,413,570,800 bytes)\n<\/pre>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n productos :: [Integer] -> [Integer] -> Integer -> [(Integer,Integer)] tal que (productos as bs c) es la lista de pares (a,b) tales que a un elementos de as, b es un elemento de bs y su producto es x, donde as y bs son listas (posiblemente infinitas) ordenadas crecientes. Por ejemplo, productos&#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":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6495"}],"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=6495"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6495\/revisions"}],"predecessor-version":[{"id":6548,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6495\/revisions\/6548"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}