{"id":3641,"date":"2018-01-19T06:00:31","date_gmt":"2018-01-19T04:00:31","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3641"},"modified":"2018-02-19T08:07:05","modified_gmt":"2018-02-19T06:07:05","slug":"terna-pitagorica-a-partir-de-un-lado","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/terna-pitagorica-a-partir-de-un-lado\/","title":{"rendered":"Terna pitag\u00f3rica a partir de un lado"},"content":{"rendered":"<p>Una terna pitag\u00f3rica con primer lado x es una terna (x,y,z) tal que x^2 + y^2 = z^2. Por ejemplo, las ternas pitag\u00f3ricas con primer lado 16 son (16,12,20), (16,30,34) y (16,63,65).<\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   ternasPitagoricas      :: Integer -> [(Integer,Integer,Integer)]\n   mayorTernaPitagorica   :: Integer -> (Integer,Integer,Integer)\n   graficaMayorHipotenusa :: Integer -> IO ()\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(ternasPitgoricas x) es la lista de las ternas pitag\u00f3ricas con primer lado x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     ternasPitagoricas 16 == [(16,12,20),(16,30,34),(16,63,65)]\n     ternasPitagoricas 20 == [(20,15,25),(20,21,29),(20,48,52),(20,99,101)]\n     ternasPitagoricas 25 == [(25,60,65),(25,312,313)]\n     ternasPitagoricas 26 == [(26,168,170)]\n<\/pre>\n<ul>\n<li>(mayorTernaPitagorica x) es la mayor de las ternas pitag\u00f3ricas con primer lado x. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     mayorTernaPitagorica 16     ==  (16,63,65)\n     mayorTernaPitagorica 20     ==  (20,99,101)\n     mayorTernaPitagorica 25     ==  (25,312,313)\n     mayorTernaPitagorica 26     ==  (26,168,170)\n     mayorTernaPitagorica 2018   ==  (2018,1018080,1018082)\n     mayorTernaPitagorica 2019   ==  (2019,2038180,2038181)\n<\/pre>\n<ul>\n<li>(graficaMayorHipotenusa n) dibuja la gr\u00e1fica de las sucesi\u00f3n de las mayores hipotenusas de las ternas pitag\u00f3ricas con primer lado x, para x entre 3 y n. Por ejemplo, (graficaMayorHipotenusa 100) dibuja<br \/>\n<a href=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png?resize=640%2C480\" alt=\"Terna_pitagorica_a_partir_de_un_lado\" width=\"640\" height=\"480\" class=\"aligncenter size-full wp-image-3642\" srcset=\"https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png?resize=100%2C75&amp;ssl=1 100w, https:\/\/i0.wp.com\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2018\/01\/Terna_pitagorica_a_partir_de_un_lado.png?resize=150%2C112&amp;ssl=1 150w\" sizes=\"(max-width: 640px) 100vw, 640px\" data-recalc-dims=\"1\" \/><\/a><\/li>\n<\/ul>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Graphics.Gnuplot.Simple\n\n-- Definici\u00f3n de ternasPitagoricas\n-- ===============================\n\nternasPitagoricas :: Integer -> [(Integer,Integer,Integer)]\nternasPitagoricas x =\n  [(x,y,z) | y <- [1..(x^ 2 - 1) `div` 2 ]\n           , z <- raizCuadrada (x^2 + y^2)]\n\n-- La justificaci\u00f3n de la cota es\n--    x > 2\n--    x^2 + y^2 >= (y+1)^2\n--    x^2 + y^2 >= y^2 + 2*y + 1\n--    y =< (x^ 2 - 1) `div` 2 \n\n-- (raizCuadrada x) es la lista formada por la ra\u00edz cuadrada entera de\n-- x, si existe y la lista vac\u00eda, en caso contrario. Por ejemplo, \n--    raizCuadrada 25  ==  [5]\n--    raizCuadrada 26  ==  []\nraizCuadrada :: Integer -> [Integer]\nraizCuadrada x =\n  [y | y <- [(round . sqrt . fromIntegral) x]\n     , y^2 == x]\n\n\n-- 1\u00aa definici\u00f3n de mayorTernaPitagorica\n-- =====================================\n\nmayorTernaPitagorica :: Integer -> (Integer,Integer,Integer)\nmayorTernaPitagorica =\n  last . ternasPitagoricas\n\n-- 2\u00aa definici\u00f3n de mayorTernaPitagorica\n-- =====================================\n\nmayorTernaPitagorica2 :: Integer -> (Integer,Integer,Integer)\nmayorTernaPitagorica2 x =\n  head [(x,y,z) | y <- [k, k-1 .. 1]\n                , z <- raizCuadrada (x^2 + y^2)]\n  where k = (x^2 - 1) `div` 2\n\n  \n-- 3\u00aa definici\u00f3n de mayorTernaPitagorica\n-- =====================================\n\n-- Se supone que x > 2. Se consideran dos casos:\n-- \n-- Primer caso: Supongamos que x es par. Entonces x^2 > 4 y es divisible\n-- por 4. Por tanto, existe un y tal que x^2 = 4*y + 4; luego,\n--    x^2 + y^2 = 4*y + 4 + y^2\n--              = (y + 2)^2\n-- La terna es (x,y,y+2) donde y = (x^2 - 4) \/ 4.\n--\n-- Segundo caso: Supongamos que x es impar. Entonces x^2 es impar. Por\n-- tanto, existe un y tal que x^2 = 2*y + 1; luego,\n--    x^2 + y^2 = 2*y + 1 + y^2\n--              = (y+1)^2\n-- La terna es (x,y,y+1) donde y = (x^2 - 1) \/ 2.\n\nmayorTernaPitagorica3 :: Integer -> (Integer,Integer,Integer)\nmayorTernaPitagorica3 x\n  | even x    = (x, y1, y1 + 2)\n  | otherwise = (x, y2, y2 + 1)\n    where y1 = (x^2 - 4) `div` 4\n          y2 = (x^2 - 1) `div` 2 \n\n-- Comparaci\u00f3n de eficiencia\n--    \u03bb> mayorTernaPitagorica 1006\n--    (1006,253008,253010)\n--    (7.36 secs, 1,407,793,992 bytes)\n--    \u03bb> mayorTernaPitagorica2 1006\n--    (1006,253008,253010)\n--    (3.76 secs, 704,007,456 bytes)\n--    \u03bb> mayorTernaPitagorica3 1006\n--    (1006,253008,253010)\n--    (0.01 secs, 157,328 bytes)\n\ngraficaMayorHipotenusa :: Integer -> IO ()\ngraficaMayorHipotenusa n =\n  plotList [ Key Nothing\n           , PNG \"Terna_pitagorica_a_partir_de_un_lado.png\"\n           ]\n           [(x,z) | x <- [3..n]\n                  , let (_,_,z) = mayorTernaPitagorica3 x]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Una terna pitag\u00f3rica con primer lado x es una terna (x,y,z) tal que x^2 + y^2 = z^2. Por ejemplo, las ternas pitag\u00f3ricas con primer lado 16 son (16,12,20), (16,30,34) y (16,63,65). Definir las funciones ternasPitagoricas :: Integer -> [(Integer,Integer,Integer)] mayorTernaPitagorica :: Integer -> (Integer,Integer,Integer) graficaMayorHipotenusa :: Integer -> IO () tales que (ternasPitgoricas x)&#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":[4],"tags":[8,30,91,183,376,71,134,309,184,236],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3641"}],"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=3641"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3641\/revisions"}],"predecessor-version":[{"id":3774,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3641\/revisions\/3774"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}