{"id":5916,"date":"2020-05-22T06:14:48","date_gmt":"2020-05-22T04:14:48","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5916"},"modified":"2020-05-29T06:15:00","modified_gmt":"2020-05-29T04:15:00","slug":"las-sucesiones-de-loomis","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/las-sucesiones-de-loomis\/","title":{"rendered":"Las sucesiones de Loomis"},"content":{"rendered":"<p>La <a href=\"http:\/\/bit.ly\/2r9IGgz\">sucesi\u00f3n de Loomis<\/a> generada por un n\u00famero entero positivo x es la sucesi\u00f3n cuyos t\u00e9rminos se definen por<\/p>\n<ul>\n<li>f(0) es x<\/li>\n<li>f(n) es la suma de f(n-1) y el producto de los d\u00edgitos no nulos de f(n-1) <\/li>\n<\/ul>\n<p>Los primeros t\u00e9rminos de las primeras sucesiones de Loomis son<\/p>\n<ul>\n<li>Generada por 1: 1, 2, 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, 108, 116, 122, &#8230;<\/li>\n<li>Generada por 2: 2, 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, 108, 116, 122, 126, &#8230;<\/li>\n<li>Generada por 3: 3, 6, 12, 14, 18, 26, 38, 62, 74, 102, 104, 108, 116, 122, 126, &#8230;<\/li>\n<li>Generada por 4: 4, 8, 16, 22, 26, 38, 62, 74, 102, 104, 108, 116, 122, 126, 138, &#8230;<\/li>\n<li>Generada por 5: 5, 10, 11, 12, 14, 18, 26, 38, 62, 74, 102, 104, 108, 116, 122, &#8230;<\/li>\n<\/ul>\n<p>Se observa que a partir de un t\u00e9rmino todas coinciden con la generada por 1. Dicho t\u00e9rmino se llama el punto de convergencia. Por ejemplo,<\/p>\n<ul>\n<li>la generada por 2 converge a 2 <\/li>\n<li>la generada por 3 converge a 26<\/li>\n<li>la generada por 4 converge a 4<\/li>\n<li>la generada por 5 converge a 26<\/li>\n<\/ul>\n<p>Definir las siguientes funciones<\/p>\n<pre lang=\"text\">\n   sucLoomis           :: Integer -> [Integer]\n   convergencia        :: Integer -> Integer\n   graficaConvergencia :: [Integer] -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(sucLoomis x) es la sucesi\u00f3n de Loomis generada por x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> take 15 (sucLoomis 1)\n     [1,2,4,8,16,22,26,38,62,74,102,104,108,116,122]\n     \u03bb> take 15 (sucLoomis 2)\n     [2,4,8,16,22,26,38,62,74,102,104,108,116,122,126]\n     \u03bb> take 15 (sucLoomis 3)\n     [3,6,12,14,18,26,38,62,74,102,104,108,116,122,126]\n     \u03bb> take 15 (sucLoomis 4)\n     [4,8,16,22,26,38,62,74,102,104,108,116,122,126,138]\n     \u03bb> take 15 (sucLoomis 5)\n     [5,10,11,12,14,18,26,38,62,74,102,104,108,116,122]\n     \u03bb> take 15 (sucLoomis 20)\n     [20,22,26,38,62,74,102,104,108,116,122,126,138,162,174]\n     \u03bb> take 15 (sucLoomis 100)\n     [100,101,102,104,108,116,122,126,138,162,174,202,206,218,234]\n     \u03bb> sucLoomis 1 !! (2*10^5)\n     235180736652\n<\/pre>\n<ul>\n<li>(convergencia x) es el t\u00e9rmino de convergencia de la sucesio\u0144 de Loomis generada por x xon la geerada por 1. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     convergencia  2      ==  2\n     convergencia  3      ==  26\n     convergencia  4      ==  4\n     convergencia 17      ==  38\n     convergencia 19      ==  102\n     convergencia 43      ==  162\n     convergencia 27      ==  202\n     convergencia 58      ==  474\n     convergencia 63      ==  150056\n     convergencia 81      ==  150056\n     convergencia 89      ==  150056\n     convergencia (10^12) ==  1000101125092\n<\/pre>\n<ul>\n<li>(graficaConvergencia xs) dibuja la gr\u00e1fica de los t\u00e9rminos de convergencia de las sucesiones de Loomis generadas por los elementos de xs. Por ejemplo, (graficaConvergencia ([1..50]) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png?resize=640%2C480\" alt=\"Las_sucesiones_de_Loomis_1\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-4019\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_1.png?resize=150%2C112&amp;ssl=1 150w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><br \/>\ny graficaConvergencia ([1..148] &#92; [63,81,89,137]) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png?resize=640%2C480\" alt=\"Las_sucesiones_de_Loomis_2\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-4020\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/04\/Las_sucesiones_de_Loomis_2.png?resize=150%2C112&amp;ssl=1 150w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List               ((\\\\))\nimport Data.Char               (digitToInt)\nimport Graphics.Gnuplot.Simple (plotList, Attribute (Key, Title, XRange, PNG))\n\n-- 1\u00aa definici\u00f3n de sucLoomis\n-- ==========================\n\nsucLoomis :: Integer -> [Integer]\nsucLoomis x = map (loomis x) [0..]\n\nloomis :: Integer -> Integer -> Integer\nloomis x 0 = x\nloomis x n = y + productoDigitosNoNulos y\n  where y = loomis x (n-1)\n\nproductoDigitosNoNulos :: Integer -> Integer\nproductoDigitosNoNulos = product . digitosNoNulos\n\ndigitosNoNulos :: Integer -> [Integer]\ndigitosNoNulos x =\n  [read [c] | c <- show x, c \/= '0']\n\n-- 2\u00aa definici\u00f3n de sucLoomis\n-- ==========================\n\nsucLoomis2 :: Integer -> [Integer]\nsucLoomis2 = iterate siguienteLoomis \n\nsiguienteLoomis :: Integer -> Integer\nsiguienteLoomis y = y + productoDigitosNoNulos y\n\n-- 3\u00aa definici\u00f3n de sucLoomis\n-- ==========================\n\nsucLoomis3 :: Integer -> [Integer]\nsucLoomis3 =\n  iterate ((+) <*> product .\n           map (toInteger . digitToInt) .\n           filter (\/= '0') . show)\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> sucLoomis 1 !! 30000\n--    6571272766\n--    (2.45 secs, 987,955,944 bytes)\n--    \u03bb> sucLoomis2 1 !! 30000\n--    6571272766\n--    (2.26 secs, 979,543,328 bytes)\n--    \u03bb> sucLoomis3 1 !! 30000\n--    6571272766\n--    (0.31 secs, 88,323,832 bytes)\n\n-- 1\u00aa definici\u00f3n de convergencia\n-- =============================\n\nconvergencia1 :: Integer -> Integer\nconvergencia1 x =\n  head (dropWhile noEnSucLoomisDe1 (sucLoomis x))\n\nnoEnSucLoomisDe1 :: Integer -> Bool\nnoEnSucLoomisDe1 x = not (pertenece x sucLoomisDe1)\n\nsucLoomisDe1 :: [Integer]\nsucLoomisDe1 = sucLoomis 1\n\npertenece :: Integer -> [Integer] -> Bool\npertenece x ys =\n  x == head (dropWhile (<x) ys)\n\n-- 2\u00aa definici\u00f3n de convergencia\n-- =============================\n\nconvergencia2 :: Integer -> Integer\nconvergencia2 = aux (sucLoomis3 1) . sucLoomis3\n where aux as@(x:xs) bs@(y:ys) | x == y    = x\n                               | x < y     = aux xs bs\n                               | otherwise = aux as ys\n\n-- 3\u00aa definici\u00f3n de convergencia\n-- =============================\n\nconvergencia3 :: Integer -> Integer\nconvergencia3 = head . interseccion (sucLoomis3 1) . sucLoomis3\n \n-- (interseccion xs ys) es la intersecci\u00f3n entre las listas ordenadas xs\n-- e ys. Por ejemplo,\n--    \u03bb> take 10 (interseccion (sucLoomis3 1) (sucLoomis3 2))\n--    [2,4,8,16,22,26,38,62,74,102]\ninterseccion :: Ord a => [a] -> [a] -> [a]\ninterseccion = aux\n  where aux as@(x:xs) bs@(y:ys) = case compare x y of\n                                    LT ->     aux xs bs\n                                    EQ -> x : aux xs ys\n                                    GT ->     aux as ys\n        aux _         _         = []                           \n\n-- 4\u00aa definici\u00f3n de convergencia\n-- =============================\n\nconvergencia4 :: Integer -> Integer\nconvergencia4 x = perteneceA (sucLoomis3 x) 1\n  where perteneceA (y:ys) n | y == c    = y\n                            | otherwise = perteneceA ys c\n          where c = head $ dropWhile (< y) $ sucLoomis3 n\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> convergencia1 (10^4)\n--    150056\n--    (2.94 secs, 1,260,809,808 bytes)\n--    \u03bb> convergencia2 (10^4)\n--    150056\n--    (0.03 secs, 700,240 bytes)\n--    \u03bb> convergencia3 (10^4)\n--    150056\n--    (0.03 secs, 1,165,496 bytes)\n--    \u03bb> convergencia4 (10^4)\n--    150056\n--    (0.02 secs, 1,119,648 bytes)\n--    \n--    \u03bb> convergencia2 (10^12)\n--    1000101125092\n--    (1.81 secs, 714,901,080 bytes)\n--    \u03bb> convergencia3 (10^12)\n--    1000101125092\n--    (1.92 secs, 744,932,184 bytes)\n--    \u03bb> convergencia4 (10^12)\n--    1000101125092\n--    (1.82 secs, 941,053,328 bytes)\n\n-- Definici\u00f3n de graficaConvergencia\n-- ==================================\n\ngraficaConvergencia :: [Integer] -> IO ()\ngraficaConvergencia xs =\n  plotList [ Key Nothing\n           , Title \"Convergencia de sucesiones de Loomis\"\n           , XRange (fromIntegral (minimum xs),fromIntegral (maximum xs))\n           , PNG \"Las_sucesiones_de_Loomis_2.png\"\n           ]\n           [(x,convergencia2 x) | x <- xs] \n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La sucesi\u00f3n de Loomis generada por un n\u00famero entero positivo x es la sucesi\u00f3n cuyos t\u00e9rminos se definen por f(0) es x f(n) es la suma de f(n-1) y el producto de los d\u00edgitos no nulos de f(n-1) Los primeros t\u00e9rminos de las primeras sucesiones de Loomis son Generada por 1: 1, 2, 4, 8,&#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,59,376,71,50,415,10,181,11,309,95,6,33],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5916"}],"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=5916"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5916\/revisions"}],"predecessor-version":[{"id":5939,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5916\/revisions\/5939"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}