1019 lines
30 KiB
Python
1019 lines
30 KiB
Python
"""
|
|
The function zetazero(n) computes the n-th nontrivial zero of zeta(s).
|
|
|
|
The general strategy is to locate a block of Gram intervals B where we
|
|
know exactly the number of zeros contained and which of those zeros
|
|
is that which we search.
|
|
|
|
If n <= 400 000 000 we know exactly the Rosser exceptions, contained
|
|
in a list in this file. Hence for n<=400 000 000 we simply
|
|
look at these list of exceptions. If our zero is implicated in one of
|
|
these exceptions we have our block B. In other case we simply locate
|
|
the good Rosser block containing our zero.
|
|
|
|
For n > 400 000 000 we apply the method of Turing, as complemented by
|
|
Lehman, Brent and Trudgian to find a suitable B.
|
|
"""
|
|
|
|
from .functions import defun, defun_wrapped
|
|
|
|
def find_rosser_block_zero(ctx, n):
|
|
"""for n<400 000 000 determines a block were one find our zero"""
|
|
for k in range(len(_ROSSER_EXCEPTIONS)//2):
|
|
a=_ROSSER_EXCEPTIONS[2*k][0]
|
|
b=_ROSSER_EXCEPTIONS[2*k][1]
|
|
if ((a<= n-2) and (n-1 <= b)):
|
|
t0 = ctx.grampoint(a)
|
|
t1 = ctx.grampoint(b)
|
|
v0 = ctx._fp.siegelz(t0)
|
|
v1 = ctx._fp.siegelz(t1)
|
|
my_zero_number = n-a-1
|
|
zero_number_block = b-a
|
|
pattern = _ROSSER_EXCEPTIONS[2*k+1]
|
|
return (my_zero_number, [a,b], [t0,t1], [v0,v1])
|
|
k = n-2
|
|
t,v,b = compute_triple_tvb(ctx, k)
|
|
T = [t]
|
|
V = [v]
|
|
while b < 0:
|
|
k -= 1
|
|
t,v,b = compute_triple_tvb(ctx, k)
|
|
T.insert(0,t)
|
|
V.insert(0,v)
|
|
my_zero_number = n-k-1
|
|
m = n-1
|
|
t,v,b = compute_triple_tvb(ctx, m)
|
|
T.append(t)
|
|
V.append(v)
|
|
while b < 0:
|
|
m += 1
|
|
t,v,b = compute_triple_tvb(ctx, m)
|
|
T.append(t)
|
|
V.append(v)
|
|
return (my_zero_number, [k,m], T, V)
|
|
|
|
def wpzeros(t):
|
|
"""Precision needed to compute higher zeros"""
|
|
wp = 53
|
|
if t > 3*10**8:
|
|
wp = 63
|
|
if t > 10**11:
|
|
wp = 70
|
|
if t > 10**14:
|
|
wp = 83
|
|
return wp
|
|
|
|
def separate_zeros_in_block(ctx, zero_number_block, T, V, limitloop=None,
|
|
fp_tolerance=None):
|
|
"""Separate the zeros contained in the block T, limitloop
|
|
determines how long one must search"""
|
|
if limitloop is None:
|
|
limitloop = ctx.inf
|
|
loopnumber = 0
|
|
variations = count_variations(V)
|
|
while ((variations < zero_number_block) and (loopnumber <limitloop)):
|
|
a = T[0]
|
|
v = V[0]
|
|
newT = [a]
|
|
newV = [v]
|
|
variations = 0
|
|
for n in range(1,len(T)):
|
|
b2 = T[n]
|
|
u = V[n]
|
|
if (u*v>0):
|
|
alpha = ctx.sqrt(u/v)
|
|
b= (alpha*a+b2)/(alpha+1)
|
|
else:
|
|
b = (a+b2)/2
|
|
if fp_tolerance < 10:
|
|
w = ctx._fp.siegelz(b)
|
|
if abs(w)<fp_tolerance:
|
|
w = ctx.siegelz(b)
|
|
else:
|
|
w=ctx.siegelz(b)
|
|
if v*w<0:
|
|
variations += 1
|
|
newT.append(b)
|
|
newV.append(w)
|
|
u = V[n]
|
|
if u*w <0:
|
|
variations += 1
|
|
newT.append(b2)
|
|
newV.append(u)
|
|
a = b2
|
|
v = u
|
|
T = newT
|
|
V = newV
|
|
loopnumber +=1
|
|
if (limitloop>ITERATION_LIMIT)and(loopnumber>2)and(variations+2==zero_number_block):
|
|
dtMax=0
|
|
dtSec=0
|
|
kMax = 0
|
|
for k1 in range(1,len(T)):
|
|
dt = T[k1]-T[k1-1]
|
|
if dt > dtMax:
|
|
kMax=k1
|
|
dtSec = dtMax
|
|
dtMax = dt
|
|
elif (dt<dtMax) and(dt >dtSec):
|
|
dtSec = dt
|
|
if dtMax>3*dtSec:
|
|
f = lambda x: ctx.rs_z(x,derivative=1)
|
|
t0=T[kMax-1]
|
|
t1 = T[kMax]
|
|
t=ctx.findroot(f, (t0,t1), solver ='illinois',verify=False, verbose=False)
|
|
v = ctx.siegelz(t)
|
|
if (t0<t) and (t<t1) and (v*V[kMax]<0):
|
|
T.insert(kMax,t)
|
|
V.insert(kMax,v)
|
|
variations = count_variations(V)
|
|
if variations == zero_number_block:
|
|
separated = True
|
|
else:
|
|
separated = False
|
|
return (T,V, separated)
|
|
|
|
def separate_my_zero(ctx, my_zero_number, zero_number_block, T, V, prec):
|
|
"""If we know which zero of this block is mine,
|
|
the function separates the zero"""
|
|
variations = 0
|
|
v0 = V[0]
|
|
for k in range(1,len(V)):
|
|
v1 = V[k]
|
|
if v0*v1 < 0:
|
|
variations +=1
|
|
if variations == my_zero_number:
|
|
k0 = k
|
|
leftv = v0
|
|
rightv = v1
|
|
v0 = v1
|
|
t1 = T[k0]
|
|
t0 = T[k0-1]
|
|
ctx.prec = prec
|
|
wpz = wpzeros(my_zero_number*ctx.log(my_zero_number))
|
|
|
|
guard = 4*ctx.mag(my_zero_number)
|
|
precs = [ctx.prec+4]
|
|
index=0
|
|
while precs[0] > 2*wpz:
|
|
index +=1
|
|
precs = [precs[0] // 2 +3+2*index] + precs
|
|
ctx.prec = precs[0] + guard
|
|
r = ctx.findroot(lambda x:ctx.siegelz(x), (t0,t1), solver ='illinois', verbose=False)
|
|
#print "first step at", ctx.dps, "digits"
|
|
z=ctx.mpc(0.5,r)
|
|
for prec in precs[1:]:
|
|
ctx.prec = prec + guard
|
|
#print "refining to", ctx.dps, "digits"
|
|
znew = z - ctx.zeta(z) / ctx.zeta(z, derivative=1)
|
|
#print "difference", ctx.nstr(abs(z-znew))
|
|
z=ctx.mpc(0.5,ctx.im(znew))
|
|
return ctx.im(z)
|
|
|
|
def sure_number_block(ctx, n):
|
|
"""The number of good Rosser blocks needed to apply
|
|
Turing method
|
|
References:
|
|
R. P. Brent, On the Zeros of the Riemann Zeta Function
|
|
in the Critical Strip, Math. Comp. 33 (1979) 1361--1372
|
|
T. Trudgian, Improvements to Turing Method, Math. Comp."""
|
|
if n < 9*10**5:
|
|
return(2)
|
|
g = ctx.grampoint(n-100)
|
|
lg = ctx._fp.ln(g)
|
|
brent = 0.0061 * lg**2 +0.08*lg
|
|
trudgian = 0.0031 * lg**2 +0.11*lg
|
|
N = ctx.ceil(min(brent,trudgian))
|
|
N = int(N)
|
|
return N
|
|
|
|
def compute_triple_tvb(ctx, n):
|
|
t = ctx.grampoint(n)
|
|
v = ctx._fp.siegelz(t)
|
|
if ctx.mag(abs(v))<ctx.mag(t)-45:
|
|
v = ctx.siegelz(t)
|
|
b = v*(-1)**n
|
|
return t,v,b
|
|
|
|
|
|
|
|
ITERATION_LIMIT = 4
|
|
|
|
def search_supergood_block(ctx, n, fp_tolerance):
|
|
"""To use for n>400 000 000"""
|
|
sb = sure_number_block(ctx, n)
|
|
number_goodblocks = 0
|
|
m2 = n-1
|
|
t, v, b = compute_triple_tvb(ctx, m2)
|
|
Tf = [t]
|
|
Vf = [v]
|
|
while b < 0:
|
|
m2 += 1
|
|
t,v,b = compute_triple_tvb(ctx, m2)
|
|
Tf.append(t)
|
|
Vf.append(v)
|
|
goodpoints = [m2]
|
|
T = [t]
|
|
V = [v]
|
|
while number_goodblocks < 2*sb:
|
|
m2 += 1
|
|
t, v, b = compute_triple_tvb(ctx, m2)
|
|
T.append(t)
|
|
V.append(v)
|
|
while b < 0:
|
|
m2 += 1
|
|
t,v,b = compute_triple_tvb(ctx, m2)
|
|
T.append(t)
|
|
V.append(v)
|
|
goodpoints.append(m2)
|
|
zn = len(T)-1
|
|
A, B, separated =\
|
|
separate_zeros_in_block(ctx, zn, T, V, limitloop=ITERATION_LIMIT,
|
|
fp_tolerance=fp_tolerance)
|
|
Tf.pop()
|
|
Tf.extend(A)
|
|
Vf.pop()
|
|
Vf.extend(B)
|
|
if separated:
|
|
number_goodblocks += 1
|
|
else:
|
|
number_goodblocks = 0
|
|
T = [t]
|
|
V = [v]
|
|
# Now the same procedure to the left
|
|
number_goodblocks = 0
|
|
m2 = n-2
|
|
t, v, b = compute_triple_tvb(ctx, m2)
|
|
Tf.insert(0,t)
|
|
Vf.insert(0,v)
|
|
while b < 0:
|
|
m2 -= 1
|
|
t,v,b = compute_triple_tvb(ctx, m2)
|
|
Tf.insert(0,t)
|
|
Vf.insert(0,v)
|
|
goodpoints.insert(0,m2)
|
|
T = [t]
|
|
V = [v]
|
|
while number_goodblocks < 2*sb:
|
|
m2 -= 1
|
|
t, v, b = compute_triple_tvb(ctx, m2)
|
|
T.insert(0,t)
|
|
V.insert(0,v)
|
|
while b < 0:
|
|
m2 -= 1
|
|
t,v,b = compute_triple_tvb(ctx, m2)
|
|
T.insert(0,t)
|
|
V.insert(0,v)
|
|
goodpoints.insert(0,m2)
|
|
zn = len(T)-1
|
|
A, B, separated =\
|
|
separate_zeros_in_block(ctx, zn, T, V, limitloop=ITERATION_LIMIT, fp_tolerance=fp_tolerance)
|
|
A.pop()
|
|
Tf = A+Tf
|
|
B.pop()
|
|
Vf = B+Vf
|
|
if separated:
|
|
number_goodblocks += 1
|
|
else:
|
|
number_goodblocks = 0
|
|
T = [t]
|
|
V = [v]
|
|
r = goodpoints[2*sb]
|
|
lg = len(goodpoints)
|
|
s = goodpoints[lg-2*sb-1]
|
|
tr, vr, br = compute_triple_tvb(ctx, r)
|
|
ar = Tf.index(tr)
|
|
ts, vs, bs = compute_triple_tvb(ctx, s)
|
|
as1 = Tf.index(ts)
|
|
T = Tf[ar:as1+1]
|
|
V = Vf[ar:as1+1]
|
|
zn = s-r
|
|
A, B, separated =\
|
|
separate_zeros_in_block(ctx, zn,T,V,limitloop=ITERATION_LIMIT, fp_tolerance=fp_tolerance)
|
|
if separated:
|
|
return (n-r-1,[r,s],A,B)
|
|
q = goodpoints[sb]
|
|
lg = len(goodpoints)
|
|
t = goodpoints[lg-sb-1]
|
|
tq, vq, bq = compute_triple_tvb(ctx, q)
|
|
aq = Tf.index(tq)
|
|
tt, vt, bt = compute_triple_tvb(ctx, t)
|
|
at = Tf.index(tt)
|
|
T = Tf[aq:at+1]
|
|
V = Vf[aq:at+1]
|
|
return (n-q-1,[q,t],T,V)
|
|
|
|
def count_variations(V):
|
|
count = 0
|
|
vold = V[0]
|
|
for n in range(1, len(V)):
|
|
vnew = V[n]
|
|
if vold*vnew < 0:
|
|
count +=1
|
|
vold = vnew
|
|
return count
|
|
|
|
def pattern_construct(ctx, block, T, V):
|
|
pattern = '('
|
|
a = block[0]
|
|
b = block[1]
|
|
t0,v0,b0 = compute_triple_tvb(ctx, a)
|
|
k = 0
|
|
k0 = 0
|
|
for n in range(a+1,b+1):
|
|
t1,v1,b1 = compute_triple_tvb(ctx, n)
|
|
lgT =len(T)
|
|
while (k < lgT) and (T[k] <= t1):
|
|
k += 1
|
|
L = V[k0:k]
|
|
L.append(v1)
|
|
L.insert(0,v0)
|
|
count = count_variations(L)
|
|
pattern = pattern + ("%s" % count)
|
|
if b1 > 0:
|
|
pattern = pattern + ')('
|
|
k0 = k
|
|
t0,v0,b0 = t1,v1,b1
|
|
pattern = pattern[:-1]
|
|
return pattern
|
|
|
|
@defun
|
|
def zetazero(ctx, n, info=False, round=True):
|
|
r"""
|
|
Computes the `n`-th nontrivial zero of `\zeta(s)` on the critical line,
|
|
i.e. returns an approximation of the `n`-th largest complex number
|
|
`s = \frac{1}{2} + ti` for which `\zeta(s) = 0`. Equivalently, the
|
|
imaginary part `t` is a zero of the Z-function (:func:`~mpmath.siegelz`).
|
|
|
|
**Examples**
|
|
|
|
The first few zeros::
|
|
|
|
>>> from mpmath import *
|
|
>>> mp.dps = 25; mp.pretty = True
|
|
>>> zetazero(1)
|
|
(0.5 + 14.13472514173469379045725j)
|
|
>>> zetazero(2)
|
|
(0.5 + 21.02203963877155499262848j)
|
|
>>> zetazero(20)
|
|
(0.5 + 77.14484006887480537268266j)
|
|
|
|
Verifying that the values are zeros::
|
|
|
|
>>> for n in range(1,5):
|
|
... s = zetazero(n)
|
|
... chop(zeta(s)), chop(siegelz(s.imag))
|
|
...
|
|
(0.0, 0.0)
|
|
(0.0, 0.0)
|
|
(0.0, 0.0)
|
|
(0.0, 0.0)
|
|
|
|
Negative indices give the conjugate zeros (`n = 0` is undefined)::
|
|
|
|
>>> zetazero(-1)
|
|
(0.5 - 14.13472514173469379045725j)
|
|
|
|
:func:`~mpmath.zetazero` supports arbitrarily large `n` and arbitrary precision::
|
|
|
|
>>> mp.dps = 15
|
|
>>> zetazero(1234567)
|
|
(0.5 + 727690.906948208j)
|
|
>>> mp.dps = 50
|
|
>>> zetazero(1234567)
|
|
(0.5 + 727690.9069482075392389420041147142092708393819935j)
|
|
>>> chop(zeta(_)/_)
|
|
0.0
|
|
|
|
with *info=True*, :func:`~mpmath.zetazero` gives additional information::
|
|
|
|
>>> mp.dps = 15
|
|
>>> zetazero(542964976,info=True)
|
|
((0.5 + 209039046.578535j), [542964969, 542964978], 6, '(013111110)')
|
|
|
|
This means that the zero is between Gram points 542964969 and 542964978;
|
|
it is the 6-th zero between them. Finally (01311110) is the pattern
|
|
of zeros in this interval. The numbers indicate the number of zeros
|
|
in each Gram interval (Rosser blocks between parenthesis). In this case
|
|
there is only one Rosser block of length nine.
|
|
"""
|
|
n = int(n)
|
|
if n < 0:
|
|
return ctx.zetazero(-n).conjugate()
|
|
if n == 0:
|
|
raise ValueError("n must be nonzero")
|
|
wpinitial = ctx.prec
|
|
try:
|
|
wpz, fp_tolerance = comp_fp_tolerance(ctx, n)
|
|
ctx.prec = wpz
|
|
if n < 400000000:
|
|
my_zero_number, block, T, V =\
|
|
find_rosser_block_zero(ctx, n)
|
|
else:
|
|
my_zero_number, block, T, V =\
|
|
search_supergood_block(ctx, n, fp_tolerance)
|
|
zero_number_block = block[1]-block[0]
|
|
T, V, separated = separate_zeros_in_block(ctx, zero_number_block, T, V,
|
|
limitloop=ctx.inf, fp_tolerance=fp_tolerance)
|
|
if info:
|
|
pattern = pattern_construct(ctx,block,T,V)
|
|
prec = max(wpinitial, wpz)
|
|
t = separate_my_zero(ctx, my_zero_number, zero_number_block,T,V,prec)
|
|
v = ctx.mpc(0.5,t)
|
|
finally:
|
|
ctx.prec = wpinitial
|
|
if round:
|
|
v =+v
|
|
if info:
|
|
return (v,block,my_zero_number,pattern)
|
|
else:
|
|
return v
|
|
|
|
def gram_index(ctx, t):
|
|
if t > 10**13:
|
|
wp = 3*ctx.log(t, 10)
|
|
else:
|
|
wp = 0
|
|
prec = ctx.prec
|
|
try:
|
|
ctx.prec += wp
|
|
h = int(ctx.siegeltheta(t)/ctx.pi)
|
|
finally:
|
|
ctx.prec = prec
|
|
return(h)
|
|
|
|
def count_to(ctx, t, T, V):
|
|
count = 0
|
|
vold = V[0]
|
|
told = T[0]
|
|
tnew = T[1]
|
|
k = 1
|
|
while tnew < t:
|
|
vnew = V[k]
|
|
if vold*vnew < 0:
|
|
count += 1
|
|
vold = vnew
|
|
k += 1
|
|
tnew = T[k]
|
|
a = ctx.siegelz(t)
|
|
if a*vold < 0:
|
|
count += 1
|
|
return count
|
|
|
|
def comp_fp_tolerance(ctx, n):
|
|
wpz = wpzeros(n*ctx.log(n))
|
|
if n < 15*10**8:
|
|
fp_tolerance = 0.0005
|
|
elif n <= 10**14:
|
|
fp_tolerance = 0.1
|
|
else:
|
|
fp_tolerance = 100
|
|
return wpz, fp_tolerance
|
|
|
|
@defun
|
|
def nzeros(ctx, t):
|
|
r"""
|
|
Computes the number of zeros of the Riemann zeta function in
|
|
`(0,1) \times (0,t]`, usually denoted by `N(t)`.
|
|
|
|
**Examples**
|
|
|
|
The first zero has imaginary part between 14 and 15::
|
|
|
|
>>> from mpmath import *
|
|
>>> mp.dps = 15; mp.pretty = True
|
|
>>> nzeros(14)
|
|
0
|
|
>>> nzeros(15)
|
|
1
|
|
>>> zetazero(1)
|
|
(0.5 + 14.1347251417347j)
|
|
|
|
Some closely spaced zeros::
|
|
|
|
>>> nzeros(10**7)
|
|
21136125
|
|
>>> zetazero(21136125)
|
|
(0.5 + 9999999.32718175j)
|
|
>>> zetazero(21136126)
|
|
(0.5 + 10000000.2400236j)
|
|
>>> nzeros(545439823.215)
|
|
1500000001
|
|
>>> zetazero(1500000001)
|
|
(0.5 + 545439823.201985j)
|
|
>>> zetazero(1500000002)
|
|
(0.5 + 545439823.325697j)
|
|
|
|
This confirms the data given by J. van de Lune,
|
|
H. J. J. te Riele and D. T. Winter in 1986.
|
|
"""
|
|
if t < 14.1347251417347:
|
|
return 0
|
|
x = gram_index(ctx, t)
|
|
k = int(ctx.floor(x))
|
|
wpinitial = ctx.prec
|
|
wpz, fp_tolerance = comp_fp_tolerance(ctx, k)
|
|
ctx.prec = wpz
|
|
a = ctx.siegelz(t)
|
|
if k == -1 and a < 0:
|
|
return 0
|
|
elif k == -1 and a > 0:
|
|
return 1
|
|
if k+2 < 400000000:
|
|
Rblock = find_rosser_block_zero(ctx, k+2)
|
|
else:
|
|
Rblock = search_supergood_block(ctx, k+2, fp_tolerance)
|
|
n1, n2 = Rblock[1]
|
|
if n2-n1 == 1:
|
|
b = Rblock[3][0]
|
|
if a*b > 0:
|
|
ctx.prec = wpinitial
|
|
return k+1
|
|
else:
|
|
ctx.prec = wpinitial
|
|
return k+2
|
|
my_zero_number,block, T, V = Rblock
|
|
zero_number_block = n2-n1
|
|
T, V, separated = separate_zeros_in_block(ctx,\
|
|
zero_number_block, T, V,\
|
|
limitloop=ctx.inf,\
|
|
fp_tolerance=fp_tolerance)
|
|
n = count_to(ctx, t, T, V)
|
|
ctx.prec = wpinitial
|
|
return n+n1+1
|
|
|
|
@defun_wrapped
|
|
def backlunds(ctx, t):
|
|
r"""
|
|
Computes the function
|
|
`S(t) = \operatorname{arg} \zeta(\frac{1}{2} + it) / \pi`.
|
|
|
|
See Titchmarsh Section 9.3 for details of the definition.
|
|
|
|
**Examples**
|
|
|
|
>>> from mpmath import *
|
|
>>> mp.dps = 15; mp.pretty = True
|
|
>>> backlunds(217.3)
|
|
0.16302205431184
|
|
|
|
Generally, the value is a small number. At Gram points it is an integer,
|
|
frequently equal to 0::
|
|
|
|
>>> chop(backlunds(grampoint(200)))
|
|
0.0
|
|
>>> backlunds(extraprec(10)(grampoint)(211))
|
|
1.0
|
|
>>> backlunds(extraprec(10)(grampoint)(232))
|
|
-1.0
|
|
|
|
The number of zeros of the Riemann zeta function up to height `t`
|
|
satisfies `N(t) = \theta(t)/\pi + 1 + S(t)` (see :func:nzeros` and
|
|
:func:`siegeltheta`)::
|
|
|
|
>>> t = 1234.55
|
|
>>> nzeros(t)
|
|
842
|
|
>>> siegeltheta(t)/pi+1+backlunds(t)
|
|
842.0
|
|
|
|
"""
|
|
return ctx.nzeros(t)-1-ctx.siegeltheta(t)/ctx.pi
|
|
|
|
|
|
"""
|
|
_ROSSER_EXCEPTIONS is a list of all exceptions to
|
|
Rosser's rule for n <= 400 000 000.
|
|
|
|
Alternately the entry is of type [n,m], or a string.
|
|
The string is the zero pattern of the Block and the relevant
|
|
adjacent. For example (010)3 corresponds to a block
|
|
composed of three Gram intervals, the first ant third without
|
|
a zero and the intermediate with a zero. The next Gram interval
|
|
contain three zeros. So that in total we have 4 zeros in 4 Gram
|
|
blocks. n and m are the indices of the Gram points of this
|
|
interval of four Gram intervals. The Rosser exception is therefore
|
|
formed by the three Gram intervals that are signaled between
|
|
parenthesis.
|
|
|
|
We have included also some Rosser's exceptions beyond n=400 000 000
|
|
that are noted in the literature by some reason.
|
|
|
|
The list is composed from the data published in the references:
|
|
|
|
R. P. Brent, J. van de Lune, H. J. J. te Riele, D. T. Winter,
|
|
'On the Zeros of the Riemann Zeta Function in the Critical Strip. II',
|
|
Math. Comp. 39 (1982) 681--688.
|
|
See also Corrigenda in Math. Comp. 46 (1986) 771.
|
|
|
|
J. van de Lune, H. J. J. te Riele,
|
|
'On the Zeros of the Riemann Zeta Function in the Critical Strip. III',
|
|
Math. Comp. 41 (1983) 759--767.
|
|
See also Corrigenda in Math. Comp. 46 (1986) 771.
|
|
|
|
J. van de Lune,
|
|
'Sums of Equal Powers of Positive Integers',
|
|
Dissertation,
|
|
Vrije Universiteit te Amsterdam, Centrum voor Wiskunde en Informatica,
|
|
Amsterdam, 1984.
|
|
|
|
Thanks to the authors all this papers and those others that have
|
|
contributed to make this possible.
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ROSSER_EXCEPTIONS = \
|
|
[[13999525, 13999528], '(00)3',
|
|
[30783329, 30783332], '(00)3',
|
|
[30930926, 30930929], '3(00)',
|
|
[37592215, 37592218], '(00)3',
|
|
[40870156, 40870159], '(00)3',
|
|
[43628107, 43628110], '(00)3',
|
|
[46082042, 46082045], '(00)3',
|
|
[46875667, 46875670], '(00)3',
|
|
[49624540, 49624543], '3(00)',
|
|
[50799238, 50799241], '(00)3',
|
|
[55221453, 55221456], '3(00)',
|
|
[56948779, 56948782], '3(00)',
|
|
[60515663, 60515666], '(00)3',
|
|
[61331766, 61331770], '(00)40',
|
|
[69784843, 69784846], '3(00)',
|
|
[75052114, 75052117], '(00)3',
|
|
[79545240, 79545243], '3(00)',
|
|
[79652247, 79652250], '3(00)',
|
|
[83088043, 83088046], '(00)3',
|
|
[83689522, 83689525], '3(00)',
|
|
[85348958, 85348961], '(00)3',
|
|
[86513820, 86513823], '(00)3',
|
|
[87947596, 87947599], '3(00)',
|
|
[88600095, 88600098], '(00)3',
|
|
[93681183, 93681186], '(00)3',
|
|
[100316551, 100316554], '3(00)',
|
|
[100788444, 100788447], '(00)3',
|
|
[106236172, 106236175], '(00)3',
|
|
[106941327, 106941330], '3(00)',
|
|
[107287955, 107287958], '(00)3',
|
|
[107532016, 107532019], '3(00)',
|
|
[110571044, 110571047], '(00)3',
|
|
[111885253, 111885256], '3(00)',
|
|
[113239783, 113239786], '(00)3',
|
|
[120159903, 120159906], '(00)3',
|
|
[121424391, 121424394], '3(00)',
|
|
[121692931, 121692934], '3(00)',
|
|
[121934170, 121934173], '3(00)',
|
|
[122612848, 122612851], '3(00)',
|
|
[126116567, 126116570], '(00)3',
|
|
[127936513, 127936516], '(00)3',
|
|
[128710277, 128710280], '3(00)',
|
|
[129398902, 129398905], '3(00)',
|
|
[130461096, 130461099], '3(00)',
|
|
[131331947, 131331950], '3(00)',
|
|
[137334071, 137334074], '3(00)',
|
|
[137832603, 137832606], '(00)3',
|
|
[138799471, 138799474], '3(00)',
|
|
[139027791, 139027794], '(00)3',
|
|
[141617806, 141617809], '(00)3',
|
|
[144454931, 144454934], '(00)3',
|
|
[145402379, 145402382], '3(00)',
|
|
[146130245, 146130248], '3(00)',
|
|
[147059770, 147059773], '(00)3',
|
|
[147896099, 147896102], '3(00)',
|
|
[151097113, 151097116], '(00)3',
|
|
[152539438, 152539441], '(00)3',
|
|
[152863168, 152863171], '3(00)',
|
|
[153522726, 153522729], '3(00)',
|
|
[155171524, 155171527], '3(00)',
|
|
[155366607, 155366610], '(00)3',
|
|
[157260686, 157260689], '3(00)',
|
|
[157269224, 157269227], '(00)3',
|
|
[157755123, 157755126], '(00)3',
|
|
[158298484, 158298487], '3(00)',
|
|
[160369050, 160369053], '3(00)',
|
|
[162962787, 162962790], '(00)3',
|
|
[163724709, 163724712], '(00)3',
|
|
[164198113, 164198116], '3(00)',
|
|
[164689301, 164689305], '(00)40',
|
|
[164880228, 164880231], '3(00)',
|
|
[166201932, 166201935], '(00)3',
|
|
[168573836, 168573839], '(00)3',
|
|
[169750763, 169750766], '(00)3',
|
|
[170375507, 170375510], '(00)3',
|
|
[170704879, 170704882], '3(00)',
|
|
[172000992, 172000995], '3(00)',
|
|
[173289941, 173289944], '(00)3',
|
|
[173737613, 173737616], '3(00)',
|
|
[174102513, 174102516], '(00)3',
|
|
[174284990, 174284993], '(00)3',
|
|
[174500513, 174500516], '(00)3',
|
|
[175710609, 175710612], '(00)3',
|
|
[176870843, 176870846], '3(00)',
|
|
[177332732, 177332735], '3(00)',
|
|
[177902861, 177902864], '3(00)',
|
|
[179979095, 179979098], '(00)3',
|
|
[181233726, 181233729], '3(00)',
|
|
[181625435, 181625438], '(00)3',
|
|
[182105255, 182105259], '22(00)',
|
|
[182223559, 182223562], '3(00)',
|
|
[191116404, 191116407], '3(00)',
|
|
[191165599, 191165602], '3(00)',
|
|
[191297535, 191297539], '(00)22',
|
|
[192485616, 192485619], '(00)3',
|
|
[193264634, 193264638], '22(00)',
|
|
[194696968, 194696971], '(00)3',
|
|
[195876805, 195876808], '(00)3',
|
|
[195916548, 195916551], '3(00)',
|
|
[196395160, 196395163], '3(00)',
|
|
[196676303, 196676306], '(00)3',
|
|
[197889882, 197889885], '3(00)',
|
|
[198014122, 198014125], '(00)3',
|
|
[199235289, 199235292], '(00)3',
|
|
[201007375, 201007378], '(00)3',
|
|
[201030605, 201030608], '3(00)',
|
|
[201184290, 201184293], '3(00)',
|
|
[201685414, 201685418], '(00)22',
|
|
[202762875, 202762878], '3(00)',
|
|
[202860957, 202860960], '3(00)',
|
|
[203832577, 203832580], '3(00)',
|
|
[205880544, 205880547], '(00)3',
|
|
[206357111, 206357114], '(00)3',
|
|
[207159767, 207159770], '3(00)',
|
|
[207167343, 207167346], '3(00)',
|
|
[207482539, 207482543], '3(010)',
|
|
[207669540, 207669543], '3(00)',
|
|
[208053426, 208053429], '(00)3',
|
|
[208110027, 208110030], '3(00)',
|
|
[209513826, 209513829], '3(00)',
|
|
[212623522, 212623525], '(00)3',
|
|
[213841715, 213841718], '(00)3',
|
|
[214012333, 214012336], '(00)3',
|
|
[214073567, 214073570], '(00)3',
|
|
[215170600, 215170603], '3(00)',
|
|
[215881039, 215881042], '3(00)',
|
|
[216274604, 216274607], '3(00)',
|
|
[216957120, 216957123], '3(00)',
|
|
[217323208, 217323211], '(00)3',
|
|
[218799264, 218799267], '(00)3',
|
|
[218803557, 218803560], '3(00)',
|
|
[219735146, 219735149], '(00)3',
|
|
[219830062, 219830065], '3(00)',
|
|
[219897904, 219897907], '(00)3',
|
|
[221205545, 221205548], '(00)3',
|
|
[223601929, 223601932], '(00)3',
|
|
[223907076, 223907079], '3(00)',
|
|
[223970397, 223970400], '(00)3',
|
|
[224874044, 224874048], '22(00)',
|
|
[225291157, 225291160], '(00)3',
|
|
[227481734, 227481737], '(00)3',
|
|
[228006442, 228006445], '3(00)',
|
|
[228357900, 228357903], '(00)3',
|
|
[228386399, 228386402], '(00)3',
|
|
[228907446, 228907449], '(00)3',
|
|
[228984552, 228984555], '3(00)',
|
|
[229140285, 229140288], '3(00)',
|
|
[231810024, 231810027], '(00)3',
|
|
[232838062, 232838065], '3(00)',
|
|
[234389088, 234389091], '3(00)',
|
|
[235588194, 235588197], '(00)3',
|
|
[236645695, 236645698], '(00)3',
|
|
[236962876, 236962879], '3(00)',
|
|
[237516723, 237516727], '04(00)',
|
|
[240004911, 240004914], '(00)3',
|
|
[240221306, 240221309], '3(00)',
|
|
[241389213, 241389217], '(010)3',
|
|
[241549003, 241549006], '(00)3',
|
|
[241729717, 241729720], '(00)3',
|
|
[241743684, 241743687], '3(00)',
|
|
[243780200, 243780203], '3(00)',
|
|
[243801317, 243801320], '(00)3',
|
|
[244122072, 244122075], '(00)3',
|
|
[244691224, 244691227], '3(00)',
|
|
[244841577, 244841580], '(00)3',
|
|
[245813461, 245813464], '(00)3',
|
|
[246299475, 246299478], '(00)3',
|
|
[246450176, 246450179], '3(00)',
|
|
[249069349, 249069352], '(00)3',
|
|
[250076378, 250076381], '(00)3',
|
|
[252442157, 252442160], '3(00)',
|
|
[252904231, 252904234], '3(00)',
|
|
[255145220, 255145223], '(00)3',
|
|
[255285971, 255285974], '3(00)',
|
|
[256713230, 256713233], '(00)3',
|
|
[257992082, 257992085], '(00)3',
|
|
[258447955, 258447959], '22(00)',
|
|
[259298045, 259298048], '3(00)',
|
|
[262141503, 262141506], '(00)3',
|
|
[263681743, 263681746], '3(00)',
|
|
[266527881, 266527885], '(010)3',
|
|
[266617122, 266617125], '(00)3',
|
|
[266628044, 266628047], '3(00)',
|
|
[267305763, 267305766], '(00)3',
|
|
[267388404, 267388407], '3(00)',
|
|
[267441672, 267441675], '3(00)',
|
|
[267464886, 267464889], '(00)3',
|
|
[267554907, 267554910], '3(00)',
|
|
[269787480, 269787483], '(00)3',
|
|
[270881434, 270881437], '(00)3',
|
|
[270997583, 270997586], '3(00)',
|
|
[272096378, 272096381], '3(00)',
|
|
[272583009, 272583012], '(00)3',
|
|
[274190881, 274190884], '3(00)',
|
|
[274268747, 274268750], '(00)3',
|
|
[275297429, 275297432], '3(00)',
|
|
[275545476, 275545479], '3(00)',
|
|
[275898479, 275898482], '3(00)',
|
|
[275953000, 275953003], '(00)3',
|
|
[277117197, 277117201], '(00)22',
|
|
[277447310, 277447313], '3(00)',
|
|
[279059657, 279059660], '3(00)',
|
|
[279259144, 279259147], '3(00)',
|
|
[279513636, 279513639], '3(00)',
|
|
[279849069, 279849072], '3(00)',
|
|
[280291419, 280291422], '(00)3',
|
|
[281449425, 281449428], '3(00)',
|
|
[281507953, 281507956], '3(00)',
|
|
[281825600, 281825603], '(00)3',
|
|
[282547093, 282547096], '3(00)',
|
|
[283120963, 283120966], '3(00)',
|
|
[283323493, 283323496], '(00)3',
|
|
[284764535, 284764538], '3(00)',
|
|
[286172639, 286172642], '3(00)',
|
|
[286688824, 286688827], '(00)3',
|
|
[287222172, 287222175], '3(00)',
|
|
[287235534, 287235537], '3(00)',
|
|
[287304861, 287304864], '3(00)',
|
|
[287433571, 287433574], '(00)3',
|
|
[287823551, 287823554], '(00)3',
|
|
[287872422, 287872425], '3(00)',
|
|
[288766615, 288766618], '3(00)',
|
|
[290122963, 290122966], '3(00)',
|
|
[290450849, 290450853], '(00)22',
|
|
[291426141, 291426144], '3(00)',
|
|
[292810353, 292810356], '3(00)',
|
|
[293109861, 293109864], '3(00)',
|
|
[293398054, 293398057], '3(00)',
|
|
[294134426, 294134429], '3(00)',
|
|
[294216438, 294216441], '(00)3',
|
|
[295367141, 295367144], '3(00)',
|
|
[297834111, 297834114], '3(00)',
|
|
[299099969, 299099972], '3(00)',
|
|
[300746958, 300746961], '3(00)',
|
|
[301097423, 301097426], '(00)3',
|
|
[301834209, 301834212], '(00)3',
|
|
[302554791, 302554794], '(00)3',
|
|
[303497445, 303497448], '3(00)',
|
|
[304165344, 304165347], '3(00)',
|
|
[304790218, 304790222], '3(010)',
|
|
[305302352, 305302355], '(00)3',
|
|
[306785996, 306785999], '3(00)',
|
|
[307051443, 307051446], '3(00)',
|
|
[307481539, 307481542], '3(00)',
|
|
[308605569, 308605572], '3(00)',
|
|
[309237610, 309237613], '3(00)',
|
|
[310509287, 310509290], '(00)3',
|
|
[310554057, 310554060], '3(00)',
|
|
[310646345, 310646348], '3(00)',
|
|
[311274896, 311274899], '(00)3',
|
|
[311894272, 311894275], '3(00)',
|
|
[312269470, 312269473], '(00)3',
|
|
[312306601, 312306605], '(00)40',
|
|
[312683193, 312683196], '3(00)',
|
|
[314499804, 314499807], '3(00)',
|
|
[314636802, 314636805], '(00)3',
|
|
[314689897, 314689900], '3(00)',
|
|
[314721319, 314721322], '3(00)',
|
|
[316132890, 316132893], '3(00)',
|
|
[316217470, 316217474], '(010)3',
|
|
[316465705, 316465708], '3(00)',
|
|
[316542790, 316542793], '(00)3',
|
|
[320822347, 320822350], '3(00)',
|
|
[321733242, 321733245], '3(00)',
|
|
[324413970, 324413973], '(00)3',
|
|
[325950140, 325950143], '(00)3',
|
|
[326675884, 326675887], '(00)3',
|
|
[326704208, 326704211], '3(00)',
|
|
[327596247, 327596250], '3(00)',
|
|
[328123172, 328123175], '3(00)',
|
|
[328182212, 328182215], '(00)3',
|
|
[328257498, 328257501], '3(00)',
|
|
[328315836, 328315839], '(00)3',
|
|
[328800974, 328800977], '(00)3',
|
|
[328998509, 328998512], '3(00)',
|
|
[329725370, 329725373], '(00)3',
|
|
[332080601, 332080604], '(00)3',
|
|
[332221246, 332221249], '(00)3',
|
|
[332299899, 332299902], '(00)3',
|
|
[332532822, 332532825], '(00)3',
|
|
[333334544, 333334548], '(00)22',
|
|
[333881266, 333881269], '3(00)',
|
|
[334703267, 334703270], '3(00)',
|
|
[334875138, 334875141], '3(00)',
|
|
[336531451, 336531454], '3(00)',
|
|
[336825907, 336825910], '(00)3',
|
|
[336993167, 336993170], '(00)3',
|
|
[337493998, 337494001], '3(00)',
|
|
[337861034, 337861037], '3(00)',
|
|
[337899191, 337899194], '(00)3',
|
|
[337958123, 337958126], '(00)3',
|
|
[342331982, 342331985], '3(00)',
|
|
[342676068, 342676071], '3(00)',
|
|
[347063781, 347063784], '3(00)',
|
|
[347697348, 347697351], '3(00)',
|
|
[347954319, 347954322], '3(00)',
|
|
[348162775, 348162778], '3(00)',
|
|
[349210702, 349210705], '(00)3',
|
|
[349212913, 349212916], '3(00)',
|
|
[349248650, 349248653], '(00)3',
|
|
[349913500, 349913503], '3(00)',
|
|
[350891529, 350891532], '3(00)',
|
|
[351089323, 351089326], '3(00)',
|
|
[351826158, 351826161], '3(00)',
|
|
[352228580, 352228583], '(00)3',
|
|
[352376244, 352376247], '3(00)',
|
|
[352853758, 352853761], '(00)3',
|
|
[355110439, 355110442], '(00)3',
|
|
[355808090, 355808094], '(00)40',
|
|
[355941556, 355941559], '3(00)',
|
|
[356360231, 356360234], '(00)3',
|
|
[356586657, 356586660], '3(00)',
|
|
[356892926, 356892929], '(00)3',
|
|
[356908232, 356908235], '3(00)',
|
|
[357912730, 357912733], '3(00)',
|
|
[358120344, 358120347], '3(00)',
|
|
[359044096, 359044099], '(00)3',
|
|
[360819357, 360819360], '3(00)',
|
|
[361399662, 361399666], '(010)3',
|
|
[362361315, 362361318], '(00)3',
|
|
[363610112, 363610115], '(00)3',
|
|
[363964804, 363964807], '3(00)',
|
|
[364527375, 364527378], '(00)3',
|
|
[365090327, 365090330], '(00)3',
|
|
[365414539, 365414542], '3(00)',
|
|
[366738474, 366738477], '3(00)',
|
|
[368714778, 368714783], '04(010)',
|
|
[368831545, 368831548], '(00)3',
|
|
[368902387, 368902390], '(00)3',
|
|
[370109769, 370109772], '3(00)',
|
|
[370963333, 370963336], '3(00)',
|
|
[372541136, 372541140], '3(010)',
|
|
[372681562, 372681565], '(00)3',
|
|
[373009410, 373009413], '(00)3',
|
|
[373458970, 373458973], '3(00)',
|
|
[375648658, 375648661], '3(00)',
|
|
[376834728, 376834731], '3(00)',
|
|
[377119945, 377119948], '(00)3',
|
|
[377335703, 377335706], '(00)3',
|
|
[378091745, 378091748], '3(00)',
|
|
[379139522, 379139525], '3(00)',
|
|
[380279160, 380279163], '(00)3',
|
|
[380619442, 380619445], '3(00)',
|
|
[381244231, 381244234], '3(00)',
|
|
[382327446, 382327450], '(010)3',
|
|
[382357073, 382357076], '3(00)',
|
|
[383545479, 383545482], '3(00)',
|
|
[384363766, 384363769], '(00)3',
|
|
[384401786, 384401790], '22(00)',
|
|
[385198212, 385198215], '3(00)',
|
|
[385824476, 385824479], '(00)3',
|
|
[385908194, 385908197], '3(00)',
|
|
[386946806, 386946809], '3(00)',
|
|
[387592175, 387592179], '22(00)',
|
|
[388329293, 388329296], '(00)3',
|
|
[388679566, 388679569], '3(00)',
|
|
[388832142, 388832145], '3(00)',
|
|
[390087103, 390087106], '(00)3',
|
|
[390190926, 390190930], '(00)22',
|
|
[390331207, 390331210], '3(00)',
|
|
[391674495, 391674498], '3(00)',
|
|
[391937831, 391937834], '3(00)',
|
|
[391951632, 391951636], '(00)22',
|
|
[392963986, 392963989], '(00)3',
|
|
[393007921, 393007924], '3(00)',
|
|
[393373210, 393373213], '3(00)',
|
|
[393759572, 393759575], '(00)3',
|
|
[394036662, 394036665], '(00)3',
|
|
[395813866, 395813869], '(00)3',
|
|
[395956690, 395956693], '3(00)',
|
|
[396031670, 396031673], '3(00)',
|
|
[397076433, 397076436], '3(00)',
|
|
[397470601, 397470604], '3(00)',
|
|
[398289458, 398289461], '3(00)',
|
|
#
|
|
[368714778, 368714783], '04(010)',
|
|
[437953499, 437953504], '04(010)',
|
|
[526196233, 526196238], '032(00)',
|
|
[744719566, 744719571], '(010)40',
|
|
[750375857, 750375862], '032(00)',
|
|
[958241932, 958241937], '04(010)',
|
|
[983377342, 983377347], '(00)410',
|
|
[1003780080, 1003780085], '04(010)',
|
|
[1070232754, 1070232759], '(00)230',
|
|
[1209834865, 1209834870], '032(00)',
|
|
[1257209100, 1257209105], '(00)410',
|
|
[1368002233, 1368002238], '(00)230'
|
|
]
|