Congruence subgroups \(\Gamma_0(N)\) of \(\mathrm{GL}_{2}(\mathbb{F}_{q}[T])\).

By definition, it is the subgroup of matrices whose bottom left coefficient is divislble by \(N\).

AUTHORS:

  • Cécile Armana, Xavier Caruso (2026-02): initial version

class sage.modular.drinfeld_modform.congroup_gamma0.Gamma0Element(parent, elt)[source]

Bases: MultiplicativeGroupElement

An element in a congruence subgroup.

is_one()[source]

Return whether this matrix is the identity matrix.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: G = Gamma0(T^4 + 2*T + 3)
sage: g = G.an_element()
sage: g
[4*T^4 + 3*T + 3 4*T^4 + 3*T + 2]
[  T^4 + 2*T + 3   T^4 + 2*T + 4]
sage: g.is_one()
False
sage: h = g * g^(-1)
sage: h.is_one()
True
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> G = Gamma0(T**Integer(4) + Integer(2)*T + Integer(3))
>>> g = G.an_element()
>>> g
[4*T^4 + 3*T + 3 4*T^4 + 3*T + 2]
[  T^4 + 2*T + 3   T^4 + 2*T + 4]
>>> g.is_one()
False
>>> h = g * g**(-Integer(1))
>>> h.is_one()
True
A.<T> = GF(5)[]
G = Gamma0(T^4 + 2*T + 3)
g = G.an_element()
g
g.is_one()
h = g * g^(-1)
h.is_one()
level()[source]

Return the level of the congruence subgroup in which this element lives.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: G = Gamma0(T^4 + 2*T + 3)
sage: g = G.an_element()
sage: g.level()
T^4 + 2*T + 3
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> G = Gamma0(T**Integer(4) + Integer(2)*T + Integer(3))
>>> g = G.an_element()
>>> g.level()
T^4 + 2*T + 3
A.<T> = GF(5)[]
G = Gamma0(T^4 + 2*T + 3)
g = G.an_element()
g.level()
class sage.modular.drinfeld_modform.congroup_gamma0.Gamma0_drinfeld(base, level)[source]

Bases: Group, UniqueRepresentation

A congruence subgroup.

Element[source]

alias of Gamma0Element

base_ring()[source]

Return the base ring of this congruence subgroup.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T^4 + 2*T + 3).base_ring()
Univariate Polynomial Ring in T over Finite Field of size 5
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T**Integer(4) + Integer(2)*T + Integer(3)).base_ring()
Univariate Polynomial Ring in T over Finite Field of size 5
A.<T> = GF(5)[]
Gamma0(T^4 + 2*T + 3).base_ring()
genus()[source]

” Return the genus of this congruence subgroup, i.e. the genus of the attached Drinfeld modular curve.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T - 1).genus()
0
sage: Gamma0(T^3 + 1).genus()
5
sage: Gamma0(T^5 - 3*T^4 + 1).genus()
155
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T - Integer(1)).genus()
0
>>> Gamma0(T**Integer(3) + Integer(1)).genus()
5
>>> Gamma0(T**Integer(5) - Integer(3)*T**Integer(4) + Integer(1)).genus()
155
A.<T> = GF(5)[]
Gamma0(T - 1).genus()
Gamma0(T^3 + 1).genus()
Gamma0(T^5 - 3*T^4 + 1).genus()

If the level \(N\) is irreducible, the formula simplifies as follows:

sage: def genus_irr(N):
....:     q = N.base_ring().cardinality()
....:     d = N.degree()
....:     if is_even(d):
....:          g = (q^d - q^2) / (q^2 - 1)
....:     else:
....:          g = (q^d - q) / (q^2 - 1)
....:     return g

sage: N = T^6 + T^4 + 4*T^3 + T^2 + 2
sage: N.is_irreducible()
True
sage: Gamma0(N).genus() == genus_irr(N)
True

sage: N = T^7 + 3*T + 3
sage: N.is_irreducible()
True
sage: Gamma0(N).genus() == genus_irr(N)
True
>>> from sage.all import *
>>> def genus_irr(N):
...     q = N.base_ring().cardinality()
...     d = N.degree()
...     if is_even(d):
...          g = (q**d - q**Integer(2)) / (q**Integer(2) - Integer(1))
...     else:
...          g = (q**d - q) / (q**Integer(2) - Integer(1))
...     return g

>>> N = T**Integer(6) + T**Integer(4) + Integer(4)*T**Integer(3) + T**Integer(2) + Integer(2)
>>> N.is_irreducible()
True
>>> Gamma0(N).genus() == genus_irr(N)
True

>>> N = T**Integer(7) + Integer(3)*T + Integer(3)
>>> N.is_irreducible()
True
>>> Gamma0(N).genus() == genus_irr(N)
True
def genus_irr(N):
    q = N.base_ring().cardinality()
    d = N.degree()
    if is_even(d):
         g = (q^d - q^2) / (q^2 - 1)
    else:
         g = (q^d - q) / (q^2 - 1)
    return g
