CoCalc Public Fileswww / papers / modelsX0N / model.mOpen in CoCalc with one click!
Author: William A. Stein
1
forward VectorSpaceElement,
2
ToLowerCaseLetter,
3
PrecisionAtWeight,
4
qRelationsOfDegree,
5
idxG0;
6
7
intrinsic HasCanonicalEmbeddingX0(N::RngIntElt) -> BoolElt
8
{True if and only if X_0(N) has genus > 2 and the canonical map associated to
9
X_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
14
end intrinsic;
15
16
17
intrinsic 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
46
end intrinsic;
47
48
49
50
///////////////////////////////////////////////////////////
51
// The functions used in defining the above intrinsic. //
52
///////////////////////////////////////////////////////////
53
54
function 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;
81
end function;
82
83
alphabet := {@ "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
86
function 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);
90
end function;
91
92
function 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)];
96
end function;
97
98
function 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.
101
end function;
102
103
function 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;
108
end function;
109
110