{"id":6333,"date":"2021-05-04T06:00:32","date_gmt":"2021-05-04T04:00:32","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6333"},"modified":"2021-05-11T08:17:23","modified_gmt":"2021-05-11T06:17:23","slug":"ecuacion-diofantica-con-primos-ome1995-p4","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/ecuacion-diofantica-con-primos-ome1995-p4\/","title":{"rendered":"Ecuaci\u00f3n diof\u00e1ntica con primos (OME1995 P4)"},"content":{"rendered":"<p>El enunciado del <a href=\"https:\/\/bit.ly\/32J4qlH\">problema 4 de la OME (Olimpiada Matem\u00e1tica Espa\u00f1ola) del 1995<\/a> es<\/p>\n<blockquote><p>\n  Siendo p un n\u00famero primo, halla las soluciones enteras de la ecuaci\u00f3n:<\/p>\n<blockquote><p>\n    p.(x + y) = x.y\n  <\/p><\/blockquote>\n<\/blockquote>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   soluciones :: Integer -> [(Integer, Integer)]\n<\/pre>\n<p>tal que (soluciones p) es la lista de los pares de enteros (x,y) tales que p.(x + y) = x.y. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 3 (soluciones 7)\n   [(0,0),(14,14),(-42,6)]\n   \u03bb> sum [x+y | (x,y) <- take 6 (soluciones (primes !! (10^6)))]\n   185830404\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (sort)\nimport Data.Numbers.Primes (primes)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nsoluciones :: Integer -> [(Integer, Integer)]\nsoluciones p =\n  [(x,y) | (x,y) <- pares,\n           p * (x + y) == x * y]\n\n-- pares es la lista de los pares de n\u00fameros enteros ordenados por la\n-- suma de los valores absolutos de sus componentes. Por ejemplo,\n--    \u03bb> take 38 pares\n--    [(0,0),(-1,0),(0,-1),(0,1),(1,0),(-2,0),(-1,-1),(-1,1),(0,-2),\n--     (0,2),(1,-1),(1,1),(2,0),(-3,0),(-2,-1),(-2,1),(-1,-2),(-1,2),\n--     (0,-3),(0,3),(1,-2),(1,2),(2,-1),(2,1),(3,0),(-4,0),(-3,-1),\n--     (-3,1),(-2,-2),(-2,2),(-1,-3),(-1,3),(0,-4),(0,4),(1,-3),(1,3),\n--     (2,-2),(2,2)]\npares :: [(Integer,Integer)]\npares = concatMap paresEnterosSuma [0..]\n\n-- (paresEnterosSuma n) es la lista de pares de enteros (x,y) tales que la suma\n-- de los valores absolutos de x e y es igual a n. Por ejemplo,\n--    \u03bb> paresEnterosSuma 3\n--    [(-3,0),(-2,-1),(-2,1),(-1,-2),(-1,2),(0,-3),(0,3),(1,-2),(1,2),\n--     (2,-1),(2,1),(3,0)]\nparesEnterosSuma :: Integer -> [(Integer,Integer)]\nparesEnterosSuma n = concatMap aux [-n..n]\n  where aux k | m == 0    = [(k,0)]\n              | otherwise = [(k,-m),(k,m)]\n          where m = n - abs k\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\n-- Observando los siguientes c\u00e1lculos:\n--    take 6 (soluciones 2)  == [(0,0),(-2,1),(1,-2),(4,4),(3,6),(6,3)]\n--    take 6 (soluciones 3)  == [(0,0),(-6,2),(2,-6),(6,6),(4,12),(12,4)]\n--    take 6 (soluciones 5)  == [(0,0),(10,10),(-20,4),(4,-20),(6,30),(30,6)]\n--    take 6 (soluciones 7)  == [(0,0),(14,14),(-42,6),(6,-42),(8,56),(56,8)]\n--    take 6 (soluciones 11) == [(0,0),(22,22),(-110,10),(10,-110),(12,132),(132,12)]\n\nsoluciones2 :: Integer -> [(Integer, Integer)]\nsoluciones2 2 = [(0,0),(-2,1),(1,-2),(4,4),(3,6),(6,3)]\nsoluciones2 3 = [(0,0),(-6,2),(2,-6),(6,6),(4,12),(12,4)]\nsoluciones2 p =\n  [(0,0), (2*p,2*p), (p*(1-p),p-1), (p-1,p*(1-p)), (p+1,p*(p+1)), (p*(p+1),p+1)]\n\n-- Comparaci\u00f3n de equivalencia\n-- ===========================\n\n-- La propiedad es\nprop_equivalencia :: Bool\nprop_equivalencia =\n  and [ take 6 (soluciones p) == soluciones2 p\n      | p <- takeWhile (<= 37) primes]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> prop_equivalencia\n--    True\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> take 6 (soluciones 37)\n--    [(0,0),(74,74),(-1332,36),(36,-1332),(38,1406),(1406,38)]\n--    (3.88 secs, 2,521,196,352 bytes)\n--    \u03bb> take 6 (soluciones2 37)\n--    [(0,0),(74,74),(-1332,36),(36,-1332),(38,1406),(1406,38)]\n--    (0.01 secs, 144,192 bytes)\n<\/pre>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>El enunciado del problema 4 de la OME (Olimpiada Matem\u00e1tica Espa\u00f1ola) del 1995 es Siendo p un n\u00famero primo, halla las soluciones enteras de la ecuaci\u00f3n: p.(x + y) = x.y Definir la funci\u00f3n soluciones :: Integer -> [(Integer, Integer)] tal que (soluciones p) es la lista de los pares de enteros (x,y) tales 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":[2],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6333"}],"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=6333"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6333\/revisions"}],"predecessor-version":[{"id":6446,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6333\/revisions\/6446"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}