{"id":799,"date":"2014-12-11T07:00:53","date_gmt":"2014-12-11T05:00:53","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=799"},"modified":"2022-03-25T20:11:33","modified_gmt":"2022-03-25T18:11:33","slug":"numeros-que-sumados-a-su-siguiente-primo-dan-primos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-que-sumados-a-su-siguiente-primo-dan-primos\/","title":{"rendered":"N\u00fameros que sumados a su siguiente primo dan primos"},"content":{"rendered":"<h4>Introducci\u00f3n<\/h4>\n<p>La <strong>Enciclopedia electr\u00f3nica de sucesiones de enteros<\/strong> (OEIS por sus siglas en ingl\u00e9s, de <em>On-Line Encyclopedia of Integer Sequences<\/em>) es una base de datos que registra sucesiones de n\u00fameros enteros. Est\u00e1 disponible libremente en Internet, en la direcci\u00f3n <a href=\"http:\/\/oeis.org\">http:\/\/oeis.org<\/a>.<\/p>\n<p>La semana pasada Antonio Rold\u00e1n a\u00f1adi\u00f3 una nueva sucesi\u00f3n a la OEIS, la <a href=\"https:\/\/oeis.org\/A249624\">A249624<\/a> que sirve de base para el problema de hoy.<\/p>\n<h4>Enunciado<\/h4>\n<pre lang=\"text\">\n-- Definir la sucesi\u00f3n\n--     a249624 :: [Integer]\n-- tal que sus elementos son los n\u00fameros x tales que la suma de x y el\n-- primo que le sigue es un n\u00famero primo. Por ejemplo, \n--    ghci> take 20 a249624\n--    [0,1,2,6,8,14,18,20,24,30,34,36,38,48,50,54,64,68,78,80]\n-- \n-- El n\u00famero 8 est\u00e1 en la sucesi\u00f3n porque su siguiente primo es 11 y\n-- 8+11=19 es primo. El 12 no est\u00e1 en la sucesi\u00f3n porque su siguiente\n-- primo es 13 y 12+13=25 no es primo.\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Numbers.Primes (primes, isPrime)\nimport Data.List (genericReplicate)\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\na249624 :: [Integer]\na249624 = 0: 1: [x | x <- [2,4..], primo (x + siguientePrimo x)]\n\nprimo :: Integer -> Bool\nprimo x = [y | y <- [1..x], x `rem` y == 0] == [1,x]\n\nsiguientePrimo :: Integer -> Integer\nsiguientePrimo x = head [y | y <- [x+1..], primo y]\n\n-- 2\u00aa definici\u00f3n (por recursi\u00f3n)\n-- =============================\n\na249624b :: [Integer]\na249624b = 0 : 1 : 2: aux [2,4..] primos where\n    aux (x:xs) (y:ys) \n        | y < x                = aux (x:xs) ys\n        | (x+y) `pertenece` ys = x : aux xs (y:ys)\n        | otherwise            = aux xs (y:ys)\n    pertenece x ys = x == head (dropWhile (<x) ys)\n\nprimos :: [Integer]\nprimos = 2 : [x | x <- [3,5..], primo x]\n\n-- 3\u00aa definici\u00f3n (con la librer\u00eda de primos)\n-- =========================================\n\na249624c :: [Integer]\na249624c = 0: 1: [x | x <- [2,4..], isPrime (x + siguientePrimo3 x)]\n\nsiguientePrimo3 x = head [y | y <- [x+1..], isPrime y]\n\n-- 4\u00aa definici\u00f3n (por recursi\u00f3n con la librer\u00eda de primos)\n-- =======================================================\n\na249624d :: [Integer]\na249624d = 0 : 1 : 2: aux [2,4..] primes where\n    aux (x:xs) (y:ys) \n        | y < x                = aux (x:xs) ys\n        | (x+y) `pertenece` ys = x : aux xs (y:ys)\n        | otherwise            = aux xs (y:ys)\n    pertenece x ys = x == head (dropWhile (<x) ys)\n\n-- 5\u00aa definici\u00f3n\n-- =============\n\na249624e :: [Integer]\na249624e = [a | q <- primes, \n                let p = siguientePrimo3 (q `div` 2),\n                let a = q-p,\n                siguientePrimo3 a == p]\n\n-- 6\u00aa definici\u00f3n\n-- =============\n\na249624f :: [Integer]\na249624f = [x | (x,y) <- zip [0..] ps, isPrime (x+y)]\n    where ps = 2:2:concat (zipWith f primes (tail primes))\n          f p q = genericReplicate (q-p) q\n\n-- 7\u00aa definici\u00f3n\n-- =============\n\na249624g :: [Integer]\na249624g = 0:1:(aux primes (tail primes) primes)\n    where aux (x:xs) (y:ys) zs\n              | null rs   = aux xs ys zs2\n              | otherwise = [r-y | r <- rs] ++ (aux xs ys zs2)\n              where a = x+y\n                    b = 2*y-1\n                    zs1 = takeWhile (<=b) zs\n                    rs = [r | r <- [a..b], r `elem` zs1]\n                    zs2 = dropWhile (<=b) zs\n\n-- ---------------------------------------------------------------------\n-- \u00a7 Comparaci\u00f3n de eficiencia                                        --\n-- ---------------------------------------------------------------------\n\n-- La comparaci\u00f3n es\n--    ghci> :set +s\n--    \n--    ghci> a249624 !! 700\n--    5670\n--    (12.72 secs, 1245938184 bytes)\n--    \n--    ghci> a249624b !! 700\n--    5670\n--    (8.01 secs, 764775268 bytes)\n-- \n--    ghci> a249624c !! 700\n--    5670\n--    (0.22 secs, 108982640 bytes)\n--    \n--    ghci> a249624d !! 700\n--    5670\n--    (0.20 secs, 4707384 bytes)\n--    \n--    ghci> a249624e !! 700\n--    5670\n--    (0.17 secs, 77283064 bytes)\n--    \n--    ghci> a249624f !! 700\n--    5670\n--    (0.08 secs, 31684408 bytes)\n--    \n--    ghci> a249624g !! 700\n--    5670\n--    (0.03 secs, 4651576 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n La Enciclopedia electr\u00f3nica de sucesiones de enteros (OEIS por sus siglas en ingl\u00e9s, de On-Line Encyclopedia of Integer Sequences) es una base de datos que registra sucesiones de n\u00fameros enteros. Est\u00e1 disponible libremente en Internet, en la direcci\u00f3n http:\/\/oeis.org. La semana pasada Antonio Rold\u00e1n a\u00f1adi\u00f3 una nueva sucesi\u00f3n a la OEIS, la A249624 que&#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":[5],"tags":[8,12,30,59,175,71,174,415,141,11,173,6,31,45,76],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/799"}],"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=799"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/799\/revisions"}],"predecessor-version":[{"id":877,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/799\/revisions\/877"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}