{"id":5457,"date":"2020-01-30T05:30:34","date_gmt":"2020-01-30T03:30:34","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5457"},"modified":"2022-03-26T12:09:08","modified_gmt":"2022-03-26T10:09:08","slug":"longitud-de-la-parte-periodica","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/longitud-de-la-parte-periodica\/","title":{"rendered":"Longitud de la parte peri\u00f3dica"},"content":{"rendered":"<p>La <strong>propiedad de la longitud de la parte peri\u00f3dica<\/strong> afirma que<\/p>\n<blockquote><p>\nSi p es un n\u00famero primo distinto de 2 y de 5, entonces la longitud del per\u00edodo de 1\/p es el menor entero positivo n tal que p divide a <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=10%5En+-+1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"10^n - 1\" class=\"latex\" \/>.\n<\/p><\/blockquote>\n<p>El objetivo de este ejercicio es la verificaci\u00f3n de dicha propiedad.<\/p>\n<p>Las fracciones se representan por un par de enteros. Por ejemplo, el n\u00famero 2\/3 se representa por (2,3). Su tipo es<\/p>\n<pre lang=\"text\">\n   type Fraccion = (Integer,Integer)\n<\/pre>\n<p>Los n\u00fameros decimales se representan por ternas, donde el primer elemento es la parte entera, el segundo es el anteper\u00edodo y el tercero es el per\u00edodo. Por ejemplo,<\/p>\n<pre lang=\"text\">\n 6\/2  = 3                  se representa por (3,[],[])\n 1\/2  = 0.5                se representa por (0,[5],[])\n 1\/3  = 0.333333...        se representa por (0,[],[3])  \n23\/14 = 1.6428571428571... se representa por (1,[6],[4,2,8,5,7,1])\n<\/pre>\n<p>Su tipo es<\/p>\n<pre lang=\"text\">\n   type Decimal = (Integer,[Integer],[Integer])\n<\/pre>\n<p>Definir, usando las funciones cocientesRestos y primerRepetido de los ejercicios anteriores, las funciones<\/p>\n<pre lang=\"text\">\n   decimal :: Fraccion -> Decimal\n   longitudPeriodo :: Fraccion -> Integer\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(decimal f) es la representaci\u00f3n decimal de la fracci\u00f3n f. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     decimal (6,2)          ==  (3,[],[])\n     decimal (3,4)          ==  (0,[7,5],[])\n     decimal (1,3)          ==  (0,[],[3])\n     decimal (23,14)        ==  (1,[6],[4,2,8,5,7,1])\n     decimal (247813,19980) ==  (12,[4,0],[3,0,5])\n     decimal (1,101)        ==  (0,[],[0,0,9,9])\n<\/pre>\n<ul>\n<li>(longitudPeriodo f) es la longitud de la parte peri\u00f3dica de la representaci\u00f3n decimal de la fracci\u00f3n f. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     longitudPeriodo (6,2)           ==  0\n     longitudPeriodo (3,4)           ==  0\n     longitudPeriodo (1,3)           ==  1\n     longitudPeriodo (23,14)         ==  6\n     longitudPeriodo (247813,19980)  ==  3\n     longitudPeriodo (1,101)         ==  4\n     longitudPeriodo (1,1229)        ==  1228\n<\/pre>\n<p>Comprobar con QuickCheck la propiedad de la longitud de la parte peri\u00f3dica; es decir, k es un n\u00famero natural distinto de 0 y 2 y p es el primo k-\u00e9simo, entonces la longitud del per\u00edodo de 1\/p es el menor entero positivo n tal que p divide a <img decoding=\"async\" src=\"https:\/\/s0.wp.com\/latex.php?latex=10%5En+-+1&#038;bg=ffffff&#038;fg=000&#038;s=0&#038;c=20201002\" alt=\"10^n - 1\" class=\"latex\" \/>..<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes\nimport Test.QuickCheck\n\ntype Fraccion = (Integer,Integer)\ntype Decimal = (Integer,[Integer],[Integer])\n\ndecimal :: Fraccion -> Decimal\ndecimal (n,d) \n  | snd y == 0 = (fst x, map fst xs, [])\n  | otherwise  = (fst x, map fst xs, map fst (y:zs))\n  where\n    qrs         = cocientesRestos (n,d)\n    Just (q,r)  = primerRepetido qrs\n    (x:xs,y:ys) = break (==(q,r)) qrs\n    zs          = takeWhile (\/=(q,r)) ys\n\ncocientesRestos :: Fraccion -> [(Integer,Integer)]\ncocientesRestos (n,d) =\n  (q,r) : cocientesRestos (10*r, d)\n  where (q,r) = quotRem n d\n\nprimerRepetido :: Eq a => [a] -> Maybe a\nprimerRepetido xs = aux xs []\n  where\n    aux [] _                     = Nothing\n    aux (x:xs') ys | x `elem` ys = Just x\n                   | otherwise   = aux xs' (x:ys) \n\nlongitudPeriodo :: Fraccion -> Int\nlongitudPeriodo (n,d) = length xs\n  where (_,_,xs) = decimal (n,d)\n\n-- La propiedad es\nprop_LongitudPeriodo :: Int -> Property\nprop_LongitudPeriodo k =\n  k > 0 && k \/= 2 \n  ==>\n  longitudPeriodo (1,p) ==\n  head [n | n <- [1..], (10^n-1) `mod` p == 0]\n  where p = primes !! k\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_LongitudPeriodo\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>\n\u00abEn el desarrollo de la comprensi\u00f3n de los fen\u00f3menos complejos, la herramienta m\u00e1s poderosa de que dispone el intelecto humano es la abstracci\u00f3n. La abstracci\u00f3n surge del reconocimiento de las similitudes entre ciertos objetos, situaciones o procesos en el mundo real y de la decisi\u00f3n de concentrarse en estas similitudes e ignorar, por el momento, sus diferencias.\u00bb <\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Tony_Hoare\">Tony Hoare<\/a>\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>La propiedad de la longitud de la parte peri\u00f3dica afirma que Si p es un n\u00famero primo distinto de 2 y de 5, entonces la longitud del per\u00edodo de 1\/p es el menor entero positivo n tal que p divide a . El objetivo de este ejercicio es la verificaci\u00f3n de dicha propiedad. Las fracciones&#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":[7],"tags":[61,8,500,80,71,10,89,411,11,173,254,6,34,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5457"}],"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=5457"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5457\/revisions"}],"predecessor-version":[{"id":5532,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5457\/revisions\/5532"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5457"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}