Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

SageMath, Cython and Julia: BBP algorithm

198 views
1
##
2
#
3
# BBP: Cython
4
#
5
6
cimport cython
7
from libc.math cimport floor
8
from libc.float cimport DBL_EPSILON
9
10
cdef unsigned long cpower_mod(unsigned long a, unsigned long b, unsigned long n):
11
cdef unsigned long r = 1
12
while b > 0:
13
if b % 2 == 1:
14
r = r * a % n
15
b /= 2
16
a = a * a % n
17
return r
18
19
@cython.cdivision(True)
20
cdef double cratio(unsigned long d, unsigned long k, unsigned long j):
21
return <double> cpower_mod(16, d - k, 8*k + j) / (8*k + j)
22
23
cdef double cfrac_part(double x):
24
return x - floor(x)
25
26
@cython.cdivision(True)
27
cdef csigma(unsigned long d, unsigned long j):
28
cdef double r = 0.
29
cdef unsigned long k
30
31
for k in range(0, d + 1):
32
r += cratio(d, k, j)
33
if r > 1.:
34
r = cfrac_part(r)
35
36
cdef double kk = 8*(d + 1) + j
37
cdef double u = 1 / 16
38
cdef double rat = u / kk
39
40
while rat > DBL_EPSILON:
41
r += rat
42
kk += 8
43
u /= 16
44
rat = u / kk
45
46
return cfrac_part(r)
47
48
def cdigpi(unsigned long d):
49
cdef double r = 4*csigma(d, 1) - 2*csigma(d, 4) - csigma(d, 5) - csigma(d, 6)
50
return <int> floor(16*cfrac_part(r))
51
52