Goto Chapter: Top 1 2 3 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

2 Subgroups of SL_2(ℤ)
 2.1 Construction of modular subgroups
 2.2 Computing with modular subgroups
 2.3 Miscellaneous

2 Subgroups of SL_2(ℤ)

For representing finite-index subgroups of SL_2(ℤ), this package introduces the new object ModularSubgroup. As stated in the introduction, a ModularSubgroup essentially consists of the two permutations σ_S and σ_T describing the coset graph with respect to the generators S and T (with the convention that 1 corresponds to the identity coset). So explicitly specifying these permutations is the canonical way to construct a ModularSubgroup.
Though you might not always have a coset graph of your subgroup at hand, but rather a list of generating matrices. Therefore we implement multiple constructors for ModularSubgroup: three that take as input two permutations describing the coset graph with respect to different pairs of generators of SL_2(ℤ), and one that takes a list of SL_2(ℤ) matrices as generators.

2.1 Construction of modular subgroups

2.1-1 Constructors
‣ ModularSubgroup( s, t )( operation )

Returns: A modular subgroup.

Constructs a ModularSubgroup object corresponding to the finite-index subgroup of SL_2(ℤ) described by the permutations s and t.
This constructor tests if the given permutations actually describe the coset action of the matrices


                     [ 0 -1 ]            [ 1  1 ]
                 S = [ 1  0 ],       T = [ 0  1 ]
    

by checking that they act transitively and satisfy the relations

s^4 = (s^3 t)^3 = s^2 t s^{-2} t^{-1} = 1

Upon creation, the cosets are renamed in a standardized way to make the internal interaction with existing GAP methods easier. (The fact that 1 corresponds to the identity coset is not changed by this)

    
    gap> G := ModularSubgroup(
    > (1,2)(3,4)(5,6)(7,8)(9,10),
    > (1,4)(2,5,9,10,8)(3,7,6));
    <modular subgroup of index 10>
    
    
‣ ModularSubgroupST( s, t )( operation )

Returns: A modular subgroup.

Synonymous for ModularSubgroup (see above).

‣ ModularSubgroupRT( r, t )( operation )

Returns: A modular subgroup.

Constructs a ModularSubgroup object corresponding to the finite-index subgroup of SL_2(ℤ) determined by the permutations r and t which describe the action of the matrices


                     [ 1  0 ]           [ 1  1 ]
                 R = [ 1  1 ]       T = [ 0  1 ]
    

on the right cosets.
A check is performed if the permutations actually describe such an action on the cosets of some subgroup.
Upon creation, the cosets are renamed in a standardized way to make the internal interaction with existing GAP methods easier. (The fact that 1 corresponds to the identity coset is not changed by this)

    
    gap> G := ModularSubgroupRT(
    > (1,9,8,10,7)(2,6)(3,4,5),
    > (1,4)(2,5,9,10,8)(3,7,6));
    <modular subgroup of index 10>
    
    
‣ ModularSubgrouSJ( s, j )( operation )

Returns: A modular subgroup.

Constructs a ModularSubgroup object corresponding to the finite-index subgroup of SL_2(ℤ) determined by the permutations s and j which describe the action of the matrices


                     [ 0 -1 ]           [  0  1 ]
                 S = [ 1  0 ]       J = [ -1  1 ]
    

on the right cosets.
A check is performed if the permutations actually describe such an action on the cosets of some subgroup.
Upon creation, the cosets are renamed in a standardized way to make the internal interaction with existing GAP methods easier. (The fact that 1 corresponds to the identity coset is not changed by this)

    
    gap> G := ModularSubgroupSJ(
    > (1,2)(3,6)(4,7)(5,9)(8,10),
    > (1,5,6)(2,3,7)(4,9,10));
    <modular subgroup of index 10>
    
    
‣ ModularSubgroup( gens )( operation )

Returns: A modular subgroup.

Constructs a ModularSubgroup object corresponding to the finite-index subgroup of SL_2(ℤ) generated by the matrices in gens.
No test is performed to check if the generated subgroup actually has finite index!
This constructor implicitly computes a coset table of the subgroup. Hence it might be slow for very large index subgroups.

    
    gap> G := ModularSubgroup([
    > [[1,2], [0,1]],
    > [[1,0], [2,1]],
    > [[-1,0], [0,-1]]
    > ]);
    <modular subgroup of index 6>
    
  

2.1-2 Getters for the coset action
‣ SAction( G )( operation )

Returns: A permutation.

Returns the permutation σ_S describing the action of the matrix S on the cosets of G.

‣ TAction( G )( operation )

Returns: A permutation.

Returns the permutation σ_T describing the action of the matrix T on the cosets of G.

