CoCalc Shared Filescode / 11a.ipynbOpen in CoCalc with one click!
Authors: JB Nam, William A. Stein, Andrew Sutherland, Nicholas Triantafillou

Computing ΛE,d(t)\Lambda_{E,d}(t)

** Some details below of the definition of α\alpha are wrong.**

The Definition

Let EE be a non-CM elliptic curve over Q\QQ.

Let d>2d>2 be an odd positive integer.

Let χ\chi vary over Dirichlet characters of order dd whose conductor mm is coprime to the conductor NN of EE.

We have L(E,χ,1)=1τ(χ)a(Z/mZ)χ(a)amE± L(E,\overline{\chi},1) = \frac{1}{\tau(\chi)} \cdot \sum_{a\in (\ZZ/m\ZZ)^*} \chi(a)\cdot \left \langle\frac{a}{m} \right \rangle^{\pm}_E where ±\pm is the sign of χ\chi, τ(χ)\tau(\chi) is the Gauss sum, and amE±=πi(irfdz±irfdz) \left \langle\frac{a}{m} \right \rangle^{\pm}_E = \pi i \left( \int_{i\infty}^{r} f dz \pm \int_{i\infty}^{-r} f dz \right) is the ±\pm period mapping.

To make things very concrete we assume that mm is prime. This is not necessary.

Let GG denote the quotient of (Z/mZ)(\ZZ/m\ZZ)^* of order dd, so we have an exact sequence 1H(Z/mZ)G1 1 \to H \to (\ZZ/m\ZZ)^* \to G \to 1 where HH is the unique subgroup of (Z/mZ)(\ZZ/m\ZZ)^* of order n=φ(m)/dn = \varphi(m)/d.

Choose a generator h(Z/mZ)h\in (\ZZ/m\ZZ)^*, i.e., any element of φ(m)\varphi(m) of order φ(m)/d\varphi(m)/d, so H=hH=\langle h \rangle.

Choose b(Z/mZ)b \in (\ZZ/m\ZZ)^* of order φ(m)\varphi(m), and write (Z/mZ)=Hb0Hb1Hbd1(disjoint union)(\ZZ/m\ZZ)^* = Hb^0 \cup Hb^1 \cdots \cup Hb^{d-1} \qquad \text{(disjoint union)}

Since χ(H)={1}\chi(H)=\{1\}, we have L(E,χ,1)=1τ(χ)i=0d1(χ(bi)j=0n1bihjmE±) L(E,\overline{\chi},1) = \frac{1}{\tau(\chi)} \cdot \sum_{i=0}^{d-1} \left( \chi(b^i) \sum_{j=0}^{n-1} \left\langle \frac{b^i h^j}{m} \right\rangle^{\pm}_E \right)

Fix ωE±\omega_{E}^{\pm} so that amE±\left \langle\frac{a}{m} \right \rangle^{\pm}_E is an algebraic multiple of ωE±\omega_{E}^{\pm} (so, e.g., ωE±\omega_{E}^{\pm} might just be the least real or imaginary period of EE). The rational period mapping is [am]E±=amE±ωE±Q. \left [ \frac{a}{m} \right ] ^{\pm}_E = \frac{\left \langle\frac{a}{m} \right \rangle^{\pm}_E} {\omega_E^{\pm}} \in \QQ.

L(E,χ,1)=ωE±τ(χ)i=0d1(χ(bi)j=0n1[bihjm]E±) L(E,\overline{\chi},1) = \frac{\omega_E^\pm}{\tau(\chi)} \cdot \sum_{i=0}^{d-1} \left( \chi(b^i) \sum_{j=0}^{n-1} \left [ \frac{b^i h^j}{m} \right ]^{\pm}_E \right)

For i=0,1,,d12i=0,1,\ldots, \frac{d-1}{2}, let αm±(i)=1φ(m)log(m)j=0n1[N(d1)/2bihjm]E±R. \alpha_m^{\pm}(i) = \frac{1}{\sqrt{\varphi(m)\log(m)}} \cdot \sum_{j=0}^{n-1} \left [ \frac{N^{(d-1)/2} b^i h^j}{m} \right ]^{\pm}_E \in \RR.

The distribution ΛE,d\Lambda_{E,d} is the distribution of real numbers αm(i)\alpha_m(i), where we vary over all mm and i>0i>0. More concretely, for each integer mm coprime to NEN_E such that dφ(m)d \mid \varphi(m), compute the dd real numbers αm(i)\alpha_m(i) and add them to our set of values. The distribution ΛE,d\Lambda_{E,d} is then the result of doing this as mm goes to \infty.

NOTE: The term αm(0)\alpha_m(0) is the sensitive theta coefficient.

