{"id":4441,"date":"2018-12-20T06:00:25","date_gmt":"2018-12-20T04:00:25","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4441"},"modified":"2018-12-27T08:24:06","modified_gmt":"2018-12-27T06:24:06","slug":"divisores-propios-maximales","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/divisores-propios-maximales\/","title":{"rendered":"Divisores propios maximales"},"content":{"rendered":"<p>Se dice que a es un divisor propio maximal de un n\u00famero b si a es un divisor de b distinto de b y no existe ning\u00fan n\u00famero c tal que a &lt; c &lt; b, a es un divisor de c y c es un divisor de b. Por ejemplo, 15 es un divisor propio maximal de 30, pero 5 no lo es.<\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   divisoresPropiosMaximales  :: Integer -> [Integer]\n   nDivisoresPropiosMaximales :: Integer -> Integer\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(divisoresPropiosMaximales x) es la lista de los divisores propios maximales de x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     divisoresPropiosMaximales 30   ==  [6,10,15]\n     divisoresPropiosMaximales 420  ==  [60,84,140,210]\n     divisoresPropiosMaximales 7    ==  [1]\n     length (divisoresPropiosMaximales (product [1..3*10^4])) == 3245\n<\/pre>\n<ul>\n<li>(nDivisoresPropiosMaximales x) es el n\u00famero de  divisores propios maximales de x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     nDivisoresPropiosMaximales 30   ==  3\n     nDivisoresPropiosMaximales 420  ==  4\n     nDivisoresPropiosMaximales 7    ==  1\n     nDivisoresPropiosMaximales (product [1..3*10^4])  ==  3245\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes (primeFactors)\nimport Data.List (genericLength, group, nub)\nimport Test.QuickCheck\n\n-- 1\u00aa definici\u00f3n de divisoresPropiosMaximales\n-- ==========================================\n\ndivisoresPropiosMaximales :: Integer -> [Integer]\ndivisoresPropiosMaximales x =\n  [y | y <- divisoresPropios x\n     , null [z | z <- divisoresPropios x\n               , y < z \n               , z `mod` y == 0]]\n\n-- (divisoresPropios x) es la lista de los divisores propios de x; es\n-- decir, de los divisores de x distintos de x. Por ejemplo,\n--    divisoresPropios 30  ==  [1,2,3,5,6,10,15]\ndivisoresPropios :: Integer -> [Integer]\ndivisoresPropios x =\n  [y | y <- [1..x-1]\n     , x `mod` y == 0]\n\n-- 2\u00aa definici\u00f3n de divisoresPropiosMaximales\n-- ==========================================\n\ndivisoresPropiosMaximales2 :: Integer -> [Integer]\ndivisoresPropiosMaximales2 x =\n  reverse [x `div` y | y <- nub (primeFactors x)]\n\n-- Equivalencia de las definiciones de divisoresPropiosMaximales\n-- =============================================================\n\n-- La propiedad es\nprop_divisoresPropiosMaximales_equiv :: (Positive Integer) -> Bool\nprop_divisoresPropiosMaximales_equiv (Positive x) =\n  divisoresPropiosMaximales x == divisoresPropiosMaximales2 x\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_divisoresPropiosMaximales_equiv\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia de divisoresPropiosMaximales\n-- ======================================================\n\n--    \u03bb> length (divisoresPropiosMaximales (product [1..10]))\n--    4\n--    (13.33 secs, 7,037,241,776 bytes)\n--    \u03bb> length (divisoresPropiosMaximales2 (product [1..10]))\n--    4\n--    (0.00 secs, 135,848 bytes)\n\n-- 1\u00aa definici\u00f3n de nDivisoresPropiosMaximales\n-- ===========================================\n\nnDivisoresPropiosMaximales :: Integer -> Integer\nnDivisoresPropiosMaximales =\n  genericLength . divisoresPropiosMaximales\n  \n-- 2\u00aa definici\u00f3n de nDivisoresPropiosMaximales\n-- ===========================================\n\nnDivisoresPropiosMaximales2 :: Integer -> Integer\nnDivisoresPropiosMaximales2 =\n  genericLength . divisoresPropiosMaximales2\n  \n-- 3\u00aa definici\u00f3n de nDivisoresPropiosMaximales\n-- ===========================================\n\nnDivisoresPropiosMaximales3 :: Integer -> Integer\nnDivisoresPropiosMaximales3 =\n  genericLength . group . primeFactors\n\n-- Equivalencia de las definiciones de nDivisoresPropiosMaximales\n-- ==============================================================\n\n-- La propiedad es\nprop_nDivisoresPropiosMaximales_equiv :: (Positive Integer) -> Bool\nprop_nDivisoresPropiosMaximales_equiv (Positive x) =\n  nDivisoresPropiosMaximales  x == nDivisoresPropiosMaximales3 x &&\n  nDivisoresPropiosMaximales2 x == nDivisoresPropiosMaximales3 x \n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_nDivisoresPropiosMaximales_equiv\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia de nDivisoresPropiosMaximales\n-- =======================================================\n\n--    \u03bb> nDivisoresPropiosMaximales2 (product [1..10])\n--    4\n--    (13.33 secs, 7,037,242,536 bytes)\n--    \u03bb> nDivisoresPropiosMaximales2 (product [1..10])\n--    4\n--    (0.00 secs, 135,640 bytes)\n--    \u03bb> nDivisoresPropiosMaximales3 (product [1..10])\n--    4\n--    (0.00 secs, 135,232 bytes)\n--    \n--    \u03bb> nDivisoresPropiosMaximales2 (product [1..3*10^4])\n--    3245\n--    (3.12 secs, 4,636,274,040 bytes)\n--    \u03bb> nDivisoresPropiosMaximales3 (product [1..3*10^4])\n--    3245\n--    (3.06 secs, 4,649,295,056 bytes)\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\n\u00abMoneda que est\u00e1 en la mano<br \/>\nquiz\u00e1 se deba guardar;<br \/>\nla monedita del alma<br \/>\nse pierde si no se da.\u00bb<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Se dice que a es un divisor propio maximal de un n\u00famero b si a es un divisor de b distinto de b y no existe ning\u00fan n\u00famero c tal que a &lt; c &lt; b, a es un divisor de c y c es un divisor de b. Por ejemplo, 15 es un divisor&#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":[8,30,258,13,89,24,141,247,32,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4441"}],"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=4441"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4441\/revisions"}],"predecessor-version":[{"id":4482,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4441\/revisions\/4482"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}