Module: sage.modular.abvar.finite_subgroup
Finite subgroups of modular abelian varieties
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.
Author: William Stein (2007-03)
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
Class: FiniteSubgroup
self, abvar, [field_of_definition=Rational Field]) |
A finite subgroup of a modular abelian variety.
Input:
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
Functions: abelian_variety,
exponent,
field_of_definition,
gen,
gens,
intersection,
invariants,
is_subgroup,
lattice,
order,
subgroup
self) |
Return the abelian variety that this is a finite subgroup of.
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
self) |
Return the exponent of this finite abelian group.
Output: Integer
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
self) |
Return the field over which this finite modular abelian variety subgroup is defined. This is a field over which this subgroup is defined.
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
self, n) |
Return
th generator of self.
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) Traceback (most recent call last): ... IndexError: list index out of range
Negative indices wrap around:
sage: C.gen(-1) [(0, 0, 0, 1/3)]
self) |
Return generators for this finite subgroup.
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)]]
self, other) |
Return the intersection of the finite subgroups self and other.
Input:
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)
self) |
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
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 Traceback (most recent call last): ... 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]
self, other) |
Return True exactly if self is a subgroup of other, and both are defined as subgroups of the same ambient abelian variety.
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
self) |
Return the lattice corresponding to this subgroup in the rational homology of the modular Jacobian product. The elements of the subgroup are represented by vecotors in the ambient vector space (the rational homology), and this returns the lattice they span.
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]
self) |
Return the order (number of elements) of this finite subgroup.
sage: J = J0(42) sage: C = J.cuspidal_subgroup() sage: C.order() 2304
self, gens) |
Return the subgroup of self spanned by the given generators, which all must be elements of self.
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
Special Functions: __add__,
__call__,
__cmp__,
__contains__,
__init__,
__mul__,
__rmul__,
_invariants_repr,
_relative_basis_matrix,
_repr_
self, other) |
Return the sum of two subgroups.
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
self, x) |
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).
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) Traceback (most recent call last): ... TypeError: x does not define an element of self
self, other) |
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).
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
self, x) |
Returns True if x is contained in this finite subgroup.
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 0 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
self, right) |
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:
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
self, left) |
Multiply this finite subgroup on the left by an integer.
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
self) |
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.
sage: J0(42).cuspidal_subgroup()._invariants_repr() 'with invariants [2, 2, 12, 48] '
self) |
Return matrix of this finite subgroup, but relative to the homology of the parent abelian variety.
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]
self) |
Return string representation of this finite subgroup.
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'
Class: FiniteSubgroup_lattice
self, abvar, lattice, [field_of_definition=Algebraic Field], [check=True]) |
A finite subgroup of a modular abelian variety that is defined by a given lattice.
Input:
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
Functions: lattice
self) |
Return lattice that defines this finite subgroup.
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]
Special Functions: __init__
Class: TorsionPoint
self, parent, element, [check=True]) |
An element of a finite subgroup of a modular abelian variety.
Input:
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'>
Functions: additive_order,
element
self) |
Return the additive order of this element.
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
self) |
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.
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'>
Special Functions: __cmp__,
__init__,
_add_,
_lmul_,
_neg_,
_relative_element,
_repr_,
_rmul_,
_sub_
self, right) |
Compare self and right.
Input:
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)]
self, other) |
Add two finite subgroup elements with the same parent. This is called implicitly by +.
Input:
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)]
self, right) |
Right multiply a finite subgroup element by an integer.
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)]
self) |
Negate a finite subgroup element.
sage: J = J0(11); G = J.finite_subgroup([[1/3,0], [0,1/5]]) sage: G.0._neg_() [(-1/3, 0)]
self) |
Return coordinates of this element in terms of basis for the integral homology of the containing abelian variety.
Output: vector
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)
self) |
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]
.
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)]'
self, left) |
Left multiply a finite subgroup element by an integer.
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)]
self, other) |
Subtract two finite subgroup elements with the same parent. This is called implicitly by +.
Input:
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)]