{"id":3017,"date":"2017-02-27T06:00:43","date_gmt":"2017-02-27T04:00:43","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3017"},"modified":"2017-03-06T08:31:04","modified_gmt":"2017-03-06T06:31:04","slug":"precision-de-aproximaciones-de-pi","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/precision-de-aproximaciones-de-pi\/","title":{"rendered":"Precisi\u00f3n de aproximaciones de pi"},"content":{"rendered":"<p>La precisi\u00f3n de una aproximaci\u00f3n x de pi es el n\u00famero de d\u00edgitos comunes entre el inicio de x y de pi. Por ejemplo, puesto que 355\/113 es 3.1415929203539825 y pi es 3.141592653589793,  la precisi\u00f3n de 355\/113 es 7.<\/p>\n<p>Definir las siguientes funciones<\/p>\n<pre lang=\"text\">\n   mayorPrefijoComun :: Eq a => [a] -> [a] -> [a]\n   precisionPi       :: Double -> Int\n   precisionPiCR     :: CReal -> Int\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(mayorPrefijoComun xs ys) es el mayor prefijo com\u00fan de xs e ys. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     mayorPrefijoComun []      [2,3,4,5]  ==  []\n     mayorPrefijoComun [2,3,5] []         ==  []\n     mayorPrefijoComun [2,3,5] [2,3,4,5]  ==  [2,3]\n     mayorPrefijoComun [2,3,5] [2,5,3,4]  ==  [2]\n     mayorPrefijoComun [2,3,5] [5,2,3,4]  ==  []\n<\/pre>\n<ul>\n<li>(precisionPi x) es la precisi\u00f3n de la aproximaci\u00f3n de pi x. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     precisionPi (25\/8)              ==  2\n     precisionPi (22\/7)              ==  3\n     precisionPi (sqrt 2 + sqrt 3)   ==  3\n     precisionPi (377\/120)           ==  4\n     precisionPi (31**(1\/3))         ==  4\n     precisionPi (7^7\/4^9)           ==  5\n     precisionPi (355\/113)           ==  7\n     precisionPi ((2143\/22)**(1\/4))  ==  9\n<\/pre>\n<ul>\n<li>(precisionPiCR x) es la precisi\u00f3n de la aproximaci\u00f3n de pi x, como n\u00fameros reales. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     precisionPiCR (log (640320^3+744)\/(sqrt 163))                        == 31\n     precisionPiCR (log (5280^3*(236674+30303*sqrt 61)^3+744)\/(sqrt 427)) == 53\n<\/pre>\n<p><strong>Nota<\/strong>: Para la definici\u00f3n precisionPiCR se usa la librer\u00eda Data.Number.CReal que se instala con<\/p>\n<pre lang=\"text\">\n   cabal install numbers\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Number.CReal\n\n-- mayorPrefijoCom\u00fan\n-- =================\n\n-- 1\u00aa definici\u00f3n\nmayorPrefijoComun :: Eq a => [a] -> [a] -> [a]\nmayorPrefijoComun [] _ = []\nmayorPrefijoComun _ [] = []\nmayorPrefijoComun (x:xs) (y:ys)\n  | x == y    = x : mayorPrefijoComun xs ys\n  | otherwise = []\n\n-- 2\u00aa definici\u00f3n\nmayorPrefijoComun2 :: Eq a => [a] -> [a] -> [a]\nmayorPrefijoComun2 xs ys =\n  [x | (x,y) <- takeWhile (\\(x,y) -> x == y) (zip xs ys)] \n\n-- 3\u00aa definici\u00f3n\nmayorPrefijoComun3 :: Eq a => [a] -> [a] -> [a]\nmayorPrefijoComun3 xs ys =\n  [x | (x,y) <- takeWhile (uncurry (==)) (zip xs ys)] \n\n-- 4\u00aa definici\u00f3n\nmayorPrefijoComun4 :: Eq a => [a] -> [a] -> [a]\nmayorPrefijoComun4 xs =\n  map fst . takeWhile (uncurry (==)) . zip xs\n\n-- 5\u00aa definici\u00f3n\nmayorPrefijoComun5 :: Eq a => [a] -> [a] -> [a]\nmayorPrefijoComun5 =\n  ((map fst . takeWhile (uncurry (==))) .) . zip\n\n-- precisionPi\n-- ===========\n\n-- 1\u00aa definici\u00f3n\nprecisionPi :: Double -> Int\nprecisionPi x =\n  length (mayorPrefijoComun xs ys) - 1\n  where xs = show x\n        ys = show pi\n\n-- 2\u00aa definici\u00f3n\nprecisionPi2 :: Double -> Int\nprecisionPi2 =\n  pred . length . mayorPrefijoComun (show pi) . show\n\n-- precisionPiCR\n-- =============\n\nprecisionPiCR :: CReal -> Int\nprecisionPiCR = aux 50\n  where aux n x | p < n-1   = p\n                | otherwise = aux (n+50) x\n          where p = precisionPiCRHasta n x\n\n-- (precisionPiCRHasta n x) es la precisi\u00f3n de pi acotada por n. Por\n-- ejemplo,\n--    precisionPiCRHasta 1 3.14   ==  2\n--    precisionPiCRHasta 5 3.14   ==  3\n--    precisionPiCRHasta 5 3.142  ==  3\n--    precisionPiCRHasta 5 3.141  ==  4\nprecisionPiCRHasta :: Int -> CReal -> Int\nprecisionPiCRHasta n x =\n  length (mayorPrefijoComun xs ys) - 1\n  where xs = showCReal n x\n        ys = showCReal n pi\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La precisi\u00f3n de una aproximaci\u00f3n x de pi es el n\u00famero de d\u00edgitos comunes entre el inicio de x y de pi. Por ejemplo, puesto que 355\/113 es 3.1415929203539825 y pi es 3.141592653589793, la precisi\u00f3n de 355\/113 es 7. Definir las siguientes funciones mayorPrefijoComun :: Eq a => [a] -> [a] -> [a] precisionPi ::&#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,80,28,10,11,377,6,33,378,34,271,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3017"}],"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=3017"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3017\/revisions"}],"predecessor-version":[{"id":3054,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3017\/revisions\/3054"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}