CoCalc Shared Fileswww / papers / modelsX1N / models.m
Author: William A. Stein
1declare verbose Models, 1;
2
3intrinsic 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;
23end intrinsic;
24
25intrinsic 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);
77end intrinsic;
78
79intrinsic Qchi(N::RngIntElt) -> FldCyc
80{The field Q(zeta_n), where n = exponent of (Z/NZ)^*.}
81   return CyclotomicField(Exponent(UnitGroup(IntegerRing(N))));
82end intrinsic;
83
84intrinsic 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;
91end intrinsic;
92
93intrinsic 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];
102end intrinsic;
103
104intrinsic 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;
119end intrinsic;
120