Transformaciones lineales de números triangulares
La sucesión de los números triangulares se obtiene sumando los números naturales. Así, los 8 primeros números triangulares son
| 1 2 3 4 5 6 7 8 |     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úmero triangular n existen números naturales a y b, tales que a . n + b también es triangular. Para n = 6, se tiene que
| 1 2 3 4 5 |     6 = 1 * 6 + 0    15 = 2 * 6 + 3    21 = 3 * 6 + 3    28 = 4 * 6 + 4    36 = 5 * 6 + 6 | 
son números triangulares
Definir la función
| 1 |    transformaciones :: Integer -> [(Integer,Integer)] | 
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úmero tal que a . n + b es triangular. Por ejemplo,
| 1 2 3 |    take 5 (transformaciones 6)  == [(1,0),(2,3),(3,3),(4,4),(5,6)]    take 5 (transformaciones 15) == [(1,0),(2,6),(3,10),(4,6),(5,3)]    transformaciones 21 !! (7*10^7) == (70000001,39732) | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | -- 1ª solución -- =========== transformaciones :: Integer -> [(Integer,Integer)] transformaciones n = (1,0) : [(a, f a) | a <- [2..]]   where f a = head (dropWhile (<= a*n) triangulares) - a*n -- triangulares es la lista de los números triangulares. Por ejemplo,   --    take 5 triangulares == [1,3,6,10,15] triangulares :: [Integer] triangulares = scanl1 (+) [1..] -- 2ª solución -- =========== transformaciones2 :: Integer -> [(Integer,Integer)] transformaciones2 n = (1,0): map g [2..]   where g a = (a, head (dropWhile (<= a*n) triangulares) - a*n) -- Comparación de eficiencia -- ========================= --    λ> transformaciones 21 !! (2*10^7) --    (20000001,21615) --    (3.02 secs, 4,320,111,544 bytes) --    λ> transformaciones2 21 !! (2*10^7) --    (20000001,21615) --    (0.44 secs, 3,200,112,320 bytes) -- --    λ> transformaciones2 21 !! (7*10^7) --    (70000001,39732) --    (1.41 secs, 11,200,885,336 bytes) | 
Pensamiento
A la hora del rocío,
de la niebla salen
sierra blanca y prado verde.
¡El sol en los encinares!Antonio Machado