Números taxicab
Los números taxicab, taxi-cab o números de Hardy-Ramanujan son aquellos números naturales que pueden expresarse como suma de dos cubos de más de una forma.
Alternativamente, se define al n-ésimo número taxicab como el menor número que es suma de dos cubos de n formas.
Definir las siguientes sucesiones
1 2 |
taxicab :: [Integer] taxicab2 :: [Integer] |
tales que taxicab es la sucesión de estos números según la primera definición y taxicab2 según la segunda. Por ejemplo,
1 2 |
take 5 taxicab == [1729,4104,13832,20683,32832] take 2 taxicab2 == [2,1729] |
Nota 1. La sucesiones taxicab y taxicab2 se corresponden con las sucesiones A001235 y A011541 de la OEIS.
Nota 2: Este ejercicio ha sido propuesto por Ángel Ruiz Campos.
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import Data.List (find) import Data.Maybe (fromJust) taxicab :: [Integer] taxicab = filter ((> 1) . length . descomposiciones) [1..] -- (descomposiciones n) es la lista de pares (x,y) tal que x³ + y³ = n. -- Por ejemplo, -- descomposiciones 1729 == [(10,9),(12,1)] -- descomposiciones 1728 == [(12,0)] descomposiciones :: Integer -> [(Integer,Integer)] descomposiciones n = [(x,y) | x <- [1..round (fromIntegral n ** (1/3))], let z = n - x^3, let z' = round (fromIntegral z ** (1/3)), z'^3 == z, let y = z', y <= x] -- 2ª definición de descomposiciones descomposiciones2 :: Integer -> [(Integer,Integer)] descomposiciones2 n = [(x,y) | x <- [1..raizEnt n 3], let z = n - x^3, let y = raizEnt z 3, y <= x, y^3 == z] -- (raizEnt x n) es la raíz entera n-ésima de x; es decir, el mayor -- número entero y tal que y^n <= x. Por ejemplo, -- raizEnt 8 3 == 2 -- raizEnt 9 3 == 2 -- raizEnt 26 3 == 2 -- raizEnt 27 3 == 3 -- raizEnt (10^50) 2 == 10000000000000000000000000 -- --------------------------------------------------------------------- raizEnt :: Integer -> Integer -> Integer raizEnt x n = aux (1,x) where aux (a,b) | d == x = c | c == a = c | d < x = aux (c,b) | otherwise = aux (a,c) where c = (a+b) `div` 2 d = c^n taxicab2 :: [Integer] taxicab2 = aux 1 [2..] where aux n xs = fx : aux (n+1) [fx+1..] where fx = fromJust (find ((== n) . length . descomposiciones) xs) |