-
Notifications
You must be signed in to change notification settings - Fork 0
/
step2-wald.txt
94 lines (87 loc) · 3.6 KB
/
step2-wald.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// This script uses Waldspurger's theorem and computations by Soma Purkait
// to show that E_{k^3} has rank zero for many odd values of k.
// The values of k to check are loaded from biglist.txt
// The odd values of k that are not ruled out are written to the file oddk.txt
// Build six ternary theta series
bound := 165000000;
R<q> := PowerSeriesRing(Rationals());
M1 := Matrix(Rationals(),[[1,0,0],[0,4,0],[0,0,144]]);
M2 := Matrix(Rationals(),[[4,-2,0],[-2,5,0],[0,0,36]]);
M3 := Matrix(Rationals(),[[4,0,0],[0,9,0],[0,0,16]]);
M4 := Matrix(Rationals(),[[1,0,0],[0,16,0],[0,0,36]]);
M5 := Matrix(Rationals(),[[4,0,0],[0,13,5],[0,5,13]]);
M6 := Matrix(Rationals(),[[4,0,0],[0,4,2],[0,2,37]]);
printf "Computing unary theta series.\n";
th1 := 1 + &+[ 2*q^(n^2) : n in [1..Floor(Sqrt(bound+1))]] + O(q^(bound+1));
th4 := 1 + &+[ 2*q^(4*n^2) : n in [1..Floor(Sqrt((bound+1)/4))]] + O(q^(bound+1));
th9 := 1 + &+[ 2*q^(9*n^2) : n in [1..Floor(Sqrt((bound+1)/9))]] + O(q^(bound+1));
th16 := 1 + &+[ 2*q^(16*n^2) : n in [1..Floor(Sqrt((bound+1)/16))]] + O(q^(bound+1));
th36 := 1 + &+[ 2*q^(36*n^2) : n in [1..Floor(Sqrt((bound+1)/36))]] + O(q^(bound+1));
th144 := 1 + &+[ 2*q^(144*n^2) : n in [1..Floor(Sqrt((bound+1)/144))]] + O(q^(bound+1));
bin1 := Matrix([[4,-2],[-2,5]]);
bin2 := Matrix([[13,5],[5,13]]);
bin3 := Matrix([[4,2],[2,37]]);
printf "Computing binary theta series 1.\n";
Tbin1 := ThetaSeries(LatticeWithGram(bin1),bound+1);
printf "Computing binary theta series 2.\n";
Tbin2 := ThetaSeries(LatticeWithGram(bin2),bound+1);
printf "Computing binary theta series 3.\n";
Tbin3 := ThetaSeries(LatticeWithGram(bin3),bound+1);
printf "Computing ternary theta series 1.\n";
T1 := th1*th4*th144;
printf "Computing ternary theta series 2.\n";
T2 := Tbin1*th36;
printf "Computing ternary theta series 3.\n";
T3 := th4*th9*th16;
printf "Computing ternary theta series 4.\n";
T4 := th1*th16*th36;
printf "Computing ternary theta series 5.\n";
T5 := th4*Tbin2;
printf "Computing ternary theta series 6.\n";
T6 := th4*Tbin3;
L1 := LatticeWithGram(M1);
L2 := LatticeWithGram(M2);
L3 := LatticeWithGram(M3);
L4 := LatticeWithGram(M4);
L5 := LatticeWithGram(M5);
L6 := LatticeWithGram(M6);
aut1 := #AutomorphismGroup(L1);
aut2 := #AutomorphismGroup(L2);
aut3 := #AutomorphismGroup(L3);
aut4 := #AutomorphismGroup(L4);
aut5 := #AutomorphismGroup(L5);
aut6 := #AutomorphismGroup(L6);
mass := (1/aut1 + 1/aut2 + 1/aut3 + 1/aut4 + 1/aut5 + 1/aut6);
eis := (T1/aut1 + T2/aut2 + T3/aut3 + T4/aut4 + T5/aut6 + T6/aut6)/mass;
f1 := R!(T1-eis)*3;
f2 := R!(T2-eis)*3;
f3 := R!(T3-eis)*3;
f4 := R!(T4-eis)*3;
f5 := R!(T5-eis)*3;
h1 := (1/6)*f1 + (-1/12)*f3 + (1/6)*f4 + (1/4)*f5;
// We have h1 = (5/16)*T1 + (-3/16)*T2 + (-7/16)*T3 + (5/16)*T4 + (9/16)*T5 - (3/16)*T6.
// h1 = f1 + 6f4 in Soma Purkait's notation. Twisting by chi_(-3)
// puts f1 and f4 into S_3(Gamma_0(5184)) where the Sturm bound is 1296.
// We can check that the first 1296 coefficients of f1 are supported on
// the congruence class 1 mod 3, and the first 1296 coefficients of f4
// are supported on the congruence class 2 mod 3. It follows that if
// k is a fundamental discriminant = 1 (mod 8), then L(E_k^3,1) = 0
// if and only if the kth Fourier coefficient of h1 is = 0.
// Coates-Wiles result implies that if L(E_k^3,1) is nonzero, then
// E_k^3 has rank zero.
load "biglist.txt";
notruledout := [];
for k in biglist do
if (k mod 2 eq 1) then
if IsSquare(k) then
kp := 1;
else
kp := FundamentalDiscriminant(k);
end if;
if Coefficient(h1,kp) eq 0 then
Append(~notruledout,k);
end if;
end if;
end for;
PrintFile("oddk.txt",Sprintf("notruledout := %o;\n",notruledout));
quit;