Cuspidal subgroups of modular abelian varieties

AUTHORS:

  • William Stein (2007-03, 2008-02)

EXAMPLES: We compute the cuspidal subgroup of \(J_1(13)\):

sage: A = J1(13)
sage: C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
sage: C.gens()
[[(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)]]
sage: C.order()
361
sage: C.invariants()
[19, 19]
>>> from sage.all import *
>>> A = J1(Integer(13))
>>> C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
>>> C.gens()
[[(1/19, 0, 9/19, 9/19)], [(0, 1/19, 0, 9/19)]]
>>> C.order()
361
>>> C.invariants()
[19, 19]

We compute the cuspidal subgroup of \(J_0(54)\):

sage: A = J0(54)
sage: C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [3, 3, 3, 3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
sage: C.gens()
[[(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
sage: C.order()
2187
sage: C.invariants()
[3, 3, 3, 3, 3, 9]
>>> from sage.all import *
>>> A = J0(Integer(54))
>>> C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [3, 3, 3, 3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
>>> C.gens()
[[(1/3, 0, 0, 0, 0, 1/3, 0, 2/3)], [(0, 1/3, 0, 0, 0, 2/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 1/9, 1/9, 1/9, 2/9)], [(0, 0, 0, 1/3, 0, 1/3, 0, 0)], [(0, 0, 0, 0, 1/3, 1/3, 0, 1/3)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
>>> C.order()
2187
>>> C.invariants()
[3, 3, 3, 3, 3, 9]

We compute the subgroup of the cuspidal subgroup generated by rational cusps.

sage: C = J0(54).rational_cusp_subgroup(); C
Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
sage: C.gens()
[[(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
sage: C.order()
81
sage: C.invariants()
[3, 3, 9]
>>> from sage.all import *
>>> C = J0(Integer(54)).rational_cusp_subgroup(); C
Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
>>> C.gens()
[[(1/3, 0, 0, 1/3, 2/3, 1/3, 0, 1/3)], [(0, 0, 1/9, 1/9, 7/9, 7/9, 1/9, 8/9)], [(0, 0, 0, 0, 0, 0, 1/3, 2/3)]]
>>> C.order()
81
>>> C.invariants()
[3, 3, 9]

This might not give us the exact rational torsion subgroup, since it might be bigger than order \(81\):

sage: J0(54).rational_torsion_subgroup().multiple_of_order()
243
>>> from sage.all import *
>>> J0(Integer(54)).rational_torsion_subgroup().multiple_of_order()
243
class sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup(abvar, field_of_definition=Rational Field)[source]

Bases: CuspidalSubgroup_generic

EXAMPLES:

sage: a = J0(65)[2]
sage: t = a.cuspidal_subgroup()
sage: t.order()
6
>>> from sage.all import *
>>> a = J0(Integer(65))[Integer(2)]
>>> t = a.cuspidal_subgroup()
>>> t.order()
6
lattice()[source]

Returned cached tuple of vectors that define elements of the rational homology that generate this finite subgroup.

OUTPUT: tuple (cached)

EXAMPLES:

sage: J = J0(27)
sage: G = J.cuspidal_subgroup()
sage: G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0 1/3]
>>> from sage.all import *
>>> J = J0(Integer(27))
>>> G = J.cuspidal_subgroup()
>>> G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0 1/3]

Test that the result is cached:

sage: G.lattice() is G.lattice()
True
>>> from sage.all import *
>>> G.lattice() is G.lattice()
True
class sage.modular.abvar.cuspidal_subgroup.CuspidalSubgroup_generic(abvar, field_of_definition=Rational Field)[source]

Bases: FiniteSubgroup

class sage.modular.abvar.cuspidal_subgroup.RationalCuspSubgroup(abvar, field_of_definition=Rational Field)[source]

Bases: CuspidalSubgroup_generic

EXAMPLES:

sage: a = J0(65)[2]
sage: t = a.rational_cusp_subgroup()
sage: t.order()
6
>>> from sage.all import *
>>> a = J0(Integer(65))[Integer(2)]
>>> t = a.rational_cusp_subgroup()
>>> t.order()
6
lattice()[source]

Return lattice that defines this group.

OUTPUT: lattice

EXAMPLES:

sage: G = J0(27).rational_cusp_subgroup()
sage: G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0   1]
>>> from sage.all import *
>>> G = J0(Integer(27)).rational_cusp_subgroup()
>>> G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0   1]

Test that the result is cached.

sage: G.lattice() is G.lattice()
True
>>> from sage.all import *
>>> G.lattice() is G.lattice()
True
class sage.modular.abvar.cuspidal_subgroup.RationalCuspidalSubgroup(abvar, field_of_definition=Rational Field)[source]

Bases: CuspidalSubgroup_generic

EXAMPLES:

sage: a = J0(65)[2]
sage: t = a.rational_cuspidal_subgroup()
sage: t.order()
6
>>> from sage.all import *
>>> a = J0(Integer(65))[Integer(2)]
>>> t = a.rational_cuspidal_subgroup()
>>> t.order()
6
lattice()[source]

Return lattice that defines this group.

OUTPUT: lattice

EXAMPLES:

sage: G = J0(27).rational_cuspidal_subgroup()
sage: G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0   1]
>>> from sage.all import *
>>> G = J0(Integer(27)).rational_cuspidal_subgroup()
>>> G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3   0]
[  0   1]

Test that the result is cached.

sage: G.lattice() is G.lattice()
True
>>> from sage.all import *
>>> G.lattice() is G.lattice()
True
sage.modular.abvar.cuspidal_subgroup.is_rational_cusp_gamma0(c, N, data)[source]

Return True if the rational number c is a rational cusp of level N.

This uses remarks in Glenn Steven’s Ph.D. thesis.

INPUT:

  • c – a cusp

  • N – positive integer

  • data – the list [n for n in range(2,N) if gcd(n,N) == 1], which is passed in as a parameter purely for efficiency reasons.

EXAMPLES:

sage: from sage.modular.abvar.cuspidal_subgroup import is_rational_cusp_gamma0
sage: N = 27
sage: data = [n for n in range(2,N) if gcd(n,N) == 1]
sage: is_rational_cusp_gamma0(Cusp(1/3), N, data)
False
sage: is_rational_cusp_gamma0(Cusp(1), N, data)
True
sage: is_rational_cusp_gamma0(Cusp(oo), N, data)
True
sage: is_rational_cusp_gamma0(Cusp(2/9), N, data)
False
>>> from sage.all import *
>>> from sage.modular.abvar.cuspidal_subgroup import is_rational_cusp_gamma0
>>> N = Integer(27)
>>> data = [n for n in range(Integer(2),N) if gcd(n,N) == Integer(1)]
>>> is_rational_cusp_gamma0(Cusp(Integer(1)/Integer(3)), N, data)
False
>>> is_rational_cusp_gamma0(Cusp(Integer(1)), N, data)
True
>>> is_rational_cusp_gamma0(Cusp(oo), N, data)
True
>>> is_rational_cusp_gamma0(Cusp(Integer(2)/Integer(9)), N, data)
False