{"id":6583,"date":"2022-02-04T05:00:02","date_gmt":"2022-02-04T03:00:02","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6583"},"modified":"2022-04-15T12:08:05","modified_gmt":"2022-04-15T10:08:05","slug":"reconocimiento-de-potencias-de-4","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/reconocimiento-de-potencias-de-4\/","title":{"rendered":"Reconocimiento de potencias de 4"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   esPotenciaDe4 :: Integral a => a -> Bool\n<\/pre>\n<p>tal que (esPotenciaDe4 n) se verifica si n es una potencia de 4. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   esPotenciaDe4 16                ==  True\n   esPotenciaDe4 17                ==  False\n   esPotenciaDe4 (4^(4*10^5))      ==  True\n   esPotenciaDe4 (1 + 4^(4*10^5))  ==  False\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nesPotenciaDe4_1 :: Integral a => a -> Bool\nesPotenciaDe4_1 0 = False\nesPotenciaDe4_1 1 = True\nesPotenciaDe4_1 n = n `mod` 4 == 0 && esPotenciaDe4_1 (n `div` 4)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nesPotenciaDe4_2 :: Integral a => a -> Bool\nesPotenciaDe4_2 n = n `pertenece` potenciasDe4\n\n-- potenciassDe4 es la lista de las potencias de 4. Por ejemplo,\n--    take 5 potenciasDe4  ==  [1,4,16,64,256]\npotenciasDe4 :: Integral a => [a]\npotenciasDe4 = [4^x | x <- [0..]]\n\n-- (pertenece x ys) se verifica si x pertenece a la lista ordenada\n-- (posiblemente infinita xs). Por ejemplo,\n--    pertenece 8 [2,4..]  ==  True\n--    pertenece 9 [2,4..]  ==  False\npertenece :: Integral a => a -> [a] -> Bool\npertenece x ys = x == head (dropWhile (<x) ys)\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nesPotenciaDe4_3 :: Integral a => a -> Bool\nesPotenciaDe4_3 n = n `pertenece` potenciasDe4_2\n\n-- potenciassDe4 es la lista de las potencias de 4. Por ejemplo,\n--    take 5 potenciasDe4  ==  [1,4,16,64,256]\npotenciasDe4_2 :: Integral a => [a]\npotenciasDe4_2 = iterate (*4) 1\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nesPotenciaDe4_4 :: Integral n => n -> Bool\nesPotenciaDe4_4 n =\n  n == head (dropWhile (<n) (iterate (*4) 1))\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nesPotenciaDe4_5 :: Integral n => n -> Bool\nesPotenciaDe4_5 n =\n  n == until (>=n) (*4) 1\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> esPotenciaDe4_1 (4^(4*10^4))\n--    True\n--    (0.18 secs, 233,903,248 bytes)\n--    \u03bb> esPotenciaDe4_2 (4^(4*10^4))\n--    True\n--    (2.01 secs, 756,125,712 bytes)\n--    \u03bb> esPotenciaDe4_3 (4^(4*10^4))\n--    True\n--    (0.05 secs, 212,019,464 bytes)\n--    \u03bb> esPotenciaDe4_4 (4^(4*10^4))\n--    True\n--    (0.05 secs, 212,019,368 bytes)\n--    \u03bb> esPotenciaDe4_5 (4^(4*10^4))\n--    True\n--    (0.07 secs, 209,779,888 bytes)\n--\n--    \u03bb> esPotenciaDe4_3 (4^(2*10^5))\n--    True\n--    (0.64 secs, 5,184,667,280 bytes)\n--    \u03bb> esPotenciaDe4_4 (4^(2*10^5))\n--    True\n--    (0.64 secs, 5,184,667,200 bytes)\n--    \u03bb> esPotenciaDe4_5 (4^(2*10^5))\n--    True\n--    (0.63 secs, 5,173,467,656 bytes)\n--\n--    \u03bb> esPotenciaDe4_3 (4^(4*10^5))\n--    True\n--    (2.27 secs, 20,681,727,464 bytes)\n--    \u03bb> esPotenciaDe4_4 (4^(4*10^5))\n--    True\n--    (2.30 secs, 20,681,727,320 bytes)\n--    \u03bb> esPotenciaDe4_5 (4^(4*10^5))\n--    True\n--    (2.28 secs, 20,659,327,352 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Reconocimiento_de_potencias_de_4.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n esPotenciaDe4 :: Integral a => a -> Bool tal que (esPotenciaDe4 n) se verifica si n es una potencia de 4. Por ejemplo, esPotenciaDe4 16 == True esPotenciaDe4 17 == False esPotenciaDe4 (4^(4*10^5)) == True esPotenciaDe4 (1 + 4^(4*10^5)) == False Soluciones &#8212; 1\u00aa soluci\u00f3n &#8212; =========== esPotenciaDe4_1 :: Integral a =>&#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,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\/6583"}],"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=6583"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6583\/revisions"}],"predecessor-version":[{"id":6692,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6583\/revisions\/6692"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6583"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6583"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}