Ir al contenido principal

Aproximación entre pi y e

El día 11 de noviembre, se publicó en la cuenta de Twitter de Fermat's Library la siguiente curiosa identidad que relaciona los números e y pi:

Aproximación entre pi y e

Definir las siguientes funciones:

sumaTerminos :: Int -> Double
aproximacion :: Double -> Int

tales que

  • (sumaTerminos n) es la suma de los primeros n términos de la serie 1/(π²+ 1) + 1/(4π²+1) + 1/(9π²+1) + 1/(16π²+ ) + ... Por ejemplo,
sumaTerminos 10     ==  0.14687821811081034
sumaTerminos 100    ==  0.15550948345688423
sumaTerminos 1000   ==  0.15641637221314514
sumaTerminos 10000  ==  0.15650751113789382
  • (aproximación x) es el menor número de términos que hay que sumar de la serie anterior para que se diferencie (en valor absoluto) de 1/(e²-1) menos que x. Por ejemplo,
aproximacion 0.1     ==  1
aproximacion 0.01    ==  10
aproximacion 0.001   ==  101
aproximacion 0.0001  ==  1013

Soluciones

sumaTerminos :: Int -> Double
sumaTerminos 0 = 0
sumaTerminos n = 1 / (m^2 * pi^2 + 1) + sumaTerminos (n-1)
  where m = fromIntegral n

aproximacion :: Double -> Int
aproximacion x =
  head [n | n <- [0..]
          , abs (sumaTerminos n - 1 / (e^2 - 1)) < x]
  where e = exp 1