N = T^6 + T^4 + 4*T^3 + T^2 + 2
N.is_irreducible()
Gamma0(N).genus() == genus_irr(N)
N = T^7 + 3*T + 3
N.is_irreducible()
Gamma0(N).genus() == genus_irr(N)

REFERENCE:

[Gek2001], Theorem 8.1

index()[source]

Return the index of this congruence subgroup as a subgroup of \(\mathrm{GL}_{2}(A)\) (where \(A\) is the base ring).

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T^4 - 3*T^2 + 1).index()
900
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T**Integer(4) - Integer(3)*T**Integer(2) + Integer(1)).index()
900
A.<T> = GF(5)[]
Gamma0(T^4 - 3*T^2 + 1).index()

If the level \(N\) is irreducible, the index is \(1 + q^{\mathrm{deg}(N)}\). We check it on an example below:

sage: N = T^4 + 4*T^2 + 4*T + 2
sage: N.is_irreducible()
True
sage: q = A.base_ring().cardinality()
sage: Gamma0(N).index() == 1 + q^4
True
>>> from sage.all import *
>>> N = T**Integer(4) + Integer(4)*T**Integer(2) + Integer(4)*T + Integer(2)
>>> N.is_irreducible()
True
>>> q = A.base_ring().cardinality()
>>> Gamma0(N).index() == Integer(1) + q**Integer(4)
True
N = T^4 + 4*T^2 + 4*T + 2
N.is_irreducible()
q = A.base_ring().cardinality()
Gamma0(N).index() == 1 + q^4
level()[source]

Return the level of this congruence subgroup.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T^4 + 2*T + 3).level()
T^4 + 2*T + 3
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T**Integer(4) + Integer(2)*T + Integer(3)).level()
T^4 + 2*T + 3
A.<T> = GF(5)[]
Gamma0(T^4 + 2*T + 3).level()
matrix_space()[source]

Return the matrix space of this congruence subgroup.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T^4 + 2*T + 3).matrix_space()
Full MatrixSpace of 2 by 2 dense matrices over Univariate Polynomial
Ring in T over Finite Field of size 5
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T**Integer(4) + Integer(2)*T + Integer(3)).matrix_space()
Full MatrixSpace of 2 by 2 dense matrices over Univariate Polynomial
Ring in T over Finite Field of size 5
A.<T> = GF(5)[]
Gamma0(T^4 + 2*T + 3).matrix_space()
ncusps()[source]

Return the number of cusps of this congruence subgroup, i.e. the number of cusps of the attached Drinfeld modular curve.

EXAMPLES:

sage: A.<T> = GF(5)[]
sage: Gamma0(T - 1).ncusps()
2
sage: Gamma0(T^3 + 1).ncusps()
4
sage: Gamma0(T^7 - 3*T^4 + 1).ncusps()
8
>>> from sage.all import *
>>> A = GF(Integer(5))['T']; (T,) = A._first_ngens(1)
>>> Gamma0(T - Integer(1)).ncusps()
2
>>> Gamma0(T**Integer(3) + Integer(1)).ncusps()
4
>>> Gamma0(T**Integer(7) - Integer(3)*T**Integer(4) + Integer(1)).ncusps()
8
A.<T> = GF(5)[]
Gamma0(T - 1).ncusps()
Gamma0(T^3 + 1).ncusps()
Gamma0(T^7 - 3*T^4 + 1).ncusps()

If the level \(N\) is irreducible, the number of cusps is \(2\). We check it below:

sage: N = T^6 + T^4 + 4*T^3 + T^2 + 2
sage: N.is_irreducible()
True
sage: Gamma0(N).ncusps() == 2
True
>>> from sage.all import *
>>> N = T**Integer(6) + T**Integer(4) + Integer(4)*T**Integer(3) + T**Integer(2) + Integer(2)
>>> N.is_irreducible()
True
>>> Gamma0(N).ncusps() == Integer(2)
True
N = T^6 + T^4 + 4*T^3 + T^2 + 2
N.is_irreducible()
Gamma0(N).ncusps() == 2

sage: N = T^7 + 3*T + 3
sage: N.is_irreducible()
True
sage: Gamma0(N).ncusps() == 2
True
>>> from sage.all import *
>>> N = T**Integer(7) + Integer(3)*T + Integer(3)
>>> N.is_irreducible()
True
>>> Gamma0(N).ncusps() == Integer(2)
True
N = T^7 + 3*T + 3
N.is_irreducible()
Gamma0(N).ncusps() == 2

REFERENCE:

[Gek2001], Proposition 6.7

class sage.modular.drinfeld_modform.congroup_gamma0.InclusionIntoMatrixSpace(parent)[source]

Bases: Map

Inclusion of a congruence subgroup into the corresponding matrix space.