{"id":5204,"date":"2019-12-04T05:30:14","date_gmt":"2019-12-04T03:30:14","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=5204"},"modified":"2019-12-11T08:41:32","modified_gmt":"2019-12-11T06:41:32","slug":"transformaciones-lineales-de-numeros-triangulares","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/transformaciones-lineales-de-numeros-triangulares\/","title":{"rendered":"Transformaciones lineales de n\u00fameros triangulares"},"content":{"rendered":"<p>La sucesi\u00f3n de los n\u00fameros triangulares se obtiene sumando los n\u00fameros naturales. As\u00ed, los 8 primeros n\u00fameros triangulares son<\/p>\n<pre lang=\"text\">\n    1 = 1\n    3 = 1+2\n    6 = 1+2+3\n   10 = 1+2+3+4\n   15 = 1+2+3+4+5\n   21 = 1+2+3+4+5+6\n   28 = 1+2+3+4+5+6+7\n   36 = 1+2+3+4+5+6+7+8\n<\/pre>\n<p>Para cada n\u00famero triangular n existen n\u00fameros naturales a y b, tales que <code>a . n + b<\/code> tambi\u00e9n es triangular. Para n = 6, se tiene que<\/p>\n<pre lang=\"text\">\n    6 = 1 * 6 + 0\n   15 = 2 * 6 + 3\n   21 = 3 * 6 + 3\n   28 = 4 * 6 + 4\n   36 = 5 * 6 + 6\n<\/pre>\n<p>son n\u00fameros triangulares<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   transformaciones :: Integer -> [(Integer,Integer)]\n<\/pre>\n<p>tal que si n es triangular, (transformaciones n) es la lista de los pares (a,b) tales que a es un entero positivo y b el menor n\u00famero tal que <code>a . n + b<\/code> es triangular. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   take 5 (transformaciones 6)  == [(1,0),(2,3),(3,3),(4,4),(5,6)]\n   take 5 (transformaciones 15) == [(1,0),(2,6),(3,10),(4,6),(5,3)]\n   transformaciones 21 !! (7*10^7) == (70000001,39732)\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ntransformaciones :: Integer -> [(Integer,Integer)]\ntransformaciones n = (1,0) : [(a, f a) | a <- [2..]]\n  where f a = head (dropWhile (<= a*n) triangulares) - a*n\n\n-- triangulares es la lista de los n\u00fameros triangulares. Por ejemplo,  \n--    take 5 triangulares == [1,3,6,10,15]\ntriangulares :: [Integer]\ntriangulares = scanl1 (+) [1..]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ntransformaciones2 :: Integer -> [(Integer,Integer)]\ntransformaciones2 n = (1,0): map g [2..]\n  where g a = (a, head (dropWhile (<= a*n) triangulares) - a*n)\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> transformaciones 21 !! (2*10^7)\n--    (20000001,21615)\n--    (3.02 secs, 4,320,111,544 bytes)\n--    \u03bb> transformaciones2 21 !! (2*10^7)\n--    (20000001,21615)\n--    (0.44 secs, 3,200,112,320 bytes)\n--\n--    \u03bb> transformaciones2 21 !! (7*10^7)\n--    (70000001,39732)\n--    (1.41 secs, 11,200,885,336 bytes)\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nA la hora del roc\u00edo,<br \/>\nde la niebla salen<br \/>\nsierra blanca y prado verde.<br \/>\n\u00a1El sol en los encinares!<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>La sucesi\u00f3n de los n\u00fameros triangulares se obtiene sumando los n\u00fameros naturales. As\u00ed, los 8 primeros n\u00fameros triangulares son 1 = 1 3 = 1+2 6 = 1+2+3 10 = 1+2+3+4 15 = 1+2+3+4+5 21 = 1+2+3+4+5+6 28 = 1+2+3+4+5+6+7 36 = 1+2+3+4+5+6+7+8 Para cada n\u00famero triangular n existen n\u00fameros naturales a y b, tales&#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,59,71,10,11,252],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5204"}],"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=5204"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5204\/revisions"}],"predecessor-version":[{"id":5248,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/5204\/revisions\/5248"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=5204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=5204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=5204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}