{"id":7090,"date":"2022-06-23T06:00:29","date_gmt":"2022-06-23T04:00:29","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7090"},"modified":"2022-06-21T11:54:44","modified_gmt":"2022-06-21T09:54:44","slug":"numeros-para-los-que-mcm12-n-1-mcm12-n","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-para-los-que-mcm12-n-1-mcm12-n\/","title":{"rendered":"N\u00fameros para los que mcm(1,2,&#8230;n-1) = mcm(1,2,&#8230;,n)"},"content":{"rendered":"<p>Un n\u00famero n es especial si mcm(1,2,&#8230;,n-1) = mcm(1,2,&#8230;,n). Por ejemplo, el 6 es especial ya que<\/p>\n<pre lang=\"text\">\n   mcm(1,2,3,4,5) = 60 = mcm(1,2,3,4,5,6)\n<\/pre>\n<p>Definir la sucesi\u00f3n<\/p>\n<pre lang=\"text\">\n   especiales :: [Integer]\n<\/pre>\n<p>cuyos t\u00e9rminos son los n\u00fameros especiales. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   take 10 especiales     ==  [1,6,10,12,14,15,18,20,21,22]\n   especiales !! 50       ==  84\n   especiales !! 500      ==  638\n   especiales !! 5000     ==  5806\n   especiales !! 50000    ==  55746\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck (NonNegative(NonNegative), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nespeciales1 :: [Integer]\nespeciales1 = filter especial1 [1..]\n\nespecial1 :: Integer -> Bool\nespecial1 n = mcm1 [1..n-1] == mcm1 [1..n]\n\nmcm1 :: [Integer] -> Integer\nmcm1 []     = 1\nmcm1 (x:xs) = lcm x (mcm1 xs)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nespeciales2 :: [Integer]\nespeciales2 = filter especial2 [1..]\n\nespecial2 :: Integer -> Bool\nespecial2 n = mcm2 [1..n-1] == mcm2 [1..n]\n\nmcm2 :: [Integer] -> Integer\nmcm2 = foldr lcm 1\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nespeciales3 :: [Integer]\nespeciales3 = [n | ((n,x),(_,y)) <- zip mcms (tail mcms)\n                 , x == y]\n\nmcms :: [(Integer,Integer)]\nmcms = zip [1..] (scanl lcm 1 [1..])\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_especiales :: NonNegative Int -> Bool\nprop_especiales (NonNegative n) =\n  all (== especiales1 !! n)\n      [especiales2 !! n,\n       especiales3 !! n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_especiales\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n\n-- Comparaci\u00f3n \n--    \u03bb> especiales1 !! 2000\n--    2390\n--    (3.38 secs, 4,724,497,192 bytes)\n--    \u03bb> especiales2 !! 2000\n--    2390\n--    (1.91 secs, 4,303,415,512 bytes)\n--    \u03bb> especiales3 !! 2000\n--    2390\n--    (0.01 secs, 4,209,664 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Numeros_para_los_que_mcm.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero n es especial si mcm(1,2,&#8230;,n-1) = mcm(1,2,&#8230;,n). Por ejemplo, el 6 es especial ya que mcm(1,2,3,4,5) = 60 = mcm(1,2,3,4,5,6) Definir la sucesi\u00f3n especiales :: [Integer] cuyos t\u00e9rminos son los n\u00fameros especiales. Por ejemplo, take 10 especiales == [1,6,10,12,14,15,18,20,21,22] especiales !! 50 == 84 especiales !! 500 == 638 especiales !! 5000 ==&#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":[2],"tags":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7090"}],"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=7090"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7090\/revisions"}],"predecessor-version":[{"id":7091,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7090\/revisions\/7091"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}