{"id":7008,"date":"2022-05-10T11:42:43","date_gmt":"2022-05-10T09:42:43","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7008"},"modified":"2022-05-10T11:43:34","modified_gmt":"2022-05-10T09:43:34","slug":"particiones-de-enteros-positivos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/particiones-de-enteros-positivos\/","title":{"rendered":"Particiones de enteros positivos"},"content":{"rendered":"<p>Una partici\u00f3n de un entero positivo n es una manera de escribir n como una suma de enteros positivos. Dos sumas que s\u00f3lo difieren en el orden de sus sumandos se consideran la misma partici\u00f3n. Por ejemplo, 4 tiene cinco particiones: 4, 3+1, 2+2, 2+1+1 y 1+1+1+1.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   particiones :: Int -> [[Int]]\n<\/pre>\n<p>tal que <code>(particiones n)<\/code> es la lista de las particiones del n\u00famero <code>n<\/code>. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   particiones 4  ==  [[4],[3,1],[2,2],[2,1,1],[1,1,1,1]]\n   particiones 5  ==  [[5],[4,1],[3,2],[3,1,1],[2,2,1],[2,1,1,1],[1,1,1,1,1]]\n   length (particiones 50)  ==  204226\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nmodule Particiones_de_enteros_positivos where\n\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nparticiones1 :: Int -> [[Int]]\nparticiones1 0 = [[]]\nparticiones1 n = [x:y | x <- [n,n-1..1],\n                        y <- particiones1 (n-x),\n                        [x] >= take 1 y]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nparticiones2 :: Int -> [[Int]]\nparticiones2 n = aux !! n\n  where\n    aux = [] : map particiones [1..]\n    particiones m = [m] : [x:p | x <- [m,m-1..1],\n                                 p <- aux !! (m-x),\n                                 x >= head p]\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nparticiones3 :: Int -> [[Int]]\nparticiones3 n = aux n n\n  where aux 0 _ = [[]]\n        aux n' m = concat [map (i:) (aux (n'-i) i)\n                          | i <- [n',n'-1..1], i <= m]\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nparticiones4 :: Int -> [[Int]]\nparticiones4 n = aux n n\n  where aux 0 _ = [[]]\n        aux n' m = concat [map (i:) (aux (n'-i) i)\n                          | i <- [k,k-1..1]]\n          where k = min m n'\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_particiones :: Positive Int -> Bool\nprop_particiones (Positive n) =\n  all (== particiones1 n)\n      [ particiones2 n\n      , particiones3 n\n      , particiones4 n\n      ]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheckWith (stdArgs {maxSize=20}) prop_particiones\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia                                        --\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> length (particiones1 23)\n--    1255\n--    (12.50 secs, 6,614,487,992 bytes)\n--    \u03bb> length (particiones2 23)\n--    1255\n--    (0.04 secs, 3,071,104 bytes)\n--    \u03bb> length (particiones3 23)\n--    1255\n--    (0.02 secs, 9,163,544 bytes)\n--    \u03bb> length (particiones4 23)\n--    1255\n--    (0.01 secs, 7,149,512 bytes)\n--\n--    \u03bb> length (particiones2 50)\n--    204226\n--    (2.50 secs, 758,729,104 bytes)\n--    \u03bb> length (particiones3 50)\n--    204226\n--    (4.26 secs, 2,359,121,096 bytes)\n--    \u03bb> length (particiones4 50)\n--    204226\n--    (2.67 secs, 1,598,588,040 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Particiones_de_enteros_positivos.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una partici\u00f3n de un entero positivo n es una manera de escribir n como una suma de enteros positivos. Dos sumas que s\u00f3lo difieren en el orden de sus sumandos se consideran la misma partici\u00f3n. Por ejemplo, 4 tiene cinco particiones: 4, 3+1, 2+2, 2+1+1 y 1+1+1+1. Definir la funci\u00f3n particiones :: Int -> [[Int]]&#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":[41,8,12,10,84,570,6,47,521,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7008"}],"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=7008"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7008\/revisions"}],"predecessor-version":[{"id":7010,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7008\/revisions\/7010"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7008"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7008"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}