Two-generator subgroups of SL(2,R)

The algorithms explained in have been implemented in Magma and can be downloaded here.

How to use this file with Magma:

The above package has to be loaded into your Magma workspace using:

> Attach("sl2r.m");

Constructing a two-generator subgoup

Suppose A, B are matrices over K. To generate the group G:= <A, B> as a subgroup of (P)SL(2,R) one uses the commands TwoGeneratorSubgroupSL2R and TwoGeneratorSubgroupPSL2R. Besides the matrices A and B they also expect an embedding of K into R as a third parameter. If K is the field of rationals, one has to use Infinity() as embedding.

> A:= Matrix(2, [ 2, 0, 2, 1/2 ]);
> B:= Matrix(2, [ 5, 2, -3, -1 ]);
> G:= TwoGeneratorSubgroupSL2R(A, B, Infinity()); G;
Two generator subgroup of SL(2,R) generated by
[  2   0]
[  2 1/2],
[ 5  2]
[-3 -1]

Predicates of two-generator subgoups

The generators of G can be accessed as G.1 and G.2. The following functions can be used to decide if G is discrete, etc. In the example above,

> IsDiscreteAndFree(G);
true
So the group G is discrete and free.

Constructive membership for two-generator subgoups

Whenever the group G is discrete, the membership problem can be decided using the Membership intrinsic. In the example above,

> Membership(G, A^10 * B^3 * A);
true $.1^10 * $.2^3 * $.1                                                                                                                                                          
> Membership(G, -A);
false
The first return value indicates whether the element is in G. If this is the case, then the second return value is a word in a free group of rank 2 that expresses the element in the generators of G. Note that if G was created as a subgroup of PSL(2,R) then the second membership test above would yield true:

> H:= TwoGeneratorSubgroupPSL2R(A, B, Infinity());
> Membership(H, -A);
true $.1                                                                                                                                                                           
As explained in the papers mentioned in the beginning, the algorithm usually computes a witness pair for G. The chosen witness pair can be obtained using the WitnessPair intrinsic.

Another example

We construct a (2,3,7)-triangle group:

> K:= NumberField( Polynomial([-1, 0, -2, 0, 1, 0, 1]) );
> eta:= K.1^2;
> X:= Matrix(K, 2, [0, -K.1, K.1^5 + K.1^3 - 2*K.1, 0 ]);
> Y:= Matrix(K, 2, [1/2,  1/2*(-K.1^5 - K.1^4 - K.1^3 + K.1 + 1), 1/2*(-K.1^5 + K.1^4 + 3*K.1 - 2) , 1/2] );
> plc:= InfinitePlaces(K)[1];
> G:= TwoGeneratorSubgroupSL2R(X, Y, plc);
> IsTriangleGroup(G);
true <2, 3, 7>