CoCalc Public Fileswww / papers / modelsX0N / model.m
Author: William A. Stein
1forward VectorSpaceElement,
2        ToLowerCaseLetter,
3        PrecisionAtWeight,
4        qRelationsOfDegree,
5        idxG0;
6
7intrinsic HasCanonicalEmbeddingX0(N::RngIntElt) -> BoolElt
8{True if and only if X_0(N) has genus > 2 and the canonical map associated to
9X_0(N) is an embedding.}
10
11   return N ge 11 and DimensionCuspFormsGamma0(N,2) gt 2 and
12               not (N in {30,33,35,37,39,40,41,46,47,48,59,71});
13
14end intrinsic;
15
16
17intrinsic CanonicalEmbeddingX0(N::RngIntElt) -> SchProj
18{The canonical embedding of X_0(N).}
19
20   requirege N,1;
21   require HasCanonicalEmbeddingX0(N) : "The canonical map is not an embedding.";
22
23   n := DimensionCuspFormsGamma0(N,2);
24   K := RationalField();
25   M := CuspidalSubspace(ModularSymbols(N,2,K,+1));
26   R := PolynomialRing(K,n);
27   AssignNames(~R,[ToLowerCaseLetter(i) : i in [1..n]]);
28   Pn := ProjectiveSpace(R);
29   deg := 0;
30   C := Scheme(Pn,R!0);
31
32   while true do
33      deg +:= 1;
34      rels := qRelationsOfDegree(M,PrecisionAtWeight(N,2*deg),deg);
35      if #rels gt 0 then
36         rels := [R!r : r in rels];
37         C := C meet Scheme(Pn, rels);
38         if Dimension(C) eq 1 and IsIrreducible(C) then
39//         if Dimension(C) eq 1 then
40            DisownChildren(AmbientSpace(M));
41            return C;
42         end if;
43      end if;
44   end while;
45
46end intrinsic;
47
48
49
50///////////////////////////////////////////////////////////
51//  The functions used in defining the above intrinsic.  //
52///////////////////////////////////////////////////////////
53
54function qRelationsOfDegree(M, prec, d)
55// The algebraic relations of degree d satisfied by the sequence of
56// q-expansions qExpansions(M,prec) of a basis for the space of
57// modular forms corresponding to M.
58
59   assert Type(d) eq RngIntElt;
60   assert Type(prec) eq RngIntElt;
61   assert Type(M) eq ModSym;
62
63   assert IsCuspidal(M) eq true;
64   assert Dimension(M) gt 0 ;
65   assert d ge 1;
66
67   K := BaseField(M);
68   B := qExpansionBasis(M,prec);
69   S := Parent(B[1]);
70   R := PolynomialRing(K,#B);
71   AssignNames(~R,[ToLowerCaseLetter(n) : n in [1..#B]]);
72   monoms := MonomialsOfDegree(R,d);
73   forms  := [&*[B[i]^exp[i] : i in [1..#B]] where exp := Exponents(m) : m in monoms];
74   V    := VectorSpace(K,prec);
75   vecs := [VectorSpaceElement(V,f) : f in forms];
76   A := RMatrixSpace(K,#forms,prec)!vecs;
77   relvecs := Basis(Kernel(A));
78   rels := [&+[v[i]*monoms[i] : i in [1..#monoms]] : v in relvecs];
79
80   return rels;
81end function;
82
83alphabet := {@ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
84     "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" @};
85
86function ToLowerCaseLetter(n)
87// Returns the n-th letter coding.  The coding goes a,b,c,...,z,aa,bb,...
88   assert Type(n) eq RngIntElt and n gt 0;
89   return alphabet[((n-1)mod 26)+1]^(((n-1) div 26) + 1);
90end function;
91
92function idxG0(n)
93   assert Type(n) eq RngIntElt;
94   return
95      &*[Integers()| t[1]^t[2] + t[1]^(t[2]-1) : t in Factorization(n)];
96end function;
97
98function PrecisionAtWeight(N,k)
99   assert Type(N) eq RngIntElt and Type(k) eq RngIntElt;
100   return Floor(idxG0(N) * k/12 + 1) + 5;  // the "+5" should be unnecessary.
101end function;
102
103function VectorSpaceElement(V, f)
104   R<q>:=Parent(f);
105   S := [0 : i in [1..Valuation(f)]] cat Eltseq(f+O(q^Degree(V)));
106   S := S cat [0 : i in [1..Degree(V)-#S]];
107   return V!S;
108end function;
109
110