{"id":3648,"date":"2018-01-22T06:00:32","date_gmt":"2018-01-22T04:00:32","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3648"},"modified":"2018-01-29T10:14:53","modified_gmt":"2018-01-29T08:14:53","slug":"complemento-potencial","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/complemento-potencial\/","title":{"rendered":"Complemento potencial"},"content":{"rendered":"<p>El <em>complemento potencial<\/em> de un n\u00famero entero positivo x es el menor n\u00famero y tal que el producto de x por y es un una potencia perfecta. Por ejemplo,<\/p>\n<ul>\n<li>el complemento potencial de 12 es 3 ya que 12 y 24 no son potencias perfectas pero 36 s\u00ed lo es;  <\/li>\n<li>el complemento potencial de 54 es 4 ya que 54, 108 y 162 no son potencias perfectas pero 216 = 6^3 s\u00ed lo es.<\/li>\n<\/ul>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   complemento                 :: Integer -> Integer\n   graficaComplementoPotencial :: Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(complemento x) es el complemento potencial de x; por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     complemento 12     ==  3\n     complemento 54     ==  4\n     complemento 720    ==  5\n     complemento 24000  ==  9\n     complemento 2018   ==  2018\n<\/pre>\n<ul>\n<li>(graficaComplementoPotencial n) dibuja la gr\u00e1fica de los complementos potenciales de los n primeros n\u00fameros enteros positivos. Por ejemplo, (graficaComplementoPotencial 100) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?resize=640%2C480\" alt=\"Complemento_potencial_100\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-3650\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?resize=150%2C112&amp;ssl=1 150w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><br \/>\ny (graficaComplementoPotencial 500) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png?resize=640%2C480\" alt=\"Complemento_potencial_500\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-3652\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_500.png?resize=150%2C112&amp;ssl=1 150w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/li>\n<\/ul>\n<p>Comprobar con QuickCheck que (complemento x) es menor o igual que x.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes     (primeFactors)\nimport Data.List               (genericLength, group)\nimport Graphics.Gnuplot.Simple (plotList, Attribute (Key, PNG, Title))\nimport Test.QuickCheck\n\ncomplemento :: Integer -> Integer\ncomplemento 1 = 1\ncomplemento x =\n  head [y | y <- [1..]\n          , esPotenciaPerfecta (x*y)]\n  \n-- (esPotenciaPerfecta x) se verifica si x es una potencia perfecta. Por\n-- ejemplo, \n--    esPotenciaPerfecta 36  ==  True\n--    esPotenciaPerfecta 72  ==  False\nesPotenciaPerfecta :: Integer -> Bool\nesPotenciaPerfecta x = mcd (exponentes x) > 1\n\n-- (exponentes x) es la lista de los exponentes de la factorizaci\u00f3n prima\n-- de x. Por ejemplos,\n--    exponentes 36  ==  [2,2]\n--    exponentes 72  ==  [3,2]\nexponentes :: Integer -> [Integer]\nexponentes = map snd . factorizacion\n  \n-- (factorizacion n) es la factorizacion prima de n. Por ejemplo,\n--    factorizacion 1400  ==  [(2,3),(5,2),(7,1)]\nfactorizacion :: Integer -> [(Integer,Integer)]\nfactorizacion n =\n  [(x,genericLength xs) | xs@(x:_) <- group (primeFactors n)]\n\n-- (mcd xs) es el m\u00e1ximo com\u00fan divisor de la lista xs. Por ejemplo,\n--    mcd [4,6,10]  ==  2\n--    mcd [4,5,10]  ==  1\nmcd :: [Integer] -> Integer\nmcd = foldl1 gcd\n\n-- La propiedad es\nprop_complemento :: (Positive Integer) -> Bool\nprop_complemento (Positive x) =\n  complemento x <= x\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_complemento\n--    +++ OK, passed 100 tests.\n\ngraficaComplementoPotencial :: Integer -> IO ()\ngraficaComplementoPotencial n =\n  plotList [Key Nothing\n           , PNG (\"Complemento_potencial_\"  ++ show n ++ \".png\")\n           , Title (\"(graficaComplementoPotencial \" ++ show n ++ \")\") \n           ]\n           (map complemento [1..n])\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El complemento potencial de un n\u00famero entero positivo x es el menor n\u00famero y tal que el producto de x por y es un una potencia perfecta. Por ejemplo, el complemento potencial de 12 es 3 ya que 12 y 24 no son potencias perfectas pero 36 s\u00ed lo es; el complemento potencial de 54&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3650,"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,359,155,258,376,13,71,10,11,309,247,16,146],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Complemento_potencial_100.png?fit=640%2C480&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3648"}],"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=3648"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3648\/revisions"}],"predecessor-version":[{"id":3689,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3648\/revisions\/3689"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media\/3650"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}