{"id":5413,"date":"2020-01-23T04:30:26","date_gmt":"2020-01-23T02:30:26","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5413"},"modified":"2020-01-30T11:37:46","modified_gmt":"2020-01-30T09:37:46","slug":"sumas-de-cuatro-cuadrados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/sumas-de-cuatro-cuadrados\/","title":{"rendered":"Sumas de cuatro cuadrados"},"content":{"rendered":"<p>El n\u00famero 42 es una suma de cuatro cuadrados de n\u00fameros enteros positivos ya que<\/p>\n<pre lang=\"text\">\n   42 = 16 + 16 + 9 + 1 = 4\u00b2 + 4\u00b2 + 3\u00b2 + 1\u00b2\n<\/pre>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   sumas4Cuadrados :: Integer -> [(Integer,Integer,Integer,Integer)]\n   graficaNumeroSumas4Cuadrados :: Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(sumas4Cuadrados n) es la lista de las descompociones de n como suma de cuatro cuadrados. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">  \n     sumas4Cuadrados 42  ==  [(16,16,9,1),(25,9,4,4),(36,4,1,1)]\n     sumas4Cuadrados 14  ==  []\n     length (sumas4Cuadrados (5*10^4))  ==  260\n<\/pre>\n<ul>\n<li>(graficaNumeroSumas4Cuadrados n) dibuja la gr\u00e1fica del n\u00famero de descomposiciones en sumas de 4 cuadrados de los n primeros. Por ejemplo, (graficaNumeroSumas4Cuadrados 600) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2020\/01\/Sumas_de_cuatro_cuadrados.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2020\/01\/Sumas_de_cuatro_cuadrados.png?resize=640%2C480\" alt=\"\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-5414\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2020\/01\/Sumas_de_cuatro_cuadrados.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2020\/01\/Sumas_de_cuatro_cuadrados.png?resize=300%2C225&amp;ssl=1 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<h4>Pensamiento<\/h4>\n<pre lang=\"haskell\">\nimport Graphics.Gnuplot.Simple\n\n-- 1\u00aa definici\u00f3n de sumas4Cuadrados\n-- ================================\n\nsumas4Cuadrados :: Integer -> [(Integer,Integer,Integer,Integer)]\nsumas4Cuadrados n =\n  [(a^2,b^2,c^2,d) | a <- [1..n]\n                   , b <- [a..n]\n                   , c <- [b..n]\n                   , let d = n - a^2 - b^2 - c^2\n                   , c^2 <= d \n                   , esCuadrado d]\n\n-- (esCuadrado x) se verifica si x es un n\u00famero al cuadrado. Por\n-- ejemplo,\n--    esCuadrado 25  ==  True\n--    esCuadrado 26  ==  False\nesCuadrado :: Integer -> Bool\nesCuadrado x = x == y * y\n  where y = raiz x\n\n-- (raiz x) es la ra\u00edz cuadrada entera de x. Por ejemplo,\n--    raiz 25  ==  5\n--    raiz 24  ==  4\n--    raiz 26  ==  5\nraiz :: Integer -> Integer\nraiz x = floor (sqrt (fromIntegral x))\n\n-- 2\u00aa definici\u00f3n de sumas4Cuadrados\n-- ================================\n\n-- Los intervalos de b\u00faqueda en la definici\u00f3n anterior se pueden reducir\n-- teniendo en cuenta las siguientes restricciones\n--    1 <= a <= b <= c <= d \n--    n = a\u00b2 + b\u00b2 + c\u00b2 + d\u00b2 >= 4a\u00b2 ==> a <= sqrt (n\/4)\n--    n - a\u00b2 = b\u00b2 + c\u00b2 + d\u00b2 >= 3b\u00b2 ==> b <= sqrt ((n-a\u00b2)\/3)\n--    n - a\u00b2 - b\u00b2 = c\u00b2 + d\u00b2 >= 2c\u00b2 ==> c <= sqrt ((n-a\u00b2-b\u00b2)\/2)\n\nsumas4Cuadrados2 :: Integer -> [(Integer,Integer,Integer,Integer)]\nsumas4Cuadrados2 n =\n  [(a^2,b^2,c^2,d) | a <- [1 .. floor (sqrt (fromIntegral n \/ 4))]\n                   , b <- [a .. floor (sqrt (fromIntegral (n-a^2) \/ 3))]\n                   , c <- [b .. floor (sqrt (fromIntegral (n-a^2-b^2) \/ 2))]\n                   , let d = n - a^2 - b^2 - c^2\n                   , c^2 <= d \n                   , esCuadrado d]\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comprobaci\u00f3n es\n--    \u03bb> length (sumas4Cuadrados 300)\n--    11\n--    (7.93 secs, 11,280,814,312 bytes)\n--    \u03bb> length (sumas4Cuadrados2 300)\n--    11\n--    (0.01 secs, 901,520 bytes)\n\n-- Definici\u00f3n de graficaConvergencia\n-- ==================================\n\ngraficaNumeroSumas4Cuadrados :: Integer -> IO ()\ngraficaNumeroSumas4Cuadrados n =\n  plotList [ Key Nothing\n           , Title \"Numero de sumas como 4 cuadrados\"\n           , PNG \"Sumas_de_cuatro_cuadrados.png\"\n           ]\n           [length (sumas4Cuadrados2 k) | k <- [0..n]] \n\n-- Definici\u00f3n de esSuma4Cuadrados\n-- ==============================\n\n-- (esSuma4Cuadrados n) se verifica si n es la suma de 4 cuadrados. Por\n-- ejemplo, \n--    esSuma4Cuadrados 42  ==  True\n--    esSuma4Cuadrados 11  ==  False\n--    esSuma4Cuadrados 41  ==  False\nesSuma4Cuadrados :: Integer -> Bool\nesSuma4Cuadrados = not . null . sumas4Cuadrados2\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=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<blockquote><p>\n\u00bfCu\u00e1l es el peor de todos<br \/>\nlos afanes? Preguntar.<br \/>\n\u00bfY el mejor? &#8211; Hacer camino<br \/>\nsin volver la vista atr\u00e1s.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>El n\u00famero 42 es una suma de cuatro cuadrados de n\u00fameros enteros positivos ya que 42 = 16 + 16 + 9 + 1 = 4\u00b2 + 4\u00b2 + 3\u00b2 + 1\u00b2 Definir las funciones sumas4Cuadrados :: Integer -> [(Integer,Integer,Integer,Integer)] graficaNumeroSumas4Cuadrados :: Integer -> IO () tales que (sumas4Cuadrados n) es la lista de las&#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,282,183,376,28,309,236],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5413"}],"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=5413"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5413\/revisions"}],"predecessor-version":[{"id":5488,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5413\/revisions\/5488"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}