¡Pi en Haskell!

El número pi siempre está presente en Matemáticas y Computación. 

Aquí está el cálculo de algunos de sus dígitos utilizando la fórmula de Leibniz

pi/4=1-1/3+1/5-1/7+1/9....

Ver https://en.wikibooks.org/wiki/Calculus/Leibniz%27_formula_for_pi

 pii n =

  let
    ls=1:(map (+2) ls)
    inter = 1:(-1):inter
  in
    4*(sum (zipWith (*) (take n inter) (map (\x -> 1/x) (take n ls))))

La fórmula de Leibniz es mona, pero por aquí encontré que con éste algoritmo

 https://en.wikipedia.org/wiki/Chudnovsky_algorithm

se pueden hallar trillones de dígitos de pi. Ésta es la versión de este

algoritmo en Python....

 

import decimal


def binary_split(a, b):
    if b == a + 1:
        Pab = -(6*a - 5)*(2*a - 1)*(6*a - 1)
        Qab = 10939058860032000 * a**3
        Rab = Pab * (545140134*a + 13591409)
    else:
        m = (a + b) // 2
        Pam, Qam, Ram = binary_split(a, m)
        Pmb, Qmb, Rmb = binary_split(m, b)
        
        Pab = Pam * Pmb
        Qab = Qam * Qmb
        Rab = Qmb * Ram + Pam * Rmb
    return Pab, Qab, Rab


def chudnovsky(n):
    P1n, Q1n, R1n = binary_split(1, n)
    return (426880 * decimal.Decimal(10005).sqrt() * Q1n) / (13591409*Q1n + R1n)


print(chudnovsky(2))  # 3.141592653589793238462643384 
 

Reto: Traducir tal implementación a Haskell. Para quien se anime. 

 
 

Comentarios

Entradas populares de este blog

Bienvenidos

El problema de la edición de una cadena