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
1 2 3 |
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
1 |
sumaSerie :: Integer -> Rational |
tal que para cada entero positivo n, (sumaSerie n) es el valor de la siguiente sumaSerie
1 2 3 |
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,
1 2 3 4 5 6 7 8 9 10 11 |
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
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 |
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>
2 Comentarios