{"id":6595,"date":"2022-02-09T05:00:21","date_gmt":"2022-02-09T03:00:21","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6595"},"modified":"2022-02-23T18:19:05","modified_gmt":"2022-02-23T16:19:05","slug":"suma-de-multiplos-de-3-o-de-5","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/suma-de-multiplos-de-3-o-de-5\/","title":{"rendered":"Suma de m\u00faltiplos de 3 o de 5"},"content":{"rendered":"<p>Los n\u00fameros naturales menores que 10 que son m\u00faltiplos de 3 \u00f3 5 son 3, 5, 6 y 9. La suma de estos m\u00faltiplos es 23.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   sumaMultiplos :: Integer -> Integer\n<\/pre>\n<p>tal que (sumaMultiplos n) es la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores que n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   sumaMultiplos 10      ==  23\n   sumaMultiplos (10^2)  ==  2318\n   sumaMultiplos (10^3)  ==  233168\n   sumaMultiplos (10^4)  ==  23331668\n   sumaMultiplos (10^5)  ==  2333316668\n   sumaMultiplos (10^6)  ==  233333166668\n   sumaMultiplos (10^7)  ==  23333331666668\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (nub, union)\nimport Test.QuickCheck (Positive(..), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nsumaMultiplos1 :: Integer -> Integer\nsumaMultiplos1 n = sum [x | x <- [1..n-1], multiplo x 3 || multiplo x 5]\n\n-- (multiplo x y) se verifica si x es m\u00faltiplo de y. Por ejemplo,\n--    multiplo 6 3  ==  True\n--    multiplo 6 4  ==  False\nmultiplo :: Integer -> Integer -> Bool\nmultiplo x y = mod x y == 0\n\n-- 2\u00aa soluci\u00f3n                                                        --\n-- ===========\n\nsumaMultiplos2 :: Integer -> Integer\nsumaMultiplos2 n = sum [x | x <- [1..n-1], gcd x 15 > 1]\n\n-- 3\u00aa soluci\u00f3n                                                        --\n-- ===========\n\nsumaMultiplos3 :: Integer -> Integer\nsumaMultiplos3 n = sum [3,6..n-1] + sum [5,10..n-1] - sum [15,30..n-1]\n\n-- 4\u00aa soluci\u00f3n                                                        --\n-- ===========\n\nsumaMultiplos4 :: Integer -> Integer\nsumaMultiplos4 n = sum (nub ([3,6..n-1] ++ [5,10..n-1]))\n\n-- 5\u00aa soluci\u00f3n                                                        --\n-- ===========\n\nsumaMultiplos5 :: Integer -> Integer\nsumaMultiplos5 n = sum ([3,6..n-1] `union` [5,10..n-1])\n\n-- 6\u00aa soluci\u00f3n                                                      --\n-- ===========\n\nsumaMultiplos6 :: Integer -> Integer\nsumaMultiplos6 n = suma 3 n + suma 5 n - suma 15 n\n\n-- (suma d x) es la suma de los m\u00faltiplos de d menores que x. Por\n-- ejemplo,\n--    suma 3 10  ==  18\n--    suma 5 10  ==  5\nsuma :: Integer -> Integer -> Integer\nsuma d x = (a+b)*n `div` 2\n    where a = d\n          b = d * ((x-1) `div` d)\n          n = 1 + (b-a) `div` d\n\n-- Equivalencia de definiciones\n-- ============================\n\n-- La propiedad es\nprop_sumaMultiplos :: Positive Integer -> Bool\nprop_sumaMultiplos (Positive n) =\n  all (== (sumaMultiplos1 n))\n      [f n | f <- [sumaMultiplos1,\n                   sumaMultiplos2,\n                   sumaMultiplos3,\n                   sumaMultiplos4,\n                   sumaMultiplos5,\n                   sumaMultiplos6]]\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> sumaMultiplos1 (5*10^4)\n--    583291668\n--    (0.05 secs, 21,446,456 bytes)\n--    \u03bb> sumaMultiplos2 (5*10^4)\n--    583291668\n--    (0.05 secs, 26,804,944 bytes)\n--    \u03bb> sumaMultiplos3 (5*10^4)\n--    583291668\n--    (0.01 secs, 5,136,728 bytes)\n--    \u03bb> sumaMultiplos4 (5*10^4)\n--    583291668\n--    (3.05 secs, 7,474,304 bytes)\n--    \u03bb> sumaMultiplos5 (5*10^4)\n--    583291668\n--    (5.14 secs, 12,787,717,152 bytes)\n--    \u03bb> sumaMultiplos6 (5*10^4)\n--    583291668\n--    (0.01 secs, 108,448 bytes)\n--\n--    \u03bb> sumaMultiplos1 (3*10^6)\n--    2099998500000\n--    (2.14 secs, 1,281,805,696 bytes)\n--    \u03bb> sumaMultiplos2 (3*10^6)\n--    2099998500000\n--    (1.86 secs, 1,603,407,272 bytes)\n--    \u03bb> sumaMultiplos3 (3*10^6)\n--    2099998500000\n--    (0.39 secs, 304,681,080 bytes)\n--    \u03bb> sumaMultiplos6 (3*10^6)\n--    2099998500000\n--    (0.01 secs, 112,544 bytes)\n--\n--    \u03bb> sumaMultiplos3 (10^7)\n--    23333331666668\n--    (1.69 secs, 1,015,468,352 bytes)\n--    \u03bb> sumaMultiplos6 (10^7)\n--    23333331666668\n--    (0.01 secs, 112,336 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Suma_de_multiplos_de_3_o_de_5.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los n\u00fameros naturales menores que 10 que son m\u00faltiplos de 3 \u00f3 5 son 3, 5, 6 y 9. La suma de estos m\u00faltiplos es 23. Definir la funci\u00f3n sumaMultiplos :: Integer -> Integer tal que (sumaMultiplos n) es la suma de todos los m\u00faltiplos de 3 \u00f3 5 menores que n. Por ejemplo, sumaMultiplos&#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":[8,498],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6595"}],"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=6595"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6595\/revisions"}],"predecessor-version":[{"id":6697,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6595\/revisions\/6697"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}