SageMath, Cython and Julia: BBP algorithm
##1#2# BBP: Cython3#45cimport cython6from libc.math cimport floor7from libc.float cimport DBL_EPSILON89cdef unsigned long cpower_mod(unsigned long a, unsigned long b, unsigned long n):10cdef unsigned long r = 111while b > 0:12if b % 2 == 1:13r = r * a % n14b /= 215a = a * a % n16return r1718@cython.cdivision(True)19cdef double cratio(unsigned long d, unsigned long k, unsigned long j):20return <double> cpower_mod(16, d - k, 8*k + j) / (8*k + j)2122cdef double cfrac_part(double x):23return x - floor(x)2425@cython.cdivision(True)26cdef csigma(unsigned long d, unsigned long j):27cdef double r = 0.28cdef unsigned long k2930for k in range(0, d + 1):31r += cratio(d, k, j)32if r > 1.:33r = cfrac_part(r)3435cdef double kk = 8*(d + 1) + j36cdef double u = 1 / 1637cdef double rat = u / kk3839while rat > DBL_EPSILON:40r += rat41kk += 842u /= 1643rat = u / kk4445return cfrac_part(r)4647def cdigpi(unsigned long d):48cdef double r = 4*csigma(d, 1) - 2*csigma(d, 4) - csigma(d, 5) - csigma(d, 6)49return <int> floor(16*cfrac_part(r))505152