@@ -77,4 +77,54 @@ InstallMethod(CosetRepFunction,
7777 end ;
7878
7979 return cosetRep;
80- end );
80+ end );
81+
82+ # #
83+ # # AmbientTransversal( <G> )
84+ # #
85+ # # Right transversal for a congruence subgroup G in its ambient group GG
86+ InstallMethod(AmbientTransversal,
87+ " Right transversal for a congruence subgroup G in its ambient group" ,
88+ [ IsIntegerMatrixGroup and IsHAPCongruenceSubgroupGamma0 ] ,
89+ function (G )
90+ local n, GG, poscan, cosetPos, transversal, ProjPlane, cosetOfInt, MatrixInSL3_Hermite;
91+
92+ if DimensionOfMatrixGroup(G) <> 3 then
93+ TryNextMethod ();
94+ fi ;
95+
96+ n := LevelOfCongruenceSubgroup(G);
97+ ProjPlane := FiniteProjectivePlane(n);
98+
99+ GG:= AmbientGroupOfCongruenceSubgroup(G);
100+ cosetPos:= CosetPosFunction(G);
101+
102+ MatrixInSL3_Hermite := function (v )
103+ local Herm;
104+ Herm := HermiteNormalFormIntegerMatTransform([[ v[ 1 ]] ,[ v[ 2 ]] ,[ v[ 3 ]]] );
105+ return Inverse(Herm!. rowtrans);
106+ end ;
107+
108+ cosetOfInt := function (i )
109+ local x,y,z;
110+ x := ProjPlane.Reps[ i][ 1 ] ;
111+ y := ProjPlane.Reps[ i][ 2 ] ;
112+ z := ProjPlane.Reps[ i][ 3 ] ;
113+ return MatrixInSL3_Hermite([ x,y,z] );
114+ end ;
115+
116+ poscan := function (g )
117+ return cosetPos(g^- 1 );
118+ end ;
119+
120+ transversal := List([ 1 .. Length(ProjPlane.Reps)] ,i-> cosetOfInt(i)^- 1 );
121+
122+ return Objectify( NewType( FamilyObj( GG ),
123+ IsHapRightTransversalSL2ZSubgroup and IsList and
124+ IsDuplicateFreeList and IsAttributeStoringRep ),
125+ rec ( group := GG,
126+ subgroup := G,
127+ cosets:= transversal,
128+ poscan:= poscan
129+ ));
130+ end );
0 commit comments