{"id":2560,"date":"2016-11-11T06:00:41","date_gmt":"2016-11-11T04:00:41","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=2560"},"modified":"2016-11-18T06:48:52","modified_gmt":"2016-11-18T04:48:52","slug":"numeros-perfectos-y-cojonudos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-perfectos-y-cojonudos\/","title":{"rendered":"N\u00fameros perfectos y cojonudos"},"content":{"rendered":"<p>Un <strong><a href=\"http:\/\/bit.ly\/2fhJomS\">n\u00famero perfecto<\/a><\/strong> es un n\u00famero entero positivo que es igual a la suma de sus divisores propios. Por ejemplo, el 28 es perfecto porque sus divisores propios son 1, 2, 4, 7 y 14 y 1+2+4+7+14 = 28.<\/p>\n<p>Un entero positivo x es un <strong>n\u00famero cojonudo<\/strong> si existe un n tal que n > 0, x = 2^n\u00b7(2^(n+1)-1) y 2^(n+1)-1 es primo. Por ejemplo, el 28 es cojonudo ya que para n = 2 se verifica que 2 > 0, 28 = 2^2\u00b7(2^3-1) y 2^3-1 = 7 es primo.<\/p>\n<p>Definir la funciones<\/p>\n<pre lang=\"text\">\n   esPerfecto                      :: Integer -> Bool\n   esCojonudo                      :: Integer -> Bool\n   equivalencia_CojonudosPerfectos :: Integer -> Bool\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(esPerfecto x) se verifica si x es perfecto. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     esPerfecto 28  ==  True\n     esPerfecto 30  ==  False\n<\/pre>\n<ul>\n<li>(esCojonudo x) se verifica si x es cojonudo. Por ejemplo, <\/li>\n<\/ul>\n<pre lang=\"text\">\n     esCojonudo 28                   ==  True\n     esCojonudo 30                   ==  False\n     esCojonudo 2305843008139952128  ==  True\n<\/pre>\n<ul>\n<li>(equivalenciaCojonudosPerfectos n) se verifica si para todos los n\u00fameros x menores o iguales que n se tiene que x es perfecto si, y s\u00f3lo si, x es cojonudo. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     equivalenciaCojonudosPerfectos 3000  ==  True\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes\nimport Data.List\n\n-- 1\u00aa definici\u00f3n de esPerfecto\n-- ===========================\n\nesPerfecto1 :: Integer -> Bool\nesPerfecto1 x =\n  sum (divisoresPropios1 x) == x\n\ndivisoresPropios1 :: Integer -> [Integer]\ndivisoresPropios1 x =\n  [y | y <- [1..x-1]\n     , x `mod` y == 0]\n\n-- 2\u00aa definici\u00f3n de esPerfecto\n-- ===========================\n\nesPerfecto2 :: Integer -> Bool\nesPerfecto2 n = sum (divisoresPropios2 n) == n\n \ndivisoresPropios2 :: Integer -> [Integer]\ndivisoresPropios2 n =\n  (delete n . nub . map product . subsequences) (primeFactors n)\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> esPerfecto1 33550336\n--    True\n--    (48.70 secs, 6,976,432,536 bytes)\n--    \u03bb> esPerfecto2 33550336\n--    True\n--    (0.01 secs, 0 bytes)\n--    \n--    \u03bb> [x | x <- [1..10^4], esPerfecto1 x]\n--    [6,28,496,8128]\n--    (72.88 secs, 10,411,693,760 bytes)\n--    \u03bb> [x | x <- [1..10^4], esPerfecto2 x]\n--    [6,28,496,8128]\n--    (0.69 secs, 311,388,248 bytes)\n\n-- 1\u00aa definici\u00f3n de esCojonudo\n-- ===========================\n\nesCojonudo1 :: Integer -> Bool\nesCojonudo1 x = pertenece x cojonudos\n\ncojonudos :: [Integer]\ncojonudos =\n  [2^n*p | n <- [1..]\n         , let p = 2^(n+1) - 1\n         , isPrime p]\n\npertenece :: Integer -> [Integer] -> Bool\npertenece x ys =\n  head (dropWhile (<x) ys) == x\n\n-- 2\u00aa definici\u00f3n de esCojonudo\n-- ===========================\n\nesCojonudo2 :: Integer -> Bool\nesCojonudo2 n | length p \/= 1  = False\n              | otherwise      = head p == 2 * product d -1\n    where (d,p) = partition (==2) (primeFactors n)\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> length [x | x <- [1..10^5], esCojonudo1 x]\n--    4\n--    (0.37 secs, 23,492,384 bytes)\n--    \u03bb> length [x | x <- [1..10^5], esCojonudo2 x]\n--    4\n--    (7.46 secs, 4,245,266,408 bytes)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\nequivalencia_CojonudosPerfectos :: Integer -> Bool\nequivalencia_CojonudosPerfectos n =\n  and [esCojonudo1 x == esPerfecto2 x | x <- [1..n]]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero perfecto es un n\u00famero entero positivo que es igual a la suma de sus divisores propios. Por ejemplo, el 28 es perfecto porque sus divisores propios son 1, 2, 4, 7 y 14 y 1+2+4+7+14 = 28. Un entero positivo x es un n\u00famero cojonudo si existe un n tal que n >&#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":[100,8,59,71,174,89,40],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2560"}],"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=2560"}],"version-history":[{"count":7,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2560\/revisions"}],"predecessor-version":[{"id":2597,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2560\/revisions\/2597"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=2560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=2560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=2560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}