{"id":7167,"date":"2022-08-03T06:00:52","date_gmt":"2022-08-03T04:00:52","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7167"},"modified":"2022-12-14T17:04:07","modified_gmt":"2022-12-14T15:04:07","slug":"representaciones-de-un-numero-como-suma-de-dos-cuadrados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/representaciones-de-un-numero-como-suma-de-dos-cuadrados\/","title":{"rendered":"Representaciones de un n\u00famero como suma de dos cuadrados"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   representaciones :: Integer -> [(Integer,Integer)]\n<\/pre>\n<p>tal que (representaciones n) es la lista de pares de n\u00fameros naturales (x,y) tales que n = x^2 + y^2. Por ejemplo.<\/p>\n<pre lang=\"text\">\n   representaciones  20              ==  [(2,4)]\n   representaciones  25              ==  [(0,5),(3,4)]\n   representaciones 325              ==  [(1,18),(6,17),(10,15)]\n   length (representaciones (10^14)) == 8\n<\/pre>\n<p>Comprobar con QuickCheck que un n\u00famero natural n se puede  como suma de dos cuadrados si, y s\u00f3lo si, en la factorizaci\u00f3n prima de n todos los exponentes de sus factores primos congruentes con 3 m\u00f3dulo 4 son pares.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength, group)\nimport Data.Numbers.Primes (primeFactors)\nimport Test.QuickCheck (Positive (Positive), quickCheck)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nrepresentaciones1 :: Integer -> [(Integer,Integer)]\nrepresentaciones1 n =\n  [(x,y) | x <- [0..n], y <- [x..n], n == x*x + y*y]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nrepresentaciones2 :: Integer -> [(Integer,Integer)]\nrepresentaciones2 n =\n  [(x,raiz z) | x <- [0..raiz (n `div` 2)], \n                let z = n - x*x,\n                esCuadrado z]\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 = floor . sqrt . fromIntegral\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-- 3\u00aa soluci\u00f3n\n-- ===========\n \nrepresentaciones3 :: Integer -> [(Integer, Integer)]\nrepresentaciones3 n = aux 0 (raiz n)\n  where aux x y\n          | x > y     = [] \n          | otherwise = case compare (x*x + y*y) n of\n                          LT -> aux (x + 1) y\n                          EQ -> (x, y) : aux (x + 1) (y - 1)\n                          GT -> aux x (y - 1)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_representaciones :: Positive Integer -> Bool\nprop_representaciones (Positive n) =\n  all (== representaciones1 n)\n      [representaciones2 n,\n       representaciones3 n]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_representaciones\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> representaciones1 4000\n--    [(20,60),(36,52)]\n--    (4.95 secs, 2,434,929,624 bytes)\n--    \u03bb> representaciones2 4000\n--    [(20,60),(36,52)]\n--    (0.00 secs, 599,800 bytes)\n--    \u03bb> representaciones3 4000\n--    [(20,60),(36,52)]\n--    (0.01 secs, 591,184 bytes)\n--    \n--    \u03bb> length (representaciones2 (10^14))\n--    8\n--    (6.64 secs, 5,600,837,088 bytes)\n--    \u03bb> length (representaciones3 (10^14))\n--    8\n--    (9.37 secs, 4,720,548,264 bytes)\n\n-- Comprobaci\u00f3n de la propiedad\n-- ============================\n\n-- La propiedad es\nprop_representacion :: Positive Integer -> Bool\nprop_representacion (Positive n) =\n  not (null (representaciones2 n)) == \n  all (\\(p,e) -> p `mod` 4 \/= 3 || even e) (factorizacion n)\n\n-- (factorizacion n) es la factorizaci\u00f3n prima de n. Por ejemplo,\n--    factorizacion 600  ==  [(2,3),(3,1),(5,2)]\nfactorizacion :: Integer -> [(Integer,Integer)]\nfactorizacion n =\n  map (\\xs -> (head xs, genericLength xs)) (group (primeFactors n))\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_representacion\n--    +++ OK, passed 100 tests.\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Representaciones_de_un_numero_como_suma_de_dos_cuadrados.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n representaciones :: Integer -> [(Integer,Integer)] tal que (representaciones n) es la lista de pares de n\u00fameros naturales (x,y) tales que n = x^2 + y^2. Por ejemplo. representaciones 20 == [(2,4)] representaciones 25 == [(0,5),(3,4)] representaciones 325 == [(1,18),(6,17),(10,15)] length (representaciones (10^14)) == 8 Comprobar con QuickCheck que un n\u00famero natural n&#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":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7167"}],"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=7167"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7167\/revisions"}],"predecessor-version":[{"id":7722,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7167\/revisions\/7722"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}