{"id":3638,"date":"2018-01-18T06:00:30","date_gmt":"2018-01-18T04:00:30","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3638"},"modified":"2018-02-19T08:11:55","modified_gmt":"2018-02-19T06:11:55","slug":"escalada-hasta-un-primo","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/escalada-hasta-un-primo\/","title":{"rendered":"Escalada hasta un primo"},"content":{"rendered":"<p>Este ejercicio est\u00e1 basado en el art\u00edculo <a href=\"http:\/\/bit.ly\/2FKclTd\">La conjetura de la \u00abescalada hasta un primo\u00bb<\/a> publicado esta semana por Miguel \u00c1ngel Morales en su blog <a href=\"https:\/\/www.gaussianos.com\">Gaussianos<\/a>.<\/p>\n<p>La conjetura de escalada hasta un primo trata, propuesta por <a href=\"http:\/\/bit.ly\/2ELgmoY\">John Horton Conway<\/a>, es sencilla de plantear, pero primero vamos a ver qu\u00e9 es eso de <em>escalar hasta un primo<\/em>. Tomamos un n\u00famero cualquiera y lo descomponemos en factores primos (colocados en orden ascendente). Si el n\u00famero era primo, ya hemos acabado; si no era primo, construimos el n\u00famero formado por los factores primos y los exponentes de los mismos colocados tal cual salen en la factorizaci\u00f3n. Con el n\u00famero obtenido hacemos lo mismo que antes. La escalada finaliza cuando obtengamos un n\u00famero primo. Por ejemplo, para obtener la escalada prima de 1400, como no es primo, se factoriza (obteni\u00e9ndose <code>2^3 * 5^2 * 7<\/code>) y se unen bases y exponentes (obteni\u00e9ndose 23527). Con el 23527 se repite el proceso obteni\u00e9ndose la factorizaci\u00f3n  (<code>7 * 3361<\/code>) y su uni\u00f3n (73361). Como el 73361 es primo, termina la escalada. Por tanto, la escalada de 1400 es [1400,23527,73361].<\/p>\n<p>La conjetura de Conway sobre \u00abescalada hasta un primo\u00bb dice que todo n\u00famero  natural mayor o igual que 2 termina su escalada en un n\u00famero primo.<\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   escaladaPrima                :: Integer -> [Integer]\n   longitudEscaladaPrima        :: Integer -> Integer\n   longitudEscaladaPrimaAcotada :: Integer -> Integer -> Integer\n   graficaEscalada              :: Integer -> Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(escaladaPrima n) es la escalada prima de n. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> escaladaPrima 1400\n     [1400,23527,73361]\n     \u03bb> escaladaPrima 333\n     [333,3237,31383,3211317,3217139151,39722974813]\n     \u03bb> take 10 (escaladaPrima 20)\n     [20,225,3252,223271,297699,399233,715623,3263907,32347303,160720129]\n     \u03bb> take 3 (escaladaPrima 13532385396179)\n     [13532385396179,13532385396179,13532385396179]\n     \u03bb> take 2 (escaladaPrima 45214884853168941713016664887087462487)\n     [45214884853168941713016664887087462487,13532385396179]\n<\/pre>\n<ul>\n<li>(longitudEscaladaPrima n) es la longitud de la escalada prima de n. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     longitudEscaladaPrima 1400  ==  3\n     longitudEscaladaPrima 333   ==  6\n<\/pre>\n<ul>\n<li>(longitudEscaladaPrimaAcotada n k) es el m\u00ednimo entre la longitud de la escalada prima de n y k. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     longitudEscaladaPrimaAcotada 333 10  ==  6\n     longitudEscaladaPrimaAcotada 333 4   ==  4\n     longitudEscaladaPrimaAcotada 20 4    ==  4\n<\/pre>\n<ul>\n<li>(graficaEscalada n k) dibuja la gr\u00e1fica de (longitudEscaladaPrimaAcotada x k) para x entre 2 y n. Por ejemplo, (graficaEscalada 120 15) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.png?resize=640%2C480\" alt=\"Escalada_hasta_un_primo\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-3639\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Escalada_hasta_un_primo.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 (genericLength, group)\nimport Data.Numbers.Primes\nimport Graphics.Gnuplot.Simple\n\n-- Definici\u00f3n de escaladaPrima \nescaladaPrima :: Integer -> [Integer]\nescaladaPrima n\n  | isPrime n = [n]\n  | otherwise = n : escaladaPrima (siguiente n)\n\n-- (siguiente n) es el siguiente de n en la escalada hacia un primo. Por\n-- ejemplo, \n--    siguiente 1400  ==  23527\nsiguiente :: Integer -> Integer\nsiguiente = paresAnumero . factorizacion\n\n-- (factorizacion n) es la factorizacion prima de n. Por ejemplo,\n--    factorizacion 1400  ==  [(2,3),(5,2),(7,1)]\nfactorizacion :: Integer -> [(Integer,Integer)]\nfactorizacion n =\n  [(x,genericLength xs) | xs@(x:_) <- group (primeFactors n)]\n\n-- (paAnumero p) es el n\u00famero obtenido pegando las dos componentes de p\n-- (si la segunda es mayor que 1) o s\u00f3lo la primera componente, en caso\n-- contrario. Por ejemplo, \n--    parAnumero (7,1)  ==  7\n--    parAnumero (23,5)  ==  235\nparAnumero :: (Integer,Integer) -> Integer\nparAnumero (n,1) = n\nparAnumero (n,k) = read (show n ++ show k)\n\n-- (paresA numeros ps) es el n\u00famero obtenido aplicando parAnumero a cada\n-- uno de los pares de ps. Por ejemplo,\n--    paresAnumero [(2,3),(5,2),(7,1)]  ==  23527\nparesAnumero :: [(Integer,Integer)] -> Integer\nparesAnumero = read . concatMap (show . parAnumero)\n\n-- Definici\u00f3n de longitudEscaladaPrima\nlongitudEscaladaPrima :: Integer -> Integer\nlongitudEscaladaPrima n\n  | isPrime n = 1\n  | otherwise = 1 + longitudEscaladaPrima (siguiente n)\n\n-- Definici\u00f3n de longitudEscaladaPrimaAcotada\nlongitudEscaladaPrimaAcotada :: Integer -> Integer -> Integer\nlongitudEscaladaPrimaAcotada _ 0 = 0\nlongitudEscaladaPrimaAcotada n k\n  | isPrime n = 1\n  | otherwise = 1 + longitudEscaladaPrimaAcotada (siguiente n) (k-1)\n\n-- Definici\u00f3n de graficaEscalada \ngraficaEscalada :: Integer -> Integer -> IO ()\ngraficaEscalada n k =\n  plotList [ Key Nothing\n           , PNG \"Escalada_hasta_un_primo.png\"\n           , Title (\"graficaEscalada \" ++ show n ++ \" \" ++ show k)\n           , XLabel \"Numeros\"\n           , YLabel \"Longitud de escalada\"\n           ]\n           [(x,longitudEscaladaPrimaAcotada x k) | x <- [2..n]]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Este ejercicio est\u00e1 basado en el art\u00edculo La conjetura de la \u00abescalada hasta un primo\u00bb publicado esta semana por Miguel \u00c1ngel Morales en su blog Gaussianos. La conjetura de escalada hasta un primo trata, propuesta por John Horton Conway, es sencilla de plantear, pero primero vamos a ver qu\u00e9 es eso de escalar hasta un&#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,58,421,376,13,174,11,309,247,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\/3638"}],"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=3638"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3638\/revisions"}],"predecessor-version":[{"id":3775,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3638\/revisions\/3775"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}