If G is a subgroup of finite index in PSL2(Z), then returns a sequence of coset representatives of G in PSL2(Z).
Returns a sequence of generators of the congruence subgroup G.
For a congruence subgroup G, and an element g of G, this function returns a sequence of integers corresponding to an expression for g in terms of a fixed set of generators for G. Let L be the list of generators for G output by the function Generators. Then the return sequence [e1n1, e2n2, ..., em nm], where ni are positive integers, and ei=1 or -1, means that g=L[n1]e1L[n2]e2 ... L[nm]em. Note that since the computation is in PSL2(R), this equality only holds up to multiplication by +- 1.
The genus of the upper half plane quotiented by the congruence subgroup G.
For G a subgroup of PSL2(Z) returns a sequence of points in the Upper Half plane which are the vertices of a fundamental domain for G.
> G := CongruenceSubgroup(0,12); > Generators(G); [ [1 1] [0 1], [ 5 -1] [36 -7], [ 5 -4] [ 24 -19], [ 7 -5] [ 24 -17], [ 5 -3] [12 -7] ] > C := CosetRepresentatives(G); > H<i,r> := UpperHalfPlaneWithCusps(); > triangle := [H|Infinity(),r,r-1]; > translates := [g*triangle : g in C];
> N := 34; > characters := DirichletGroup(N,CyclotomicField(EulerPhi(N))); > char := Elements(characters)[5]; > G := CongruenceSubgroup([N,Conductor(char),1],char); > > // We can create a list of generators: > gens := Generators(G); > #gens; 21 > // given an element of G, > g := G![ 21, 4, 68, 13 ];; > // we can find g in terms of these generators: > FindWord(G,g); [ -8, 1 ] > // This means that up to sign, g = gens[8]^(-1)*gens[1], > // which can be verified as follows: > gens[8]^(-1)*gens[1]; [-21 -4] [-68 -13]
Returns a sequence of inequivalent cusps of the congruence subgroup G.
Returns the width of x as a cusp of the congruence subgroup G.
Returns a list of inequivalent elliptic points for the congruence subgroup G. A second argument may be given to specify the upper half plane H containing these elliptic points.
> G := CongruenceSubgroup(0,12); > Cusps(G); [ oo, 0, 1/6, 1/4, 1/3, 1/2 ] > Widths(G); [ 1, 12, 1, 3, 4, 3 ] > // Note that the sum of the cusp widths is the same as the Index: > &+Widths(G); 24 > Index(G); 24
In the following example we find which group Γ0(N) has the most elliptic points for N less than 20, and list the elliptic points in this case.
> H := UpperHalfPlaneWithCusps(); > [#EllipticPoints(Gamma0(N),H) : N in [1..20]]; [ 2, 1, 1, 0, 2, 0, 2, 0, 0, 2, 0, 0, 4, 0, 0, 0, 2, 0, 2, 0 ] > // find the index where the maximal number of elliptic points is attained: > Max($1); 4 13 > // find the elliptic points for Gamma0(13): > EllipticPoints(Gamma0(13)); [ 5/13 + (1/13)*root(-1), 8/13 + (1/13)*root(-1), 7/26 + (1/26)*root(-3), 19/26 + (1/26)*root(-3) ]