{"id":5411,"date":"2020-01-22T05:30:59","date_gmt":"2020-01-22T03:30:59","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5411"},"modified":"2020-01-29T07:59:27","modified_gmt":"2020-01-29T05:59:27","slug":"numeros-sin-2-en-base-3","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-sin-2-en-base-3\/","title":{"rendered":"N\u00fameros sin 2 en base 3"},"content":{"rendered":"<p>Definir la sucesi\u00f3n<\/p>\n<pre lang=\"text\">\n   numerosSin2EnBase3 :: [Integer]\n<\/pre>\n<p>cuyos t\u00e9rminos son los n\u00fameros cuya representaci\u00f3n en base 3 no contiene el d\u00edgito 2. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 20 numerosSin2EnBase3\n   [0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,81,82,84,85]\n<\/pre>\n<p>Se observa que<\/p>\n<ul>\n<li>12 est\u00e1 en la sucesi\u00f3n ya que su representaci\u00f3n en base 3 es 110 (porque 1\u00b73\u00b2 + 1\u00b73\u00b9 + 0.3\u2070 = 12) y no contiene a 2. <\/li>\n<li>14 no est\u00e1 en la sucesi\u00f3n ya que su representaci\u00f3n en base 3 es 112 (porque 1\u00b73\u00b2 + 1\u00b73\u00b9 + 2.3\u2070 = 14) y contiene a 2.<\/li>\n<\/ul>\n<p>Comprobar con QuickCheck que las sucesiones numerosSin2EnBase3 y sucesionSin3enPA (del ejercicio anterior) son iguales; es decir, para todo n\u00famero natural n, el n-\u00e9simo t\u00e9rmino de numerosSin2EnBase3 es igual al n-\u00e9simo t\u00e9rmino de sucesionSin3enPA.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List ((\\\\))\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nnumerosSin2EnBase3a :: [Integer]\nnumerosSin2EnBase3a =\n  [n | n <- [0..]\n     , 2 `notElem` (enBase3 n)]\n\n-- (enBase3 n) es la representaci\u00f3n de n en base 3. Por ejemplo,\n--    enBase3 7   ==  [1,2]\n--    enBase3 9   ==  [0,0,1]\n--    enBase3 10  ==  [1,0,1]\n--    enBase3 11  ==  [2,0,1]\nenBase3 :: Integer -> [Integer]\nenBase3 n | n < 3     = [n]\n          | otherwise = r : enBase3 q\n  where (q,r) = quotRem n 3\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\n-- Se puede construir como un tri\u00e1ngulo:\n--    0\n--    1\n--    3 4\n--    9 10 12 13\n--    27 28 30 31 36 37 39 40\n--    ....\n\nnumerosSin2EnBase3b :: [Integer]\nnumerosSin2EnBase3b = 0 : concat (iterate siguientes [1])\n  where siguientes xs = concatMap (\\x -> [3*x,3*x+1]) xs\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La compraci\u00f3n es\n--    \u03bb> numerosSin2EnBase3a !! (10^4)\n--    1679697\n--    (4.06 secs, 2,245,415,808 bytes)\n--    \u03bb> numerosSin2EnBase3b !! (10^4)\n--    1679697\n--    (0.03 secs, 2,109,912 bytes)\n\n-- Definici\u00f3n\n-- ==========\n\n-- En lo que sigue usaremos la 2\u00aa definici\u00f3n.\nnumerosSin2EnBase3 :: [Integer]\nnumerosSin2EnBase3 = numerosSin2EnBase3b\n\n-- Propiedad\n-- =========\n\n-- La propiedad es\nprop_equivalencia :: Int -> Property\nprop_equivalencia n =\n  n > 0 ==> sucesionSin3enPA !! n == numerosSin2EnBase3 !! n\n\n-- sucesionSin3enPA donde cada uno de sus t\u00e9rminos es el menor n\u00famero\n-- natural tal que no est\u00e1 en PA con cualesquiera dos t\u00e9rminos\n-- anteriores de la sucesi\u00f3n. \nsucesionSin3enPA :: [Integer]\nsucesionSin3enPA = aux [] [0..] \n  where\n    aux xs (y:ys) = y : aux (y:xs) (ys \\\\ [2 * y - x | x <- xs])\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_equivalencia\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Otras soluciones<\/h4>\n<ul>\n<li>Se pueden escribir otras soluciones en los comentarios.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nO que yo pueda asesinar un d\u00eda<br \/>\nen mi alma, al despertar, esa persona<br \/>\nque me hizo el mundo mientras yo dorm\u00eda.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Definir la sucesi\u00f3n numerosSin2EnBase3 :: [Integer] cuyos t\u00e9rminos son los n\u00fameros cuya representaci\u00f3n en base 3 no contiene el d\u00edgito 2. Por ejemplo, \u03bb> take 20 numerosSin2EnBase3 [0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,81,82,84,85] Se observa que 12 est\u00e1 en la sucesi\u00f3n ya que su representaci\u00f3n en base 3 es 110 (porque 1\u00b73\u00b2 + 1\u00b73\u00b9 + 0.3\u2070 = 12) y no&#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,58,50,488,11,254,6,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5411"}],"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=5411"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5411\/revisions"}],"predecessor-version":[{"id":5484,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5411\/revisions\/5484"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}