Menu Close

Día: 7 mayo, 2021

Suma de serie racional

El enunciado del problema 6 de la Fase Local de la Olimpiada Matemática Española del 2020 es

Sea n un entero positivo. Calcular la siguiente suma

         3           4           5                    n+2
     --------- + --------- + --------- + ··· + ---------------------
      1·2·4·5     2·3·5·6     3·4·6·7           n·(n+1)·(n+3)·(n+4)

Definir la función

   sumaSerie :: Integer -> Rational

tal que para cada entero positivo n, (sumaSerie n) es el valor de la siguiente sumaSerie

      3           4           5                    n+2
  --------- + --------- + --------- + ··· + ---------------------
   1·2·4·5     2·3·5·6     3·4·6·7           n·(n+1)·(n+3)·(n+4)

Por ejemplo,

   sumaSerie 1        ==  3 % 40
   sumaSerie 2        ==  7 % 72
   sumaSerie 3        ==  3 % 28
   sumaSerie (10^10)  ==  3125000001562500000 % 25000000012500000001
 
   length (show (sumaSerie (10^10)))      ==  42
   length (show (sumaSerie (10^(10^2))))  ==  402
   length (show (sumaSerie (10^(10^3))))  ==  4002
   length (show (sumaSerie (10^(10^4))))  ==  40002
   length (show (sumaSerie (10^(10^5))))  ==  400002
   length (show (sumaSerie (10^(10^6))))  ==  4000002

Soluciones

import Test.QuickCheck (Property, (==>), quickCheck)
 
-- 1ª solución
-- ===========
 
sumaSerie :: Integer -> Rational
sumaSerie n =
  sum [k/((k-1)*(k-2)*(k+1)*(k+2))
      | a <- [3..n+2],
        let k = fromIntegral a]
 
-- 2ª solución
-- ===========
 
-- Calculando los primeros términos
--    λ> [sumaSerie n | n <- [1..11]]
--    [3 % 40,7 % 72,3 % 28,9 % 80,25 % 216,33 % 280,21 % 176,13 % 108,63 % 520,75 % 616,11 % 90]
-- y usando Wolfram Alpha https://bit.ly/2PvoCEK
 
sumaSerie2 :: Integer -> Rational
sumaSerie2 n = m*(m+5)/(8*(m+1)*(m+4))
  where m = fromIntegral n
 
-- Comprobación de equivalencia
-- ============================
 
-- La propiedad es
prop_sumaSerie :: Integer -> Property
prop_sumaSerie n =
  n > 0 ==>
  sumaSerie n == sumaSerie2 n
 
-- La comprobación es
--    λ> quickCheck prop_sumaSerie
--    +++ OK, passed 100 tests.
 
-- Comparación de eficiencia
-- =========================
 
-- La comparación es
--    λ> sumaSerie (10^6)
--    31250156250 % 250001250001
--    (4.99 secs, 6,029,246,016 bytes)
--    λ> sumaSerie2 (10^6)
--    31250156250 % 250001250001
--    (0.02 secs, 123,280 bytes)
  • En los comentarios se pueden escribir nuevas soluciones.
  • El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>