Menu Close

Suma de una fila del triángulo de los impares

Se condidera el siguiente triángulo de números impares

                1
             3     5
          7     9    11
      13    15    17    19
   21    23    25    27    29
................................

Definir la función

   sumaFilaTrianguloImpares :: Integer -> Integer

tal que (sumaFilaTrianguloImpares n) es la suma de la n-ésima fila del triángulo de los números impares. Por ejemplo,

   sumaFilaTrianguloImpares 1  ==  1
   sumaFilaTrianguloImpares 2  ==  8
   length (show (sumaFilaTrianguloImpares (10^500)))    ==  1501
   length (show (sumaFilaTrianguloImpares (10^5000)))   ==  15001
   length (show (sumaFilaTrianguloImpares (10^50000)))  ==  150001

Soluciones

import Test.QuickCheck
 
-- 1ª solución
sumaFilaTrianguloImpares1 :: Integer -> Integer
sumaFilaTrianguloImpares1 n =
  sum [n^2-n+1, n^2-n+3 .. n^2+n-1]
 
-- 2ª solución
sumaFilaTrianguloImpares2 :: Integer -> Integer
sumaFilaTrianguloImpares2 = (^3)
 
-- Equivalencia
-- ============
 
-- La propiedad es
prop_sumaFilaTrianguloImpares :: Integer -> Property
prop_sumaFilaTrianguloImpares n =
  n > 0 ==> sumaFilaTrianguloImpares1 n == sumaFilaTrianguloImpares2 n
 
-- La comprobación es
--    λ> quickCheck prop_sumaFilaTrianguloImpares
--    +++ OK, passed 100 tests.
 
-- Comparación de eficiencia
-- =========================
 
-- La comparación es
--    λ> length (show (sumaFilaTrianguloImpares1 (10^7)))
--    22
--    (2.91 secs, 2,167,239,232 bytes)
--    λ> length (show (sumaFilaTrianguloImpares2 (10^7)))
--    22
--    (0.01 secs, 102,584 bytes)

El código se encuentra en GitHub.

Ejercicio

3 soluciones de “Suma de una fila del triángulo de los impares

  1. Pablo Quevedo
    sumaFilaTrianguloImpares :: Integer -> Integer
    sumaFilaTrianguloImpares n = 
      sum [n^2-n+1, n^2-n+3 .. n^2+n-1]
  2. j0sejuan
    from sympy import *
     
    i, j, n = symbols('i j n')
     
    # escribimos directamente la definición
    suma = Sum(2 * j - 1, (j, Sum(i, (i, 1, n - 1)) + 1, Sum(i, (i, 1, n))))
     
    # simplificando
    # >>> terms_gcd(suma.doit())
    # n**3
     
    # por tanto la función buscada es
    #
    #     sumaFilaTrianguloImpares :: Integer -> Integer
    #     sumaFilaTrianguloImpares = (^3)

Escribe tu solución

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