Regarding complexity the work in doing this computation is the work of computing the rational numbers [a/m]E±[a/m]_E^\pm for all aa. It's the same bottlekneck that goes into approximating pp-adic LL-series using the classical Riemann sums algorithm. The code in Sage for this is fairly slow, but I have some fast code in psage, which I used for some papers on pp-adic LL-series.

In [ ]:

Example 11a

In terms of Sage, the rational_period_mapping method on a modular symbols space computes a choice of [a/m]E±[a/m]_E^{\pm}:

In [12]:
M = ModularSymbols(11,sign=1).cuspidal_submodule() N = M.level() f = M.rational_period_mapping() f([oo, 1/11]) # a/m = 1/11
(0)
In [24]:
d = 3 ms = [m for m in prime_range(2000) if gcd(m, 11) == 1 and euler_phi(m) % d == 0 and m%2==1] print(ms)
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139, 151, 157, 163, 181, 193, 199, 211, 223, 229, 241, 271, 277, 283, 307, 313, 331, 337, 349, 367, 373, 379, 397, 409, 421, 433, 439, 457, 463, 487, 499, 523, 541, 547, 571, 577, 601, 607, 613, 619, 631, 643, 661, 673, 691, 709, 727, 733, 739, 751, 757, 769, 787, 811, 823, 829, 853, 859, 877, 883, 907, 919, 937, 967, 991, 997, 1009, 1021, 1033, 1039, 1051, 1063, 1069, 1087, 1093, 1117, 1123, 1129, 1153, 1171, 1201, 1213, 1231, 1237, 1249, 1279, 1291, 1297, 1303, 1321, 1327, 1381, 1399, 1423, 1429, 1447, 1453, 1459, 1471, 1483, 1489, 1531, 1543, 1549, 1567, 1579, 1597, 1609, 1621, 1627, 1657, 1663, 1669, 1693, 1699, 1723, 1741, 1747, 1753, 1759, 1777, 1783, 1789, 1801, 1831, 1861, 1867, 1873, 1879, 1933, 1951, 1987, 1993, 1999]
In [41]:
def alphas(m, d, normalize=True): assert d%2 == 1 R = Integers(m) Npow = R(N)^((d-1)//2) gen = R(primitive_root(m)) n = euler_phi(m)//d b = gen h = gen^d if normalize: denom = float(sqrt(euler_phi(m)*log(m))) else: denom = 1 alphas = [] for i in range(1, (d-1)//2 + 1): s = 0 for j in range(n): symb = [oo, (Npow * b^i * h^j).lift() / ZZ(m)] period = f(symb)[0] s += period alphas.append(s / denom) return alphas
In [42]:
print ms[0] alphas(ms[0], d, normalize=False)
7
[7]
In [43]:
alphas(37, d, normalize=False)
[-33]
In [44]:
for i in range(10): print ms[i], alphas(ms[i], d, false)
7 [7] 13 [-16] 19 [16] 31 [10] 37 [-33] 43 [-11] 61 [20] 67 [22] 73 [9] 79 [21]
In [8]:
data = [] for m in ms: data += alphas(m, d)
In [9]:
len(data)
360
In [10]:
stats.TimeSeries(data).plot_histogram(bins=30)
In [11]:
# More data... ms2 = [m for m in prime_range(2000,3000) if gcd(m, 11) == 1 and euler_phi(m) % d == 0 and m%2==1] for m in ms2: data += alphas(m, d)
In [12]:
t = stats.TimeSeries(data) t.plot_histogram(bins=30)
In [13]:
t.plot_histogram(bins=100)
In [14]:
print t.mean(), t.standard_deviation()
-0.0806714227685 0.110769030552
In [15]:
stats.TimeSeries(data).plot()

Now try d=29d=29

In [16]:
d = 29 ms = [m for m in prime_range(3,5000) if gcd(m, 11) == 1 and euler_phi(m) % d == 0] print(ms)
[59, 233, 349, 523, 929, 1103, 1277, 1451, 1567, 1741, 1973, 2089, 2437, 2843, 3191, 3307, 3539, 4003, 4177, 4409, 4583, 4931]
In [17]:
print alphas(ms[0], d)
[0.04232831912577409, 0.04232831912577409, 0.04232831912577409, 0.04232831912577409, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, -0.16931327650309635, 0.04232831912577409, 0.04232831912577409, 0.04232831912577409]
In [18]:
data = [] for m in ms: data += alphas(m, d)
In [19]:
print len(data) t = stats.TimeSeries(data) print t.mean() t.plot_histogram(bins=100)
638 -0.0127456234641
In [20]:
t.plot()
In [21]:
stats.TimeSeries(t[:i].mean() for i in range(5,len(t))).plot(gridlines='minor')
In [ ]: