{"id":7147,"date":"2022-07-21T06:00:12","date_gmt":"2022-07-21T04:00:12","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7147"},"modified":"2022-07-16T18:17:55","modified_gmt":"2022-07-16T16:17:55","slug":"sucesion-de-suma-de-cuadrados-de-los-digitos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/sucesion-de-suma-de-cuadrados-de-los-digitos\/","title":{"rendered":"Sucesi\u00f3n de suma de cuadrados de los d\u00edgitos"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   sucSumaCuadradosDigitos :: Integer -> [Integer]\n<\/pre>\n<p>tal que (sucSumaCuadradosDigitos n) es la sucesi\u00f3n cuyo primer t\u00e9rmino es n y los restantes se obtienen sumando los cuadrados de los d\u00edgitos de su t\u00e9rmino anterior. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 20 (sucSumaCuadradosDigitos1 2000)\n   [2000,4,16,37,58,89,145,42,20,4,16,37,58,89,145,42,20,4,16,37]\n   \u03bb> take 20 (sucSumaCuadradosDigitos 1976)\n   [1976,167,86,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]\n   \u03bb> sucSumaCuadradosDigitos 2000 !! (10^9)\n   20\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (Positive (Positive), NonNegative (NonNegative), quickCheck)\n\n-- 1\u00aa soluci\u00f3n \n-- ===========\n\nsucSumaCuadradosDigitos1 :: Integer -> [Integer]\nsucSumaCuadradosDigitos1 n =\n  n : [sumaCuadradosDigitos x | x <- sucSumaCuadradosDigitos1 n]\n\n-- (sumaCuadradosDigitos n) es la suma de los cuadrados de los d\u00edgitos\n-- de n. Por ejemplo, \n--    sumaCuadradosDigitos 2016  ==  41\nsumaCuadradosDigitos :: Integer -> Integer\nsumaCuadradosDigitos n = sum (map (^2) (digitos n))\n\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo,\n--    digitos 325  ==  [3,2,5]\ndigitos :: Integer -> [Integer]\ndigitos n = [read [d] | d <- show n]\n\n-- 2\u00aa soluci\u00f3n \n-- ===========\n\nsucSumaCuadradosDigitos2 :: Integer -> [Integer]\nsucSumaCuadradosDigitos2 = iterate sumaCuadradosDigitos\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\n-- A partir de los c\u00e1lculos con las definiciones anteriores, se observa\n-- que para todo n (sucSumaCuadradosDigitos n) tiene una parte pura y\n-- otra peri\u00f3dica. Por ejemplo, para n = 2016, \n--    \u03bb> take 20 (sucSumaCuadradosDigitos 2016)\n--    [2016,41,17,50,25,29,85,89,145,42,20,4,16,37,58,89,145,42,20,4]\n-- la parte pura es\n--    [2016,41,17,50,25,29,85]\n-- y la parte peri\u00f3dica es\n--    [89,145,42,20,4,16,37,58])\n\nsucSumaCuadradosDigitos3 :: Integer -> [Integer]\nsucSumaCuadradosDigitos3 n = xs ++ cycle ys\n  where (xs,ys) = sucCompactaSumaCuadradosDigitos n\n\n-- (sucCompactaSumaCuadradosDigitos n) es el par formado por la parte\n-- pura y la peri\u00f3dica de (sucSumaCuadradosDigitos n). Por ejemplo, \n--    \u03bb> sucCompactaSumaCuadradosDigitos 2016\n--    ([2016,41,17,50,25,29,85],[89,145,42,20,4,16,37,58])\n--    \u03bb> sucCompactaSumaCuadradosDigitos 1976\n--    ([1976,167,86,100],[1])\nsucCompactaSumaCuadradosDigitos :: Integer -> ([Integer],[Integer])\nsucCompactaSumaCuadradosDigitos = \n  partePuraPeriodica . sucSumaCuadradosDigitos1\n\n-- (partePuraPeriodica xs) es el par formado por la parte pura y la\n-- peri\u00f3dica de xs. Por ejemplo,\n--    \u03bb> partePuraPeriodica (sucSumaCuadradosDigitos 2016)\n--    ([2016,41,17,50,25,29,85],[89,145,42,20,4,16,37,58])\n--    \u03bb> partePuraPeriodica (sucSumaCuadradosDigitos 1976)\n--    ([1976,167,86,100],[1])\npartePuraPeriodica :: [Integer] -> ([Integer],[Integer])\npartePuraPeriodica = aux [] \n  where aux as (b:bs) | b `elem` as = span (\/=b) (reverse as)\n                      | otherwise = aux (b:as) bs\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nsucSumaCuadradosDigitos4 :: Integer -> [Integer]\nsucSumaCuadradosDigitos4 1  = repeat 1\nsucSumaCuadradosDigitos4 89 = cycle [89,145,42,20,4,16,37,58]\nsucSumaCuadradosDigitos4 n  =\n  n : sucSumaCuadradosDigitos4 (sumaCuadradosDigitos n)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_sucSumaCuadradosDigitos :: Positive Integer -> NonNegative Int -> Bool\nprop_sucSumaCuadradosDigitos (Positive n) (NonNegative k) =\n  all (== sucSumaCuadradosDigitos1 n !! k)\n      [sucSumaCuadradosDigitos2 n !! k,\n       sucSumaCuadradosDigitos3 n !! k,\n       sucSumaCuadradosDigitos4 n !! k]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_sucSumaCuadradosDigitos\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> sucSumaCuadradosDigitos1 2000 !! (10^4)\n--    20\n--    (6.96 secs, 8,049,886,312 bytes)\n--    \u03bb> sucSumaCuadradosDigitos2 2000 !! (10^4)\n--    20\n--    (0.08 secs, 91,024,688 bytes)\n--    \u03bb> sucSumaCuadradosDigitos3 2000 !! (10^4)\n--    20\n--    (0.01 secs, 995,560 bytes)\n--    \u03bb> sucSumaCuadradosDigitos4 2000 !! (10^4)\n--    20\n--    (0.02 secs, 587,040 bytes)\n--    \n--    \u03bb> sucSumaCuadradosDigitos2 2000 !! (3*10^5)\n--    20\n--    (1.96 secs, 2,715,501,416 bytes)\n--    \u03bb> sucSumaCuadradosDigitos3 2000 !! (3*10^5)\n--    20\n--    (0.02 secs, 995,872 bytes)\n--    \u03bb> sucSumaCuadradosDigitos4 2000 !! (3*10^5)\n--    20\n--    (0.02 secs, 587,352 bytes)\n--    \n--    \u03bb> sucSumaCuadradosDigitos3 2000 !! (10^9)\n--    20\n--    (2.85 secs, 996,016 bytes)\n--    \u03bb> sucSumaCuadradosDigitos4 2000 !! (10^9)\n--    20\n--    (2.54 secs, 587,496 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Sucesion_de_suma_de_cuadrados_de_los_digitos.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n sucSumaCuadradosDigitos :: Integer -> [Integer] tal que (sucSumaCuadradosDigitos n) es la sucesi\u00f3n cuyo primer t\u00e9rmino es n y los restantes se obtienen sumando los cuadrados de los d\u00edgitos de su t\u00e9rmino anterior. Por ejemplo, \u03bb> take 20 (sucSumaCuadradosDigitos1 2000) [2000,4,16,37,58,89,145,42,20,4,16,37,58,89,145,42,20,4,16,37] \u03bb> take 20 (sucSumaCuadradosDigitos 1976) [1976,167,86,100,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] \u03bb> sucSumaCuadradosDigitos 2000 !! (10^9) 20&#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":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7147"}],"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=7147"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7147\/revisions"}],"predecessor-version":[{"id":7148,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7147\/revisions\/7148"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}