{"id":6522,"date":"2021-06-15T06:00:52","date_gmt":"2021-06-15T04:00:52","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6522"},"modified":"2022-01-26T12:13:47","modified_gmt":"2022-01-26T10:13:47","slug":"maxima-suma-de-dos-cuadrados-condicionados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/maxima-suma-de-dos-cuadrados-condicionados\/","title":{"rendered":"M\u00e1xima suma de dos cuadrados condicionados"},"content":{"rendered":"<p>El enunciado del problema 3 de la IMO (Olimpiada Internacional de Matem\u00e1ticas) de 1981 es<\/p>\n<blockquote><p>\n  Calcular el m\u00e1ximo valor de m\u00b2 + n\u00b2 donde m y n son n\u00fameros enteros tales que m, n \u2208 {1, 2, &#8230;, 1981} y (n\u00b2 &#8211; mn &#8211; m\u00b2)\u00b2 = 1.\n<\/p><\/blockquote>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   maximoValor :: Integer -> Integer\n<\/pre>\n<p>tal que (maximoValor k) es el m\u00e1ximo valor de m\u00b2 + n\u00b2 donde m y n son n\u00fameros enteros tales que m, n \u2208 {1, 2, &#8230;, k} y (n\u00b2 &#8211; mn &#8211; m\u00b2)\u00b2 = 1. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   maximoValor 10       ==  89\n   maximoValor (10^20)  ==  9663391306290450775010025392525829059713\n   length (show (maximoValor5 (10^(4*10^4))))  ==  80000\n<\/pre>\n<p>Usando la funci\u00f3n maximoValor, calcular la respuesta del problema.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nmaximoValor :: Integer -> Integer\nmaximoValor k =\n  maximum [m^2 + n^2 | m <- [1..k],\n                       n <- [m..k],\n                       (n^2 - m*n - m^2)^2 == 1]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nmaximoValor2 :: Integer -> Integer\nmaximoValor2 k =\n  maximum [m^2 + n^2 | (m, n) <- soluciones k]\n\n-- (soluciones k) es la lista de los pares (m,n) tales que\n-- m, n \u2208 {1, 2,..., k}, m <= n y (n\u00b2 - mn - m\u00b2)\u00b2 = 1.\n-- Por ejemplo,\n--    \u03bb> soluciones 50\n--    [(1,1),(1,2),(2,3),(3,5),(5,8),(8,13),(13,21),(21,34)]\nsoluciones :: Integer -> [(Integer,Integer)]\nsoluciones k =\n  [(m, n) | m <- [1..k],\n            n <- [m..k],\n            (n^2 - m*n - m^2)^2 == 1]\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nmaximoValor3 :: Integer -> Integer\nmaximoValor3 k = m^2 + n^2\n  where (m, n) = last (soluciones k)\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nmaximoValor4 :: Integer -> Integer\nmaximoValor4 k = m^2 + n^2\n  where (m, n) = head [(m, n) | m <- [k,k-1..1],\n                                n <- [k,k-1..m],\n                                (n^2 - m*n - m^2)^2 == 1]\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\n-- Con el siguiente c\u00e1lculo\n--    \u03bb> soluciones 50\n--    [(1,1),(1,2),(2,3),(3,5),(5,8),(8,13),(13,21),(21,34)]\n-- se observa que las soluciones son pares de t\u00e9rminos consecutivos de\n-- la sucessi\u00f3n de Fibonacci.\n\nmaximoValor5 :: Integer -> Integer\nmaximoValor5 k = m^2 + n^2\n  where [m,n] = take 2 (reverse (takeWhile (<= k) fibs))\n\n-- fibs es la la sucesi\u00f3n de los n\u00fameros de Fibonacci. Por ejemplo,\n--    take 14 fibs  == [1,1,2,3,5,8,13,21,34,55,89,144,233,377]\nfibs :: [Integer]\nfibs = 1 : scanl (+) 1 fibs\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> maximoValor 1500\n--    1346269\n--    (1.94 secs, 2,188,819,744 bytes)\n--    \u03bb> maximoValor2 1500\n--    1346269\n--    (1.93 secs, 2,188,821,752 bytes)\n--    \u03bb> maximoValor3 1500\n--    1346269\n--    (1.95 secs, 2,188,803,312 bytes)\n--    \u03bb> maximoValor4 1500\n--    1346269\n--    (0.71 secs, 775,331,376 bytes)\n--    \u03bb> maximoValor5 1500\n--    1346269\n--    (0.01 secs, 106,952 bytes)\n--\n--    \u03bb> maximoValor4 4000\n--    9227465\n--    (5.00 secs, 5,641,750,992 bytes)\n--    \u03bb> maximoValor5 4000\n--    9227465\n--    (0.01 secs, 107,104 bytes)\n\n-- C\u00e1lculo de la respuesta\n-- =======================\n\n-- El c\u00e1lculo es\n--    \u03bb> maximoValor5 1981\n--    3524578\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 3 de la IMO (Olimpiada Internacional de Matem\u00e1ticas) de 1981 es Calcular el m\u00e1ximo valor de m\u00b2 + n\u00b2 donde m y n son n\u00fameros enteros tales que m, n \u2208 {1, 2, &#8230;, 1981} y (n\u00b2 &#8211; mn &#8211; m\u00b2)\u00b2 = 1. Definir la funci\u00f3n maximoValor :: Integer -> Integer&#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\/6522"}],"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=6522"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6522\/revisions"}],"predecessor-version":[{"id":6543,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6522\/revisions\/6543"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6522"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6522"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6522"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}