Menu Close

Sumas parciales de Nicómaco

Nicómaco de Gerasa vivió en Palestina entre los siglos I y II de nuestra era. Escribió Arithmetike eisagoge (Introducción a la aritmética) que es el primer trabajo en donde se trata la Aritmética de forma separada a la Geometría. En el tratado se encuentra la siguiente proposición: «si se escriben los números impares

   1, 3, 5, 7, 9, 11, 13, 15, 17, ...

entonces el primero es el cubo de 1; la suma de los dos siguientes, el cubo de 2; la suma de los tres siguientes, el cubo de 3; y así sucesivamente.»

Definir las siguientes funciones

   listasParciales :: [a] -> [[a]]
   sumasParciales  :: [Int] -> [Int]

tales que

  • (listasParciales xs) es la lista obtenido agrupando los elementos de la lista infinita xs de forma que la primera tiene 0 elementos; la segunda, el primer elemento de xs; la tercera, los dos siguientes; y así sucesivamente. Por ejemplo,
     λ> take 7 (listasParciales [1..])
     [[],[1],[2,3],[4,5,6],[7,8,9,10],[11,12,13,14,15],[16,17,18,19,20,21]]
     λ> take 7 (listasParciales [1,3..])
     [[],[1],[3,5],[7,9,11],[13,15,17,19],[21,23,25,27,29],[31,33,35,37,39,41]]
  • (sumasParciales xs) es la lista de las sumas parciales de la lista infinita xs. Por ejemplo,
     λ> take 15 (sumasParciales [1..])
     [0,1,5,15,34,65,111,175,260,369,505,671,870,1105,1379]
     λ> take 15 (sumasParciales [1,3..])
     [0,1,8,27,64,125,216,343,512,729,1000,1331,1728,2197,2744]

Comprobar con QuickChek la propiedad de Nicómaco; es decir, que para todo número natural n, el término n-ésimo de (sumasParciales [1,3..]) es el cubo de n.

Soluciones

import Test.QuickCheck
 
listasParciales :: [a] -> [[a]]
listasParciales = aux 0
  where aux n xs = ys : aux (n+1) zs  
          where (ys,zs) = splitAt n xs
 
sumasParciales :: [Int] -> [Int]
sumasParciales = map sum . listasParciales
 
prop_Nicomaco :: (Positive Int) -> Bool
prop_Nicomaco (Positive n) =
  sumasParciales [1,3..] !! n == n^3
Posted in Inicial

3 Comments

  1. angruicam1
    import Data.List.Split (splitPlaces)
    import Test.QuickCheck
     
    listasParciales :: [a] -> [[a]]
    listasParciales = splitPlaces [0...]
     
    sumasParciales :: [Int] -> [Int]
    sumasParciales = map sum . listasParciales
     
    prop_Nicomaco :: Int -> Property
    prop_Nicomaco n = n >= 0 ==> sumasParciales [1,3...] !! n == n^3
  2. albcarcas1
    import Test.QuickCheck
     
    listasParciales :: [a] -> [[a]]
    listasParciales xs = [[]] ++ [take n (drop (div (n*(n-1)) 2) xs) | n <- [1..] ]
     
    sumasParciales  :: [Int] -> [Int]
    sumasParciales = map sum . listasParciales
     
    prop_Nicomaco :: Int -> Property
    prop_Nicomaco n = n >= 0 ==> sumasParciales [1,3..] !! n == n^3
  3. carriomon1
    listasParciales :: [a] -> [[a]]
    listasParciales xs = aux xs 0
            where aux xs n = (take n xs) : aux (drop n xs) (n+1)
     
     
    sumasParciales :: [Int] -> [Int]
    sumasParciales xs  = map sum  $ listasParciales xs

Leave a Reply to carriomon1Cancel reply

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