{"id":5996,"date":"2021-01-22T06:00:25","date_gmt":"2021-01-22T04:00:25","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5996"},"modified":"2021-01-29T09:21:56","modified_gmt":"2021-01-29T07:21:56","slug":"la-serie-1-2-3-4-%c2%b7%c2%b7%c2%b7","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/la-serie-1-2-3-4-%c2%b7%c2%b7%c2%b7\/","title":{"rendered":"La serie 1 &#8211; 2 + 3 &#8211; 4 + \u00b7\u00b7\u00b7"},"content":{"rendered":"<p>En este ejercicio se considerar\u00e1 la serie<\/p>\n<pre lang=\"text\">\n   1 - 2 + 3 - 4 + 5 - 6 + 7 - 8 + 9 - 10 + \u00b7\u00b7\u00b7\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   serie     :: [Integer]\n   sumaSerie :: Integer -> Integer\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>serie es lalista de los t\u00e9rminos de la serie anterior; es decir,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     take 7 serie  ==  [1,-2,3,-4,5,-6,7]\n<\/pre>\n<ul>\n<li>(sumaSerie n) es la suma de los n primeros t\u00e9rminos de la serie. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     sumaSerie 5     ==  3\n     sumaSerie 6     ==  -3\n     sumaSerie 2021  ==  1011\n     length (show (sumaSerie (10^1000)))  ==  1001\n<\/pre>\n<p>Comprobar con QuickCheck que<\/p>\n<ul>\n<li>la suma de la serie se puede hacer tan grande como se desee; es decir, que para todo n\u00famero a existe un n tal que la suma de los n primeros t\u00e9rminos de la serie es mayor que a;<\/li>\n<li>la suma de la serie se puede hacer tan peque\u00f1a como se desee; es decir, que para todo n\u00famero a existe un n tal que la suma de los n primeros t\u00e9rminos de la serie es menor que a.<\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (cycle, genericTake)\nimport Test.QuickCheck (Property, (==>), quickCheck)\n\n-- 1\u00aa definici\u00f3n de serie\n-- ======================\n\nserie :: [Integer]\nserie = [(-1)^(n-1) * n | n <- [1..]]\n\n-- 2\u00aa definici\u00f3n de serie\n-- ======================\n\nserie2 :: [Integer]\nserie2 = zipWith (*) (cycle [1,-1]) [1..]\n\n-- 3\u00aa definici\u00f3n de serie\n-- ======================\n\nserie3 :: [Integer]\nserie3 = zipWith ($) (cycle [id,negate]) [1..]\n\n-- 1\u00aa definici\u00f3n de sumaSerie\n-- ==========================\n\nsumaSerie :: Integer -> Integer\nsumaSerie n = sum (genericTake n serie)\n\n-- 2\u00aa definici\u00f3n sumaSerie\n-- =======================\n\n-- La 2\u00aa definici\u00f3n se basa en la siguiente observaci\u00f3n\n-- + Si n es par, entonces\n--        1 - 2 + 3 - 4 + 5 - 6 + \u00b7\u00b7\u00b7 + (n-1) - n\n--      = (1 - 2) + (3 - 4) + (5 - 6) + \u00b7\u00b7\u00b7 + ((n-1) - n)\n--      = -1      - 1       - 1       - \u00b7\u00b7\u00b7 - 1\n--      = -1 * n\/2\n-- + Si n es impar, entonces\n--        1 - 2 + 3 - 4 + 5 - 6 + \u00b7\u00b7\u00b7 + (n-2) - (n-1) + n\n--      = (1 - 2) + (3 - 4) + (5 - 6) + \u00b7\u00b7\u00b7 + ((n-2) - (n-1)) + n\n--      = -1      - 1       - 1       - \u00b7\u00b7\u00b7 - 1               + n\n--      = -1 * (n-1)\/2 + n\n--      = n - ((n-1)\/2)\n\nsumaSerie2 :: Integer -> Integer\nsumaSerie2 n\n  | even n    = -(n `div` 2)\n  | otherwise = n - ((n - 1) `div` 2)\n\n\n-- 3\u00aa definici\u00f3n sumaSerie\n-- =======================\n\n-- La 3\u00aa definici\u00f3n se basa en la siguiente observaci\u00f3n\n--    \u03bb> [sumaSerie n | n <- [1..20]]\n--    [1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10]\n\nsumaSerie3 :: Integer -> Integer\nsumaSerie3 n = ((-1)^(n-1)*(2*n+1)+1) `div` 4\n\n-- Equivalencia\n-- ============\n\n-- La propiedad es\nprop_sumaSerie_equiv :: Integer -> Property\nprop_sumaSerie_equiv n =\n  n > 0 ==>\n  sumaSerie  n == sumaSerie2 n &&\n  sumaSerie2 n == sumaSerie3 n\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_sumaSerie_equiv\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> sumaSerie (10^6)\n--    -500000\n--    (3.34 secs, 5,106,633,208 bytes)\n--    \u03bb> sumaSerie2 (10^6)\n--    -500000\n--    (0.01 secs, 102,600 bytes)\n--    \u03bb> sumaSerie3 (10^6)\n--    -500000\n--    (0.02 secs, 110,976 bytes)\n--    \u03bb> sumaSerie3 (10^6)\n--    -500000\n\n-- Propiedad\n-- =========\n\n-- La propiedad es\nprop_sumaSerie :: Integer -> Bool\nprop_sumaSerie a =\n  any (> a) sumas && any (< a) sumas\n  where sumas = [sumaSerie2 n | n <- [1..]]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_sumaSerie\n--    +++ OK, passed 100 tests.\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En este ejercicio se considerar\u00e1 la serie 1 &#8211; 2 + 3 &#8211; 4 + 5 &#8211; 6 + 7 &#8211; 8 + 9 &#8211; 10 + \u00b7\u00b7\u00b7 Definir las funciones serie :: [Integer] sumaSerie :: Integer -> Integer tales que serie es lalista de los t\u00e9rminos de la serie anterior; es decir, take 7&#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":[5],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5996"}],"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=5996"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5996\/revisions"}],"predecessor-version":[{"id":6035,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5996\/revisions\/6035"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}