import math
#calculates (x+1)^a - x^a
def df(x, a):
lm = 0.5 * a * math.log(x * (x + 1.0))
ld = 0.5 * a * math.log1p(1.0 / x)
return 2 * math.exp(lm) * math.sinh(ld)
def zetam(a, n):
a += 0.0
assert a != -1
l = []
for i in range(n):
l.append(df(2 * i + 1.0, a))
l.append(-0.5 * (2 * n + 1.0) ** a)
q = 20
l1 = [0.25 * ((-1) ** i) * df(2 * n + i + 1.0, a) for i in range(q)]
for i in range(q):
l.append(l1[0])
for j in range(q - i - 1):
l1[j] = 0.5 * (l1[j] + l1[j + 1])
return math.fsum(l) / df(1.0, a + 1.0)
zetam_vs = {
2.5 : 0.00851692877785033054,
2.0 : 0,
0.5 : -0.207886224977354566,
0.0 : -0.5,
-0.5 : -1.4603545088095868,
-2.0 : math.pi ** 2 / 6
}
a = -2.0
n = 6
q = 20
print("a =", a, ", n =", n, ", q =", q)
r0 = zetam(a, n)
rd = zetam_vs.get(a, 0.0)
print("{:.30f}".format(r0), r0 - rd)
Comments