log_integral gives wrong values for complex arguments
Riemann's formula for the number of primes less than a given number requires the calculation of the logarithmic integral (Li(x) or li(x)) for complex values. This function is implemented in Sage as log_integral.
However, it does not seem to give the correct values for complex arguments. When I feed in -4.42464733272289 + 0.649996908475887I it returns -0.0380977804390431 + 4.49840994945387I, but -4.41940689179334 - 0.684720910130221I returns -0.0281163576275170 - 4.50165559913773I, i.e., there seems to be a discontinuity when the imaginary part turns negative.
This script shows the behaviour:
start = 0
end = 10
steps = 100
args = [(start * (1 - s / steps) + end * (s / steps)) for s in range(steps+1)]
val1 = [20^(1/2+s*i) for s in args]
val2 = [log_integral(s) for s in val1]
for (x,y,z) in zip(args, val1, val2):
print n(x), '\t', n(y), '\t', n(z)
Maybe the problem is that a different branch of the complex logarithm should be used. But the values of the above sequence should converge to pi * i, which doesn't seem to be the case at all.
Has anybody seen this behaviour before or any idea how to fix it?
Question - do you want `li(x)` or `Li(x)`, or does it matter here? See http://www.sagemath.org/doc/reference/functions/sage/functions/exp_integral.html for how we do each of these. Usually mpmath is pretty darn accurate so I am a little surprised...
It shouldn't matter here, since li(x) and Li(x) only differ in an additive constant, which should also hold for the complex continuation. But if in doubt - I mean Li(x)...
Yes, and we define it that way, but I just wanted to confirm...