{"id":5364,"date":"2020-01-20T05:30:50","date_gmt":"2020-01-20T03:30:50","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5364"},"modified":"2020-01-27T13:09:36","modified_gmt":"2020-01-27T11:09:36","slug":"maximos-locales-en-los-numeros-de-descomposiciones-de-goldbach","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/maximos-locales-en-los-numeros-de-descomposiciones-de-goldbach\/","title":{"rendered":"M\u00e1ximos locales en los n\u00fameros de descomposiciones de Goldbach"},"content":{"rendered":"<p>La <a href=\"http:\/\/bit.ly\/37dFLWG\">conjetura de Goldbach<\/a> afirma que todo n\u00famero entero mayor que 2 se puede expresar como suma de dos primos.<\/p>\n<p>Las <a href=\"http:\/\/bit.ly\/369X3nl\">descomposiciones de Goldbach<\/a> son las maneras de expresar un n\u00famero como suma de dos primos. Por ejemplo, el n\u00famero 10 tiene dos descomposiciones de Goldbach ya que se puede expresar como la suma de 3 y 7 y la suma de 5 y 5.<\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   descomposicionesGoldbach :: Integer -> [(Integer,Integer)]\n   numeroGoldbach :: Integer -> Integer\n   tieneMaximoLocalGoldbach :: Integer -> Bool\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(descomposicionesGoldbach n) es la lista de las descomposiciones de Goldbach del n\u00famero n. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     descomposicionesGoldbach 5   ==  [(2,3)]\n     descomposicionesGoldbach 10  ==  [(3,7),(5,5)]\n     descomposicionesGoldbach 22  ==  [(3,19),(5,17),(11,11)]\n     descomposicionesGoldbach 34  ==  [(3,31),(5,29),(11,23),(17,17)]\n     descomposicionesGoldbach 35  ==  []\n     descomposicionesGoldbach (9+10^9)  ==  [(2,1000000007)]\n<\/pre>\n<ul>\n<li>(numeroGolbach n) es el n\u00famero de descomposiciones de Goldbach del n\u00famero n. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     numeroGoldbach 5         ==  1\n     numeroGoldbach 10        ==  2\n     numeroGoldbach 22        ==  3\n     numeroGoldbach 34        ==  4\n     numeroGoldbach 35        ==  0\n     numeroGoldbach (9+10^9)  ==  1\n     maximum [numeroGoldbach n | n <- [2..3000]]  ==  128\n<\/pre>\n<ul>\n<li>(tieneMaximoLocalGoldbach n) se verifica si en n se alcanza un m\u00e1ximo local en el n\u00famero de descomposiciones de Goldbach; es decir, los n\u00fameros n tales que el n\u00famero de descomposiciones de Goldbach de n es mayor o igual que las de n-1 y las de n+1. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> filter tieneMaximoLocalGoldbach [1..45]\n     [1,2,4,5,6,7,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44]\n<\/pre>\n<p>En el ejemplo anterior se comprueba que en los m\u00faltiplos de 6 (es decir, en 6, 12, 18, 24, 30, 36 y 42), el n\u00famero de descomposiciones de Goldbach alcanza un m\u00e1ximo local. Comprobar con QuickCheck que esta propiedad se cumple en general; es decir, para todo entero positivo n, el n\u00famero de descomposiciones de Goldbach en 6n es un m\u00e1ximo local.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength)\nimport Data.Numbers.Primes (primes, isPrime)\nimport Test.QuickCheck\n\n-- Definiciones de descomposicionesGoldbach\n-- ========================================\n\n-- 1\u00aa definici\u00f3n\ndescomposicionesGoldbach1 :: Integer -> [(Integer,Integer)]\ndescomposicionesGoldbach1 n =\n  [(p,n-p) | p <- takeWhile (<= n `div` 2) primes\n           , isPrime (n-p)]\n\n-- 2\u00aa definici\u00f3n\ndescomposicionesGoldbach2 :: Integer -> [(Integer,Integer)]\ndescomposicionesGoldbach2 n\n  | odd n     = [(2,n-2) | isPrime (n-2)]\n  | otherwise = [(p,n-p) | p <- takeWhile (<= n `div` 2) primes\n                         , isPrime (n-p)]                               \n\n-- Comparaci\u00f3n de eficiencia \n--    \u03bb> descomposicionesGoldbach1 (9+10^8)\n--    [(2,100000007)]\n--    (10.75 secs, 32,177,389,480 bytes)\n--    \u03bb> descomposicionesGoldbach2 (9+10^8)\n--    [(2,100000007)]\n--    (0.01 secs, 3,228,912 bytes)\n\n-- En lo que sigue, usaremos la 2\u00aa definici\u00f3n\ndescomposicionesGoldbach :: Integer -> [(Integer,Integer)]\ndescomposicionesGoldbach = descomposicionesGoldbach2\n\n-- Definici\u00f3n de numeroGolbach\n-- ===========================\n\nnumeroGoldbach :: Integer -> Integer\nnumeroGoldbach = genericLength . descomposicionesGoldbach\n\n-- Definici\u00f3n de tieneMaximoLocalGoldbach\n-- ======================================\n\ntieneMaximoLocalGoldbach :: Integer -> Bool\ntieneMaximoLocalGoldbach n =\n  numeroGoldbach (n-1) <= x &#038;&#038; x >= numeroGoldbach (n+1)\n  where x = numeroGoldbach n\n\n-- La propiedad es\nprop_Goldbach :: Integer -> Property\nprop_Goldbach n =\n  n > 0 ==> tieneMaximoLocalGoldbach (6*n)\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_Goldbach\n--    +++ OK, passed 100 tests.\n<\/pre>\n<h4>Otras soluciones<\/h4>\n<ul>\n<li>Se pueden escribir otras soluciones en los comentarios.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=\"haskell\"&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<h4>Referencia<\/h4>\n<ul>\n<li><a href=\"http:\/\/bit.ly\/2taUBi3\">Local maxima of number of Goldbach decompositions<\/a> en ProofWiki.<\/li>\n<li><a href=\"https:\/\/oeis.org\/A061358\">Sucesi\u00f3n A061358<\/a> de OEIS.<\/li>\n<\/ul>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nTe abanicaras<br \/>\ncon un madrigal que diga:<br \/>\nen amor el olvido pone la sal.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>La conjetura de Goldbach afirma que todo n\u00famero entero mayor que 2 se puede expresar como suma de dos primos. Las descomposiciones de Goldbach son las maneras de expresar un n\u00famero como suma de dos primos. Por ejemplo, el n\u00famero 10 tiene dos descomposiciones de Goldbach ya que se puede expresar como la suma de&#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":[8,30,258,174,92,11,173,34,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5364"}],"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=5364"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5364\/revisions"}],"predecessor-version":[{"id":5471,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5364\/revisions\/5471"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}