{"id":1946,"date":"2016-01-04T06:00:17","date_gmt":"2016-01-04T04:00:17","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1946"},"modified":"2016-05-01T20:08:05","modified_gmt":"2016-05-01T18:08:05","slug":"2016-es-un-numero-practico","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/2016-es-un-numero-practico\/","title":{"rendered":"2016 es un n\u00famero pr\u00e1ctico"},"content":{"rendered":"<p>Un entero positivo n es un <a href=\"http:\/\/bit.ly\/1R1CT4r\"><strong>n\u00famero pr\u00e1ctico<\/strong><\/a> si todos los enteros positivos menores que \u00e9l se pueden expresar como suma de distintos divisores de n. Por ejemplo, el 12 es un n\u00famero pr\u00e1ctico, ya que todos los enteros positivos menores que 12 se pueden expresar como suma de divisores de 12 (1, 2, 3, 4 y 6) sin usar ning\u00fan divisor m\u00e1s de una vez en cada suma:<\/p>\n<pre lang=\"text\">\n    1 = 1\n    2 = 2\n    3 = 3\n    4 = 4\n    5 = 2 + 3\n    6 = 6\n    7 = 1 + 6\n    8 = 2 + 6\n    9 = 3 + 6\n   10 = 4 + 6\n   11 = 1 + 4 + 6\n<\/pre>\n<p>En cambio, 14 no es un n\u00famero pr\u00e1ctico ya que 6 no se puede escribir como suma, con sumandos distintos, de divisores de 14.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   esPractico :: Integer -> Bool\n<\/pre>\n<p>tal que (esPractico n) se verifica si n es un n\u00famero pr\u00e1ctico. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   esPractico 12                                      ==  True\n   esPractico 14                                      ==  False\n   esPractico 2016                                    ==  True\n   esPractico 42535295865117307932921825928971026432  ==  True\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength, group, nub, sort, subsequences)\nimport Data.Numbers.Primes (primeFactors)\nimport Graphics.Gnuplot.Simple\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\nesPractico1 :: Integer -> Bool\nesPractico1 n =\n    takeWhile (<n) (sumas (divisores n)) == [0..n-1]\n\n-- (divisores n) es la lista de los divisores de n. Por ejemplo,\n--    divisores 12  ==  [1,2,3,4,6]\n--    divisores 14  ==  [1,2,7]\ndivisores :: Integer -> [Integer]\ndivisores n = [k | k <- [1..n-1], n `mod` k == 0]\n\n-- (sumas xs) es la lista ordenada de n\u00fameros que se pueden obtener como\n-- sumas de elementos de xs sin usar ning\u00fan elemento m\u00e1s de una vez en\n-- cada suma. Por ejemplo,  \n--    sumas [1,2,3]  ==  [0,1,2,3,4,5,6]\n--    sumas [1,2,7]  ==  [0,1,2,3,7,8,9,10]\nsumas :: [Integer] -> [Integer]\nsumas xs = sort (nub (map sum (subsequences xs)))\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nesPractico2 :: Integer -> Bool\nesPractico2 n = all (esSumable (divisores n)) [1..n-1]\n\n-- (esSumable xs n) se verifica si n se puede escribir como una suma de\n-- elementos distintos de la lista creciente xs. Por ejemplo,\n--    esSumable [1,2,7] 8  ==  True\n--    esSumable [1,2,7] 6  ==  False\n--    esSumable [1,2,7] 4  ==  False\n--    esSumable [1,2,7] 2  ==  True\n--    esSumable [1,2,7] 0  ==  True\nesSumable :: [Integer] -> Integer -> Bool\nesSumable _ 0  = True\nesSumable [] _ = False\nesSumable (x:xs) n = x <= n &#038;&#038; (esSumable xs (n-x) || esSumable xs n)\n\n-- 3\u00aa definici\u00f3n\n-- =============\n\n-- Usando la caracterizaci\u00f3n de Stewart y Sierpi\u0144ski: un entero n >= 2\n-- es pr\u00e1ctico syss para su factorizaci\u00f3n prima\n--    n = p(1)^e(1) * p(2)*e(2) *...* p(k)^e(k)\n-- se cumple que p(1) = 2 y, para cada i de 2 a k se cumple que\n--                         1+e(j) \n--                i-1  p(j)       - 1\n--    p(i) <= 1 +  \u220f  ----------------\n--                j=1     p(j) - 1\n\nesPractico3 :: Integer -> Bool\nesPractico3 1 = True\nesPractico3 n = \n    x == 2 &&\n    and [p <= 1 + c | (p,c) <- zip bases cotas]\n    where xss       = factorizacion n\n          (x:bases) = map fst xss\n          cotas     = scanl1 (*) [(p^(1+e)-1) `div` (p-1) | (p,e) <- xss]\n\n-- (factorizacion n) es la factorizaci\u00f3n de n. Por ejemplo, \n--    factorizacion  600  ==  [(2,3),(3,1),(5,2)]\n--    factorizacion 1400  ==  [(2,3),(5,2),(7,1)]\nfactorizacion :: Integer -> [(Integer,Integer)]\nfactorizacion n =\n    [(head xs,genericLength xs) | xs <- group (primeFactors n)]\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> length [n | n <- [1..400], esPractico1 n]\n--    92\n--    (40.21 secs, 8,378,539,464 bytes)\n--    \u03bb> length [n | n <- [1..400], esPractico2 n]\n--    92\n--    (8.29 secs, 1,109,669,760 bytes)\n--    \u03bb> length [n | n <- [1..400], esPractico3 n]\n--    92\n--    (0.02 secs, 0 bytes)\n<\/pre>\n<h4>Referencias<\/h4>\n<p>Basado en el art\u00edculo de Gaussianos <a href=\"http:\/\/bit.ly\/1R1CQFK\">Feliz Navidad y Feliz A\u00f1o (n\u00famero pr\u00e1ctico) 2016<\/a>.<\/p>\n<p>Otras referencias<\/p>\n<ul>\n<li>M. Margenstern (1991), <a href=\"http:\/\/bit.ly\/1R1EyHh\">Les nombres pratiques: th\u00e9orie, observations et conjectures<\/a>.<\/li>\n<li>G. Melfi, <a href=\"http:\/\/bit.ly\/1R1DROf\">Practical numbers<\/a>.<\/li>\n<li>G. Melfi (2008), <a href=\"http:\/\/bit.ly\/1R1Ep6A\">A survey on practical numbers<\/a>.<\/li>\n<li>OEIS, <a href=\"https:\/\/oeis.org\/A005153\">Sucesi\u00f3n A005153<\/a>.<\/li>\n<li>PlanetMath.org, <a href=\"http:\/\/bit.ly\/1R1DH9x\">Practical number<\/a>.<\/li>\n<li>E.W. Weisstein, <a href=\"http:\/\/bit.ly\/1YYGvss\">Practical number<\/a>.<\/li>\n<li>A. Weingartner (2015), <a href=\"http:\/\/bit.ly\/1R1EGX6\">Practical numbers and the distribution of divisors<\/a>.<\/li>\n<li>Wikipedia, <a href=\"http:\/\/bit.ly\/1R1CT4r\">Practical number<\/a>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Un entero positivo n es un n\u00famero pr\u00e1ctico si todos los enteros positivos menores que \u00e9l se pueden expresar como suma de distintos divisores de n. Por ejemplo, el 12 es un n\u00famero pr\u00e1ctico, ya que todos los enteros positivos menores que 12 se pueden expresar como suma de divisores de 12 (1, 2, 3,&#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":[41,100,8,30,80,258,13,71,10,89,24,11,247,6,252,14,88,40,34,9],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1946"}],"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=1946"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1946\/revisions"}],"predecessor-version":[{"id":1976,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1946\/revisions\/1976"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}