{"id":6660,"date":"2022-02-23T05:00:45","date_gmt":"2022-02-23T03:00:45","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6660"},"modified":"2022-04-15T12:05:04","modified_gmt":"2022-04-15T10:05:04","slug":"primos-consecutivos-con-media-capicua","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/primos-consecutivos-con-media-capicua\/","title":{"rendered":"Primos consecutivos con media capic\u00faa"},"content":{"rendered":"<p>Definir la lista<\/p>\n<pre lang=\"text\">\n   primosConsecutivosConMediaCapicua :: [(Int,Int,Int)]\n<\/pre>\n<p>formada por las ternas (x,y,z) tales que x e y son primos consecutivos cuya media, z, es capic\u00faa. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 5 primosConsecutivosConMediaCapicua\n   [(3,5,4),(5,7,6),(7,11,9),(97,101,99),(109,113,111)]\n   \u03bb> primosConsecutivosConMediaCapicua !! 500\n   (5687863,5687867,5687865)\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericTake)\nimport Data.Numbers.Primes (primes)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nprimosConsecutivosConMediaCapicua :: [(Integer,Integer,Integer)]\nprimosConsecutivosConMediaCapicua =\n  [(x,y,z) | (x,y) <- zip primosImpares (tail primosImpares),\n             let z = (x + y) `div` 2,\n             capicua z]\n\n-- (primo x) se verifica si x es primo. Por ejemplo,\n--    primo 7  ==  True\n--    primo 8  ==  False\nprimo :: Integer -> Bool\nprimo x = [y | y <- [1..x], x `rem` y == 0] == [1,x]\n\n-- primosImpares es la lista de los n\u00fameros primos impares. Por ejemplo,\n--    take 10 primosImpares  ==  [3,5,7,11,13,17,19,23,29]\nprimosImpares :: [Integer]\nprimosImpares = [x | x <- [3,5..], primo x]\n\n-- (capicua x) se verifica si x es capic\u00faa. Por ejemplo,\ncapicua :: Integer -> Bool\ncapicua x = ys == reverse ys\n  where ys = show x\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nprimosConsecutivosConMediaCapicua2 :: [(Integer,Integer,Integer)]\nprimosConsecutivosConMediaCapicua2 =\n  [(x,y,z) | (x,y) <- zip primosImpares2 (tail primosImpares2),\n             let z = (x + y) `div` 2,\n             capicua z]\n\nprimosImpares2 :: [Integer]\nprimosImpares2 = tail (criba [2..])\n  where criba (p:ps) = p : criba [n | n <- ps, mod n p \/= 0]\n        criba []     = error \"Imposible\"\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nprimosConsecutivosConMediaCapicua3 :: [(Integer,Integer,Integer)]\nprimosConsecutivosConMediaCapicua3 =\n  [(x,y,z) | (x,y) <- zip (tail primos3) (drop 2 primos3),\n             let z = (x + y) `div` 2,\n             capicua z]\n\nprimos3 :: [Integer]\nprimos3 = 2 : 3 : criba3 0 (tail primos3) 3\n  where criba3 k (p:ps) x = [n | n <- [x+2,x+4..p*p-2],\n                                 and [n `rem` q \/= 0 | q <- take k (tail primos3)]]\n                            ++ criba3 (k+1) ps (p*p)\n        criba3 _ [] _     = error \"Imposible\"\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nprimosConsecutivosConMediaCapicua4 :: [(Integer,Integer,Integer)]\nprimosConsecutivosConMediaCapicua4 =\n  [(x,y,z) | (x,y) <- zip (tail primes) (drop 2 primes),\n             let z = (x + y) `div` 2,\n             capicua z]\n\n-- Equivalencia de definiciones\n-- ============================\n\n-- La propiedad es\nprop_primosConsecutivosConMediaCapicua :: Integer -> Bool\nprop_primosConsecutivosConMediaCapicua n =\n  all (== genericTake n primosConsecutivosConMediaCapicua)\n      [genericTake n primosConsecutivosConMediaCapicua2,\n       genericTake n primosConsecutivosConMediaCapicua3,\n       genericTake n primosConsecutivosConMediaCapicua4]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> prop_primosConsecutivosConMediaCapicua 25 {-# SCC \"\" #-}\n--    True\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> primosConsecutivosConMediaCapicua !! 30\n--    (12919,12923,12921)\n--    (4.60 secs, 1,877,064,288 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua2 !! 30\n--    (12919,12923,12921)\n--    (0.69 secs, 407,055,848 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua3 !! 30\n--    (12919,12923,12921)\n--    (0.07 secs, 18,597,104 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua4 !! 30\n--    (12919,12923,12921)\n--    (0.01 secs, 10,065,784 bytes)\n--\n--    \u03bb> primosConsecutivosConMediaCapicua2 !! 40\n--    (29287,29297,29292)\n--    (2.67 secs, 1,775,554,576 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua3 !! 40\n--    (29287,29297,29292)\n--    (0.09 secs, 32,325,808 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua4 !! 40\n--    (29287,29297,29292)\n--    (0.01 secs, 22,160,072 bytes)\n--\n--    \u03bb> primosConsecutivosConMediaCapicua3 !! 150\n--    (605503,605509,605506)\n--    (3.68 secs, 2,298,403,864 bytes)\n--    \u03bb> primosConsecutivosConMediaCapicua4 !! 150\n--    (605503,605509,605506)\n--    (0.24 secs, 491,917,240 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Primos_consecutivos_con_media_capicua.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la lista primosConsecutivosConMediaCapicua :: [(Int,Int,Int)] formada por las ternas (x,y,z) tales que x e y son primos consecutivos cuya media, z, es capic\u00faa. Por ejemplo, \u03bb> take 5 primosConsecutivosConMediaCapicua [(3,5,4),(5,7,6),(7,11,9),(97,101,99),(109,113,111)] \u03bb> primosConsecutivosConMediaCapicua !! 500 (5687863,5687867,5687865) Soluciones import Data.List (genericTake) import Data.Numbers.Primes (primes) &#8212; 1\u00aa soluci\u00f3n &#8212; =========== primosConsecutivosConMediaCapicua :: [(Integer,Integer,Integer)] primosConsecutivosConMediaCapicua = [(x,y,z) |&#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":[8,498,501,415,497,6,521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6660"}],"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=6660"}],"version-history":[{"count":7,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6660\/revisions"}],"predecessor-version":[{"id":6730,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6660\/revisions\/6730"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}