{"id":6604,"date":"2022-02-11T05:00:03","date_gmt":"2022-02-11T03:00:03","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6604"},"modified":"2022-04-15T12:07:08","modified_gmt":"2022-04-15T10:07:08","slug":"mayor-orbita-de-la-sucesion-de-collatz","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/mayor-orbita-de-la-sucesion-de-collatz\/","title":{"rendered":"Mayor \u00f3rbita de la sucesi\u00f3n de Collatz"},"content":{"rendered":"<p>Se considera la siguiente operaci\u00f3n, aplicable a cualquier n\u00famero entero positivo:<\/p>\n<ul>\n<li>Si el n\u00famero es par, se divide entre 2.<\/li>\n<li>Si el n\u00famero es impar, se multiplica por 3 y se suma 1.<\/li>\n<\/ul>\n<p>Dado un n\u00famero cualquiera, podemos calcular su \u00f3rbita; es decir, las im\u00e1genes sucesivas al iterar la funci\u00f3n. Por ejemplo, la \u00f3rbita de 13 es<\/p>\n<pre lang=\"text\">\n   13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1,...\n<\/pre>\n<p>Si observamos este ejemplo, la \u00f3rbita de 13 es peri\u00f3dica, es decir, se repite indefinidamente a partir de un momento dado). La conjetura de Collatz dice que siempre alcanzaremos el 1 para cualquier n\u00famero con el que comencemos. Por ejemplo,<\/p>\n<ul>\n<li>Empezando en n = 6 se obtiene 6, 3, 10, 5, 16, 8, 4, 2, 1.<\/li>\n<li>Empezando en n = 11 se obtiene: 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.<\/li>\n<li>Empezando en n = 27, la sucesi\u00f3n tiene 112 pasos, llegando hasta 9232 antes de descender a 1:  27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732, 866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1.<\/li>\n<\/ul>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   mayoresGeneradores :: Integer -> [Integer]\n<\/pre>\n<p>tal que (mayoresGeneradores n) es la lista de los n\u00fameros menores o iguales que n cuyas \u00f3rbitas de Collatz son las de mayor longitud. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   mayoresGeneradores 20      ==  [18,19]\n   mayoresGeneradores (10^6)  ==  [837799]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport qualified Data.MemoCombinators as Memo (integral)\nimport Data.List (genericLength, genericTake, maximumBy)\nimport Test.QuickCheck (Positive(..), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nmayoresGeneradores :: Integer -> [Integer]\nmayoresGeneradores n =\n  [x | (x,y) <- ps, y == m]\n  where ps = genericTake n longitudesOrbitas\n        m  = maximum (map snd ps)\n\n-- longitudesOrbita es la lista de los n\u00fameros junto a las longitudes de\n-- las \u00f3rbitas de Collatz que generan. Por ejemplo,\n--    \u03bb> take 10 longitudesOrbitas\n--    [(1,1),(2,2),(3,8),(4,3),(5,6),(6,9),(7,17),(8,4),(9,20),(10,7)]\nlongitudesOrbitas :: [(Integer, Integer)]\nlongitudesOrbitas =\n  [(n, genericLength (collatz n)) | n <- [1..]]\n\n-- (siguiente n) es el siguiente de n en la sucesi\u00f3n de Collatz. Por\n-- ejemplo,\n--    siguiente 13  ==  40\n--    siguiente 40  ==  20\nsiguiente :: Integer -> Integer\nsiguiente n | even n    = n `div` 2\n            | otherwise = 3*n+1\n\n-- (collatz1 n) es la \u00f3rbita de Collatz de n hasta alcanzar el\n-- 1. Por ejemplo,\n--    collatz 13  ==  [13,40,20,10,5,16,8,4,2,1]\n\n-- 1\u00aa definici\u00f3n de collatz\ncollatz1 :: Integer -> [Integer]\ncollatz1 1 = [1]\ncollatz1 n = n : collatz1 (siguiente n)\n\n-- 2\u00aa definici\u00f3n de collatz\ncollatz2 :: Integer -> [Integer]\ncollatz2 n = takeWhile (\/=1) (iterate siguiente n) ++ [1]\n\n-- Usaremos la 2\u00aa definici\u00f3n de collatz\ncollatz :: Integer -> [Integer]\ncollatz = collatz2\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nmayoresGeneradores2 :: Integer -> [Integer]\nmayoresGeneradores2 n =\n  [x | (x,y) <- ps, y == m]\n  where ps = [(x, longitudOrbita x) | x <- [1..n]]\n        m  = maximum (map snd ps)\n\n-- (longitudOrbita x) es la longitud de la \u00f3rbita de x. Por ejemplo,\n--    longitudOrbita 13  ==  10\nlongitudOrbita :: Integer -> Integer\nlongitudOrbita 1 = 1\nlongitudOrbita x = 1 + longitudOrbita (siguiente x)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nmayoresGeneradores3 :: Integer -> [Integer]\nmayoresGeneradores3 n =\n  [x | (x,y) <- ps, y == m]\n  where ps = [(x, longitudOrbita2 x) | x <- [1..n]]\n        m  = maximum (map snd ps)\n\nlongitudOrbita2 :: Integer -> Integer\nlongitudOrbita2 = Memo.integral longitudOrbita2'\n  where\n    longitudOrbita2' 1 = 1\n    longitudOrbita2' x = 1 + longitudOrbita2 (siguiente x)\n\n\n-- Equivalencia de definiciones\n-- ============================\n\n-- La propiedad es\nprop_mayoresGeneradores :: (Positive Integer) -> Bool\nprop_mayoresGeneradores (Positive n) =\n  all (== (mayoresGeneradores n))\n      [mayoresGeneradores2 n,\n       mayoresGeneradores3 n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_mayoresGeneradores\n--    +++ OK, passed 100 tests.\n\n-- Comprobaci\u00f3n de eficiencia\n-- ==========================\n\n-- La comprobaci\u00f3n es\n--    \u03bb> mayoresGeneradores (10^5)\n--    [77031]\n--    (5.43 secs, 6,232,320,064 bytes)\n--    \u03bb> mayoresGeneradores2 (10^5)\n--    [77031]\n--    (7.68 secs, 5,238,991,616 bytes)\n--    \u03bb> mayoresGeneradores3 (10^5)\n--    [77031]\n--    (0.88 secs, 571,788,736 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Mayor_orbita_de_la_sucesion_de_Collatz.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se considera la siguiente operaci\u00f3n, aplicable a cualquier n\u00famero entero positivo: Si el n\u00famero es par, se divide entre 2. Si el n\u00famero es impar, se multiplica por 3 y se suma 1. Dado un n\u00famero cualquiera, podemos calcular su \u00f3rbita; es decir, las im\u00e1genes sucesivas al iterar la funci\u00f3n. Por ejemplo, la \u00f3rbita de&#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,502,415,11,6,521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6604"}],"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=6604"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6604\/revisions"}],"predecessor-version":[{"id":6700,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6604\/revisions\/6700"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}