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:
MultiplicativeGroupElementAn 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,UniqueRepresentationA 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