{"id":4273,"date":"2018-07-23T18:29:49","date_gmt":"2018-07-23T16:29:49","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4273"},"modified":"2018-07-24T16:50:53","modified_gmt":"2018-07-24T14:50:53","slug":"tren-de-potencias","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/tren-de-potencias\/","title":{"rendered":"Tren de potencias"},"content":{"rendered":"<p>Si n es el n\u00famero natural cuya expansi\u00f3n decimal es abc&#8230; , el tren de potencias de n es a^b<em>c^d<\/em>&#8230; donde el \u00faltimo exponente es 1, si n tiene un n\u00famero impar de d\u00edgitos. Por ejemplo<\/p>\n<pre lang=\"text\">\n   trenDePotencias 2453  = 2^4*5^3     = 2000\n   trenDePotencias 24536 = 2^4*5^3*6^1 = 12000\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   trenDePotencias            :: Integer -> Integer\n   esPuntoFijoTrenDePotencias :: Integer -> Bool\n   puntosFijosTrenDePotencias :: [Integer]\n   tablaTrenDePotencias       :: Integer -> Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(trenDePotencias n) es el tren de potencia de n. Por ejemplo. <\/li>\n<\/ul>\n<pre lang=\"text\">\n     trenDePotencias 20   ==  1\n     trenDePotencias 21   ==  2\n     trenDePotencias 24   ==  16\n     trenDePotencias 39   ==  19683\n     trenDePotencias 623  ==  108\n<\/pre>\n<ul>\n<li>(esPuntoFijoTrenDePotencias n) se verifica si n es un punto fijo de trenDePotencias; es decir, (trenDePotencias n) es igual a n. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     esPuntoFijoTrenDePotencias 2592                        ==  True\n     esPuntoFijoTrenDePotencias 24547284284866560000000000  ==  True\n<\/pre>\n<ul>\n<li>puntosFijosTrenDePotencias es la lista de los puntso fijos de trenDePotencias. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     take 10 puntosFijosTrenDePotencias  ==  [1,2,3,4,5,6,7,8,9,2592]\n<\/pre>\n<ul>\n<li>(tablaTrenDePotencias a b) es la tabla de los trenes de potencias de los n\u00fameros entre a y b. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> tablaTrenDePotencias 20 39\n     | 20 |     1 |\n     | 21 |     2 |\n     | 22 |     4 |\n     | 23 |     8 |\n     | 24 |    16 |\n     | 25 |    32 |\n     | 26 |    64 |\n     | 27 |   128 |\n     | 28 |   256 |\n     | 29 |   512 |\n     | 30 |     1 |\n     | 31 |     3 |\n     | 32 |     9 |\n     | 33 |    27 |\n     | 34 |    81 |\n     | 35 |   243 |\n     | 36 |   729 |\n     | 37 |  2187 |\n     | 38 |  6561 |\n     | 39 | 19683 |\n     \u03bb> tablaTrenDePotencias 2340 2359\n     | 2340 |        8 |\n     | 2341 |       32 |\n     | 2342 |      128 |\n     | 2343 |      512 |\n     | 2344 |     2048 |\n     | 2345 |     8192 |\n     | 2346 |    32768 |\n     | 2347 |   131072 |\n     | 2348 |   524288 |\n     | 2349 |  2097152 |\n     | 2350 |        8 |\n     | 2351 |       40 |\n     | 2352 |      200 |\n     | 2353 |     1000 |\n     | 2354 |     5000 |\n     | 2355 |    25000 |\n     | 2356 |   125000 |\n     | 2357 |   625000 |\n     | 2358 |  3125000 |\n     | 2359 | 15625000 |\n<\/pre>\n<p>Comprobar con QuickCheck que entre 2593 y 24547284284866559999999999 la funci\u00f3n trenDePotencias no tiene puntos fijos.<\/p>\n<h4>Soluciones<\/h4>\n<p>Puedes escribir tus soluciones en los comentarios o ver las soluciones propuestas pulsando [expand title=\u00bbaqu\u00ed\u00bb]  <\/p>\n<pre lang=\"haskell\">\r\nimport Test.QuickCheck\r\nimport Text.Printf\r\n\r\n-- 1\u00aa definici\u00f3n de trenDePotencias\r\n-- ================================\r\n\r\ntrenDePotencias :: Integer -> Integer\r\ntrenDePotencias = trenDePotenciasLN . digitos\r\n\r\n-- (digitos n) es la lista de los d\u00edgitos del n\u00famero n. Por ejemplo,\r\n--    digitos 2018  ==   [2,0,1,8]\r\ndigitos :: Integer -> [Integer]\r\ndigitos n =\r\n  [read [c] | c <- show n]\r\n\r\n-- (trenDePotenciasLN xs) es el tren de potencias de la lista de n\u00fameros\r\n-- xs. Por ejemplo,\r\n--    trenDePotenciasLN [2,4,5,3]    ==   2000\r\n--    trenDePotenciasLN [2,4,5,3,6]  ==   12000\r\ntrenDePotenciasLN :: [Integer] -> Integer\r\ntrenDePotenciasLN []       = 1\r\ntrenDePotenciasLN [x]      = x\r\ntrenDePotenciasLN (u:v:ws) = u ^ v * (trenDePotenciasLN ws) \r\n\r\n-- 2\u00aa definici\u00f3n de trenDePotencias\r\n-- ================================\r\n\r\ntrenDePotencias2 :: Integer -> Integer\r\ntrenDePotencias2 = trenDePotenciasLN2 . digitos\r\n\r\n-- (trenDePotenciasLN2 xs) es el tren de potencias de la lista de n\u00fameros\r\n-- xs. Por ejemplo,\r\n--    trenDePotenciasLN2 [2,4,5,3]    ==   2000\r\n--    trenDePotenciasLN2 [2,4,5,3,6]  ==   12000\r\ntrenDePotenciasLN2 :: [Integer] -> Integer\r\ntrenDePotenciasLN2 xs =\r\n  product [x^y | (x,y) <- pares xs]\r\n\r\n-- (pares xs) es la lista de los pares de elementos en la posiciones\r\n-- pares y sus siguientes; si la longitud de xs es impar, la segunda\r\n-- componente del \u00faltimo par es 1. Por ejemplo,\r\n--    pares [2,4,5,3]    ==   [(2,4),(5,3)]\r\n--    pares [2,4,5,3,6]  ==   [(2,4),(5,3),(6,1)]\r\npares :: [Integer] -> [(Integer,Integer)]\r\npares []       = []\r\npares [x]      = [(x,1)]\r\npares (x:y:zs) = (x,y) : pares zs\r\n\r\n-- Equivalencia\r\n-- ============\r\n\r\n-- La propiedad es\r\nprop_equivalencia :: (Positive Integer) -> Bool\r\nprop_equivalencia (Positive n) =\r\n  trenDePotencias n == trenDePotencias2 n\r\n\r\n-- La comprobaci\u00f3n es\r\n--    \u03bb> quickCheck prop_equivalencia\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- Comparaci\u00f3n de eficiencia\r\n-- =========================\r\n\r\n--    \u03bb> let n = 2*10^5 in trenDePotencias (read (replicate n '2')) == 2^n\r\n--    True\r\n--    (2.11 secs, 2,224,301,136 bytes)\r\n--    \u03bb> let n = 2*10^5 in trenDePotencias2 (read (replicate n '2')) == 2^n\r\n--    True\r\n--    (2.08 secs, 2,237,749,216 bytes)\r\n\r\n-- Definici\u00f3n de esPuntoFijoTrenDePotencias\r\n-- ========================================\r\n\r\nesPuntoFijoTrenDePotencias :: Integer -> Bool\r\nesPuntoFijoTrenDePotencias n =\r\n  trenDePotencias n == n\r\n\r\n-- Definici\u00f3n de puntosFijosTrenDePotencias\r\n-- ========================================\r\n\r\npuntosFijosTrenDePotencias :: [Integer]\r\npuntosFijosTrenDePotencias =\r\n  filter esPuntoFijoTrenDePotencias [1..]\r\n\r\n-- Definici\u00f3n de tablaTrenDePotencias\r\n-- ==================================\r\n\r\ntablaTrenDePotencias :: Integer -> Integer -> IO ()\r\ntablaTrenDePotencias a b =\r\n  sequence_ [printf cabecera x y | (x,y) <- trenes]\r\n  where trenes  = [(n,trenDePotencias n) | n <- [a..b]]\r\n        m1      = show (1 + length (show b))\r\n        m2      = show (length (show (maximum (map snd trenes))))\r\n        cabecera = concat [\"|% \",m1,\"d | %\", m2,\"d |\\n\"]\r\n\r\n-- Comprobaci\u00f3n\r\n-- ============\r\n\r\n-- La propiedad es\r\nprop_puntosFijos :: Positive Integer -> Property\r\nprop_puntosFijos (Positive n) =\r\n  x < 24547284284866560000000000 ==> not (esPuntoFijoTrenDePotencias x)\r\n  where x = 2593 + n \r\n\r\n-- La comprobaci\u00f3n es\r\n--    \u03bb> quickCheck prop_puntosFijos\r\n--    +++ OK, passed 100 tests.\r\n<\/pre>\n<p>[\/expand]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si n es el n\u00famero natural cuya expansi\u00f3n decimal es abc&#8230; , el tren de potencias de n es a^bc^d&#8230; donde el \u00faltimo exponente es 1, si n tiene un n\u00famero impar de d\u00edgitos. Por ejemplo trenDePotencias 2453 = 2^4*5^3 = 2000 trenDePotencias 24536 = 2^4*5^3*6^1 = 12000 Definir las funciones trenDePotencias :: Integer ->&#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,12,38,28,10,15,181,11,381,157,95,6,313,33,16,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4273"}],"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=4273"}],"version-history":[{"count":11,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4273\/revisions"}],"predecessor-version":[{"id":4284,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4273\/revisions\/4284"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}