‣ RAction( G )( operation )

Returns: A permutation.

Returns the permutation σ_R describing the action of the matrix R on the cosets of G.

‣ JAction( G )( operation )

Returns: A permutation.

Returns the permutation σ_J describing the action of the matrix J on the cosets of G.

‣ CosetActionOf( A, G )( operation )

Returns: A permutation.

Returns the permutation σ_A describing the action of the matrix A ∈ SL_2(ℤ) on the cosets of G.

2.2 Computing with modular subgroups

2.2-1 Index
‣ Index( G )( attribute )

Returns: A natural number.

For a given modular subgroup G this method returns its index in SL_2(ℤ). As G is internally stored as permutations (s,t) this is just


      LargestMovedPoint(s,t)
    

(or 1 if the permutations are trivial).

  
  gap> G := ModularSubgroup((1,2)(3,5)(4,6), (1,3)(2,4)(5,6));
  <modular subgroup of index 6>
  gap> Index(G);
  6
  

2.2-2 GeneralizedLevel
‣ GeneralizedLevel( G )( attribute )

Returns: A natural number.

This method calculates the general Wohlfahrt level (i.e. the lowest common multiple of all cusp widths) of G as defined in [Woh64].

  
  gap> G := ModularSubgroup((1,2)(3,5)(4,6), (1,3)(2,4)(5,6));
  <modular subgroup of index 6>
  gap> GeneralizedLevel(G);
  2
  

2.2-3 RightCosetRepresentatives
‣ RightCosetRepresentatives( G )( attribute )

Returns: A list of words.

This function returns a list of representatives of the (right) cosets of G as words in S and T.

  
  gap> G := ModularSubgroup((1,2),(2,3));
  <modular subgroup of index 3>
  gap> RightCosetRepresentatives(G);
  [ <identity ...>, S, S*T ]
  

2.2-4 GeneratorsOfGroup
‣ GeneratorsOfGroup( G )( attribute )

Returns: A list of words.

Calculates a list of generators (as words in S and T) of G. This list might include redundant generators (or even duplicates).

  
  gap> G := ModularSubgroup((1,2)(3,5)(4,6), (1,3)(2,4)(5,6));
  <modular subgroup of index 6>
  gap> GeneratorsOfGroup(G);
  [ S^-2, T^-2, S*T^-2*S^-1 ]
  

2.2-5 MatrixGeneratorsOfGroup
‣ MatrixGeneratorsOfGroup( G )( attribute )

Returns: A list of matrices.

Calculates a list of generator matrices of G. This list might include redundant generators (or even duplicates).

  
  gap> G := ModularSubgroup((1,2)(3,5)(4,6), (1,3)(2,4)(5,6));
  <modular subgroup of index 6>
  gap> MatrixGeneratorsOfGroup(G);
  [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ 1, -2 ], [ 0, 1 ] ], [ [ 1, 0 ], [ 2, 1 ] ] ]
  

2.2-6 IsCongruence
‣ IsCongruence( G )( attribute )

Returns: True or false.

This method test whether a given modular subgroup G is a congruence subgroup. It is essentially an implementation of an algorithm described in [HL14].

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> IsCongruence(G);
  true
  

2.2-7 Cusps
‣ Cusps( G )( attribute )

Returns: A list of rational numbers and infinity.

This method computes a list of inequivalent cusp representatives with respect to G.

  
  gap> G := ModularSubgroup(
  > (1,2)(3,6)(4,8)(5,9)(7,11)(10,13)(12,15)(14,17)(16,19)(18,21)(20,23)(22,24),
  > (1,3,7,4)(2,5)(6,9,8,12,14,10)(11,13,16,20,18,15)(17,21,22,19)(23,24)
  > );
  <modular subgroup of index 24>
  gap> Cusps(G);
  [ infinity, 0, 1, 2, 3/2, 5/3 ]
  

2.2-8 CuspWidth
‣ CuspWidth( c, G )( operation )

Returns: A natural number.

This method takes as input a cusp c (a rational number or infinity) and a modular group G and calculates the width of this cusp with respect to G.

  
  gap> G := ModularSubgroup(
  > (1,2,6,3)(4,11,15,12)(5,13,16,14)(7,17,9,18)(8,19,10,20)(21,24,22,23),
  > (1,4,5)(2,7,8)(3,9,10)(6,15,16)(11,20,21)(12,19,22)(13,23,17)(14,24,18)
  > );
  <modular subgroup of index 24>
  gap> CuspWidth(-1, G);
  3
  gap> CuspWidth(infinity, G);
  3
  

2.2-9 CuspsEquivalent
‣ CuspsEquivalent( p, q, G )( operation )

Returns: True or false.

