{"id":4540,"date":"2019-01-16T06:00:30","date_gmt":"2019-01-16T04:00:30","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4540"},"modified":"2019-01-23T08:07:16","modified_gmt":"2019-01-23T06:07:16","slug":"numeros-altamente-compuestos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-altamente-compuestos\/","title":{"rendered":"N\u00fameros altamente compuestos"},"content":{"rendered":"<p>Un n\u00famero <a href=\"http:\/\/bit.ly\/2H7Vj61\">altamente compuesto<\/a> es un entero positivo con m\u00e1s divisores que cualquier entero positivo m\u00e1s peque\u00f1o. Por ejemplo,<\/p>\n<ul>\n<li>4 es un n\u00famero altamente compuesto porque es el menor con 3 divisores,<\/li>\n<li>5 no es altamente compuesto porque tiene menos divisores que 4 y<\/li>\n<li>6 es un n\u00famero altamente compuesto porque es el menor con 4 divisores,<\/li>\n<\/ul>\n<p>Los primeros n\u00fameros altamente compuestos son<\/p>\n<pre lang=\"text\"> \n   1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, ...\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\"> \n   esAltamenteCompuesto       :: Int -> Bool\n   altamenteCompuestos        :: [Int]\n   graficaAltamenteCompuestos :: Int -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(esAltamanteCompuesto x) se verifica si x es altamente compuesto. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\"> \n     esAltamenteCompuesto 4      ==  True\n     esAltamenteCompuesto 5      ==  False\n     esAltamenteCompuesto 6      ==  True\n     esAltamenteCompuesto 1260   ==  True\n     esAltamenteCompuesto 2520   ==  True\n     esAltamenteCompuesto 27720  ==  True\n<\/pre>\n<ul>\n<li>altamente compuestos es la sucesi\u00f3n de los n\u00fameros altamente compuestos. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\"> \n     \u03bb> take 20 altamenteCompuestos\n     [1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560]\n<\/pre>\n<ul>\n<li>(graficaAltamenteCompuestos n) dibuja la gr\u00e1fica de los n primeros n\u00fameros altamente compuestos. Por ejemplo, (graficaAltamenteCompuestos 25) dibuja<\/li>\n<\/ul>\n<p><a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2019\/01\/Numeros_altamente_compuestos_2-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2019\/01\/Numeros_altamente_compuestos_2-1.png?resize=640%2C480\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-4569\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2019\/01\/Numeros_altamente_compuestos_2-1.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2019\/01\/Numeros_altamente_compuestos_2-1.png?resize=300%2C225&amp;ssl=1 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (group)\nimport Data.Numbers.Primes (primeFactors)\nimport Graphics.Gnuplot.Simple\n\n-- 1\u00aa definici\u00f3n de esAltamenteCompuesto\n-- =====================================\n\nesAltamenteCompuesto :: Int -> Bool\nesAltamenteCompuesto x =\n  and [nDivisores x > nDivisores y | y <- [1..x-1]]\n\n-- (nDivisores x) es el n\u00famero de divisores de x. Por ejemplo,\n--    nDivisores 30  ==  8\nnDivisores :: Int -> Int\nnDivisores x = length (divisores x)\n\n-- (divisores x) es la lista de los divisores de x. Por ejemplo,\n--    divisores 30  ==  [1,2,3,5,6,10,15,30]\ndivisores :: Int -> [Int]\ndivisores x =\n  [y | y <- [1..x]\n     , x `mod` y == 0]\n\n-- 2\u00aa definici\u00f3n de esAltamenteCompuesto\n-- =====================================\n\nesAltamenteCompuesto2 :: Int -> Bool\nesAltamenteCompuesto2 x =\n  all (nDivisores2 x >) [nDivisores2 y | y <- [1..x-1]]\n\n-- (nDivisores2 x) es el n\u00famero de divisores de x. Por ejemplo,\n--    nDivisores2 30  ==  8\nnDivisores2 :: Int -> Int\nnDivisores2 = succ . length . divisoresPropios\n\n-- (divisoresPropios x) es la lista de los divisores de x menores que\n-- x. Por ejemplo, \n--    divisoresPropios 30  ==  [1,2,3,5,6,10,15]\ndivisoresPropios :: Int -> [Int]\ndivisoresPropios x =\n  [y | y <- [1..x `div` 2]\n     , x `mod` y == 0]\n\n-- 3\u00aa definici\u00f3n de esAltamenteCompuesto\n-- =====================================\n\nesAltamenteCompuesto3 :: Int -> Bool\nesAltamenteCompuesto3 x =\n  all (nDivisores3 x >) [nDivisores3 y | y <- [1..x-1]]\n\n-- (nDivisores3 x) es el n\u00famero de divisores de x. Por ejemplo,\n--    nDivisores3 30  ==  8\nnDivisores3 :: Int -> Int\nnDivisores3 x =\n  product [1 + length xs | xs <- group (primeFactors x)]\n\n-- 4\u00aa definici\u00f3n de esAltamenteCompuesto\n-- =====================================\n\nesAltamenteCompuesto4 :: Int -> Bool\nesAltamenteCompuesto4 x =\n  x `pertenece` altamenteCompuestos2\n\n-- 1\u00aa definici\u00f3n de altamenteCompuestos \n-- ====================================\n\naltamenteCompuestos :: [Int]\naltamenteCompuestos =\n  filter esAltamenteCompuesto4 [1..]\n\n-- 2\u00aa definici\u00f3n de altamenteCompuestos \n-- ====================================\n\naltamenteCompuestos2 :: [Int]\naltamenteCompuestos2 =\n  1 : [y | ((x,n),(y,m)) <- zip sucMaxDivisores (tail sucMaxDivisores)\n         , m > n]\n\n-- sucMaxDivisores es la sucesi\u00f3n formada por los n\u00fameros enteros\n-- positivos y el m\u00e1ximo n\u00famero de divisores hasta cada n\u00famero. Por\n-- ejemplo,\n--    \u03bb> take 12 sucMaxDivisores\n--    [(1,1),(2,2),(3,2),(4,3),(5,3),(6,4),(7,4),(8,4),(9,4),(10,4),(11,4),(12,6)]\nsucMaxDivisores :: [(Int,Int)]\nsucMaxDivisores =\n  zip [1..] (scanl1 max (map nDivisores3 [1..]))\n\npertenece :: Int -> [Int] -> Bool\npertenece x ys =\n  x == head (dropWhile (<x) ys)\n\n-- Comparaci\u00f3n de eficiencia de esAltamenteCompuesto\n-- =================================================\n\n--    \u03bb> esAltamenteCompuesto 1260\n--    True\n--    (2.99 secs, 499,820,296 bytes)\n--    \u03bb> esAltamenteCompuesto2 1260\n--    True\n--    (0.51 secs, 83,902,744 bytes)\n--    \u03bb> esAltamenteCompuesto3 1260\n--    True\n--    (0.04 secs, 15,294,192 bytes)\n--    \u03bb> esAltamenteCompuesto4 1260\n--    True\n--    (0.04 secs, 15,594,392 bytes)\n--    \n--    \u03bb> esAltamenteCompuesto2 2520\n--    True\n--    (2.10 secs, 332,940,168 bytes)\n--    \u03bb> esAltamenteCompuesto3 2520\n--    True\n--    (0.09 secs, 37,896,168 bytes)\n--    \u03bb> esAltamenteCompuesto4 2520\n--    True\n--    (0.06 secs, 23,087,456 bytes)\n--\n--    \u03bb> esAltamenteCompuesto3 27720\n--    True\n--    (1.32 secs, 841,010,624 bytes)\n--    \u03bb> esAltamenteCompuesto4 27720\n--    True\n--    (1.33 secs, 810,870,384 bytes)\n\n-- Comparaci\u00f3n de eficiencia de altamenteCompuestos\n-- ================================================\n\n--    \u03bb> altamenteCompuestos !! 25\n--    45360\n--    (2.84 secs, 1,612,045,976 bytes)\n--    \u03bb> altamenteCompuestos2 !! 25\n--    45360\n--    (0.01 secs, 102,176 bytes)\n\n-- Definici\u00f3n de graficaAltamenteCompuestos\n-- ========================================\n\ngraficaAltamenteCompuestos :: Int -> IO ()\ngraficaAltamenteCompuestos n =\n  plotList [ Key Nothing\n           , PNG (\"Numeros_altamente_compuestos.png\")\n           ]\n           (take n altamenteCompuestos2)\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nNuestras horas son minutos<br \/>\ncuando esperamos saber,<br \/>\ny siglos cuando sabemos<br \/>\nlo que se puede aprender.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero altamente compuesto es un entero positivo con m\u00e1s divisores que cualquier entero positivo m\u00e1s peque\u00f1o. Por ejemplo, 4 es un n\u00famero altamente compuesto porque es el menor con 3 divisores, 5 no es altamente compuesto porque tiene menos divisores que 4 y 6 es un n\u00famero altamente compuesto porque es el menor con&#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,13,28,89,11,247,157,52],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4540"}],"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=4540"}],"version-history":[{"count":7,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4540\/revisions"}],"predecessor-version":[{"id":4622,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4540\/revisions\/4622"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}