Menu Close

2015 como raíz cuadrada de la suma de tres cubos

Todos los años, en las proximidades del final de año suelen aparecer cuestiones con propiedades del número del nuevo año. Una sobre el 2015 es la publicada el martes en la entrada 2015 como raíz de la suma de tres cubos del blog Números y algo más en la que se pide calcular tres números tales que 2015 sea igual a la raíz cuadrada de la suma de dichos tres números.

A partir de dicha entrada, se propone el siguiente problema: Definir la sucesión

   raicesCuadradasDeSumasDe3Cubos :: [Integer]

cuyos elementos son los números que se pueden escribir como raíces cuadradas de sumas de tres cubos. Por ejemplo,

   take 9 raicesCuadradasDeSumasDe3Cubos = [6,9,15,27,48,72,53,59,78]

El 6 está en la sucesión porque 1³+2³+3³ = 36 y la raíz cuadrada de36 es 6 y el 9 está porque 3³+3³+3³ = 81 y la raíz cuadrada de 81 es 9. Algunos números tienen varias descomposiones como raíz cuadrada de suma de tres cubos; por ejemplo, el 71 se puede escribir como la raíz cuadrada de la suma de los cubos de 6, 9 y 16 y también como la de 4, 4, y 17.

A partir de la sucesión se plantean las siguientes cuestiones:

  • ¿Qué lugar ocupa el 2015 en la sucesión?
  • ¿Cuál será el próximo año que se podrá escribir como la raíz cuadrada de suma de tres cubos?
  • ¿Cuáles son las descomposiciones de 2015 como raíz cuadrada de suma de tres cubos?
  • ¿Cuáles son los años hasta el 2015 que se pueden escribir como raíz cuadrada de suma de tres cubos de más formas distintas?

Soluciones

import Data.List (sort)
 
raicesCuadradasDeSumasDe3Cubos :: [Integer]
raicesCuadradasDeSumasDe3Cubos =
    [n | n <- [1..], not (null (descomposiciones n))]
 
-- (descomposiciones n) es la lista de ternas de números tales que n es la
-- raíz cuadrada de la suma de los cubos de los tres números de la
-- terna. Por ejemplo,
--    descomposiciones  6  ==  [(1,2,3)]
--    descomposiciones  9  ==  [(3,3,3)]
--    descomposiciones 71  ==  [(6,9,16),(4,4,17)]
descomposiciones :: Integer -> [(Integer,Integer,Integer)]
descomposiciones n = 
    [(a,b,c) | c <- [1..floor ((fromIntegral (n*n))**(1/3))],
               b <- [1..c],
               let d = n^2 - c^3 - b^3,
               d > 0,
               let a = round ((fromIntegral d)**(1/3)),
               a <= b,
               a^3 == d]    
 
-- El cálculo de la posición de 2015 es
--    ghci> length (takeWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
--    343
 
-- El cálculo del próximo año expresable como la raízcuadrada de la suma
-- de tres cubos es
--    ghci> head (dropWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
--    2022
 
-- (masDescomponibles xs) es la lista de elementos de xs que se pueden
-- escribir de más formas como raíz cuadrada de suma de tres cubos.
masDescomponibles :: [Integer] -> [Integer]
masDescomponibles xs =
    [y | (x,y) <- takeWhile (\p -> fst p == u) zs]
    where zs = reverse (sort [(length (descomposiciones x),x) | x <- xs])
          u  = fst (head zs)
 
-- El cálculo de los años hasta el 2015 con mayor número de
-- descomposiciones es
--    ghci> masDescomponibles (takeWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
--    [1728]
Avanzado

Una solución de “2015 como raíz cuadrada de la suma de tres cubos

  1. Abel Martín
    import Data.List (sort)
     
    raicesCuadradasDeSumasDe3Cubos :: [Integer]
    raicesCuadradasDeSumasDe3Cubos =
        [n | n <- [1..], not (null (descomposiciones n))]
     
    -- (descomposiciones n) es la lista de ternas de números tales que n es la
    -- raíz cuadrada de la suma de los cubos de los tres números de la
    -- terna. Por ejemplo,
    --    descomposiciones  6  ==  [(1,2,3)]
    --    descomposiciones  9  ==  [(3,3,3)]
    --    descomposiciones 71  ==  [(6,9,16),(4,4,17)]
    descomposiciones :: Integer -> [(Integer,Integer,Integer)]
    descomposiciones n = 
        [(a,b,c) | c <- [1..floor ((fromIntegral (n*n))**(1/3))],
                   b <- [1..c],
                   let d = n^2 - c^3 - b^3,
                   d > 0,
                   let a = round ((fromIntegral d)**(1/3)),
                   a <= b,
                   a^3 == d]    
     
    -- El cálculo de la posición de 2015 es
    --    ghci> length (takeWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
    --    343
     
    -- El cálculo del próximo año expresable como la raízcuadrada de la suma
    -- de tres cubos es
    --    ghci> head (dropWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
    --    2022
     
    -- El cálculo de las descomposiciones de 2015 como raíz cuadrada de suma
    -- de tres cubos es
    --    ghci> descomposiciones 2015
    --    [(16,78,153)]
     
    -- (masDescomponibles xs) es la lista de elementos de xs que se pueden
    -- escribir de más formas como raíz cuadrada de suma de tres cubos.
    masDescomponibles :: [Integer] -> [Integer]
    masDescomponibles xs =
        [y | (x,y) <- takeWhile (p -> fst p == u) zs]
        where zs = reverse (sort [(length (descomposiciones x),x) | x <- xs])
              u  = fst (head zs)
     
    -- El cálculo de los años hasta el 2015 con mayor número de
    -- descomposiciones es
    --    ghci> masDescomponibles (takeWhile (<=2015) raicesCuadradasDeSumasDe3Cubos)
    --    [1728]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.