{"id":4455,"date":"2018-12-24T06:00:24","date_gmt":"2018-12-24T04:00:24","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4455"},"modified":"2018-12-31T09:54:50","modified_gmt":"2018-12-31T07:54:50","slug":"divisores-compuestos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/divisores-compuestos\/","title":{"rendered":"Divisores compuestos"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   divisoresCompuestos :: Integer -> [Integer]\n<\/pre>\n<p>tal que (divisoresCompuestos x) es la lista de los divisores de x que son n\u00fameros compuestos (es decir, n\u00fameros mayores que 1 que no son primos). Por ejemplo,<\/p>\n<pre lang=\"text\">\n   divisoresCompuestos 30  ==  [6,10,15,30]\n   length (divisoresCompuestos (product [1..11]))  ==  534\n   length (divisoresCompuestos (product [1..14]))  ==  2585\n   length (divisoresCompuestos (product [1..16]))  ==  5369\n   length (divisoresCompuestos (product [1..25]))  ==  340022\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (group, inits, nub, sort, subsequences)\nimport Data.Numbers.Primes (isPrime, primeFactors)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos :: Integer -> [Integer]\ndivisoresCompuestos x =\n  [y | y <- divisores x\n     , y > 1\n     , not (isPrime y)]\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 :: Integer -> [Integer]\ndivisores x =\n  [y | y <- [1..x]\n     , x `mod` y == 0]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos2 :: Integer -> [Integer]\ndivisoresCompuestos2 x =\n  [y | y <- divisores2 x\n     , y > 1\n     , not (isPrime y)]\n\n-- (divisores2 x) es la lista de los divisores de x. Por ejemplo,\n--    divisores2 30  ==  [1,2,3,5,6,10,15,30]\ndivisores2 :: Integer -> [Integer]\ndivisores2 x =\n  [y | y <- [1..x `div` 2], x `mod` y == 0] ++ [x] \n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos3 :: Integer -> [Integer]\ndivisoresCompuestos3 x =\n  [y | y <- divisores2 x\n     , y > 1\n     , not (isPrime y)]\n\n-- (divisores3 x) es la lista de los divisores de x. Por ejemplo,\n--    divisores2 30  ==  [1,2,3,5,6,10,15,30]\ndivisores3 :: Integer -> [Integer]\ndivisores3 x =\n  nub (sort (ys ++ [x `div` y | y <- ys]))\n  where ys = [y | y <- [1..floor (sqrt (fromIntegral x))]\n                , x `mod` y == 0]\n             \n-- 4\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos4 :: Integer -> [Integer]\ndivisoresCompuestos4 x =\n  [y | y <- divisores4 x\n     , y > 1\n     , not (isPrime y)]\n\n-- (divisores4 x) es la lista de los divisores de x. Por ejemplo,\n--    divisores4 30  ==  [1,2,3,5,6,10,15,30]\ndivisores4 :: Integer -> [Integer]\ndivisores4 =\n  nub . sort . map product . subsequences . primeFactors\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos5 :: Integer -> [Integer]\ndivisoresCompuestos5 x =\n  [y | y <- divisores5 x\n     , y > 1\n     , not (isPrime y)]\n\n-- (divisores5 x) es la lista de los divisores de x. Por ejemplo,\n--    divisores5 30  ==  [1,2,3,5,6,10,15,30]\ndivisores5 :: Integer -> [Integer]\ndivisores5 =\n  sort\n  . map (product . concat)\n  . productoCartesiano\n  . map inits\n  . group\n  . primeFactors\n\n-- (productoCartesiano xss) es el producto cartesiano de los conjuntos\n-- xss. Por ejemplo, \n--    \u03bb> productoCartesiano [[1,3],[2,5],[6,4]]\n--    [[1,2,6],[1,2,4],[1,5,6],[1,5,4],[3,2,6],[3,2,4],[3,5,6],[3,5,4]]\nproductoCartesiano :: [[a]] -> [[a]]\nproductoCartesiano []       = [[]]\nproductoCartesiano (xs:xss) =\n  [x:ys | x <- xs, ys <- productoCartesiano xss]\n  \n-- 6\u00aa soluci\u00f3n\n-- ===========\n\ndivisoresCompuestos6 :: Integer -> [Integer]\ndivisoresCompuestos6 =\n  sort\n  . map product\n  . compuestos\n  . map concat\n  . productoCartesiano\n  . map inits\n  . group\n  . primeFactors\n  where compuestos xss = [xs | xs <- xss, length xs > 1]  \n\n-- Equivalencia de las definiciones\n-- ================================\n\n-- La propiedad es\nprop_divisoresCompuestos :: (Positive Integer) -> Bool\nprop_divisoresCompuestos (Positive x) =\n  all (== divisoresCompuestos x) [f x | f <- [ divisoresCompuestos2\n                                             , divisoresCompuestos3\n                                             , divisoresCompuestos4\n                                             , divisoresCompuestos5\n                                             , divisoresCompuestos6 ]]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_divisoresCompuestos\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> length (divisoresCompuestos (product [1..11]))\n--    534\n--    (14.59 secs, 7,985,108,976 bytes)\n--    \u03bb> length (divisoresCompuestos2 (product [1..11]))\n--    534\n--    (7.36 secs, 3,993,461,168 bytes)\n--    \u03bb> length (divisoresCompuestos3 (product [1..11]))\n--    534\n--    (7.35 secs, 3,993,461,336 bytes)\n--    \u03bb> length (divisoresCompuestos4 (product [1..11]))\n--    534\n--    (0.07 secs, 110,126,392 bytes)\n--    \u03bb> length (divisoresCompuestos5 (product [1..11]))\n--    534\n--    (0.01 secs, 3,332,224 bytes)\n--    \u03bb> length (divisoresCompuestos6 (product [1..11]))\n--    534\n--    (0.01 secs, 1,869,776 bytes)\n--    \n--    \u03bb> length (divisoresCompuestos4 (product [1..14]))\n--    2585\n--    (9.11 secs, 9,461,570,720 bytes)\n--    \u03bb> length (divisoresCompuestos5 (product [1..14]))\n--    2585\n--    (0.04 secs, 17,139,872 bytes)\n--    \u03bb> length (divisoresCompuestos6 (product [1..14]))\n--    2585\n--    (0.02 secs, 10,140,744 bytes)\n--    \n--    \u03bb> length (divisoresCompuestos2 (product [1..16]))\n--    5369\n--    (1.97 secs, 932,433,176 bytes)\n--    \u03bb> length (divisoresCompuestos5 (product [1..16]))\n--    5369\n--    (0.03 secs, 37,452,088 bytes)\n--    \u03bb> length (divisoresCompuestos6 (product [1..16]))\n--    5369\n--    (0.03 secs, 23,017,480 bytes)\n--    \n--    \u03bb> length (divisoresCompuestos5 (product [1..25]))\n--    340022\n--    (2.43 secs, 3,055,140,056 bytes)\n--    \u03bb> length (divisoresCompuestos6 (product [1..25]))\n--    340022\n--    (1.94 secs, 2,145,440,904 bytes)\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\n\u00abLa verdad del hombre empieza donde acaba su propia tonter\u00eda, pero la<br \/>\ntonter\u00eda del hombre es inagotable.\u00bb<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n divisoresCompuestos :: Integer -> [Integer] tal que (divisoresCompuestos x) es la lista de los divisores de x que son n\u00fameros compuestos (es decir, n\u00fameros mayores que 1 que no son primos). Por ejemplo, divisoresCompuestos 30 == [6,10,15,30] length (divisoresCompuestos (product [1..11])) == 534 length (divisoresCompuestos (product [1..14])) == 2585 length (divisoresCompuestos (product&#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,12,30,282,13,74,174,10,89,181,24,11,247,157,6,14,236,88],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4455"}],"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=4455"}],"version-history":[{"count":8,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4455\/revisions"}],"predecessor-version":[{"id":4489,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4455\/revisions\/4489"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}