{"id":6581,"date":"2022-02-03T05:00:13","date_gmt":"2022-02-03T03:00:13","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6581"},"modified":"2022-04-15T12:08:17","modified_gmt":"2022-04-15T10:08:17","slug":"producto-de-los-elementos-de-la-diagonal-principal","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/producto-de-los-elementos-de-la-diagonal-principal\/","title":{"rendered":"Producto de los elementos de la diagonal principal"},"content":{"rendered":"<p>Las matrices se pueden representar como lista de listas de la misma longitud, donde cada uno de sus elementos representa una fila de la matriz.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   productoDiagonalPrincipal :: Num a => [[a]] -> a\n<\/pre>\n<p>tal que (productoDiagonalPrincipal xss) es el producto de los elementos de la diagonal principal de la matriz cuadrada xss. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   productoDiagonal1 [[3,5,2],[4,7,1],[6,9,8]]  ==  168\n   productoDiagonal1 (replicate 5 [1..5])       ==  120\n   length (show (productoDiagonal3 (replicate 30000 [1..30000])))  ==  121288\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericReplicate)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nproductoDiagonal1 :: Num a => [[a]] -> a\nproductoDiagonal1 xss = product (diagonal1 xss)\n\n-- (diagonal1 xss) es la diagonal de la matriz xss. Por ejemplo,\n--    diagonal1 [[3,5,2],[4,7,1],[6,9,0]]  ==  [3,7,0]\n--    diagonal1 [[3,5],[4,7],[6,9]]        ==  [3,7]\n--    diagonal1 [[3,5,2],[4,7,1]]          ==  [3,7]\ndiagonal1 :: [[a]] -> [a]\ndiagonal1 ((x:_):xss) = x : diagonal1 (map tail xss)\ndiagonal1 _           = []\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nproductoDiagonal2 :: Num a => [[a]] -> a\nproductoDiagonal2 = product . diagonal1\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nproductoDiagonal3 :: Num a => [[a]] -> a\nproductoDiagonal3 = product . diagonal3\n\ndiagonal3 :: [[a]] -> [a]\ndiagonal3 xss = [xs !! k | (xs,k) <- zip xss [0..n]]\n  where n = length (head xss) - 1\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nproductoDiagonal4 :: Num a => [[a]] -> a\nproductoDiagonal4 []          = 1\nproductoDiagonal4 [[]]        = 1\nproductoDiagonal4 ((x:_):xss) = x * productoDiagonal4 (map tail xss)\n\n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nproductoDiagonal5 :: Num a => [[a]] -> a\nproductoDiagonal5 xss = product (zipWith (!!) xss [0..k])\n  where m = length xss\n        n = length (head xss)\n        k = min m n - 1\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\nejemplo :: Integer -> [[Integer]]\nejemplo n = genericReplicate n [1..n]\n\n-- La comparaci\u00f3n es\n--    \u03bb> length (show (productoDiagonal1 (ejemplo 7000)))\n--    23878\n--    (1.23 secs, 3,396,129,424 bytes)\n--    \u03bb> length (show (productoDiagonal2 (ejemplo 7000)))\n--    23878\n--    (0.94 secs, 3,396,127,680 bytes)\n--    \u03bb> length (show (productoDiagonal3 (ejemplo 7000)))\n--    23878\n--    (0.09 secs, 44,841,864 bytes)\n--    \u03bb> length (show (productoDiagonal4 (ejemplo 7000)))\n--    23878\n--    (0.96 secs, 3,614,137,840 bytes)\n--    \u03bb> length (show (productoDiagonal5 (ejemplo 7000)))\n--    23878\n--    (0.07 secs, 44,168,984 bytes)\n--\n--    \u03bb> length (show (productoDiagonal3 (ejemplo 70000)))\n--    308760\n--    (8.26 secs, 5,359,752,408 bytes)\n--    \u03bb> length (show (productoDiagonal5 (ejemplo 70000)))\n--    308760\n--    (9.34 secs, 5,353,035,656 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Producto_de_los_elementos_de_la_diagonal_principal.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las matrices se pueden representar como lista de listas de la misma longitud, donde cada uno de sus elementos representa una fila de la matriz. Definir la funci\u00f3n productoDiagonalPrincipal :: Num a => [[a]] -> a tal que (productoDiagonalPrincipal xss) es el producto de los elementos de la diagonal principal de la matriz cuadrada xss&#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":[8,498,42,11,6],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6581"}],"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=6581"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6581\/revisions"}],"predecessor-version":[{"id":6690,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6581\/revisions\/6690"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}