Takes two cusps p and q and a modular subgroup G and checks if they are equivalent modulo G, i.e. if there exists a matrix A ∈ G with Ap = q.

  
  gap> G := ModularSubgroup(
  > (1,2,6,3)(4,11,15,12)(5,13,16,14)(7,17,9,18)(8,19,10,20)(21,24,22,23),
  > (1,4,5)(2,7,8)(3,9,10)(6,15,16)(11,20,21)(12,19,22)(13,23,17)(14,24,18)
  > );
  <modular subgroup of index 24>
  gap> CuspsEquivalent(infinity, 1, G);
  false
  gap> CuspsEquivalent(-1, 1/2, G);
  true
  

2.2-10 CosetRepresentativeOfCusp
‣ CosetRepresentativeOfCusp( c, G )( operation )

Returns: A word in S and T.

For a cusp c this function returns a right coset representative A of G such that A ∞ and c are equivalent with respect to G.

  
  gap> G := ModularSubgroup(
  > (1,2,6,3)(4,11,15,12)(5,13,16,14)(7,17,9,18)(8,19,10,20)(21,24,22,23),
  > (1,4,5)(2,7,8)(3,9,10)(6,15,16)(11,20,21)(12,19,22)(13,23,17)(14,24,18)
  > );
  <modular subgroup of index 24>
  gap> CosetRepresentativeOfCusp(4, G);
  T*S
  

2.2-11 IndexModN
‣ IndexModN( G, N )( operation )

Returns: A natural number.

For a modular subgroup G and a natural number N this method calculates the index of the projection barG of G in SL_2(ℤ/Nℤ).

  
  gap> G := ModularSubgroup((1,2)(3,5)(4,6), (1,3)(2,4)(5,6));
  <modular subgroup of index 6>
  gap> IndexModN(G, 2);
  6
  

2.2-12 Deficiency
‣ Deficiency( G, N )( operation )

Returns: A natural number.

For a modular subgroup G and a natural number N this method calculates the so-called deficiency of G from being a congruence subgroup of level N.
The deficiency of a finite-index subgroup Γ of SL_2(ℤ) was introduced in [WS15]. It is defined as the index [Γ(N) : Γ(N) ∩ Γ] where Γ(N) is the principal congruence subgroup of level N.

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> Deficiency(G, 2);
  2
  gap> Deficiency(G, 4);
  1
  

2.2-13 Deficiency
‣ Deficiency( G )( attribute )

Returns: A natural number.

Shorthand for Deficiency(G, GeneralizedLevel(G)).

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> Deficiency(G);
  2
  gap> Deficiency(G, GeneralizedLevel(G));
  2
  

2.2-14 Projection
‣ Projection( G )( operation )

Returns: A projective modular subgroup.

For a given modular subgroup G this function calculates its image barG under the projection π : SL_2(ℤ) → PSL_2(ℤ).

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> Projection(G);
  <projective modular subgroup of index 6>
  

2.2-15 Conjugate
‣ Conjugate( G, A )( operation )

Returns: A ModularSubgroup.

Conjugates the group G by A and returns the group A^-1*G*A.

2.2-16 NormalCore
‣ NormalCore( G )( attribute )

Returns: A modular subgroup.

Calculates the normal core of G in SL_2(ℤ), i.e. the maximal subgroup of G that is normal in SL_2(ℤ).

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> NormalCore(G);
  <modular subgroup of index 48>
  

2.2-17 QuotientByNormalCore
‣ QuotientByNormalCore( G )( attribute )

Returns: A finite group.

Calculates the quotient of SL_2(ℤ) by the normal core of G.

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> QuotientByNormalCore(G);
  <permutation group with 2 generators>
  

2.2-18 AssociatedCharacterTable
‣ AssociatedCharacterTable( G )( attribute )

Returns: A character table.

Returns the character table of SL_2(ℤ)/N where N is the normal core of G.

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> AssociatedCharacterTable(G);
  CharacterTable( <permutation group of size 48 with 2 generators> )
  

2.2-19 IsElementOf
‣ IsElementOf( A, G )( operation )

Returns: True or false.

