{"id":6014,"date":"2021-01-28T06:00:50","date_gmt":"2021-01-28T04:00:50","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6014"},"modified":"2021-02-04T10:02:47","modified_gmt":"2021-02-04T08:02:47","slug":"el-numero-de-dottie","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/el-numero-de-dottie\/","title":{"rendered":"El n\u00famero de Dottie"},"content":{"rendered":"<p>La sucesi\u00f3n de Dottie correspondiente a un n\u00famero x se obtiene a partir de x aplic\u00e1ndole la funci\u00f3n coseno al t\u00e9rmino anterior. Por ejemplo, empezando en el 2021 los t\u00e9rminos de la sucesi\u00f3n de Dottie son<\/p>\n<pre lang=\"text\">\n   d(0) = 2021\n   d(1) = cos(2021)                = -0.5768544484396986\n   d(2) = cos(-0.5768544484396986) = 0.8381823464377144\n   d(3) = cos(0.8381823464377144)  = 0.6688152257126013\n   d(4) = cos(0.6688152257126013)  = 0.7845568438177061\n   d(5) = cos(0.7845568438177061)  = 0.7077014336446841\n   d(6) = cos(0.7077014336446841)  = 0.7598581544800473\n   d(7) = cos(0.7598581544800473)  = 0.7249337238692606\n   d(8) = cos(0.7249337238692606)  = 0.7485433703735275\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   sucesionDottie :: Double -> [Double]\n   limite :: [Double] -> Double -> Int -> Double\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(sucesionDottie x) es la lista de los t\u00e9rminos de la sucesi\u00f3n de Dottie correspondiente a x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> mapM_ print (take 10 (sucesionDottie 2021))\n     2021.0\n     -0.5768544484396986\n     0.8381823464377144\n     0.6688152257126013\n     0.7845568438177061\n     0.7077014336446841\n     0.7598581544800473\n     0.7249337238692606\n     0.7485433703735275\n     0.7326809874975466\n     \u03bb> mapM_ print (take 10 (drop 85 (sucesionDottie 2021)))\n     0.7390851332151601\n     0.739085133215161\n     0.7390851332151605\n     0.7390851332151608\n     0.7390851332151606\n     0.7390851332151607\n     0.7390851332151607\n     0.7390851332151607\n     0.7390851332151607\n     0.7390851332151607\n<\/pre>\n<ul>\n<li>(limite xs a n) es el l\u00edmite de xs con aproximaci\u00f3n a y amplitud n; es decir, el primer t\u00e9rmino x de la sucesi\u00f3n tal que el valor absoluto de x y cualquiera de sus n siguentes elementos es menor que a. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> limite [(2*n+1)\/(n+5) | n <- [1..]] 0.001 300\n     1.993991989319092\n     \u03bb> limite [(2*n+1)\/(n+5) | n <- [1..]] 1e-6 300\n     1.9998260062637745\n     \u03bb> limite [(1+1\/n)**n | n <- [1..]] 0.001 300\n     2.7155953364173175\n     \u03bb> limite (sucesionDottie 2021) 1e-16 100\n     0.7390851332151607\n     \u03bb> limite (sucesionDottie 27) 1e-16 100\n     0.7390851332151607\n<\/pre>\n<p>Comprobar con QuickCheck que, para todo n\u00famero x, el l\u00edmite de la<br \/>\nsucesi\u00f3n de Dottie generada por  x es mismo; es decir, si x e y son<br \/>\ndos n\u00fameros cualesquiera, entonces<\/p>\n<pre lang=\"text\">\n     limite (sucesionDottie x) 1e-16 100 ==\n     limite (sucesionDottie y) 1e-16 100\n<\/pre>\n<p>Dicho l\u00edmite es el <strong>n\u00famero de Dottie<\/strong>.<\/p>\n<p><strong>Referencia<\/strong>: Este ejercicio est\u00e1 basado en el art\u00edculo <a href=\"https:\/\/bit.ly\/362dyUH\">El n\u00famero de Dottie<\/a> publicado por Miguel \u00c1ngel Morales en Gaussianos el 20 de enero de 2021.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (tails)\nimport Test.QuickCheck\n\n-- 1\u00aa definici\u00f3n de sucesionDottie\n-- ===============================\n\nsucesionDottie1 :: Double -> [Double]\nsucesionDottie1 x  = map (terminoDottie x) [0..]\n\nterminoDottie :: Double -> Int -> Double\nterminoDottie x 0 = x\nterminoDottie x n = cos (terminoDottie x (n-1))\n\n-- 2\u00aa definici\u00f3n de sucesionDottie\n-- ===============================\n\nsucesionDottie2 :: Double -> [Double]\nsucesionDottie2 x = iterate cos x\n\n-- Comparaci\u00f3n de eficiencia de definiciones de sucesionDottie\n-- ===========================================================\n\n-- La comparaci\u00f3n es\n--    \u03bb> sucesionDottie1 2021 !! (5*10^6)\n--    0.7390851332151607\n--    (2.13 secs, 1,894,864,000 bytes)\n--    \u03bb> sucesionDottie2 2021 !! (5*10^6)\n--    0.7390851332151607\n--    (0.95 secs, 644,703,256 bytes)\n\n-- En lo que sigue, usaremos la 2\u00aa definici\u00f3n\nsucesionDottie :: Double -> [Double]\nsucesionDottie = sucesionDottie2\n\n-- 1\u00aa definici\u00f3n de limite\n-- =======================\n\nlimite1 :: [Double] -> Double -> Int -> Double\nlimite1 xs a n =\n  head [ x | (x:ys) <- segmentos xs n\n       , all (\\y ->  abs (y - x) < a) ys]\n\n-- (segmentos xs n) es la lista de los segmentos de la lista infinita xs\n-- con n elementos. Por ejemplo,\n--    \u03bb> take 5 (segmentos [1..] 3)\n--    [[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7]]\nsegmentos :: [a] -> Int -> [[a]]\nsegmentos xs n = map (take n) (tails xs)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nlimite2 :: [Double] -> Double -> Int -> Double\nlimite2 (n:ns) x a\n  | abs (n - maximum (take (a-1) ns)) < x = n\n  | otherwise                             = limite2 ns x a\n\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> limite1 [(1+1\/n)**n | n <- [1..]] 1e-8 100\n--    2.7182700737511185\n--    (1.40 secs, 1,044,694,328 bytes)\n--    \u03bb> limite2 [(1+1\/n)**n | n <- [1..]] 1e-8 100\n--    2.7182700737511185\n--    (0.47 secs, 1,185,073,072 bytes)\n\n-- En lo que sigue, usaremos la 2\u00aa definici\u00f3n\nlimite :: [Double] -> Double -> Int -> Double\nlimite = limite2\n\n-- Propiedad\n-- =========\n\n-- La propiedad es\nprop_Dottie :: Double -> Double -> Bool\nprop_Dottie x y =\n  limite (sucesionDottie x) 1e-16 100 ==\n  limite (sucesionDottie y) 1e-16 100\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_Dottie\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>La sucesi\u00f3n de Dottie correspondiente a un n\u00famero x se obtiene a partir de x aplic\u00e1ndole la funci\u00f3n coseno al t\u00e9rmino anterior. Por ejemplo, empezando en el 2021 los t\u00e9rminos de la sucesi\u00f3n de Dottie son d(0) = 2021 d(1) = cos(2021) = -0.5768544484396986 d(2) = cos(-0.5768544484396986) = 0.8381823464377144 d(3) = cos(0.8381823464377144) = 0.6688152257126013 d(4)&#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":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6014"}],"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=6014"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6014\/revisions"}],"predecessor-version":[{"id":6051,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6014\/revisions\/6051"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}