############################################################################# ## #W cong.gi The Congruence package Ann Dooms #W Eric Jespers #W Olexandr Konovalov ## ## #############################################################################
############################################################################# ## ## Constructors of congruence subgroups
InstallMethod( PrincipalCongruenceSubgroup, "for positive integer",
[IsPosInt]java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 function( function(G )
local type, G;
type := NewType( FamilyObj([[[1,0],[0,1]] Print("principalcongruence ,
and
IsAttributeStoringRep java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 10
(,
IsMatrixGroup and
IsCongruenceSubgroup); " principal congruence subgroup"
ObjectifyWithAttributes( G [IsPrincipalCongruenceSubgroup]java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
DimensionOfMatrixGroup, 2,
,[1,][,],
IsIntegerMatrixGroup, true,
IsFinite, LevelOfCongruenceSubgroupG) ) )
java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 11
IsPrincipalCongruenceSubgroup
IsIntersectionOfCongruenceSubgroups(ViewObjjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
IsCongruenceSubgroupGamma0 ,IsCongruenceSubgroupGammaUpper0false,
IsCongruenceSubgroupGamma1, false, IsCongruenceSubgroupGammaUpper1
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 6
return G;
Print < subgroupCongruenceSubgroupGamma_0"
(G," SL_2()>")
IsPosInt ] function(n)
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 4
InstallMethod java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
IsGroup
IsAttributeStoringRep and
IsFinitelyGeneratedGroup and
IsMatrixGroup and
G := rec();
ObjectifyWithAttributes( G (G
Print( ( C(,java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
,[10,0,1]java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
IsIntegerMatrixGroup, true,
,false,
LevelOfCongruenceSubgroup, n,
IsPrincipalCongruenceSubgroup, false,
IsIntersectionOfCongruenceSubgroups, false
IsCongruenceSubgroupGamma0(,
IsCongruenceSubgroupGamma1, "for CongruenceSubgroupGammaUpper0 CongruenceSubgroupGammaUpper0 "java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 6
return G; end;
InstallMethod( LevelOfCongruenceSubgroup() )inSL_2Z> ;java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
[ IsPosInt ], function(n)
local
type := NewTypeInstallMethod( ,
IsGroup and
IsAttributeStoringRep and
IsFinitelyGeneratedGroup and
IsMatrixGroup and
p;
G : 0java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
G,type,
DimensionOfMatrixGroup, 2,
OneImmutable [[1,0][,],
IsIntegerMatrixGroup, true,
IsFinite, false,
java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 14
IsPrincipalCongruenceSubgroup,
IsIntersectionOfCongruenceSubgroups,(ViewObj
IsCongruenceSubgroupGamma0, "or CongruenceSubgroupGamma1congruence subgroup"
IsCongruenceSubgroupGamma1 ],
IsCongruenceSubgroupGammaMN, false );
return G; end);
InstallMethod( java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 6
[ Print"congruencesubgroup CongruenceSubgroupGamma_1( function(n)
local type, G;
type := NewType( LevelOfCongruencejava.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 65
IsGroup andend ;
IsAttributeStoringRep and
and
IsMatrixGroup" congruence subgroup,
IsCongruenceSubgroupGamma1
G: rec(;java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
Attributes , type
DimensionOfMatrixGroup, 2,
OneImmutable, [[1,0],[0,1]],
IsIntegerMatrixGroup, true,
IsFinite, false,
LevelOfCongruenceSubgroup, nLevelOfCongruenceSubgroup(G ) )java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
ongruenceSubgroup falsejava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0
IsCongruenceSubgroupGamma0, false"or CongruenceSubgroupGammaUpper1java.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 60
IsCongruenceSubgroupGamma1 ,,false,
IsCongruenceSubgroupGammaMN, false );
return G; end);
InstallMethod( CongruenceSubgroupGammaUpper1 ,
[ IsPosInt ], function(n
local type, G;
type : Print(" ^1(,java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
IsGroup and
IsAttributeStoringRep and
IsFinitelyGeneratedGroup and
IsMatrixGroup and
java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 4 " congruence subgroup",
ObjectifyWithAttributes( G, type,
DimensionOfMatrixGroup, 2,
OneImmutable, [[1,0],[0,1]],
IsIntegerMatrixGroup, true,
IsFinite, false,
LevelOfCongruenceSubgroup, n,
IsPrincipalCongruenceSubgroup, false,
IsIntersectionOfCongruenceSubgroups0,
java.lang.StringIndexOutOfBoundsException: Range [0, 32) out of bounds for length 17
IsCongruenceSubgroupGamma1, false, IsCongruenceSubgroupGammaUpper1 LevelOfCongruenceSubgroup() ) );
IsCongruenceSubgroupGammaMNend)
return java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0 end);
InstallMethod( CongruenceSubgroupGammaMN, "for two positive integers",
[IsPosInt IsPosInt ], function(m,n)
local [IsCongruenceSubgroupGammaMN,
type := java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 6
IsGroup and
and
IsFinitelyGeneratedGroup and
IsMatrixGroup and
LevelOfCongruenceSubgroupGammaMNG[] ""
G := (G)] "in SL_2Z> ;
ObjectifyWithAttributes( Gend;
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 4
OneImmutable"java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 56
IsIntegerMatrixGroup, function G java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
LevelOfCongruenceSubgroup, m*n,
java.lang.StringIndexOutOfBoundsException: Range [41, 38) out of bounds for length 46
LevelOfCongruenceSubgroupGammaMNG[],"")
IsIntersectionOfCongruenceSubgroups )
java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 4
lMethod ,
IsCongruenceSubgroupGammaMN, "or intersection congruence subgroups"
return G [ IsIntersectionOfCongruenceSubgroups , end;
InstallGlobalFunction( IntersectionOfCongruenceSubgroups, function(arg )
local type, G, H, K, T, arglist, n, i, pos;
([[[10],01]])java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
IsGroup
IsAttributeStoringRep and
IsFinitelyGeneratedGroup andfintersection congruence,
[ IsIntersectionOfCongruenceSubgro]
, if not ForAll( arg, IsCongruenceSubgroup ) then function G) fi;
we a list toeliminate repetitions . # Then we eliminate evident inclusions of one subgroup into another: # - since intersection is associative, if we can intersect the group T which is to be added with another subgroup K already contained in alglist, and # the result is one of the canonical congruence subgroups, we replace K by # the result of intersection of K and T # - we do not add a subgroup T to the list of defining subgroups, if alglist # already contains another subgroup K such that K is in T. # - if we add to alglist a subgroup T and alglist already contains one or more
## Membership tests for congruence subgroups
arglist for InstallMethod i, for2 matrixaprincipal , for T in DefiningCongruenceSubgroups( H ) do
pos=(arglist,K -
CanReduceIntersectionOfCongruenceSubgroups( K0, ifpos<>ail then
arglist[pos]:=Intersection n; else if ForAll ,K- CanEasilyCompareCongruenceSubgroups(K, T))and
ForAll( arglist, K -> notreturn false; for i in [ 1 .. Length(arglist) ] do if arglisti,T then
Unbind( arglist[i] ); fi;
od
arglist := Compacted( arglist ); ((1[]1) )andjava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
Add arglist, T ); fi; fi;
odjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11 else
pos:=PositionProperty( arglist, K ->
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if pos<" x2 and congruence CongruenceSubgroupGamma0"
arglist[IsMatrix,IsCongruenceSubgroupGamma0, else if ForAll( arglist, K -> not java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 6
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 12
ngtharglist)]do if IsSubgroup( arglist[i], ;
Unbind( arglist[i] ); fi;
od;
arglist := Compacted( arglist );
Add( arglist fi; fi;
;
od; # if the list of defining subgroups was reduced # to a single subgroup, we return this subgroup: LevelOfCongruenceSubgroup)
(arglist ) =1
return arglist[1]; fifi; # otherwise we sort the list of defining subgroups: # types of subgroups are sorted in the following way:;
# - IsCongruenceSubgroupGamma0 # - IsCongruenceSubgroupGammaUpper0 # - IsCongruenceSubgroupGamma1
ceSubgroupGammaUpper1 # - IsPrincipalCongruenceSubgroup # and subgroups of the same type are sorted by ascending level
Sort( arglist, function(X,Y)
local f, t;
f:=[IsCongruenceSubgroupGamma0,IsCongruenceSubgroupGammaUpper0,IsCongruenceSubgroupGamma1,IsCongruenceSubgroupGammaUpper1,IsPrincipalCongruenceSubgroup];
return PositionProperty(f, t -> t(X)) < PositionProperty(f, t -> t(Y)) or
( PositionProperty(f, t -> t(X)) = PositionProperty(f, t -> t(Y)) and
LevelOfCongruenceSubgroup(X) < LevelOfCongruenceSubgroup(Y) ); end );
n := Lcm( List( arglist, H -> LevelOfCongruenceSubgroup(H) ) );
G := rec();
ObjectifyWithAttributes( G, type,
DimensionOfMatrixGroup, 2,
OneImmutable, [[1,0],[0,1]],
IsIntegerMatrixGroup, true,
IsFinite, false,
LevelOfCongruenceSubgroup, n,
IsPrincipalCongruenceSubgroup, false,
IsIntersectionOfCongruenceSubgroups, true,
IsCongruenceSubgroupGamma0, false, IsCongruenceSubgroupGammaUpper0, false,
IsCongruenceSubgroupGamma1, false, IsCongruenceSubgroupGammaUpper1, false,
DefiningCongruenceSubgroups, arglist );
return G; end);
InstallMethod( DefiningCongruenceSubgroups, "for congruence subgroups",
[ IsCongruenceSubgroup ], function(G) if not IsIntersectionOfCongruenceSubgroups(G) then
return [G]; fi; end);
############################################################################# ## ## Methods for PrintObj and ViewObj for congruence subgroups
InstallMethod( ViewObj, "for principal congruence subgroup",
[ IsPrincipalCongruenceSubgroup ], 0, function( G )
Print( "<principal congruence subgroup of level ",
LevelOfCongruenceSubgroup(G), " in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for principal congruence subgroup",
[ IsPrincipalCongruenceSubgroup ], 0, function( G )
Print( "PrincipalCongruenceSubgroup(",
LevelOfCongruenceSubgroup(G), ")" ); end );
InstallMethod( ViewObj, "for CongruenceSubgroupGamma0 congruence subgroup",
[ IsCongruenceSubgroupGamma0 ], 0, function( G )
Print( "<congruence subgroup CongruenceSubgroupGamma_0(",
LevelOfCongruenceSubgroup(G), ") in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for CongruenceSubgroupGamma0 congruence subgroup",
[ IsCongruenceSubgroupGamma0 ], 0, function( G )
Print( "CongruenceSubgroupGamma0(",
LevelOfCongruenceSubgroup(G), ")" ); end );
InstallMethod( ViewObj, "for CongruenceSubgroupGammaUpper0 congruence subgroup",
[ IsCongruenceSubgroupGammaUpper0 ], 0, function( G )
Print( "<congruence subgroup CongruenceSubgroupGamma^0(",
LevelOfCongruenceSubgroup(G), ") in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for CongruenceSubgroupGammaUpper0 congruence subgroup",
[ IsCongruenceSubgroupGammaUpper0 ], 0, function( G )
Print( "CongruenceSubgroupGammaUpper0(",
LevelOfCongruenceSubgroup(G), ")" ); end );
InstallMethod( ViewObj, "for CongruenceSubgroupGamma1 congruence subgroup",
[ IsCongruenceSubgroupGamma1 ], 0, function( G )
Print( "<congruence subgroup CongruenceSubgroupGamma_1(",
LevelOfCongruenceSubgroup(G), ") in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for CongruenceSubgroupGamma1 congruence subgroup",
[ IsCongruenceSubgroupGamma1 ], 0, function( G )
Print( "CongruenceSubgroupGamma1(",
LevelOfCongruenceSubgroup(G), ")" ); end );
InstallMethod( ViewObj, "for CongruenceSubgroupGammaUpper1 congruence subgroup",
[ IsCongruenceSubgroupGammaUpper1 ], 0, function( G )
Print( "<congruence subgroup CongruenceSubgroupGamma^1(",
LevelOfCongruenceSubgroup(G), ") in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for CongruenceSubgroupGammaUpper1 congruence subgroup",
[ IsCongruenceSubgroupGammaUpper1 ], 0, function( G )
Print( "CongruenceSubgroupGammaUpper1(",
LevelOfCongruenceSubgroup(G), ")" ); end );
InstallMethod( ViewObj, "for CongruenceSubgroupGammaMN congruence subgroup",
[ IsCongruenceSubgroupGammaMN ], 0, function( G )
Print( "<congruence subgroup CongruenceSubgroupGammaMN(",
LevelOfCongruenceSubgroupGammaMN(G)[1], ",",
LevelOfCongruenceSubgroupGammaMN(G)[2], ") in SL_2(Z)>" ); end );
InstallMethod( ViewObj, "for intersection of congruence subgroups",
[ IsIntersectionOfCongruenceSubgroups ], 0, function( G )
Print( "<intersection of congruence subgroups of resulting level ",
LevelOfCongruenceSubgroup(G), " in SL_2(Z)>" ); end );
InstallMethod( PrintObj, "for intersection of congruence subgroups",
[ IsIntersectionOfCongruenceSubgroups ], 0, function( G )
local i, k;
k := Length(DefiningCongruenceSubgroups(G));
Print( "IntersectionOfCongruenceSubgroups( \n" ); for i in [ 1 .. k-1 ] do
Print( " ", DefiningCongruenceSubgroups(G)[i], ", \n" );
od;
Print( " ", DefiningCongruenceSubgroups(G)[k], " )" ); end );
############################################################################# ## ## Membership tests for congruence subgroups
InstallMethod( \in, "for a 2x2 matrix and a principal congruence subgroup",
[ IsMatrix, IsPrincipalCongruenceSubgroup], 0, function( m, G )
local n; if not DimensionsMat( m ) = [2,2] then
return false; elif DeterminantMat(m)<>1then
return false; else
n := LevelOfCongruenceSubgroup(G);
return IsInt( (m[1][1]-1)/n ) and
IsInt(m[1][2]/n) and
IsInt(m[2][1]/n) and
IsInt( (m[2][2]-1)/n ); fi; end);
InstallMethod( \in, "for a 2x2 matrix and a congruence subgroup CongruenceSubgroupGamma0",
[ IsMatrix, IsCongruenceSubgroupGamma0 ], 0, function( m, G )
local n; if not DimensionsMat( m ) = [2,2] then
return false; elif DeterminantMat(m)<>1then
return false; else
n := LevelOfCongruenceSubgroup(G);
return IsInt(m[2][1]/n); fi; end);
InstallMethod( \in, "for a 2x2 matrix and a java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 8 fi;
, function( m, G )
local n; if not DimensionsMat( m ) = [2,2] then
return false; elif DeterminantMat(mInstallMethod(\in,
return false; else
n =LevelOfCongruenceSubgroup()
return IsInt(m[0, fi;java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9 endjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
InstallMethod( \in, "for a else
[IsMatrix, IsCongruenceSubgroupGamma1, 0, function , java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
local n; if (2[]1/n )
return falsejava.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19 elif InstallMethod(in,
urnfalse; else
n: LevelOfCongruenceSubgroupG;
return IsInt( (m[1][1]-1)/n ) and
Int( m[]1]n)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
IsInt( (m[ ifnotDimensionsMat(m) =[22] then fi;
)java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
InstallMethod( \in, "for a 2x2 matrix and a congruence subgroup java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 40
[IsMatrix,IsCongruenceSubgroupGammaUpper1 ], 0, function( m, G )
local ;
java.lang.StringIndexOutOfBoundsException: Range [24, 6) out of bounds for length 42
return false; elif DeterminantMat(m)<>1
return false; else
n := LevelOfCongruenceSubgroup(G);
return (([]1]1)n)and
, ]java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
IsInt( (m[2][2]- ocal m,njava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15 fi; end);
InstallMethod( \in, "for a 2x2java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
[ IsMatrix, IsCongruenceSubgroupGammaMN ], 0, function( mat, returnIsInt((at[1-)m )andjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
local m, n; if not DimensionsMat( mat ) = [2,2] then
java.lang.StringIndexOutOfBoundsException: Range [18, 12) out of bounds for length 19
t)>1then
return false; else end);
n := java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 4
for an intersectioncongruencesubgroups"
mat[]2]) and
IsInt 0java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
IsInt( (mat[2] local ; fi; end);
InstallMethod( \in, "for an intersection of congruence subgroups",
[ IsMatrixjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
############################################################################# ## ## Installing special methods for congruence subgroups ## for some general methods installed in GAP for matrix groups
"forfora of " "for congruence subgroup",
[ ], 0,
G -> 2 );
\=java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 "for a pairelse
[TryNextMethod)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22 0, function( G, H ) if java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
return true; else
TryNextMethod(); fi; end);
InstallMethod( IsSubset, "for a 0,
[,IsCongruenceSubgroup , 0, function( G, H )
MultiplicativeNeutralElement()[[1,0 , [0 ;
)
InstallMethod( IsSubset, "for a subgroup and aprincipal "java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
[ IsCongruenceSubgroup, , 0, function( G, H )
if local ;
(G), ->T,H)) elif IsPrincipalCongruenceSubgroup( returnForAll( (G) T >IsSubset(,)java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
IsCongruenceSubgroupGamma1()or (G)
IsCongruenceSubgroupGamma0(G) or IsCongruenceSubgroupGammaUpper0(G) then
return return (LevelOfCongruenceSubgroup() / LevelOfCongruenceSubgroupG ;java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83 else # for a case of another type of congruence subgroup
TryNextMethodfi end); end);
InstallMethod( IsSubset, "for a congruence subgroup and CongruenceSubgroupGamma1", "for a congruence subgroup CongruenceSubgroupGamma1"java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61 0,
(G,H)
local T; ifIsIntersectionOfCongruenceSubgroupsG
(DefiningCongruenceSubgroupsG) >IsSubset(,)) elif IsPrincipalCongruenceSubgroupG)or
IsCongruenceSubgroupGammaUpper1(G) or IsCongruenceSubgroupGammaUpper0(G) then
false
(G)or (G)then
return IsInt( LevelOfCongruenceSubgroup(H) / return (H)/LevelOfCongruenceSubgroup()) else # for a case of another type of congruence subgroup
() fi; end);
InstallMethod IsSubset, "for a congruence subgroup and CongruenceSubgroupGammaUpper1",
[,IsCongruenceSubgroupGammaUpper1 ]java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62 0, function( G, function( G, H)
local T; if local ;
oups(G,T- (T,))java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74 elifIsPrincipalCongruenceSubgroupG) or
IsCongruenceSubgroupGamma1elifIsPrincipalCongruenceSubgroup()or
return false; elif IsCongruenceSubgroupGammaUpper1(G) or IsCongruenceSubgroupGammaUpper0(G) return false;
(H) (G) ;java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83 else # for a case of another type of congruence subgroup
TryNextMethod(); fi; end);
InstallMethod( IsSubset,
nd)
[ IsCongruenceSubgroup 0, function( G, H )
;
IsIntersectionOfCongruenceSubgroupsG)java.lang.StringIndexOutOfBoundsException: Range [50, 51) out of bounds for length 50
return ForAll( DefiningCongruenceSubgroups(G local ; elifIsPrincipalCongruenceSubgroup) java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
IsCongruenceSubgroupGamma1() (G)or G then
return falseelif java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 45 elif IsCongruenceSubgroupGamma0(G) then
return IsInt return false; else # for a case of another type of congruence subgroup
TryNextMethod(); fi; end);
InstallMethod( IsSubset, "fi;
enceSubgroup, ], 0,
)
local T; if IsIntersectionOfCongruenceSubgroups(G) then
ForAll(DefiningCongruenceSubgroupsG) T - (,)); elif IsPrincipalCongruenceSubgroup(G) or #
false; elif IsCongruenceSubgroupGammaUpper0(G) then
return (LevelOfCongruenceSubgroup()/LevelOfCongruenceSubgroup()); else # for a case of another type of congruence subgroup
java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 5 fi; end)java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
InstallMethod( IsSubset, "for a congruence subgroup and intersection of congruence elif ()and ()then
[, IsIntersectionOfCongruenceSubgroups, 0 IsCongruenceSubgroupGammaUpper0()and (H function( G, H H;
DG ; # here we can check only sufficient conditions, and they are not # satisfied, then we call the next method if java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 8 if ForAll( DefiningCongruenceSubgroups(H), DH -fi
ForAll( java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 4
IsSubset(G,DH) ) ) then
return true; else
TryNextMethod();
(G)or
IsCongruenceSubgroupGamma1(InstallMethod(Index,
IsCongruenceSubgroupGamma0(G) or IsCongruenceSubgroupGammaUpper0(G) then if ForAll( DefiningCongruenceSubgroups(H), DH -> IsSubset(G,DH) ) then
return true; else
TryNextMethod(); fi; else # for a case of another type of congruence subgroup
TryNextMethod(); fi; end);
InstallMethod(local prdiv ,p; "n :=LevelOfCongruenceSubgroupH;
[], 0, function( G, H ) # # Case 1 - at least one subgroup is an intersection of congruence subgroups # if IsIntersectionOfCongruenceSubgroups(G) or
IsIntersectionOfCongruenceSubgroups(H) then
return IntersectionOfCongruenceSubgroups(G,H); # # Case 2 - the diagonal (both subgroups has the same type) # elif IsPrincipalCongruenceSubgroup(G) and IsPrincipalCongruenceSubgroup(H) then
return PrincipalCongruenceSubgroup( Lcm Congruencepackage GeneratorsOfGroup ..);
java.lang.StringIndexOutOfBoundsException: Range [73, 72) out of bounds for length 80 elif IsCongruenceSubgroupGamma1(G) and if i]in G
gens[]: -ensi]java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
LevelOfCongruenceSubgroup(H) ) ); elif IsCongruenceSubgroupGammaUpper1(G) and IsCongruenceSubgroupGammaUpper1(H) then
return CongruenceSubgroupGammaUpper1( Lcm( LevelOfCongruenceSubgroup(G),
LevelOfCongruenceSubgroup(H) ) ); elif IsCongruenceSubgroupGamma0(G) and IsCongruenceSubgroupGamma0(H) then
return CongruenceSubgroupGamma0( Lcm( LevelOfCongruenceSubgroup(G),
LevelOfCongruenceSubgroup(H) ) ); elif IsCongruenceSubgroupGammaUpper0(G) and IsCongruenceSubgroupGammaUpper0(H) then
return CongruenceSubgroupGammaUpper0( Lcm( LevelOfCongruenceSubgroup(G),
LevelOfCongruenceSubgroup(H) ) ); # # Case 3 - Subgroups has different level # elif LevelOfCongruenceSubgroup(G) <> LevelOfCongruenceSubgroup(H) then
return IntersectionOfCongruenceSubgroups(G,H); # # Now subgroups have the same level # elif IsCongruenceSubgroupGamma1(G) and IsCongruenceSubgroupGamma0(H) then
return G; # so all properties and attributes of G will be preserved elif IsCongruenceSubgroupGamma0(G) and IsCongruenceSubgroupGamma1(H) then
return H; elif IsCongruenceSubgroupGammaUpper1(G) and IsCongruenceSubgroupGammaUpper0(H) then
return G; elif IsCongruenceSubgroupGammaUpper0(G) and IsCongruenceSubgroupGammaUpper1(H) then
return H; elif IsCongruenceSubgroupGamma0(G) and end ;
return IntersectionOfCongruenceSubgroups(G,H); else
return PrincipalCongruenceSubgroup(LevelOfCongruenceSubgroup(G)## ## end);
############################################################################# ## ## Indices of congruence subgroups ## #############################################################################
InstallMethod( Index, "for a natural SL_2(Z) and a congruence subgroup",
[ IsNaturalSL, IsCongruenceSubgroup ], 0, function( G, H )
local n, prdiv, r, p;
n := LevelOfCongruenceSubgroup(H); if HasIsPrincipalCongruenceSubgroup( H ) and
IsPrincipalCongruenceSubgroup( H ) then if n=1then
Assert( 1, IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) = 1 );
return 1; elif n=2then
Assert( 1, IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) = 6 );
return 12; # not 6, since we are in SL, not in PSL else
prdiv := Set( Factors( n ) );
r := n^3; # not (n^3)/2 since we are in SL, not in PSL for p in prdiv do
r := r*(1-1/p^2);
od;
Assert( 1, IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) = r/2 );
return r; fi; elif ( HasIsCongruenceSubgroupGamma0( H ) and IsCongruenceSubgroupGamma0( H ) ) or
( HasIsCongruenceSubgroupGammaUpper0( H ) and IsCongruenceSubgroupGammaUpper0( H ) ) then # for CongruenceSubgroupGamma0 we use the formula # [ SL_2(Z) : CongruenceSubgroupGamma0(n) ] = n * "Product over prime p | n" ( 1 + 1/p )
prdiv := Set( Factors( n ) );
r := n; for p in prdiv do
r := r*(1+1/p);
od;
Assert( 1, IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) = r );
return r; elif ( HasIsCongruenceSubgroupGamma1( H ) and IsCongruenceSubgroupGamma1( H ) ) or
( HasIsCongruenceSubgroupGammaUpper1( H ) and IsCongruenceSubgroupGammaUpper1( H ) ) then # for CongruenceSubgroupGamma1 we use the formula # [ CongruenceSubgroupGamma0(n) : CongruenceSubgroupGamma1(n) ] = n * "Product over prime p | n" ( 1 - 1/p ) # Combining with the previous case, we get that # [ SL_2(Z) : CongruenceSubgroupGamma1(n) ] = n^2 * "Product over prime p | n" ( 1 - 1/p^2 )
prdiv := Set( Factors( n ) );
r := n^2; for p in prdiv do
r := r*(1-1/p^2);
od;
Assert( 1, IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) = r/2 );
return r; else # if H is not in any of the cases above, for example is an intersection # of some congruence subgroups, we derive the index from its Farey symbol if [[-1,0],[0,-1]] in H then
return IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) ; else
return IndexInPSL2ZByFareySymbol( FareySymbol ( H ) ) * 2; fi; fi; end);
InstallMethod( IndexInSL2Z, "for a congruence subgroup",
[ IsCongruenceSubgroup ], 0,
G -> Index( SL(2,Integers), G ) );
InstallMethod( Index, "for a pair of congruence subgroups",
[ IsCongruenceSubgroup, IsCongruenceSubgroup ], 0, function( G, H ) if IsSubgroup( G, H ) then
return IndexInSL2Z(H)/IndexInSL2Z(G); fi; end);
############################################################################# ## ## Generators of confruence subgroups from Farey symbols ## #############################################################################
InstallMethod( GeneratorsOfGroup, "for a congruence subgroup",
[ IsCongruenceSubgroup ], 0, function(G)
local gens, i;
Info( InfoCongruence, 1, "Using the Congruence package for GeneratorsOfGroup ...");
gens := GeneratorsByFareySymbol( FareySymbol( G ) ); for i in [ 1 .. Length(gens) ] do if not gens[i] in G then
gens[i] := -gens[i];
Assert( 1, gens[i] in G ); fi;
od;
return gens; end );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.