Sage can compute with fairly general finite subgroups of modular
abelian varieties. Elements of finite order are represented by
equivalence classes of elements in
modulo
. A finite subgroup can be
defined by giving generators and via various other constructions.
Given a finite subgroup, one can compute generators, as well as the
structure as an abstract group. Arithmetic on subgroups is also
supported, including adding two subgroups together, checking
inclusion, etc.
TODO: Intersection, action of Hecke operators.
AUTHORS:
EXAMPLES:
sage: J = J0(33)
sage: C = J.cuspidal_subgroup()
sage: C
Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
sage: C.order()
100
sage: C.gens()
[[(1/10, 0, 1/10, 1/10, 1/10, 3/10)], [(0, 1/5, 1/10, 0, 1/10, 9/10)], [(0, 0, 1/2, 0, 1/2, 1/2)]]
sage: C.0 + C.1
[(1/10, 1/5, 1/5, 1/10, 1/5, 6/5)]
sage: 10*(C.0 + C.1)
[(0, 0, 0, 0, 0, 0)]
sage: G = C.subgroup([C.0 + C.1]); G
Finite subgroup with invariants [10] over QQbar of Abelian variety J0(33) of dimension 3
sage: G.gens()
[[(1/10, 1/5, 1/5, 1/10, 1/5, 1/5)]]
sage: G.order()
10
sage: G <= C
True
sage: G >= C
False
We make a table of the order of the cuspidal subgroup for the first few levels:
sage: for N in range(11,40): print N, J0(N).cuspidal_subgroup().order()
...
11 5
12 1
13 1
14 6
15 8
16 1
17 4
18 1
19 3
20 6
21 8
22 25
23 11
24 8
25 1
26 21
27 9
28 36
29 7
30 192
31 5
32 8
33 100
34 48
35 48
36 12
37 3
38 135
39 56
TESTS:
sage: G = J0(11).finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
sage: loads(dumps(G)) == G
True
sage: loads(dumps(G.0)) == G.0
True
Return the sum of two subgroups.
EXAMPLES:
sage: C = J0(22).cuspidal_subgroup()
sage: C.gens()
[[(1/5, 1/5, 4/5, 0)], [(0, 0, 0, 1/5)]]
sage: A = C.subgroup([C.0]); B = C.subgroup([C.1])
sage: A + B == C
True
Coerce into this finite subgroup.
This works when the abelian varieties that contains x and self are
the same, or if is coercible into the rational homology
(viewed as an abstract
-vector space).
EXAMPLES: We first construct the -torsion subgroup of
:
sage: J = J0(23)
sage: G = J.torsion_subgroup(11)
sage: G.invariants()
[11, 11, 11, 11]
We also construct the cuspidal subgroup.
sage: C = J.cuspidal_subgroup()
sage: C.invariants()
[11]
Coercing something into its parent returns it:
sage: G(G.0) is G.0
True
We coerce an element from the cuspidal subgroup into the
-torsion subgroup:
sage: z = G(C.0); z
[(1/11, 10/11, 0, 8/11)]
sage: z.parent() == G
True
We coerce a list, which defines an element of the underlying
full_module into , and verify an
equality:
sage: x = G([1/11, 1/11, 0, -1/11])
sage: x == G([1/11, 1/11, 0, 10/11])
True
Finally we attempt to coerce in an element that shouldn’t work,
since is is not in :
sage: G(J.torsion_subgroup(3).0)
...
TypeError: x does not define an element of self
Compare this finite subgroup to other.
If other is not a modular abelian variety finite subgroup, then the types of self and other are compared. If other is a finite subgroup, and the ambient abelian varieties are equal, then the subgroups themselves are compared, by comparing their full modules. If the containing abelian varieties are not equal and their ambient varieties are different they are compared; if they are the same, then a NotImplemnetedError is raised (this is temporary).
EXAMPLES: We first compare to subgroups of :
sage: A = J0(37)
sage: G = A.torsion_subgroup(3); G.order()
81
sage: H = A.cuspidal_subgroup(); H.order()
3
sage: H < G
True
sage: H.is_subgroup(G)
True
sage: H < 5 #random (meaningless since it depends on memory layout)
False
sage: 5 < H #random (meaningless since it depends on memory layout)
True
The ambient varieties are compared:
sage: cmp(A[0].cuspidal_subgroup(), J0(11).cuspidal_subgroup())
1
Comparing subgroups sitting in different abelian varieties:
sage: cmp(A[0].cuspidal_subgroup(), A[1].cuspidal_subgroup())
-1
Returns True if x is contained in this finite subgroup.
EXAMPLES: We define two distinct finite subgroups of
:
sage: G1 = J0(27).rational_cusp_subgroup(); G1
Finite subgroup with invariants [3] over QQ of Abelian variety J0(27) of dimension 1
sage: G1.0
[(1/3, 0)]
sage: G2 = J0(27).cuspidal_subgroup(); G2
Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(27) of dimension 1
sage: G2.gens()
[[(1/3, 0)], [(0, 1/3)]]
Now we check whether various elements are in and
:
sage: G2.0 in G1
True
sage: G2.1 in G1
False
sage: G1.0 in G1
True
sage: G1.0 in G2
True
The integer is in, since it coerces in:
sage: 0 in G1
True
Elements that have a completely different ambient product Jacobian
are never in :
sage: J0(23).cuspidal_subgroup().0 in G1
False
sage: J0(23).cuspidal_subgroup()(0) in G1
False
A finite subgroup of a modular abelian variety.
INPUT:
EXAMPLES: This is an abstract base class, so there are no instances of this class itself.
sage: A = J0(37)
sage: G = A.torsion_subgroup(3); G
Finite subgroup with invariants [3, 3, 3, 3] over QQ of Abelian variety J0(37) of dimension 2
sage: type(G)
<class 'sage.modular.abvar.finite_subgroup.FiniteSubgroup_lattice'>
sage: from sage.modular.abvar.finite_subgroup import FiniteSubgroup
sage: isinstance(G, FiniteSubgroup)
True
Multiply this subgroup by the rational number right.
If right is an integer the result is a subgroup of self. If right
is a rational number , then this group is first
divided by
then multiplied by
.
INPUT:
OUTPUT: a subgroup
EXAMPLES:
sage: J = J0(37)
sage: H = J.cuspidal_subgroup(); H.order()
3
sage: G = H * 3; G.order()
1
sage: G = H * (1/2); G.order()
48
sage: J.torsion_subgroup(2) + H == G
True
sage: G = H*(3/2); G.order()
16
sage: J = J0(42)
sage: G = J.cuspidal_subgroup(); factor(G.order())
2^8 * 3^2
sage: (G * 3).order()
256
sage: (G * 0).order()
1
sage: (G * (1/5)).order()
22500000000
Multiply this finite subgroup on the left by an integer.
EXAMPLES:
sage: J = J0(42)
sage: G = J.cuspidal_subgroup(); factor(G.order())
2^8 * 3^2
sage: H = G.__rmul__(2)
sage: H.order().factor()
2^4 * 3^2
sage: 2*G
Finite subgroup with invariants [6, 24] over QQ of Abelian variety J0(42) of dimension 5
The string representation of the ‘invariants’ part of this group.
We make this a separate function so it is possible to create finite subgroups that don’t print their invariants, since printing them could be expensive.
EXAMPLES:
sage: J0(42).cuspidal_subgroup()._invariants_repr()
'with invariants [2, 2, 12, 48] '
Return matrix of this finite subgroup, but relative to the homology of the parent abelian variety.
EXAMPLES:
sage: A = J0(43)[1]; A
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
sage: C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [7] over QQ of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
sage: C._relative_basis_matrix()
[ 1 0 0 0]
[ 0 1/7 6/7 5/7]
[ 0 0 1 0]
[ 0 0 0 1]
Return string representation of this finite subgroup.
EXAMPLES:
sage: J = J0(42)
sage: G = J.torsion_subgroup(3); G._repr_()
'Finite subgroup with invariants [3, 3, 3, 3, 3, 3, 3, 3, 3, 3] over QQ of Abelian variety J0(42) of dimension 5'
Return the abelian variety that this is a finite subgroup of.
EXAMPLES:
sage: J = J0(42)
sage: G = J.rational_torsion_subgroup(); G
Torsion subgroup of Abelian variety J0(42) of dimension 5
sage: G.abelian_variety()
Abelian variety J0(42) of dimension 5
Return the exponent of this finite abelian group.
OUTPUT: Integer
EXAMPLES:
sage: t = J0(33).hecke_operator(7)
sage: G = t.kernel()[0]; G
Finite subgroup with invariants [2, 2, 2, 2, 4, 4] over QQ of Abelian variety J0(33) of dimension 3
sage: G.exponent()
4
Return the field over which this finite modular abelian variety subgroup is defined. This is a field over which this subgroup is defined.
EXAMPLES:
sage: J = J0(42)
sage: G = J.rational_torsion_subgroup(); G
Torsion subgroup of Abelian variety J0(42) of dimension 5
sage: G.field_of_definition()
Rational Field
Return generator of self.
EXAMPLES:
sage: J = J0(23)
sage: C = J.torsion_subgroup(3)
sage: C.gens()
[[(1/3, 0, 0, 0)], [(0, 1/3, 0, 0)], [(0, 0, 1/3, 0)], [(0, 0, 0, 1/3)]]
sage: C.gen(0)
[(1/3, 0, 0, 0)]
sage: C.gen(3)
[(0, 0, 0, 1/3)]
sage: C.gen(4)
...
IndexError: list index out of range
Negative indices wrap around:
sage: C.gen(-1)
[(0, 0, 0, 1/3)]
Return generators for this finite subgroup.
EXAMPLES: We list generators for several cuspidal subgroups:
sage: J0(11).cuspidal_subgroup().gens()
[[(0, 1/5)]]
sage: J0(37).cuspidal_subgroup().gens()
[[(0, 0, 0, 1/3)]]
sage: J0(43).cuspidal_subgroup().gens()
[[(0, 1/7, 0, 6/7, 0, 5/7)]]
sage: J1(13).cuspidal_subgroup().gens()
[[(1/19, 0, 0, 9/19)], [(0, 1/19, 1/19, 18/19)]]
sage: J0(22).torsion_subgroup(6).gens()
[[(1/6, 0, 0, 0)], [(0, 1/6, 0, 0)], [(0, 0, 1/6, 0)], [(0, 0, 0, 1/6)]]
Return the intersection of the finite subgroups self and other.
INPUT:
OUTPUT: a finite group
EXAMPLES:
sage: E11a0, E11a1, B = J0(33)
sage: G = E11a0.torsion_subgroup(6); H = E11a0.torsion_subgroup(9)
sage: G.intersection(H)
Finite subgroup with invariants [3, 3] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: W = E11a1.torsion_subgroup(15)
sage: G.intersection(W)
Finite subgroup with invariants [] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: E11a0.intersection(E11a1)[0]
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
We intersect subgroups of different abelian varieties.
sage: E11a0, E11a1, B = J0(33)
sage: G = E11a0.torsion_subgroup(5); H = E11a1.torsion_subgroup(5)
sage: G.intersection(H)
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: E11a0.intersection(E11a1)[0]
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
We intersect abelian varieties with subgroups:
sage: t = J0(33).hecke_operator(7)
sage: G = t.kernel()[0]; G
Finite subgroup with invariants [2, 2, 2, 2, 4, 4] over QQ of Abelian variety J0(33) of dimension 3
sage: A = J0(33).old_subvariety()
sage: A.intersection(G)
Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
sage: A.hecke_operator(7).kernel()[0]
Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
sage: B = J0(33).new_subvariety()
sage: B.intersection(G)
Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
sage: B.hecke_operator(7).kernel()[0]
Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
sage: A.intersection(B)[0]
Finite subgroup with invariants [3, 3] over QQ of Abelian subvariety of dimension 2 of J0(33)
Return elementary invariants of this abelian group, by which we
mean a nondecreasing (immutable) sequence of integers
,
, with
dividing
, and such that this group is abstractly
isomorphic to
EXAMPLES:
sage: J = J0(38)
sage: C = J.cuspidal_subgroup(); C
Finite subgroup with invariants [3, 45] over QQ of Abelian variety J0(38) of dimension 4
sage: v = C.invariants(); v
[3, 45]
sage: v[0] = 5
...
ValueError: object is immutable; please change a copy instead.
sage: type(v[0])
<type 'sage.rings.integer.Integer'>
sage: C * 3
Finite subgroup with invariants [15] over QQ of Abelian variety J0(38) of dimension 4
An example involving another cuspidal subgroup:
sage: C = J0(22).cuspidal_subgroup(); C
Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(22) of dimension 2
sage: C.lattice()
Free module of degree 4 and rank 4 over Integer Ring
Echelon basis matrix:
[1/5 1/5 4/5 0]
[ 0 1 0 0]
[ 0 0 1 0]
[ 0 0 0 1/5]
sage: C.invariants()
[5, 5]
Return True exactly if self is a subgroup of other, and both are defined as subgroups of the same ambient abelian variety.
EXAMPLES:
sage: C = J0(22).cuspidal_subgroup()
sage: H = C.subgroup([C.0])
sage: K = C.subgroup([C.1])
sage: H.is_subgroup(K)
False
sage: K.is_subgroup(H)
False
sage: K.is_subgroup(C)
True
sage: H.is_subgroup(C)
True
Return the lattice corresponding to this subgroup in the rational homology of the modular Jacobian product. The elements of the subgroup are represented by vectors in the ambient vector space (the rational homology), and this returns the lattice they span. EXAMPLES:
sage: J = J0(33); C = J[0].cuspidal_subgroup(); C
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: C.lattice()
Free module of degree 6 and rank 2 over Integer Ring
Echelon basis matrix:
[ 1/5 13/5 -2 -4/5 2 -1/5]
[ 0 3 -2 -1 2 0]
Return the order (number of elements) of this finite subgroup.
EXAMPLES:
sage: J = J0(42)
sage: C = J.cuspidal_subgroup()
sage: C.order()
2304
Return the subgroup of self spanned by the given generators, which all must be elements of self.
EXAMPLES:
sage: J = J0(23)
sage: G = J.torsion_subgroup(11); G
Finite subgroup with invariants [11, 11, 11, 11] over QQ of Abelian variety J0(23) of dimension 2
We create the subgroup of the 11-torsion subgroup of
generated by the first
-torsion
point:
sage: H = G.subgroup([G.0]); H
Finite subgroup with invariants [11] over QQbar of Abelian variety J0(23) of dimension 2
sage: H.invariants()
[11]
We can also create a subgroup from a list of objects that coerce into the ambient rational homology.
sage: H == G.subgroup([[1/11,0,0,0]])
True
A finite subgroup of a modular abelian variety that is defined by a given lattice.
INPUT:
EXAMPLES:
sage: J = J0(11)
sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
Return lattice that defines this finite subgroup.
EXAMPLES:
sage: J = J0(11)
sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
sage: G.lattice()
Free module of degree 2 and rank 2 over Integer Ring
Echelon basis matrix:
[1/3 0]
[ 0 1/5]
Compare self and right.
INPUT:
OUTPUT: -1, 0, or 1
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: cmp(G.0, G.1)
1
sage: cmp(G.0, G.0)
0
sage: 3*G.0 == 0
True
sage: 3*G.0 == 5*G.1
True
We make sure things that shouldn’t be equal aren’t:
sage: H = J0(14).finite_subgroup([[1/3,0]])
sage: G.0 == H.0
False
sage: cmp(G.0, H.0)
-1
sage: G.0
[(1/3, 0)]
sage: H.0
[(1/3, 0)]
An element of a finite subgroup of a modular abelian variety.
INPUT:
EXAMPLES: The following calls the TorsionPoint constructor implicitly:
sage: J = J0(11)
sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
sage: type(G.0)
<class 'sage.modular.abvar.finite_subgroup.TorsionPoint'>
Add two finite subgroup elements with the same parent. This is called implicitly by +.
INPUT:
OUTPUT: a TorsionPoint
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0._add_(G.1)
[(1/3, 1/5)]
sage: G.0 + G.1
[(1/3, 1/5)]
Right multiply a finite subgroup element by an integer.
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0._lmul_(2)
[(2/3, 0)]
sage: G.0 * 2
[(2/3, 0)]
Negate a finite subgroup element.
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0._neg_()
[(-1/3, 0)]
Return coordinates of this element in terms of basis for the integral homology of the containing abelian variety.
OUTPUT: vector
EXAMPLES:
sage: A = J0(43)[1]; A
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
sage: C = A.cuspidal_subgroup(); C
Finite subgroup with invariants [7] over QQ of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
sage: x = C.0; x
[(0, 1/7, 0, 6/7, 0, 5/7)]
sage: x._relative_element()
(0, 1/7, 6/7, 5/7)
Return string representation of this finite subgroup element. Since
they are represented as equivalences classes of rational homology
modulo integral homology, we represent an element corresponding to
in the rational homology by [v].
EXAMPLES:
sage: J = J0(11)
sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
sage: G.0._repr_()
'[(1/3, 0)]'
Left multiply a finite subgroup element by an integer.
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0._rmul_(2)
[(2/3, 0)]
sage: 2*G.0
[(2/3, 0)]
Subtract two finite subgroup elements with the same parent. This is called implicitly by +.
INPUT:
OUTPUT: a TorsionPoint
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0._sub_(G.1)
[(1/3, -1/5)]
sage: G.0 - G.1
[(1/3, -1/5)]
Return the additive order of this element.
EXAMPLES:
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]])
sage: G.0.additive_order()
3
sage: G.1.additive_order()
5
sage: (G.0 + G.1).additive_order()
15
sage: (3*G.0).additive_order()
1
Return an underlying QQ-vector space element that defines this element of a modular abelian variety. This is a vector in the ambient Jacobian variety’s rational homology.
EXAMPLES: We create some elements of :
sage: J = J0(11)
sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
sage: G.0.element()
(1/3, 0)
The underlying element is a vector over the rational numbers:
sage: v = (G.0-G.1).element(); v
(1/3, -1/5)
sage: type(v)
<type 'sage.modules.vector_rational_dense.Vector_rational_dense'>