The question:

" why is our root number graph so choppy looking?"

makes me very suspicious and wonder about the same graph over Cremona's data... so let's do that.

%auto


Here we take all curves in Cremona's tables up to conductor 350K, including all curves in each isogeny class.

(Note: I'm using the parity of the rank to compute the root number, since I didn't easily see the root number in the database...)

%time
%python
v = []
s = 0.0
n = 0
for N in range(10000):
for lbl, c in db.allcurves(N).iteritems():
s += (1 if (c[1]%2==0) else -1)
n += 1
v.append(s/n)
v = stats.TimeSeries(v)
v.plot()

CPU time: 5.53 s, Wall time: 12.48 s
# Log scale
base = 1.2
w = [[i,v[int(base^i)]] for i in range(1,round(floor(log(len(v),base))))]
show(line(w) + points(w,pointsize=30,color='grey'), ymin=-.1)

v[0]

1.0
%time
%python
v = []
s = 0.0
n = 0
for N in range(350000):
for lbl, c in db.allcurves(N).iteritems():
s += (1 if (c[1]%2==0) else -1)
n += 1
v.append(s/n)
v = stats.TimeSeries(v)

CPU time: 116.69 s, Wall time: 116.74 s
# the beginning:
v[:100].plot()

# yes there really are that many curves of rank 0 at the beginning!
len(list(cremona_curves(range(11,37))))

76
v[:1000].plot()

v[:10000].plot()

# The full data up to 350K on a linear scale.
v.plot(ymin=-.2)


Now the same on a log scale, except using a smaller base than 10 since our data only goes up to 350K...

base = 1.2
w = [[i,v[int(base^i)]] for i in range(1,round(floor(log(len(v),base))))]
line(w) + points(w,pointsize=30,color='grey')


Well that is disturbingly different than the picture in our paper...