{"id":1232,"date":"2015-03-27T06:00:27","date_gmt":"2015-03-27T04:00:27","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1232"},"modified":"2015-05-01T08:54:59","modified_gmt":"2015-05-01T06:54:59","slug":"numeros-de-suma-prima-hereditarios-por-la-derecha","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-de-suma-prima-hereditarios-por-la-derecha\/","title":{"rendered":"N\u00fameros de suma prima hereditarios por la derecha"},"content":{"rendered":"<p>Decimos que un n\u00famero es de suma prima si la suma de todos sus d\u00edgitos es un n\u00famero primo. Por ejemplo el n\u00famero 562 es de suma prima pues la suma de sus d\u00edgitos es el n\u00famero primo 13; sin embargo, el n\u00famero 514 no es de suma prima pues la suma de sus d\u00edgitos es 10, que no es primo.<\/p>\n<p>Decimos que un n\u00famero es de suma prima hereditario por la derecha si es de suma prima y los n\u00fameros que se obtienen eliminando sus \u00faltimas cifras tambi\u00e9n son de suma prima. Por ejemplo 7426 es de suma prima hereditario por la derecha pues 7426, 742, 74 y 7 son todos n\u00fameros de suma prima.<\/p>\n<p>Definir la constante<\/p>\n<pre lang=\"text\">\n   listaSumaPrimaHD :: [Integer]\n<\/pre>\n<p>cuyo valor es la lista infinita de los n\u00fameros de suma prima hereditarios por la derecha. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   take 10 listaSumaPrimaHD     ==  [2,3,5,7,20,21,23,25,29,30]\n   listaSumaPrimaHD !! 2000000  ==  3800024668046\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Char (digitToInt)\nimport Data.Array\nimport Data.Numbers.Primes (isPrime)\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\nlistaSumaPrimaHD1 :: [Integer]\nlistaSumaPrimaHD1 = filter sumaPrimaHD [1..]\n\n-- (sumaPrimaHD n) se verifica si n es de suma prima hereditario por la\n-- derecha. Por ejemplo,\n--    sumaPrimaHD 7426  ==  True\n--    sumaPrimaHD 7427  ==  False\nsumaPrimaHD n\n    | n < 10    = isPrime n\n    | otherwise = sumaPrima n &#038;&#038; sumaPrimaHD (n `div` 10)\n\n-- (sumaPrima n) se verifica si n es un n\u00famero de suma prima. Por\n-- ejemplo, \n--    sumaPrima 562  ==  True\n--    sumaPrima 514  ==  False\nsumaPrima :: Integer -> Bool\nsumaPrima = isPrime . sum . digitos\n\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo,\n--    digitos 325  ==  [3,2,5]\ndigitos :: Integer -> [Integer]\ndigitos = map (fromIntegral . digitToInt) . show\n\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nlistaSumaPrimaHD2 :: [Integer]\nlistaSumaPrimaHD2 = map fst paresSumaPrimaHDDigitos\n\nparesSumaPrimaHDDigitos :: [(Integer, Integer)]\nparesSumaPrimaHDDigitos =\n    paresSumaPrimaHDDigitosAux 1 [(2,2),(3,3),(5,5),(7,7)]\n\nparesSumaPrimaHDDigitosAux :: Integer -> [(Integer,Integer)] -> \n                              [(Integer,Integer)]\nparesSumaPrimaHDDigitosAux n ac =\n    ac ++ paresSumaPrimaHDDigitosAux (n+1) \n                                     (concatMap extiendeSumaPrimaHD ac)\n\nextiendeSumaPrimaHD :: (Integer,Integer) -> [(Integer,Integer)]\nextiendeSumaPrimaHD (n,s) = [(n*10+k,s+k) | k <- [0..9], isPrime (s+k)]\n\n-- 3\u00aa definici\u00f3n\n-- =============\n\nlistaSumaPrimaHD3 :: [Integer]\nlistaSumaPrimaHD3 = \n    map fst (concat (iterate (concatMap extiendeSumaPrimaHD3) \n                             [(2,2),(3,3),(5,5),(7,7)]))\n\nextiendeSumaPrimaHD3 :: (Integer,Integer) -> [(Integer,Integer)]\nextiendeSumaPrimaHD3 (n,s) = [(n*10+k,s+k) | k <- extensiones ! s]\n\nextensiones :: Array Integer [Integer]\nextensiones = array (1,1000) \n              [(n,[k | k <- [0..9], isPrime (n+k)]) | n <- [1..1000]]\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    ghci> listaSumaPrimaHD1 !! 600\n--    34004\n--    (2.47 secs, 1565301720 bytes)\n--    ghci> listaSumaPrimaHD2 !! 600\n--    34004\n--    (0.02 secs, 7209000 bytes)\n--    ghci> listaSumaPrimaHD3 !! 600\n--    34004\n--    (0.01 secs, 1579920 bytes)\n-- \n--    ghci> listaSumaPrimaHD2 !! 2000000\n--    3800024668046\n--    (45.41 secs, 29056613824 bytes)\n--    ghci> listaSumaPrimaHD3 !! 2000000\n--    3800024668046\n--    (4.29 secs, 973265400 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Decimos que un n\u00famero es de suma prima si la suma de todos sus d\u00edgitos es un n\u00famero primo. Por ejemplo el n\u00famero 562 es de suma prima pues la suma de sus d\u00edgitos es el n\u00famero primo 13; sin embargo, el n\u00famero 514 no es de suma prima pues la suma de sus d\u00edgitos&#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":[7],"tags":[250,12,58,248,30,183,80,174,50,10,42,11,6,33,40],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1232"}],"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=1232"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1232\/revisions"}],"predecessor-version":[{"id":1286,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1232\/revisions\/1286"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}