{"id":1926,"date":"2016-01-01T06:00:51","date_gmt":"2016-01-01T04:00:51","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1926"},"modified":"2016-01-07T09:42:21","modified_gmt":"2016-01-07T07:42:21","slug":"suma-con-redondeos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/suma-con-redondeos\/","title":{"rendered":"Suma con redondeos"},"content":{"rendered":"<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   sumaRedondeos       :: Integer -> [Integer]\n   limiteSumaRedondeos :: Integer -> Integer\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(sumaRedondeos n) es la sucesi\u00f3n cuyo k-\u00e9simo t\u00e9rmino es<\/li>\n<\/ul>\n<pre lang=\"text\">\n     redondeo (n\/2) + redondeo (n\/4) + ... + redondeo (n\/2^k)\n<\/pre>\n<p>Por ejemplo,<\/p>\n<pre lang=\"text\">\n     take 5 (sumaRedondeos 1000)  ==  [500,750,875,937,968]\n<\/pre>\n<ul>\n<li>(limiteSumaRedondeos n) es la suma de la serie<\/li>\n<\/ul>\n<pre lang=\"text\">\n     redondeo (n\/2) + redondeo (n\/4) + redondeo (n\/8) + ...\n<\/pre>\n<p>Por ejemplo,<\/p>\n<pre lang=\"text\">\n     limiteSumaRedondeos 2000                    ==  1999\n     limiteSumaRedondeos 2016                    ==  2016\n     limiteSumaRedondeos (10^308) `mod` (10^10)  ==  123839487\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa definici\u00f3n\n-- =============\n\nsumaRedondeos1 :: Integer -> [Integer]\nsumaRedondeos1 n =\n    [sum [round (n'\/(fromIntegral (2^k))) | k <- [1..m]] | m <- [1..]]\n    where n' = fromIntegral n\n\nlimiteSumaRedondeos1 :: Integer -> Integer\nlimiteSumaRedondeos1 = limite . sumaRedondeos1\n\nlimite :: [Integer] -> Integer\nlimite xs = head [x | (x,y) <- zip xs (tail xs), x == y]\n\n-- 2\u00aa definici\u00f3n\nsumaRedondeos2 :: Integer -> [Integer]\nsumaRedondeos2 n =\n    scanl1 (+) [round (n'\/(fromIntegral (2^k))) | k <- [1..]]\n    where n' = fromIntegral n\n\nlimiteSumaRedondeos2 :: Integer -> Integer\nlimiteSumaRedondeos2 = limite . sumaRedondeos2\n\n-- 3\u00aa definici\u00f3n\nsumaRedondeos3 :: Integer -> [Integer]\nsumaRedondeos3 n = map fst (iterate f (round (n'\/2),4))\n    where f (s,d) = (s + round (n'\/(fromIntegral d)), 2*d)\n          n'      = fromIntegral n\n\nlimiteSumaRedondeos3 :: Integer -> Integer\nlimiteSumaRedondeos3 = limite . sumaRedondeos3\n\n-- 4\u00aa definici\u00f3n\nsumaRedondeos4 :: Integer -> [Integer]\nsumaRedondeos4 n = xs ++ repeat x\n    where n' = fromIntegral n\n          m  = round (logBase 2 n')\n          xs = scanl1 (+) [round (n'\/(fromIntegral (2^k))) | k <- [1..m]]\n          x  = last xs\n\nlimiteSumaRedondeos4 :: Integer -> Integer\nlimiteSumaRedondeos4 = limite . sumaRedondeos4\n\n-- Comparaci\u00f3n de eficiencia\n--    \u03bb> (sumaRedondeos1 4) !! 20000\n--    3\n--    (0.92 secs, 197,782,232 bytes)\n--    \u03bb> (sumaRedondeos1 4) !! 30000\n--    3\n--    (2.20 secs, 351,084,816 bytes)\n--    \u03bb> (sumaRedondeos3 4) !! 20000\n--    3\n--    (0.30 secs, 53,472,392 bytes)\n--    \u03bb> (sumaRedondeos4 4) !! 20000\n--    3\n--    (0.01 secs, 0 bytes)\n\n-- En lo que sigue, usaremos la 3\u00aa definici\u00f3n\nsumaRedondeos :: Integer -> [Integer]\nsumaRedondeos = sumaRedondeos3\n\n-- 5\u00aa definici\u00f3n\n-- =============\n\nlimiteSumaRedondeos5 :: Integer -> Integer\nlimiteSumaRedondeos5 n = \n    sum [round (n'\/(fromIntegral (2^k))) | k <- [1..m]]\n    where n' = fromIntegral n\n          m  = round (logBase 2 n')\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir las funciones sumaRedondeos :: Integer -> [Integer] limiteSumaRedondeos :: Integer -> Integer tales que (sumaRedondeos n) es la sucesi\u00f3n cuyo k-\u00e9simo t\u00e9rmino es redondeo (n\/2) + redondeo (n\/4) + &#8230; + redondeo (n\/2^k) Por ejemplo, take 5 (sumaRedondeos 1000) == [500,750,875,937,968] (limiteSumaRedondeos n) es la suma de la serie redondeo (n\/2) + redondeo (n\/4)&#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":[4],"tags":[8,183,80,71,50,134,314,10,11,49,184,252,40,45,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1926"}],"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=1926"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1926\/revisions"}],"predecessor-version":[{"id":1962,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1926\/revisions\/1962"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}