This function checks if a given matrix A is an element of the modular subgroup G.

  
  gap> G := ModularSubgroup([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  <modular subgroup of index 12>
  gap> IsElementOf([[-1,0],[0,-1]], G);
  false
  gap> IsElementOf([[1,4],[0,1]], G);
  true
  

2.2-20 Genus
‣ Genus( G )( attribute )

Returns: A non-negative integer.

Computes the genus of the quotient G ∖ ℍ via an algorithm described in [Sch04].

  
  gap> G := ModularSubgroup((1,2),(2,3));
  <modular subgroup of index 3>
  gap> Genus(G);
  0
  

2.3 Miscellaneous

The following functions are mostly helper functions used internally and are only documented for sake of completeness.

2.3-1 DefinesCosetActionST
‣ DefinesCosetActionST( s, t )( operation )

Returns: True or false.

Checks if two given permutations s and t describe the action of the generator matrices S and T on the cosets of some subgroup. This is the case if they satisfy the relations

s^4 = (s^3 t)^3 = s^2 t s^{-2} t^{-1} = 1

and act transitively.

  
  gap> s := (1,2)(3,4)(5,6)(7,8)(9,10);;
  gap> t := (1,4)(2,5,9,10,8)(3,7,6);;
  gap> DefinesCosetActionST(s,t);
  true
  

2.3-2 DefinesCosetActionRT
‣ DefinesCosetActionRT( r, t )( operation )

Returns: True or false.

Checks if two given permutations r and t describe the action of the generator matrices R and T on the cosets of some subgroup. This is the case if they satisfy the relations

(r t^{-1} r)^4 = ((r t^{-1} r)^3 t)^3 = (r t^{-1} r)^2 t (r t^{-1} r)^{-2} t^{-1} = 1

and act transitively.

  
  gap> r := (1,9,8,10,7)(2,6)(3,4,5);;
  gap> t := (1,4)(2,5,9,10,8)(3,7,6);;
  gap> DefinesCosetActionRT(r,t);
  true
  

2.3-3 DefinesCosetActionSJ
‣ DefinesCosetActionSJ( s, j )( operation )

Returns: True or false.

Checks if two given permutations s and j describe the action of the generator matrices S and J on the cosets of some subgroup. This is the case if they satisfy the relations

s^4 = (s^3 j^{-1} s^{-1})^3 = s^2 j^{-1} s^{-2} j = 1

and act transitively.

  
  gap> s := (1,2)(3,4)(5,6)(7,8)(9,10);;
  gap> j := (1,5,6)(2,3,7)(4,9,10);;
  gap> DefinesCosetActionSJ(s,j);
  true
  

2.3-4 CosetActionFromGenerators
‣ CosetActionFromGenerators( gens )( operation )

Returns: A tuple of permutations.

Takes a list of generator matrices and calculates the coset graph (as two permutations σ_S and σ_T) of the generated subgroup of SL_2(ℤ).

  
  gap> CosetActionFromGenerators([
  > [[1,2],[0,1]],
  > [[1,0],[2,1]]
  > ]);
  [ (1,2,5,3)(4,8,10,9)(6,11,7,12), (1,4)(2,6)(3,7)(5,10)(8,12,9,11) ]
  

2.3-5 STDecomposition
‣ STDecomposition( A )( operation )

Returns: A word in S and T.

Takes a matrix A ∈ SL_2(ℤ) and decomposes it into a word in the generator matrices S and T.

  
  gap> M := [ [ 4, 3 ], [ -3, -2 ] ];;
  gap> STDecomposition(M);
  S^2*T^-1*S^-1*T^2*S^-1*T^-1*S^-1
  

2.3-6 RTDecomposition
‣ RTDecomposition( A )( operation )

Returns: A word in R and T.

Takes a matrix A ∈ SL_2(ℤ) and decomposes it into a word in the generator matrices R and T.

  
  gap> M := [ [ 4, 3 ], [ -3, -2 ] ];;
  gap> RTDecomposition(M);
  (R*T^-1*R)^2*T^-1*R^-1*(T*R^-1*T)^2*R^-1*T^-1*R^-1*T*R^-1
  

2.3-7 SJDecomposition
‣ SJDecomposition( A )( operation )

Returns: A word in S and J.

Takes a matrix A ∈ SL_2(ℤ) and decomposes it into a word in the generator matrices S and J.

  
  gap> M := [ [ 4, 3 ], [ -3, -2 ] ];;
  gap> SJDecomposition(M);
  S^3*J*(S^-1*J^-1)^2*S^-1*J*S^-1
  

2.3-8 STDecompositionAsList
‣ STDecompositionAsList( A )( operation )

Returns: A list representing a word in S and T.

Takes a matrix A ∈ SL_2(ℤ) and decomposes it into a word in the generator matrices S and T. The word is represented as a list in the format [[generator, exponent], ... ]

  
  gap> M := [ [ 4, 3 ], [ -3, -2 ] ];;
  gap> STDecompositionAsList(M);
  [ [ "S", 2 ], [ "T", -1 ], [ "S", -1 ], [ "T", 2 ], [ "S", -1 ], [ "T", -1 ],
    [ "S", -1 ], [ "T", 0 ] ]
  
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 Bib Ind

generated by GAPDoc2HTML