Module: sage.modular.abvar.abvar
Base class for modular abelian varieties
Author: William Stein (2007-03)
TESTS:
sage: A = J0(33) sage: D = A.decomposition(); D [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ] sage: loads(dumps(D)) == D True sage: loads(dumps(A)) == A True
Module-level Functions
M) |
Given an ambient modular symbols space, return complete factorization of it.
Input:
sage: M = ModularSymbols(33) sage: sage.modular.abvar.abvar.factor_modsym_space_new_factors(M) [[ Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field ], [ Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field ]]
M) |
Given a new space
of modular symbols, return the decomposition
into simple of
under the Hecke operators.
Input:
sage: M = ModularSymbols(37).cuspidal_subspace() sage: sage.modular.abvar.abvar.factor_new_space(M) [ Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 5 for Gamma_0(37) of weight 2 with sign 0 over Rational Field, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 5 for Gamma_0(37) of weight 2 with sign 0 over Rational Field ]
x) |
Return True if x is a modular abelian variety.
Input:
sage: is_ModularAbelianVariety(5) False sage: is_ModularAbelianVariety(J0(37)) True
Returning True is a statement about the data type not whether or not some abelian variety is modular:
sage: is_ModularAbelianVariety(EllipticCurve('37a')) False
M, factors) |
Append lattice information to the output of simple_factorization_of_modsym_space.
Input:
sage: M = ModularSymbols(33) sage: factors = sage.modular.abvar.abvar.simple_factorization_of_modsym_space(M, simple=False) sage: sage.modular.abvar.abvar.modsym_lattices(M, factors) [ (11, 0, None, Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field, Free module of degree 6 and rank 4 over Integer Ring Echelon basis matrix: [ 1 0 0 0 -1 2] [ 0 1 0 0 -1 1] [ 0 0 1 0 -2 2] [ 0 0 0 1 -1 -1]), (33, 0, None, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field, Free module of degree 6 and rank 2 over Integer Ring Echelon basis matrix: [ 1 0 0 -1 0 0] [ 0 0 1 0 1 -1]) ]
M, [t=None], [p=2]) |
Return a random Hecke operator acting on
, got by adding to
a random multiple of
Input:
sage: M = ModularSymbols(11).cuspidal_subspace() sage: t, p = sage.modular.abvar.abvar.random_hecke_operator(M) sage: p 3 sage: t, p = sage.modular.abvar.abvar.random_hecke_operator(M, t, p) sage: p 5
M, [simple=True]) |
Return factorization of
. If simple is False, return powers of
simples.
Input:
sage: M = ModularSymbols(33) sage: sage.modular.abvar.abvar.simple_factorization_of_modsym_space(M) [ (11, 0, 1, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field), (11, 0, 3, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field), (33, 0, 1, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field) ] sage: sage.modular.abvar.abvar.simple_factorization_of_modsym_space(M, simple=False) [ (11, 0, None, Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field), (33, 0, None, Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field) ]
f) |
Return the square root of the polynomial
.
NOTE: At some point something like this should be a member of the polynomial class. For now this is just used internally by some charpoly functions above.
sage: R.<x> = QQ[] sage: f = (x-1)*(x+2)*(x^2 + 1/3*x + 5) sage: f x^4 + 4/3*x^3 + 10/3*x^2 + 13/3*x - 10 sage: sage.modular.abvar.abvar.sqrt_poly(f^2) x^4 + 4/3*x^3 + 10/3*x^2 + 13/3*x - 10 sage: sage.modular.abvar.abvar.sqrt_poly(f) Traceback (most recent call last): ... ValueError: f must be a perfect square sage: sage.modular.abvar.abvar.sqrt_poly(2*f^2) Traceback (most recent call last): ... ValueError: f must be monic
Class: ModularAbelianVariety
self, groups, [lattice=None], [base_field=Rational Field], [is_simple=None], [newform_level=None], [isogeny_number=None], [number=None], [check=True]) |
Create a modular abelian variety with given level and base field.
Input:
sage: J0(23) Abelian variety J0(23) of dimension 2
Functions: lattice
self) |
Return the lattice that defines this abelan variety.
Output:
sage: A = (J0(11) * J0(37))[1]; A Simple abelian subvariety 37a(1,37) of dimension 1 of J0(11) x J0(37) sage: type(A) <class 'sage.modular.abvar.abvar.ModularAbelianVariety'> sage: A.lattice() Free module of degree 6 and rank 2 over Integer Ring Echelon basis matrix: [ 0 0 1 -1 1 0] [ 0 0 0 0 2 -1]
Special Functions: __init__
Class: ModularAbelianVariety_abstract
self, groups, base_field, [is_simple=None], [newform_level=None], [isogeny_number=None], [number=None], [check=True]) |
Abstract base class for modular abelian varieties.
Input:
One should not create an instance of this class, but we do so anyways here as an example.
sage: A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(37),), QQ) sage: type(A) <class 'sage.modular.abvar.abvar.ModularAbelianVariety_abstract'>
All hell breaks loose if you try to do anything with
:
sage: A Traceback (most recent call last): ... NotImplementedError: BUG -- lattice method must be defined in derived class
Functions: ambient_morphism,
ambient_variety,
base_extend,
base_field,
category,
change_ring,
complement,
cuspidal_subgroup,
decomposition,
degen_t,
degeneracy_map,
degree,
dimension,
direct_product,
dual,
endomorphism_ring,
finite_subgroup,
free_module,
groups,
hecke_operator,
hecke_polynomial,
homology,
in_same_ambient_variety,
integral_homology,
intersection,
is_ambient,
is_hecke_stable,
is_simple,
is_subvariety,
is_subvariety_of_ambient_jacobian,
isogeny_number,
label,
lattice,
level,
lseries,
modular_degree,
modular_kernel,
newform_label,
newform_level,
padic_lseries,
project_to_factor,
projection,
qbar_torsion_subgroup,
quotient,
rank,
rational_cusp_subgroup,
rational_homology,
rational_torsion_subgroup,
sturm_bound,
torsion_subgroup,
vector_space,
zero_subgroup,
zero_subvariety
self) |
Return the morphism from self to the ambient variety. This is injective if self is natural a subvariety of the ambient product Jacobian.
Output: morphism
The output is cached.
We compute the ambient structure morphism for an abelian
subvariety of
:
sage: A,B,C = J0(33) sage: phi = A.ambient_morphism() sage: phi.domain() Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33) sage: phi.codomain() Abelian variety J0(33) of dimension 3 sage: phi.matrix() [ 1 1 -2 0 2 -1] [ 0 3 -2 -1 2 0]
phi is of course injective
sage: phi.kernel() (Finite subgroup with invariants [] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Abelian subvariety of dimension 0 of J0(33))
This is the same as the basis matrix for the lattice corresponding to self:
sage: A.lattice() Free module of degree 6 and rank 2 over Integer Ring Echelon basis matrix: [ 1 1 -2 0 2 -1] [ 0 3 -2 -1 2 0]
We compute a non-injecture map to an ambient space:
sage: Q,pi = J0(33)/A sage: phi = Q.ambient_morphism() sage: phi.matrix() [ 1 4 1 9 -1 -1] [ 0 15 0 0 30 -75] [ 0 0 5 10 -5 15] [ 0 0 0 15 -15 30] sage: phi.kernel()[0] Finite subgroup with invariants [5, 15, 15] over QQ of Abelian variety factor of dimension 2 of J0(33)
self) |
Return the ambient modular abelian variety that contains this abelian variety. The ambient variety is always a product of Jacobians of modular curves.
Output: abelian variety
sage: A = J0(33)[0]; A Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33) sage: A.ambient_variety() Abelian variety J0(33) of dimension 3
self, K) |
sage: A = J0(37); A Abelian variety J0(37) of dimension 2 sage: A.base_extend(QQbar) Abelian variety J0(37) over Algebraic Field of dimension 2 sage: A.base_extend(GF(7)) Abelian variety J0(37) over Finite Field of size 7 of dimension 2
self) |
Synonym for self.base_ring()
.
sage: J0(11).base_field() Rational Field
self) |
Return the category of modular abelian varieties that contains this modular abelian variety.
sage: J0(23).category() Category of modular abelian varieties over Rational Field
self, R) |
Change the base ring of this modular abelian variety.
sage: A = J0(23) sage: A.change_ring(QQ) Abelian variety J0(23) of dimension 2
self, [A=None]) |
Return a complement of this abelian variety.
Input:
sage: a,b,c = J0(33) sage: (a+b).complement() Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) sage: (a+b).complement() == c True sage: a.complement(a+b) Abelian subvariety of dimension 1 of J0(33)
self) |
Return the cuspidal subgroup of this modular abelian variety. This is the subgroup generated by rational cusps.
sage: J = J0(54) sage: C = J.cuspidal_subgroup() 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.invariants() [3, 3, 3, 3, 3, 9] sage: J1(13).cuspidal_subgroup() Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2 sage: A = J0(33)[0] sage: A.cuspidal_subgroup() Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
self, [simple=True], [bound=None]) |
Return a sequence of abelian subvarieties of self that are all simple, have finite intersection and sum to self.
Input: simple- bool (default: True) if True, all factors are simple. If False, each factor returned is isogenous to a power of a simple and the simples in each factor are distinct.
sage: m = ModularSymbols(11).cuspidal_submodule() sage: d1 = m.degeneracy_map(33,1).matrix(); d3=m.degeneracy_map(33,3).matrix() sage: w = ModularSymbols(33).submodule((d1 + d3).image(), check=False) sage: A = w.abelian_variety(); A Abelian subvariety of dimension 1 of J0(33) sage: D = A.decomposition(); D [ Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) ] sage: D[0] == A True sage: B = A + J0(33)[0]; B Abelian subvariety of dimension 2 of J0(33) sage: dd = B.decomposition(simple=False); dd [ Abelian subvariety of dimension 2 of J0(33) ] sage: dd[0] == B True sage: dd = B.decomposition(); dd [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) ] sage: sum(dd) == B True
We decompose a product of two Jacobians:
sage: (J0(33) * J0(11)).decomposition() [ Simple abelian subvariety 11a(1,11) of dimension 1 of J0(33) x J0(11), Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33) x J0(11), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) x J0(11), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) x J0(11) ]
self, [none_if_not_known=False]) |
If this abelian variety is obtained via decomposition then it
gets labeled with the newform label along with some
information about degeneracy maps. In particular, the label
ends in a pair
, where
is the ambient level and
is an integer that divides the quotient of
by the newform
level. This function returns the tuple
, or raises a
ValueError if self isn't simple.
NOTE: It need not be the case that self is literally equal to
the image of the newform abelian variety under the
th
degeneracy map. See the documentation for the label method
for more details.
Input:
sage: D = J0(33).decomposition(); D [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ] sage: D[0].degen_t() (1, 33) sage: D[1].degen_t() (3, 33) sage: D[2].degen_t() (1, 33) sage: J0(33).degen_t() Traceback (most recent call last): ... ValueError: self must be simple
self, M_ls, t_ls) |
Return the degeneracy map with domain self and given level/parameter. If self.ambient_variety() is a product of Jacobians (as opposed to a single Jacobian), then one can provide a list of new levels and parameters, corresponding to the ambient Jacobians in order. (See the examples below.)
Input:
We make several degenerancy maps related to
and
and compute their matrices.
sage: d1 = J0(11).degeneracy_map(33, 1); d1 Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [1] sage: d1.matrix() [ 0 -3 2 1 -2 0] [ 1 -2 0 1 0 -1] sage: d2 = J0(11).degeneracy_map(33, 3); d2 Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [3] sage: d2.matrix() [-1 0 0 0 1 -2] [-1 -1 1 -1 1 0] sage: d3 = J0(33).degeneracy_map(11, 1); d3 Degeneracy map from Abelian variety J0(33) of dimension 3 to Abelian variety J0(11) of dimension 1 defined by [1]
He we verify that first mapping from level
to level
, then
back is multiplication by
:
sage: d1.matrix() * d3.matrix() [4 0] [0 4]
We compute a more complciated degeneracy map involving nontrivial product ambient Jacobians; note that this is just the block direct sum of the two matrices at the beginning of this example:
sage: d = (J0(11)*J0(11)).degeneracy_map([33,33], [1,3]); d Degeneracy map from Abelian variety J0(11) x J0(11) of dimension 2 to Abelian variety J0(33) x J0(33) of dimension 6 defined by [1, 3] sage: d.matrix() [ 0 -3 2 1 -2 0 0 0 0 0 0 0] [ 1 -2 0 1 0 -1 0 0 0 0 0 0] [ 0 0 0 0 0 0 -1 0 0 0 1 -2] [ 0 0 0 0 0 0 -1 -1 1 -1 1 0]
self) |
Return the degree of this abelian variety, which is the dimension of the ambient Jacobian product.
sage: A = J0(23) sage: A.dimension() 2
self) |
Return the dimension of this abelian variety.
sage: A = J0(23) sage: A.dimension() 2
self, other) |
Compute the direct product of self and other.
Input:
sage: J0(11).direct_product(J1(13)) Abelian variety J0(11) x J1(13) of dimension 3 sage: A = J0(33)[0].direct_product(J0(33)[1]); A Abelian subvariety of dimension 2 of J0(33) x J0(33) sage: A.lattice() Free module of degree 12 and rank 4 over Integer Ring Echelon basis matrix: [ 1 1 -2 0 2 -1 0 0 0 0 0 0] [ 0 3 -2 -1 2 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 1 0 0 0 -1 2] [ 0 0 0 0 0 0 0 1 -1 1 0 -2]
self) |
Return the dual of this abelian variety.
Output: abelian variety
WARNING: This is currently only implemented when self is an abelian subvariety of the ambient Jacobian product, and the complement of self in the ambient product Jacobian share no common factors. A more general implementation will require implementing computation of the intersection pairing on integral homology and the resulting Weil pairing on torsion.
We compute the dual of the elliptic curve newform abelian
variety of level
, and find the kernel of the modular map,
which has structure
.
sage: A,B,C = J0(33) sage: C Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) sage: Cd, f = C.dual() sage: f.matrix() [3 0] [0 3] sage: f.kernel()[0] Finite subgroup with invariants [3, 3] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
By a theorem the modular degree must thus be
:
sage: E = EllipticCurve('33a') sage: E.modular_degree() 3
Next we compute the dual of a
-dimensional new simple
abelian subvariety of
.
sage: A = AbelianVariety('43b'); A Newform abelian subvariety 43b of dimension 2 of J0(43) sage: Ad, f = A.dual()
The kernel shows that the modular degree is
:
sage: f.kernel()[0] Finite subgroup with invariants [2, 2] over QQ of Newform abelian subvariety 43b of dimension 2 of J0(43)
Unfortunately, the dual is not implemented in general:
sage: A = J0(22)[0]; A Simple abelian subvariety 11a(1,22) of dimension 1 of J0(22) sage: A.dual() Traceback (most recent call last): ... NotImplementedError: dual not implemented unless complement shares no simple factors with self.
self) |
Return the endomorphism ring of self.
Output: b = self.sturm_bound()
We compute a few endomorphism rings:
sage: J0(11).endomorphism_ring() Endomorphism ring of Abelian variety J0(11) of dimension 1 sage: J0(37).endomorphism_ring() Endomorphism ring of Abelian variety J0(37) of dimension 2 sage: J0(33)[2].endomorphism_ring() Endomorphism ring of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
No real computation is done:
sage: J1(123456).endomorphism_ring() Endomorphism ring of Abelian variety J1(123456) of dimension 423185857
self, X, [field_of_definition=None], [check=True]) |
Return a finite subgroup of this modular abelian variety.
Input:
sage: J = J0(11) sage: J.finite_subgroup([[1/5,0], [0,1/3]]) Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
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: J.finite_subgroup([[0,0,0,0,0,1/6]]) Finite subgroup with invariants [6] over QQbar of Abelian variety J0(33) of dimension 3 sage: J.finite_subgroup(C) Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
self) |
Synonym for self.lattice()
.
Output:
a free module over
sage: J0(37).free_module() Ambient free module of rank 4 over the principal ideal domain Integer Ring sage: J0(37)[0].free_module() Free module of degree 4 and rank 2 over Integer Ring Echelon basis matrix: [ 1 -1 1 0] [ 0 0 2 -1]
self) |
Return an ordered tuple of the congruence subgroups that the ambient product Jacobian is attached to.
Every modular abelian variety is a finite quotient of an
abelian subvariety of a product of modular Jacobians
. This function returns a tuple containing the
groups
.
sage: A = (J0(37) * J1(13))[0]; A Simple abelian subvariety 13aG1(1,13) of dimension 2 of J0(37) x J1(13) sage: A.groups() (Congruence Subgroup Gamma0(37), Congruence Subgroup Gamma1(13))
self, n) |
Return the
-th Hecke operator on the modular abelian
variety, if this makes sense [[elaborate]]. Otherwise raise a
ValueError.
We compute
on
.
sage: t2 = J0(37).hecke_operator(2); t2 Hecke operator T_2 on Abelian variety J0(37) of dimension 2 sage: t2.charpoly().factor() x * (x + 2) sage: t2.index() 2
Note that there is no matrix associated to Hecke operators on modular abelian varieties. For a matrix, instead consider, e.g., the Hecke operator on integral or rational homology.
sage: t2.action_on_homology().matrix() [-1 1 1 -1] [ 1 -1 1 0] [ 0 0 -2 1] [ 0 0 0 0]
self, n, [var=x]) |
Return the characteristic polynomial of the
th Hecke
operator
acting on self. Raises an ArithmeticError if
self is not Hecke equivariant.
Input:
sage: J0(33).hecke_polynomial(2) x^3 + 3*x^2 - 4 sage: f = J0(33).hecke_polynomial(2, 'y'); f y^3 + 3*y^2 - 4 sage: f.parent() Univariate Polynomial Ring in y over Rational Field sage: J0(33)[2].hecke_polynomial(3) x + 1 sage: J0(33)[0].hecke_polynomial(5) x - 1 sage: J0(33)[0].hecke_polynomial(11) x - 1 sage: J0(33)[0].hecke_polynomial(3) Traceback (most recent call last): ... ArithmeticError: subspace is not invariant under matrix
self, [base_ring=Integer Ring]) |
Return the homology of this modular abelian variety.
WARNING: For efficiency reasons the basis of the integral homology need not be the same as the basis for the rational homology.
sage: J0(389).homology(GF(7)) Homology with coefficients in Finite Field of size 7 of Abelian variety J0(389) of dimension 32 sage: J0(389).homology(QQ) Rational Homology of Abelian variety J0(389) of dimension 32 sage: J0(389).homology(ZZ) Integral Homology of Abelian variety J0(389) of dimension 32
self, other) |
Return True if self and other are abelian subvarieties of the same ambient product Jacobian.
sage: A,B,C = J0(33) sage: A.in_same_ambient_variety(B) True sage: A.in_same_ambient_variety(J0(11)) False
self) |
Return the integral homology of this modular abelian variety.
sage: H = J0(43).integral_homology(); H Integral Homology of Abelian variety J0(43) of dimension 3 sage: H.rank() 6 sage: H = J1(17).integral_homology(); H Integral Homology of Abelian variety J1(17) of dimension 5 sage: H.rank() 10
If you just ask for the rank of the homology, no serious calculations are done, so the following is fast:
sage: H = J0(50000).integral_homology(); H Integral Homology of Abelian variety J0(50000) of dimension 7351 sage: H.rank() 14702
A product:
sage: H = (J0(11) * J1(13)).integral_homology() sage: H.hecke_operator(2) Hecke operator T_2 on Integral Homology of Abelian variety J0(11) x J1(13) of dimension 3 sage: H.hecke_operator(2).matrix() [-2 0 0 0 0 0] [ 0 -2 0 0 0 0] [ 0 0 -2 0 -1 1] [ 0 0 1 -1 0 -1] [ 0 0 1 1 -2 0] [ 0 0 0 1 -1 -1]
self, other) |
Returns the intersection of self and other inside a common ambient Jacobian product.
Input:
We intersect some abelian varieties with finite intersection.
sage: J = J0(37) sage: J[0].intersection(J[1]) (Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37), Simple abelian subvariety of dimension 0 of J0(37))
sage: D = list(J0(65)); D [Simple abelian subvariety 65a(1,65) of dimension 1 of J0(65), Simple abelian subvariety 65b(1,65) of dimension 2 of J0(65), Simple abelian subvariety 65c(1,65) of dimension 2 of J0(65)] sage: D[0].intersection(D[1]) (Finite subgroup with invariants [2] over QQ of Simple abelian subvariety 65a(1,65) of dimension 1 of J0(65), Simple abelian subvariety of dimension 0 of J0(65)) sage: (D[0]+D[1]).intersection(D[1]+D[2]) (Finite subgroup with invariants [2] over QQbar of Abelian subvariety of dimension 3 of J0(65), Abelian subvariety of dimension 2 of J0(65))
sage: J = J0(33) sage: J[0].intersection(J[1]) (Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety of dimension 0 of J0(33))
Next we intersect two abelian varieties with non-finite intersection:
sage: J = J0(67); D = J.decomposition(); D [ Simple abelian subvariety 67a(1,67) of dimension 1 of J0(67), Simple abelian subvariety 67b(1,67) of dimension 2 of J0(67), Simple abelian subvariety 67c(1,67) of dimension 2 of J0(67) ] sage: (D[0] + D[1]).intersection(D[1] + D[2]) (Finite subgroup with invariants [5, 10] over QQbar of Abelian subvariety of dimension 3 of J0(67), Abelian subvariety of dimension 2 of J0(67))
self) |
Return True if self equals the ambient product Jacobian.
Output: bool
sage: A,B,C = J0(33) sage: A.is_ambient() False sage: J0(33).is_ambient() True sage: (A+B).is_ambient() False sage: (A+B+C).is_ambient() True
self) |
Return True if self is stable under the Hecke operators of its ambient Jacobian.
Output: bool
sage: J0(11).is_hecke_stable() True sage: J0(33)[2].is_hecke_stable() True sage: J0(33)[0].is_hecke_stable() False sage: (J0(33)[0] + J0(33)[1]).is_hecke_stable() True
self, [none_if_not_known=False]) |
Return whether or not this modular abelian variety is simple, i.e., has no proper nonzero abelian subvarieties.
Input:
sage: J0(5).is_simple(none_if_not_known=True) is None # this may fail if J0(5) comes up elsewhere... True sage: J0(33).is_simple() False sage: J0(33).is_simple(none_if_not_known=True) False sage: J0(33)[1].is_simple() True sage: J1(17).is_simple() False
self, other) |
Return True if self is a subvariety of other as they sit in a common ambient modular Jacobian. In particular, this function will only return True if self and other have exactly the same ambient Jacobians.
sage: J = J0(37); J Abelian variety J0(37) of dimension 2 sage: A = J[0]; A Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37) sage: A.is_subvariety(A) True sage: A.is_subvariety(J) True
self) |
Return True if self is (presented as) a subvariety of the ambient product Jacobian.
Every abelian variety in Sage is a quotient of a subvariety of an ambient Jacobian product by a finite subgroup.
sage: J0(33).is_subvariety_of_ambient_jacobian() True sage: A = J0(33)[0]; A Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33) sage: A.is_subvariety_of_ambient_jacobian() True sage: B, phi = A / A.torsion_subgroup(2) sage: B Abelian variety factor of dimension 1 of J0(33) sage: phi.matrix() [2 0] [0 2] sage: B.is_subvariety_of_ambient_jacobian() False
self, [none_if_not_known=False]) |
Return the number (starting at 0) of the isogeny class of new simple abelian varieties that self is in. If self is not simple, raises a ValueError exception.
Input:
We test the none_if_not_known flag first:
sage: J0(33).isogeny_number(none_if_not_known=True) is None True
Of course,
is not simple, so this function raises a
ValueError:
sage: J0(33).isogeny_number() Traceback (most recent call last): ... ValueError: self must be simple
Each simple factor has isogeny number 1, since that's the number at which the factor is new.
sage: J0(33)[1].isogeny_number() 0 sage: J0(33)[2].isogeny_number() 0
Next consider
where there are two distinct newform
factors:
sage: J0(37)[1].isogeny_number() 1
self) |
Return the label associated to this modular abelian variety.
The format of the label is [level][isogeny class][group](t, ambient level)
If this abelian variety
has the above label, this implies
only that
is isogenous to the newform abelan variety
associated to the newform with label [level][isogeny
class][group]. The [group] is empty for
, is G1
for
and is GH[...] for
.
WARNING: The sum of
for all
contains
, but no sum for a proper divisor of
contains
. It
need not be the case that
is equal to
!!!
Output: string
sage: J0(11).label() '11a(1,11)' sage: J0(11)[0].label() '11a(1,11)' sage: J0(33)[2].label() '33a(1,33)' sage: J0(22).label() Traceback (most recent call last): ... ValueError: self must be simple
We illustrate that self need not equal
:
sage: J = J0(11); phi = J.degeneracy_map(33, 1) + J.degeneracy_map(33,3) sage: B = phi.image(); B Abelian subvariety of dimension 1 of J0(33) sage: B.decomposition() [ Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) ] sage: C = J.degeneracy_map(33,3).image(); C Abelian subvariety of dimension 1 of J0(33) sage: C == B False
self) |
Return lattice in ambient cuspidal modular symbols product that defines this modular abelian variety.
This must be defined in each derived class.
Output:
a free module over
sage: A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(37),), QQ) sage: A Traceback (most recent call last): ... NotImplementedError: BUG -- lattice method must be defined in derived class
self) |
Return the level of this modular abelian variety, which is an
integer N (usually minimal) such that this modular abelian
variety is a quotient of
. In the case that the
ambient variety of self is a product of Jacobians, return the
LCM of their levels.
sage: J1(5077).level() 5077 sage: JH(389,[4]).level() 389 sage: (J0(11)*J0(17)).level() 187
self) |
Return the complex
-series of this modular abelian variety.
sage: A = J0(37) sage: A.lseries() Complex L-series attached to Abelian variety J0(37) of dimension 2
self) |
Return the modular degree of this abelian variety, which is the square root of the degree of the modular kernel.
sage: A = AbelianVariety('37a') sage: A.modular_degree() 2
self) |
Return the modular kernel of this abelian variety, which is the kernel of the canonical polarization of self.
sage: A = AbelianVariety('33a'); A Newform abelian subvariety 33a of dimension 1 of J0(33) sage: A.modular_kernel() Finite subgroup with invariants [3, 3] over QQ of Newform abelian subvariety 33a of dimension 1 of J0(33)
self) |
Return the label [level][isogeny class][group] of the newform
such that this abelian variety is isogenous to the newform
abelian variety
. If this abelian variety is not simple,
raise a ValueError.
Output: string
sage: J0(11).newform_label() '11a' sage: J0(33)[2].newform_label() '33a'
The following fails since
is not simple:
sage: J0(33).newform_label() Traceback (most recent call last): ... ValueError: self must be simple
self, [none_if_not_known=False]) |
Write self as a product (up to isogeny) of newform abelian
varieties
. Then this function return the least common
multiple of the levels of the newforms
, along with the
corresponding group or list of groups (the groups do not
appear with multiplicity).
Input:
sage: J0(33)[0].newform_level() (11, Congruence Subgroup Gamma0(33)) sage: J0(33)[0].newform_level(none_if_not_known=True) (11, Congruence Subgroup Gamma0(33))
Here there are multiple groups since there are in fact multiple newforms:
sage: (J0(11) * J1(13)).newform_level() (143, [Congruence Subgroup Gamma0(11), Congruence Subgroup Gamma1(13)])
self, p) |
Return the
-adic
-series of this modular abelian
variety.
sage: A = J0(37) sage: A.padic_lseries(7) 7-adic L-series attached to Abelian variety J0(37) of dimension 2
self, n) |
If self is an ambient product of Jacobians, return a projection from self to the nth such Jacobian.
sage: J = J0(33) sage: J.project_to_factor(0) Abelian variety endomorphism of Abelian variety J0(33) of dimension 3
sage: J = J0(33) * J0(37) * J0(11) sage: J.project_to_factor(2) Abelian variety morphism: From: Abelian variety J0(33) x J0(37) x J0(11) of dimension 6 To: Abelian variety J0(11) of dimension 1 sage: J.project_to_factor(2).matrix() [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [0 0] [1 0] [0 1]
self, A, [check=True]) |
Given an abelian subvariety A of self, return a projection morphism from self to A. Note that this morphism need not be unique.
Input:
sage: a,b,c = J0(33) sage: pi = J0(33).projection(a); pi.matrix() [ 3 -2] [-5 5] [-4 1] [ 3 -2] [ 5 0] [ 1 1] sage: pi = (a+b).projection(a); pi.matrix() [ 0 0] [-3 2] [-4 1] [-1 -1] sage: pi = a.projection(a); pi.matrix() [1 0] [0 1]
We project onto a factor in a product of two Jacobians:
sage: A = J0(11)*J0(11); A Abelian variety J0(11) x J0(11) of dimension 2 sage: A[0] Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(11) sage: A.projection(A[0]) Abelian variety morphism: From: Abelian variety J0(11) x J0(11) of dimension 2 To: Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(11) sage: A.projection(A[0]).matrix() [0 0] [0 0] [1 0] [0 1] sage: A.projection(A[1]).matrix() [1 0] [0 1] [0 0] [0 0]
self) |
Return the group of all points of finite order in the algebraic closure of this abelian variety.
sage: T = J0(33).qbar_torsion_subgroup(); T Group of all torsion points in QQbar on Abelian variety J0(33) of dimension 3
The field of definition is the same as the base field of the abelian variety.
sage: T.field_of_definition() Rational Field
On the other hand, T is a module over
.
sage: T.base_ring() Integer Ring
self, other) |
Compute the quotient of self and other, where other is either an abelian subvariety of self or a finite subgroup of self.
Input:
We quotient
out by an abelian subvariety:
sage: Q, f = J0(33).quotient(J0(33)[0]) sage: Q Abelian variety factor of dimension 2 of J0(33) sage: f Abelian variety morphism: From: Abelian variety J0(33) of dimension 3 To: Abelian variety factor of dimension 2 of J0(33)
We quotient
by the cuspidal subgroup:
sage: C = J0(33).cuspidal_subgroup() sage: Q, f = J0(33).quotient(C) sage: Q Abelian variety factor of dimension 3 of J0(33) sage: f.kernel()[0] Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3 sage: C Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3 sage: J0(11).direct_product(J1(13)) Abelian variety J0(11) x J1(13) of dimension 3
self) |
Return the rank of the underlying lattice of self.
sage: J = J0(33) sage: J.rank() 6 sage: J[1] Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) sage: (J[1] * J[1]).rank() 4
self) |
Return the subgroup of this modular abelian variety generated by rational cusps.
This is a subgroup of the group of rational points in the cuspidal subgroup.
WARNING: This is only currently implemented for
.
sage: J = J0(54) sage: CQ = J.rational_cusp_subgroup(); CQ Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4 sage: CQ.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: factor(CQ.order()) 3^4 sage: CQ.invariants() [3, 3, 9]
In this example the rational cuspidal subgroup and the cuspidal subgroup differ by a lot.
sage: J = J0(49) sage: J.cuspidal_subgroup() Finite subgroup with invariants [2, 14] over QQ of Abelian variety J0(49) of dimension 1 sage: J.rational_cusp_subgroup() Finite subgroup with invariants [2] over QQ of Abelian variety J0(49) of dimension 1
Note that computation of the rational cusp subgroup isn't
implemented for
.
sage: J = J1(13) sage: J.cuspidal_subgroup() Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2 sage: J.rational_cusp_subgroup() Traceback (most recent call last): ... NotImplementedError: computation of rational cusps only implemented in Gamma0 case.
self) |
Return the rational homology of this modular abelian variety.
sage: H = J0(37).rational_homology(); H Rational Homology of Abelian variety J0(37) of dimension 2 sage: H.rank() 4 sage: H.base_ring() Rational Field sage: H = J1(17).rational_homology(); H Rational Homology of Abelian variety J1(17) of dimension 5 sage: H.rank() 10 sage: H.base_ring() Rational Field
self) |
Return the maximal torsion subgroup of self defined over QQ.
sage: J = J0(33) sage: A = J.new_subvariety() sage: A Abelian subvariety of dimension 1 of J0(33) sage: t = A.rational_torsion_subgroup() sage: t.multiple_of_order() 4 sage: t.divisor_of_order() 4 sage: t.order() 4 sage: t.gens() [[(1/2, 0, 0, -1/2, 0, 0)], [(0, 0, 1/2, 0, 1/2, -1/2)]] sage: t Torsion subgroup of Abelian subvariety of dimension 1 of J0(33)
self) |
Return a bound
such that all Hecke operators
for
generate the Hecke algebra.
Output: integer
sage: J0(11).sturm_bound() 2 sage: J0(33).sturm_bound() 8 sage: J1(17).sturm_bound() 48 sage: J1(123456).sturm_bound() 1693483008 sage: JH(37,[2,3]).sturm_bound() 7 sage: J1(37).sturm_bound() 252
self, n) |
If n is an integer, return the subgroup of points of order n.
Return the
-torsion subgroup of elements of order dividing
of this modular abelian variety
, i.e., the group
.
sage: J1(13).torsion_subgroup(19) Finite subgroup with invariants [19, 19, 19, 19] over QQ of Abelian variety J1(13) of dimension 2
sage: A = J0(23) sage: G = A.torsion_subgroup(5); G Finite subgroup with invariants [5, 5, 5, 5] over QQ of Abelian variety J0(23) of dimension 2 sage: G.order() 625 sage: G.gens() [[(1/5, 0, 0, 0)], [(0, 1/5, 0, 0)], [(0, 0, 1/5, 0)], [(0, 0, 0, 1/5)]] sage: A = J0(23) sage: A.torsion_subgroup(2).order() 16
self) |
Return vector space corresponding to the modular abelian variety.
This is the lattice tensored with
.
sage: J0(37).vector_space() Vector space of dimension 4 over Rational Field sage: J0(37)[0].vector_space() Vector space of degree 4 and dimension 2 over Rational Field Basis matrix: [ 1 -1 0 1/2] [ 0 0 1 -1/2]
self) |
Return the zero subgroup of this modular abelian variety, as a finite group.
sage: A =J0(54); G = A.zero_subgroup(); G Finite subgroup with invariants [] over QQ of Abelian variety J0(54) of dimension 4 sage: G.is_subgroup(A) True
self) |
Return the zero subvariety of self.
sage: J = J0(37) sage: J.zero_subvariety() Simple abelian subvariety of dimension 0 of J0(37) sage: J.zero_subvariety().level() 37 sage: J.zero_subvariety().newform_level() (1, [])
Special Functions: __add__,
__cmp__,
__contains__,
__div__,
__getitem__,
__getslice__,
__init__,
__mul__,
__pow__,
__radd__,
_ambient_cuspidal_subgroup,
_ambient_dimension,
_ambient_hecke_matrix_on_modular_symbols,
_ambient_latex_repr,
_ambient_lattice,
_ambient_modular_symbols_abvars,
_ambient_modular_symbols_spaces,
_ambient_repr,
_classify_ambient_factors,
_complement_shares_no_factors_with_same_label,
_compute_hecke_polynomial,
_factors_with_same_label,
_Hom_,
_integral_hecke_matrix,
_isogeny_to_newform_abelian_variety,
_isogeny_to_product_of_powers,
_isogeny_to_product_of_simples,
_quotient_by_abelian_subvariety,
_quotient_by_finite_subgroup,
_rational_hecke_matrix,
_rational_homology_space,
_repr_,
_simple_isogeny
self, other) |
Returns the sum of the images of self and other inside the ambient Jacobian product. self and other must be abelian subvarieties of the ambient Jacobian product.
WARNING: The sum of course only makes sense in some ambient variety, and by definition this function takes the sum of the images of both self and other in the ambient product Jacobian.
We compute the sum of two abelian varieties of
:
sage: J = J0(33) sage: J[0] + J[1] Abelian subvariety of dimension 2 of J0(33)
We sum all three and get the full
:
sage: (J[0] + J[1]) + (J[1] + J[2]) Abelian variety J0(33) of dimension 3
Adding to zero works:
sage: J[0] + 0 Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
Hence the sum command works:
sage: sum([J[0], J[2]]) Abelian subvariety of dimension 2 of J0(33)
We try to add something in
to something in
; this shouldn't and doesn't work.
sage: J[0] + J0(11) Traceback (most recent call last): ... TypeError: sum not defined since ambient spaces different
We compute the diagonal image of
in
, then
add the result to the new elliptic curve of level
.
sage: A = J0(11) sage: B = (A.degeneracy_map(33,1) + A.degeneracy_map(33,3)).image() sage: B + J0(33)[2] Abelian subvariety of dimension 2 of J0(33)
self, other) |
Compare two modular abelian varieties.
If other is not a modular abelian variety, compares the types of self and other. If other is a modular abelian variety, compares the groups, then if those are the same, compares the newform level and isogeny class number and degeneracy map numbers. If those are not defined or matched up, compare the underlying lattices.
sage: cmp(J0(37)[0], J0(37)[1]) -1 sage: cmp(J0(33)[0], J0(33)[1]) -1 sage: cmp(J0(37), 5) #random 1
self, x) |
Determine whether or not self contains x.
sage: J = J0(67); G = (J[0] + J[1]).intersection(J[1] + J[2]) sage: G[0] Finite subgroup with invariants [5, 10] over QQbar of Abelian subvariety of dimension 3 of J0(67) sage: a = G[0].0; a [(1/10, 1/10, 3/10, 1/2, 1, -2, -3, 33/10, 0, -1/2)] sage: a in J[0] False sage: a in (J[0]+J[1]) True sage: a in (J[1]+J[2]) True sage: C = G[1] # abelian variety in kernel sage: G[0].0 [(1/10, 1/10, 3/10, 1/2, 1, -2, -3, 33/10, 0, -1/2)] sage: 5*G[0].0 [(1/2, 1/2, 3/2, 5/2, 5, -10, -15, 33/2, 0, -5/2)] sage: 5*G[0].0 in C True
self, other) |
Compute the quotient of self and other, where other is either an abelian subvariety of self or a finite subgroup of self.
Input:
Quotient out by a finite group:
sage: J = J0(67); G = (J[0] + J[1]).intersection(J[1] + J[2]) sage: Q, _ = J/G[0]; Q Abelian variety factor of dimension 5 of J0(67) over Algebraic Field sage: Q.base_field() Algebraic Field sage: Q.lattice() Free module of degree 10 and rank 10 over Integer Ring Echelon basis matrix: [1/10 1/10 3/10 1/2 0 0 0 3/10 0 1/2] [ 0 1/5 4/5 4/5 0 0 0 0 0 3/5] ...
Quotient out by an abelian subvariety:
sage: A, B, C = J0(33) sage: Q, phi = J0(33)/A sage: Q Abelian variety factor of dimension 2 of J0(33) sage: phi.domain() Abelian variety J0(33) of dimension 3 sage: phi.codomain() Abelian variety factor of dimension 2 of J0(33) sage: phi.kernel() (Finite subgroup with invariants [2] over QQbar of Abelian variety J0(33) of dimension 3, Abelian subvariety of dimension 1 of J0(33)) sage: phi.kernel()[1] == A True
The abelian variety we quotient out by must be an abelian subvariety.
sage: Q = (A + B)/C; Q Traceback (most recent call last): ... TypeError: other must be a subgroup or abelian subvariety
self, i) |
Return the i-th decomposition factor of self.
sage: J = J0(389) sage: J.decomposition() [ Simple abelian subvariety 389a(1,389) of dimension 1 of J0(389), Simple abelian subvariety 389b(1,389) of dimension 2 of J0(389), Simple abelian subvariety 389c(1,389) of dimension 3 of J0(389), Simple abelian subvariety 389d(1,389) of dimension 6 of J0(389), Simple abelian subvariety 389e(1,389) of dimension 20 of J0(389) ] sage: J[2] Simple abelian subvariety 389c(1,389) of dimension 3 of J0(389) sage: J[-1] Simple abelian subvariety 389e(1,389) of dimension 20 of J0(389)
self, i, j) |
The slice i:j of decompositions of self.
sage: J = J0(125); J.decomposition() [ Simple abelian subvariety 125a(1,125) of dimension 2 of J0(125), Simple abelian subvariety 125b(1,125) of dimension 2 of J0(125), Simple abelian subvariety 125c(1,125) of dimension 4 of J0(125) ] sage: J[:2] [ Simple abelian subvariety 125a(1,125) of dimension 2 of J0(125), Simple abelian subvariety 125b(1,125) of dimension 2 of J0(125) ]
self, other) |
Compute the direct product of self and other.
Some modular Jacobians:
sage: J0(11) * J0(33) Abelian variety J0(11) x J0(33) of dimension 4 sage: J0(11) * J0(33) * J0(11) Abelian variety J0(11) x J0(33) x J0(11) of dimension 5
We multiply some factors of
:
sage: d = J0(65).decomposition() sage: d[0] * d[1] * J0(11) Abelian subvariety of dimension 4 of J0(65) x J0(65) x J0(11)
self, n) |
Return
th power of self.
Input:
sage: J = J0(37) sage: J^0 Simple abelian subvariety of dimension 0 of J0(37) sage: J^1 Abelian variety J0(37) of dimension 2 sage: J^1 is J True
self, other) |
Return other + self when other is 0. Otherwise raise a TypeError.
sage: int(0) + J0(37) Abelian variety J0(37) of dimension 2
self, [rational_only=False]) |
sage: (J1(13)*J0(11))._ambient_cuspidal_subgroup() Finite subgroup with invariants [19, 95] over QQ of Abelian variety J1(13) x J0(11) of dimension 3 sage: (J0(33))._ambient_cuspidal_subgroup() Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3 sage: (J0(33)*J0(33))._ambient_cuspidal_subgroup() Finite subgroup with invariants [10, 10, 10, 10] over QQ of Abelian variety J0(33) x J0(33) of dimension 6
self) |
Return the dimension of the ambient Jacobian product.
sage: A = J0(37) * J1(13); A Abelian variety J0(37) x J1(13) of dimension 4 sage: A._ambient_dimension() 4 sage: B = A[0]; B Simple abelian subvariety 13aG1(1,13) of dimension 2 of J0(37) x J1(13) sage: B._ambient_dimension() 4
This example is fast because it implicitly calls _ambient_dimension.
sage: J0(902834082394) Abelian variety J0(902834082394) of dimension 113064825881
self, n) |
Return block direct sum of the matrix of the Hecke operator
acting on each of the ambient modular symbols spaces.
Input:
sage: (J0(11) * J1(13))._ambient_hecke_matrix_on_modular_symbols(2) [-2 0 0 0 0 0] [ 0 -2 0 0 0 0] [ 0 0 -2 0 -1 1] [ 0 0 1 -1 0 -1] [ 0 0 1 1 -2 0] [ 0 0 0 1 -1 -1]
self) |
Return Latex representation of the ambient product.
Output: string
sage: (J0(11) * J0(33))._ambient_latex_repr() 'J_0(11) \cross J_0(33)'
self) |
Return free lattice of rank twice the degree of self. This is the lattice corresponding to the ambient product Jacobian.
Output: lattice
We compute the ambient lattice of a product:
sage: (J0(33)*J1(11))._ambient_lattice() Ambient free module of rank 8 over the principal ideal domain Integer Ring
We compute the ambient lattice of an abelian subvariety
, which is the same as the lattice for the
itself:
sage: A = J0(33)[0]; A._ambient_lattice() Ambient free module of rank 6 over the principal ideal domain Integer Ring sage: J0(33)._ambient_lattice() Ambient free module of rank 6 over the principal ideal domain Integer Ring
self) |
Return a tuple of the ambient modular symbols abelian varieties that make up the Jacobian product that contains self.
Output: tuple of modular symbols abelian varieties
sage: (J0(11) * J0(33))._ambient_modular_symbols_abvars() (Abelian variety J0(11) of dimension 1, Abelian variety J0(33) of dimension 3)
self) |
Return a tuple of the ambient cuspidal modular symbols spaces that make up the Jacobian product that contains self.
Output: tuple of cuspidal modular symbols spaces
sage: (J0(11) * J0(33))._ambient_modular_symbols_spaces() (Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field, Modular Symbols subspace of dimension 6 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field) sage: (J0(11) * J0(33)[0])._ambient_modular_symbols_spaces() (Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field, Modular Symbols subspace of dimension 6 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field)
self) |
Output: string
sage: (J0(33)*J1(11))._ambient_repr() 'J0(33) x J1(11)'
self, [simple=True], [bound=None]) |
This function implements the following algorithm, which produces data useful in finding a decomposition or complement of self.
Then one can show that self is isogenous to the sum of the
with
in the ``in'' list. Moreover, the sum of the
with
in the ``out'' list is a complement of self in
the ambient space.
Input:
sage: d1 = J0(11).degeneracy_map(33, 1); d1 Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [1] sage: d2 = J0(11).degeneracy_map(33, 3); d2 Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [3] sage: A = (d1 + d2).image(); A Abelian subvariety of dimension 1 of J0(33) sage: A._classify_ambient_factors() ([1], [0, 2], [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ])
self) |
Return True if no simple factor of self has the same newform_label as any factor in a Poincare complement of self in the ambient product Jacobian.
is made up of two non-isogenous elliptic curves:
sage: J0(37)[0]._complement_shares_no_factors_with_same_label() True
decomposes as a product of two isogenous elliptic
curves with a third nonisogenous curve:
sage: D = J0(33).decomposition(); D [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ] sage: D[0]._complement_shares_no_factors_with_same_label() False sage: (D[0]+D[1])._complement_shares_no_factors_with_same_label() True sage: D[2]._complement_shares_no_factors_with_same_label() True
This example illustrates the relevance of the ambient product Jacobian.
sage: D = (J0(11) * J0(11)).decomposition(); D [ Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(11), Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(11) ] sage: D[0]._complement_shares_no_factors_with_same_label() False
This example illustrates that it is the newform label, not the isogeny, class that matters:
sage: D = (J0(11)*J1(11)).decomposition(); D [ Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J1(11), Simple abelian subvariety 11aG1(1,11) of dimension 1 of J0(11) x J1(11) ] sage: D[0]._complement_shares_no_factors_with_same_label() True sage: D[0].newform_label() '11a' sage: D[1].newform_label() '11aG1'
self, n, [var=x]) |
Return the Hecke polynomial of index
in terms of the given
variable.
Input:
sage: A = J0(33)*J0(11) sage: A._compute_hecke_polynomial(2) x^4 + 5*x^3 + 6*x^2 - 4*x - 8
self, other) |
Given two modular abelian varieties self and other, this function returns a list of simple abelian subvarieties appearing in the decomposition of self that have the same newform labels. Each simple factor with a given newform label appears at most one.
Input:
sage: D = J0(33).decomposition(); D [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ] sage: D[0]._factors_with_same_label(D[1]) [Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)] sage: D[0]._factors_with_same_label(D[2]) [] sage: (D[0]+D[1])._factors_with_same_label(D[1] + D[2]) [Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)]
This illustrates that the multiplicities in the returned list are 1:
sage: (D[0]+D[1])._factors_with_same_label(J0(33)) [Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)]
This illustrates that the ambient product Jacobians do not have to be the same:
sage: (D[0]+D[1])._factors_with_same_label(J0(22)) [Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)]
This illustrates that the actual factor labels are relevant, not just the isogeny class.
sage: (D[0]+D[1])._factors_with_same_label(J1(11)) [] sage: J1(11)[0].newform_label() '11aG1'
self, B, [cat=None]) |
Input:
sage: J0(37)._Hom_(J1(37)) Space of homomorphisms from Abelian variety J0(37) of dimension 2 to Abelian variety J1(37) of dimension 40
self, n) |
Return the matrix of the Hecke operator
acting on the
integral homology of this modular abelian variety, if the
modular abelian variety is stable under
. Otherwise,
raise an ArithmeticError.
sage: A = J0(23) sage: t = A._integral_hecke_matrix(2); t [ 0 1 -1 0] [ 0 1 -1 1] [-1 2 -2 1] [-1 1 0 -1] sage: t.parent() Full MatrixSpace of 4 by 4 dense matrices over Integer Ring
self) |
Return an isogeny from self to an abelian variety
attached to a newform. If self is not simple (so that no such
isogeny exists), raise a ValueError.
sage: J0(22)[0]._isogeny_to_newform_abelian_variety() Abelian variety morphism: From: Simple abelian subvariety 11a(1,22) of dimension 1 of J0(22) To: Newform abelian subvariety 11a of dimension 1 of J0(11) sage: J = J0(11); phi = J.degeneracy_map(33, 1) + J.degeneracy_map(33,3) sage: A = phi.image() sage: A._isogeny_to_newform_abelian_variety().matrix() [-3 3] [ 0 -3]
self) |
Given an abelian variety
, return an isogeny
, where
each
is a power of a simple abelian variety. These
factors will be exactly those returned by
self.decomposition(simple=False).Note that this isogeny is not
unique.
sage: J = J0(33) ; D = J.decomposition(simple=False) ; len(D) 2 sage: phi = J._isogeny_to_product_of_powers() ; phi Abelian variety morphism: From: Abelian variety J0(33) of dimension 3 To: Abelian subvariety of dimension 3 of J0(33) x J0(33)
sage: J = J0(22) * J0(37) sage: J._isogeny_to_product_of_powers() Abelian variety morphism: From: Abelian variety J0(22) x J0(37) of dimension 4 To: Abelian subvariety of dimension 4 of J0(22) x J0(37) x J0(22) x J0(37) x J0(22) x J0(37)
self) |
Given an abelian variety
, return an isogeny
,
where each
is simple. Note that this isogeny is
not unique.
sage: J = J0(37) ; J.decomposition() [ Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37), Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37) ] sage: phi = J._isogeny_to_product_of_simples() ; phi Abelian variety morphism: From: Abelian variety J0(37) of dimension 2 To: Abelian subvariety of dimension 2 of J0(37) x J0(37) sage: J[0].intersection(J[1]) == phi.kernel() True
sage: J = J0(22) * J0(37) sage: J._isogeny_to_product_of_simples() Abelian variety morphism: From: Abelian variety J0(22) x J0(37) of dimension 4 To: Abelian subvariety of dimension 4 of J0(11) x J0(11) x J0(37) x J0(37)
self, B) |
Return the quotient of self by the abelian variety
. This
is used internally by the quotient and __div__ commmands.
Input:
We compute the new quotient of
.
sage: A = J0(33); B = A.old_subvariety() sage: Q, f = A._quotient_by_abelian_subvariety(B)
Note that the quotient happens to also be an abelian subvariety:
sage: Q Abelian subvariety of dimension 1 of J0(33) sage: Q.lattice() Free module of degree 6 and rank 2 over Integer Ring Echelon basis matrix: [ 1 0 0 -1 0 0] [ 0 0 1 0 1 -1] sage: f Abelian variety morphism: From: Abelian variety J0(33) of dimension 3 To: Abelian subvariety of dimension 1 of J0(33)
We verify that
is equal to the kernel of the quotient map.
sage: f.kernel()[1] == B True
Next we quotient
out by
itself:
sage: C, g = A._quotient_by_abelian_subvariety(Q)
The result is not a subvariety:
sage: C Abelian variety factor of dimension 2 of J0(33) sage: C.lattice() Free module of degree 6 and rank 4 over Integer Ring Echelon basis matrix: [ 1/3 0 0 2/3 -1 0] [ 0 1 0 0 -1 1] [ 0 0 1/3 0 -2/3 2/3] [ 0 0 0 1 -1 -1]
self, G) |
Return the quotient of self by the finite subgroup
. This
is used internally by the quotient and __div__ commmands.
Input:
We quotient the elliptic curve
out by its cuspidal
subgroup.
sage: A = J0(11) sage: G = A.cuspidal_subgroup(); G Finite subgroup with invariants [5] over QQ of Abelian variety J0(11) of dimension 1 sage: Q, f = A._quotient_by_finite_subgroup(G) sage: Q Abelian variety factor of dimension 1 of J0(11) sage: f Abelian variety morphism: From: Abelian variety J0(11) of dimension 1 To: Abelian variety factor of dimension 1 of J0(11)
We compute the finite kernel of
(hence the [0]) and note
that it equals the subgroup
that we quotiented out by:
sage: f.kernel()[0] == G True
self, n) |
Return the matrix of the Hecke operator
acting on the
rational homology
of this modular abelian variety,
if this action is defined. Otherwise, raise an
ArithmeticError.
sage: A = J0(23) sage: t = A._rational_hecke_matrix(2); t [ 0 1 -1 0] [ 0 1 -1 1] [-1 2 -2 1] [-1 1 0 -1] sage: t.parent() Full MatrixSpace of 4 by 4 dense matrices over Rational Field
self) |
Return the rational homology of this modular abelian variety.
sage: J = J0(11) sage: J._rational_homology_space() Vector space of dimension 2 over Rational Field
The result is cached:
sage: J._rational_homology_space() is J._rational_homology_space() True
self) |
Return string representation of this modular abelian variety.
This is just the generic base class, so it's unlikely to be called in practice.
sage: A = J0(23) sage: import sage.modular.abvar.abvar as abvar sage: abvar.ModularAbelianVariety_abstract._repr_(A) 'Abelian variety J0(23) of dimension 2'
sage: (J0(11) * J0(33))._repr_() 'Abelian variety J0(11) x J0(33) of dimension 4'
self, other) |
Given self and other, if both are simple, and correspond to the same newform with the same congruence subgroup, return an isogeny. Otherwise, raise a ValueError.
Input:
sage: J = J0(33); J Abelian variety J0(33) of dimension 3 sage: J[0]._simple_isogeny(J[1]) Abelian variety morphism: From: Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33) To: Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
The following illustrates how simple isogeny is only implemented when the ambients are the same:
sage: J[0]._simple_isogeny(J1(11)) Traceback (most recent call last): ... NotImplementedError: _simple_isogeny only implemented when both abelian variety have the same ambient product Jacobian
Class: ModularAbelianVariety_modsym
self, modsym, [lattice=None], [newform_level=None], [is_simple=None], [isogeny_number=None], [number=None], [check=True]) |
Modular abelian variety that corresponds to a Hecke stable space of cuspidal modular symbols.
We create a modular abelian variety attached to a space of modular symbols.
sage: M = ModularSymbols(23).cuspidal_submodule() sage: A = M.abelian_variety(); A Abelian variety J0(23) of dimension 2
Special Functions: __init__,
_modular_symbols
self) |
Return the modular symbols space that defines this modular abelian variety.
Output: space of modular symbols
sage: M = ModularSymbols(37).cuspidal_submodule() sage: A = M.abelian_variety(); A Abelian variety J0(37) of dimension 2 sage: A._modular_symbols() Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 5 for Gamma_0(37) of weight 2 with sign 0 over Rational Field
Class: ModularAbelianVariety_modsym_abstract
Functions: decomposition,
dimension,
group,
groups,
is_ambient,
is_subvariety,
lattice,
modular_symbols,
new_subvariety,
old_subvariety
self, [simple=True], [bound=None]) |
Decompose this modular abelian variety as a product of abelian subvarieties, up to isogeny.
Input: simple- bool (default: True) if True, all factors are simple. If False, each factor returned is isogenous to a power of a simple and the simples in each factor are distinct.
sage: J = J0(33) sage: J.decomposition() [ Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33), Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33), Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33) ] sage: J1(17).decomposition() [ Simple abelian subvariety 17aG1(1,17) of dimension 1 of J1(17), Simple abelian subvariety 17bG1(1,17) of dimension 4 of J1(17) ]
self) |
Return the dimension of this modular abelian variety.
sage: J0(37)[0].dimension() 1 sage: J0(43)[1].dimension() 2 sage: J1(17)[1].dimension() 4
self) |
Return the congruence subgroup associated that this modular abelian variety is associated to.
sage: J0(13).group() Congruence Subgroup Gamma0(13) sage: J1(997).group() Congruence Subgroup Gamma1(997) sage: JH(37,[3]).group() Congruence Subgroup Gamma_H(37) with H generated by [3] sage: J0(37)[1].groups() (Congruence Subgroup Gamma0(37),)
self) |
Return the tuple of groups associated to the modular symbols abelian variety. This is always a 1-tuple.
Output: tuple
sage: A = ModularSymbols(33).cuspidal_submodule().abelian_variety(); A Abelian variety J0(33) of dimension 3 sage: A.groups() (Congruence Subgroup Gamma0(33),) sage: type(A) <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym'>
self) |
Return True if this abelian variety attached to a modular symbols space space is attached to the cuspidal subspace of the ambient modular symbols space.
Output: bool
sage: A = ModularSymbols(43).cuspidal_subspace().abelian_variety(); A Abelian variety J0(43) of dimension 3 sage: A.is_ambient() True sage: type(A) <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym'> sage: A = ModularSymbols(43).cuspidal_subspace()[1].abelian_variety(); A Abelian subvariety of dimension 2 of J0(43) sage: A.is_ambient() False
self, other) |
Return True if self is a subvariety of other.
sage: J = J0(37); J Abelian variety J0(37) of dimension 2 sage: A = J[0]; A Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37) sage: A.is_subvariety(J) True sage: A.is_subvariety(J0(11)) False
There may be a way to map
into
, but
is not
equipped with any special structure of an embedding.
sage: A.is_subvariety(J0(74)) False
Some ambient examples:
sage: J = J0(37) sage: J.is_subvariety(J) True sage: J.is_subvariety(25) False
More examples:
sage: A = J0(42); D = A.decomposition(); D [ Simple abelian subvariety 14a(1,42) of dimension 1 of J0(42), Simple abelian subvariety 14a(3,42) of dimension 1 of J0(42), Simple abelian subvariety 21a(1,42) of dimension 1 of J0(42), Simple abelian subvariety 21a(2,42) of dimension 1 of J0(42), Simple abelian subvariety 42a(1,42) of dimension 1 of J0(42) ] sage: D[0].is_subvariety(A) True sage: D[1].is_subvariety(D[0] + D[1]) True sage: D[2].is_subvariety(D[0] + D[1]) False
self) |
Return the lattice the defines this modular symbols modular abelian variety.
Output:
a free
-module embedded in an ambient
-vector
space
sage: A = ModularSymbols(33).cuspidal_submodule()[0].abelian_variety(); A Abelian subvariety of dimension 1 of J0(33) sage: A.lattice() Free module of degree 6 and rank 2 over Integer Ring Echelon basis matrix: [ 1 0 0 -1 0 0] [ 0 0 1 0 1 -1] sage: type(A) <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym'>
self, [sign=0]) |
Return space of modular symbols (with given sign) associated to this modular abelian variety, if it can be found by cutting down using Hecke operators. Otherwise raise a RuntimeError exception.
sage: A = J0(37) sage: A.modular_symbols() Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 5 for Gamma_0(37) of weight 2 with sign 0 over Rational Field sage: A.modular_symbols(1) Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(37) of weight 2 with sign 1 over Rational Field
More examples:
sage: J0(11).modular_symbols() Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field sage: J0(11).modular_symbols(sign=1) Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field sage: J0(11).modular_symbols(sign=0) Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field sage: J0(11).modular_symbols(sign=-1) Modular Symbols space of dimension 1 for Gamma_0(11) of weight 2 with sign -1 over Rational Field
Even more examples:
sage: A = J0(33)[1]; A Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33) sage: A.modular_symbols() Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 9 for Gamma_0(33) of weight 2 with sign 0 over Rational Field
It is not always possible to determine the sign subspaces:
sage: A.modular_symbols(1) Traceback (most recent call last): ... RuntimeError: unable to determine sign (=1) space of modular symbols
sage: A.modular_symbols(-1) Traceback (most recent call last): ... RuntimeError: unable to determine sign (=-1) space of modular symbols
self, [p=None]) |
Return the new or
-new subvariety of self.
Input:
sage: J0(33).new_subvariety() Abelian subvariety of dimension 1 of J0(33) sage: J0(100).new_subvariety() Abelian subvariety of dimension 1 of J0(100) sage: J1(13).new_subvariety() Abelian variety J1(13) of dimension 2
self, [p=None]) |
Return the old or
-old abelian variety of self.
Input:
sage: J0(33).old_subvariety() Abelian subvariety of dimension 2 of J0(33) sage: J0(100).old_subvariety() Abelian subvariety of dimension 6 of J0(100) sage: J1(13).old_subvariety() Abelian subvariety of dimension 0 of J1(13)
Special Functions: __add__,
_compute_hecke_polynomial,
_integral_hecke_matrix,
_modular_symbols,
_rational_hecke_matrix,
_set_lattice
self, other) |
Add two modular abelian variety factors.
sage: A = J0(42); D = A.decomposition(); D [ Simple abelian subvariety 14a(1,42) of dimension 1 of J0(42), Simple abelian subvariety 14a(3,42) of dimension 1 of J0(42), Simple abelian subvariety 21a(1,42) of dimension 1 of J0(42), Simple abelian subvariety 21a(2,42) of dimension 1 of J0(42), Simple abelian subvariety 42a(1,42) of dimension 1 of J0(42) ] sage: D[0] + D[1] Abelian subvariety of dimension 2 of J0(42) sage: D[1].is_subvariety(D[0] + D[1]) True sage: D[0] + D[1] + D[2] Abelian subvariety of dimension 3 of J0(42) sage: D[0] + D[0] Abelian subvariety of dimension 1 of J0(42) sage: D[0] + D[0] == D[0] True sage: sum(D, D[0]) == A True
self, n, [var=x]) |
Return the characteristic polynomial of the
-th Hecke
operator on self.
NOTE: If self has dimension d, then this is a polynomial of degree d. It is not of degree 2*d, so it is the square root of the characteristic polynomial of the Hecke operator on integral or rational homology (which has degree 2*d).
sage: J0(11).hecke_polynomial(2) x + 2 sage: J0(23)._compute_hecke_polynomial(2) x^2 + x - 1 sage: J1(13).hecke_polynomial(2) x^2 + 3*x + 3 sage: factor(J0(43).hecke_polynomial(2)) (x + 2) * (x^2 - 2)
The Hecke polynomial is the square root of the characteristic polynomial:
sage: factor(J0(43).hecke_operator(2).charpoly()) (x + 2) * (x^2 - 2)
self, n, [sign=0]) |
Return the action of the Hecke operator
on the integral
homology of self.
Input:
sage: J1(13)._integral_hecke_matrix(2) # slightly random choice of basis [-2 0 -1 1] [ 1 -1 0 -1] [ 1 1 -2 0] [ 0 1 -1 -1] sage: J1(13)._integral_hecke_matrix(2,sign=1) # slightly random choice of basis [-1 1] [-1 -2] sage: J1(13)._integral_hecke_matrix(2,sign=-1) # slightly random choice of basis [-2 -1] [ 1 -1]
self) |
Return the space of modular symbols corresponding to this modular symbols abelian variety.
This function is in the abstract base class, so it raises a NotImplementedError:
sage: M = ModularSymbols(37).cuspidal_submodule() sage: A = M.abelian_variety(); A Abelian variety J0(37) of dimension 2 sage: sage.modular.abvar.abvar.ModularAbelianVariety_modsym_abstract._modular_symbols(A) Traceback (most recent call last): ... NotImplementedError: bug -- must define this
Of course this function isn't called in practice, so this works:
sage: A._modular_symbols() Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 5 for Gamma_0(37) of weight 2 with sign 0 over Rational Field
self, n, [sign=0]) |
Return the action of the Hecke operator
on the rational
homology of self.
Input:
sage: J1(13)._rational_hecke_matrix(2) # slightly random choice of basis [-2 0 -1 1] [ 1 -1 0 -1] [ 1 1 -2 0] [ 0 1 -1 -1] sage: J0(43)._rational_hecke_matrix(2,sign=1) # slightly random choice of basis [-2 0 1] [-1 -2 2] [-2 0 2]
self, lattice) |
Set the lattice of this modular symbols abelian variety.
WARNING: This is only for internal use. Do not use this unless you really really know what you're doing. That's why there is an underscore in this method name.
Input:
We do something evil - there's no type checking since this function is for internal use only:
sage: A = ModularSymbols(33).cuspidal_submodule().abelian_variety() sage: A._set_lattice(5) sage: A.lattice() 5