Ask Your Question

Group given by congruence relation

asked 2020-04-05 05:47:54 -0600

oldani gravatar image

updated 2020-06-01 03:55:07 -0600

FrédéricC gravatar image


Beginner in Sage (I love it!) , I want to ask you this maybe naive question:

I have a group $G$ defined by $\lbrace M \in SL_2(Z) \ | \ M = I + kB \ mod(N) \rbrace $, where $I$ is the identity, $N$ a given positive integer, $B$ is a given fixed matrix verifying $B^2 = 0$ and $k$ (not fixed) any integer in { 0,1,2,....,N-1 }. I want to explore conjugacy classes/subgroups of this group $G$ for some specific $B$ and $N$. Is this subgroup finitely generated for some $N$? subgroups of finite index? etc... Do I have a way to do that with SageMath?

Remark that

It is subgroup of a finitely generated group butv that do not imply that it is finitely generated

$B^2 = 0$ gives that $I + kB = \Lambda^k \ with \ \Lambda = I + B$.

An obvious subgroup is $ H = \lbrace \Lambda^k, \ k \in \mathbb Z \rbrace$

Any advise or web pointer would be appreciated

Thanks for your help

edit retag flag offensive close merge delete


Why is it a group?

vdelecroix gravatar imagevdelecroix ( 2020-04-05 11:07:24 -0600 )edit


Thanks for your interest in my question . Here is the argument

Essentially because $B^2 = 0$.

Just to be clear, saying that $A=B \ mod(N)$ means that $A - B = N \cdot X$ where $X$ is an integral matrix

1) $I \in G$, take k=0

2) Take $A = I + mB + N\cdot X, B = I + nB + N\cdot Y\in G$ , $X,Y$ being any integer coefficients matrices. Write the product and you will see that (because $B^2=0$) we have $A \cdot B = I + (m+n)\cdot B \ mod(N)$

3) For the inverse, you see easily that if $A = 1 + k \cdot B \mod(N)$ then $A^{-1} = 1 - k \cdot B \ mod(N)$

oldani gravatar imageoldani ( 2020-04-05 12:17:01 -0600 )edit

So k is not fixed, you should make it clearer in your question.

vdelecroix gravatar imagevdelecroix ( 2020-04-05 12:28:52 -0600 )edit

With this definition, it is the preimage of a subgroup under the reduction mod N: SL(2,Z) -> SL(2,Z/NZ). Hence it is finite index in SL(2,Z) and in particular finitely generated. It is also congruence as it contains Gamma(N).

vdelecroix gravatar imagevdelecroix ( 2020-04-05 12:31:56 -0600 )edit

Yes sorry for that, you are right, fixed. Great thanks for this point of view, gives me a step further.
Yes , in fact $G \cap \Gamma_0 = \Gamma(N)$

oldani gravatar imageoldani ( 2020-04-05 13:12:27 -0600 )edit

1 answer

Sort by » oldest newest most voted

answered 2020-04-05 13:54:28 -0600

vdelecroix gravatar image

updated 2020-04-05 14:33:33 -0600

Here is a function constructing the group

def my_congruence_group(B, N):
    M = MatrixSpace(Zmod(N), 2)
    B = M(B)
    assert (B**2).is_zero()
    G = SL(2, Zmod(N))
    H = G.subgroup([1 + k*B for k in range(N)])
    C = libgap.RightCosets(G, H)

    l = libgap.Permutation(G([1,1,0,1]), C, libgap.OnRight)
    r = libgap.Permutation(G([1,0,1,1]), C, libgap.OnRight)
    s2 = libgap.Permutation(G([0,-1,1,0]), C, libgap.OnRight)
    s3 = libgap.Permutation(G([0,1,-1,1]), C, libgap.OnRight)

    return ArithmeticSubgroup_Permutation(L=l.sage(), R=r.sage(), S2=s2.sage(), S3=s3.sage())

You can just copy paste the code and use it as

sage: N = 6
sage: B = [2,1,2,4]
sage: G = my_congruence_group(B, N)
sage: G.gens()   # some generators for the group
[1 3]  [ 3 -2]  [ 11 -25]
[0 1], [ 2 -1], [  4  -9]
sage: print(G.genus())  # the genus of the quotient
sage: print(G.nu2(), G.nu3(), G.ncusps())  # elliptic points and cusps on the quotient
0 0 4
sage: F = G.farey_symbol()
sage: F.fundamental_domain()   # plot a fundamental domain

image description

You should have a look atSageMath documentation on subgroups of SL(2,Z) documentation to learn how to use G. in particular the section "Arithmetic subgroups defined by permutations of cosets" which is how I build your group and "Farey Symbol for arithmetic subgroups of PSL2(Z)" which teach you how constructing the fundamental domain works

EDIT: Though I suspect that all your groups are just conjugate to $\Gamma_1(N)$ or $\Gamma_0(N)$ (or at least close enough). The only matrix $B$ with $B^2= 0$ are conjugate to $\begin{pmatrix}0&b\\0&0\end{pmatrix}$.

edit flag offensive delete link more


Wonderful, thank you so much for your time and your great answer. You taught me a lot in this last two hours. I will study that with great pleasure.

oldani gravatar imageoldani ( 2020-04-05 14:44:28 -0600 )edit

Hi, Sorry to disturb you again but I have tried various ways and I get always the same error when I run the above code:

Here is an extract of the fullstack just in case :

Starts with:

GAPError Traceback (most recent call last) .........continue..... ---> 23 G = my_congruence_group(B, N) 24 G.gens() # some generators for the group 25 .........continue..... ends with

GAPError: Syntax error: ] expected in stream:1 [1 1] ^

Thanks for any clue

oldani gravatar imageoldani ( 2020-04-06 07:13:04 -0600 )edit

I guess you are using a too old version of SageMath (I do not remember when this change happend). You could replace G([1,1,0,1]) by [[1,1],[0,1]] (and the same with the other matrices).

vdelecroix gravatar imagevdelecroix ( 2020-04-06 07:48:17 -0600 )edit

Thanks. I have the 8.9 version which is recent. I have tried here: and I got the same error....strange. Don't worries I don't want to waste your time I will do my investigatio and tell you if I find something...Maybe a Python 3 compatibility issue?

oldani gravatar imageoldani ( 2020-04-06 09:44:31 -0600 )edit

Got it. Jesus here is how it works for me...don't ask me why...

def my_congruence_group(B, N): M = MatrixSpace(Zmod(N), 2) print(M)

assert (B**2).is_zero()

B = M(B)
G = SL(2, Zmod(N))
H = G.subgroup([1 + k*B for k in range(N)])
C = libgap.RightCosets(G, H)

M1 = M([[1,1],[0,1]])
M2 = M([[1,0],[1,1]])
M3 = M([[0,-1],[1,0]])
M4 = M([[0,1],[-1,1]])

l = libgap.Permutation( M1, C, libgap.OnRight)
r = libgap.Permutation( M2, C, libgap.OnRight)
s2 = libgap.Permutation( M3, C, libgap.OnRight)
s3 = libgap.Permutation( M4, C, libgap.OnRight)

return ArithmeticSubgroup_Permutation(L=l.sage(), R=r.sage(), S2=s2.sage(), S3=s3.sage())
oldani gravatar imageoldani ( 2020-04-06 10:06:06 -0600 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2020-04-05 05:47:54 -0600

Seen: 72 times

Last updated: Apr 05 '20