{"id":5416,"date":"2020-01-24T05:30:46","date_gmt":"2020-01-24T03:30:46","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5416"},"modified":"2020-01-31T14:22:35","modified_gmt":"2020-01-31T12:22:35","slug":"productos-de-sumas-de-cuatro-cuadrados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/productos-de-sumas-de-cuatro-cuadrados\/","title":{"rendered":"Productos de sumas de cuatro cuadrados"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   productoSuma4Cuadrados :: Integral a => [a] -> [a] -> [a] -> [a] -> a\n<\/pre>\n<p>tal que (productoSuma4Cuadrados as bs cs ds) es el producto de las sumas de los cuadrados de cada una de las listas que ocupan la misma posici\u00f3n (hasta que alguna se acaba). Por ejemplo,<\/p>\n<pre lang=\"text\">\n   productoSuma4Cuadrados [2,3] [1,5] [4,6] [0,3,9]\n   = (2\u00b2 + 1\u00b2 + 4\u00b2 + 0\u00b2) * (3\u00b2 + 5\u00b2 + 6\u00b2 + 3\u00b2)\n   = (4 +  1 + 16  + 0)  * (9 + 25 + 36  + 9)\n   = 1659\n<\/pre>\n<p>Comprobar con QuickCheckWith que si as, bs cs y ds son listas no vac\u00edas de enteros positivos, entonces  (productoSuma4Cuadrados as bs cs ds) se puede escribir como la suma de los cuadrados de cuatro enteros positivos.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (zip4)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nproductoSuma4Cuadrados :: Integral a => [a] -> [a] -> [a] -> [a] -> a\nproductoSuma4Cuadrados (a:as) (b:bs) (c:cs) (d:ds) =\n  (a^2+b^2+c^2+d^2) * productoSuma4Cuadrados as bs cs ds\nproductoSuma4Cuadrados _ _ _ _ = 1\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nproductoSuma4Cuadrados2 :: Integral a => [a] -> [a] -> [a] -> [a] -> a\nproductoSuma4Cuadrados2 as bs cs ds =\n  product [a^2 + b^2 + c^2 + d^2 | (a,b,c,d) <- zip4 as bs cs ds]\n\n-- Propiedad\n-- =========\n\n-- La propiedad es\nprop_productoSuma4Cuadrados ::\n  [Integer] -> [Integer] -> [Integer] -> [Integer] -> Property\nprop_productoSuma4Cuadrados as bs cs ds =\n  all (not . null) [as, bs, cs, ds]\n  ==> \n  esSuma4Cuadrados (productoSuma4Cuadrados as' bs' cs' ds')\n  where as' = [1 + abs a | a <- as]\n        bs' = [1 + abs b | b <- bs]\n        cs' = [1 + abs c | c <- cs]\n        ds' = [1 + abs d | d <- ds]\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 . sumas4Cuadrados\n\n-- (sumas4Cuadrados n) es la lista de las descomposiciones de n como\n-- sumas de 4 cuadrados. Por ejemplo,\n--    sumas4Cuadrados 42  ==  [(16,16,9,1),(25,9,4,4),(36,4,1,1)]\nsumas4Cuadrados :: Integer -> [(Integer,Integer,Integer,Integer)]\nsumas4Cuadrados 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-- (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-- La comprobaci\u00f3n es\n--    \u03bb> quickCheckWith (stdArgs {maxSize=5}) prop_productoSuma4Cuadrados\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=\u00bbhaskell\u00bb&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\n\u00bfVivir? Sencillamente:<br \/>\nla sed y el agua cerca &#8230;<br \/>\no el agua lejos, m\u00e1s, la sed y el agua,<br \/>\nun poco de cansancio \u00a1y a beberla!.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n productoSuma4Cuadrados :: Integral a => [a] -> [a] -> [a] -> [a] -> a tal que (productoSuma4Cuadrados as bs cs ds) es el producto de las sumas de los cuadrados de cada una de las listas que ocupan la misma posici\u00f3n (hasta que alguna se acaba). Por ejemplo, productoSuma4Cuadrados [2,3] [1,5] [4,6]&#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":[5],"tags":[130,41,8,282,183,181,141,11,157,236,146,489],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5416"}],"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=5416"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5416\/revisions"}],"predecessor-version":[{"id":5491,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5416\/revisions\/5491"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}