CoCalc Shared Fileswww / papers / modelsX1N / models.mOpen in CoCalc with one click!
Author: William A. Stein
1
declare verbose Models, 1;
2
3
intrinsic FindEquation(f::RngSerLaurElt, g::RngSerLaurElt) -> RngUPolElt, RngSerLaurElt
4
{}
5
6
vprintf Models : "f = %o.\ng = %o.\n", f,g;
7
q := Parent(f).1;
8
X := f/g;
9
Y := q*Derivative(X)/g;
10
11
R<x>:=PolynomialRing(Rationals());
12
13
h := x^6;
14
s := X^6;
15
Y2 := Y^2;
16
for n in [5,4,3,2,1,0] do
17
a := Coefficient(Y2-s,-n);
18
h +:= a*x^n;
19
s +:= a*X^n;
20
end for;
21
22
return h, Y2-s;
23
end intrinsic;
24
25
intrinsic FindModel(A::ModSym) -> RngUPolElt, RngSerLaurElt
26
{}
27
prec := 37;
28
29
if Sign(A) ne 0 and Dimension(A) eq 2 or Sign(A) eq 0 and Dimension(A) eq 4 then
30
R<q>:=LaurentSeriesRing(Rationals());
31
E := qExpansionBasis(A,prec+1);
32
t,f := IsCoercible(R,E[1]);
33
if not t then
34
return PolynomialRing(Rationals())!0, R!0;
35
end if;
36
g := R!E[2];
37
return FindEquation(f,g);
38
end if;
39
40
F := qEigenform(A,prec+1);
41
coef := [Eltseq(Coefficient(F,n)): n in [1..prec]];
42
n := #coef[1];
43
nz := [];
44
for c in coef do
45
for j in [1..#c] do
46
if c[j] ne 0 then
47
Append(~nz,j);
48
end if;
49
end for;
50
if #nz ge 2 then
51
break;
52
end if;
53
end for;
54
nz := Setseq(Set(nz));
55
56
57
R<q>:=LaurentSeriesRing(Rationals());
58
if #nz ne 2 or Type(coef[n][nz[1]]) ne FldRatElt then
59
return PolynomialRing(Rationals())!0, R!0;
60
end if;
61
62
f := &+[coef[n][nz[1]]*q^n : n in [1..prec]];
63
g := &+[coef[n][nz[2]]*q^n : n in [1..prec]];
64
if Coefficient(f,1) eq 0 then
65
t := g;
66
g := f;
67
f := g;
68
end if;
69
70
if Coefficient(g,2) eq 0 then
71
return PolynomialRing(Rationals())!0, R!0;
72
end if;
73
74
g /:= R!Coefficient(g,2);
75
76
return FindEquation(f,g);
77
end intrinsic;
78
79
intrinsic Qchi(N::RngIntElt) -> FldCyc
80
{The field Q(zeta_n), where n = exponent of (Z/NZ)^*.}
81
return CyclotomicField(Exponent(UnitGroup(IntegerRing(N))));
82
end intrinsic;
83
84
intrinsic FullDirichlet(N::RngIntElt) -> GrpDrch
85
{}
86
// G := DirichletGroup(N,Qchi(N));
87
G := DirichletGroup(N,CyclotomicField(12));
88
names := ["e" cat IntegerToString(i) : i in [1..Ngens(G)]];
89
AssignNames(~G,names);
90
return G;
91
end intrinsic;
92
93
intrinsic Analyze(N::RngIntElt) -> SeqEnum, SeqEnum
94
{}
95
G := FullDirichlet(N);
96
E := Elements(G);
97
98
S := [<DimensionCuspForms(e,2),e,e^(-1)> : e in Elements(G) | Order(e) in [1,2,3,4,6] and not IsTrivial(e)];
99
100
M := &cat[Decomposition(NewSubspace(CuspidalSubspace(ModularSymbols(s[2],2,+1))),23) : s in S | s[1] gt 0];
101
return S, [A : A in M | Dimension(A) eq 1 or Order(DirichletCharacter(A)) eq 2 and Dimension(A) eq 2];
102
end intrinsic;
103
104
intrinsic DescribeLevel(N::RngIntElt) -> SeqEnum
105
{}
106
107
printf " \n\n>>>>>>>>>> X_1(%o) <<<<<<<<\n\n",N;
108
S,M:=Analyze(N);
109
S;
110
for i in [1..#M] do
111
F,dif := FindModel(M[i]);
112
if F ne 0 then
113
printf "\n\n S_2[I]=%o\n", qExpansionBasis(M[i],8);
114
F;
115
dif;
116
end if;
117
end for;
118
return M;
119
end intrinsic;
120