43.11 Morphisms between modular abelian varieties, including Hecke operators

Module: sage.modular.abvar.morphism

Morphisms between modular abelian varieties, including Hecke operators acting on modular abelian varieties.

Sage can compute with Hecke operators on modular abelian varieties. A Hecke operator is defined by given a modular abelian variety and an index. Given a Hecke operator, Sage can compute the characteristic polynomial, and the action of the Hecke operator on various homology groups.

Author Log:

sage: A = J0(54)
sage: t5 = A.hecke_operator(5); t5
Hecke operator T_5 on Abelian variety J0(54) of dimension 4
sage: t5.charpoly().factor()
(x - 3) * (x + 3) * x^2
sage: B = A.new_subvariety(); B
Abelian subvariety of dimension 2 of J0(54)
sage: t5 = B.hecke_operator(5); t5
Hecke operator T_5 on Abelian subvariety of dimension 2 of J0(54)
sage: t5.charpoly().factor()
(x - 3) * (x + 3)
sage: t5.action_on_homology().matrix()
[ 0  3  3 -3]
[-3  3  3  0]
[ 3  3  0 -3]
[-3  6  3 -3]

Class: DegeneracyMap

class DegeneracyMap
DegeneracyMap( self, parent, A, t)

Create the degeneracy map of index t in parent defined by the matrix A.

Input:

parent
- a space of homomorphisms of abelian varieties
A
- a matrix defining self
t
- a list of indices defining the degeneracy map

sage: J0(44).degeneracy_map(11,2)
Degeneracy map from Abelian variety J0(44) of dimension 4 to Abelian
variety J0(11) of dimension 1 defined by [2]
sage: J0(44)[0].degeneracy_map(88,2)
Degeneracy map from Simple abelian subvariety 11a(1,44) of dimension 1 of
J0(44) to Abelian variety J0(88) of dimension 9 defined by [2]

Functions: t

t( self)

Return the list of indices defining self.

sage: J0(22).degeneracy_map(44).t()
[1]
sage: J = J0(22) * J0(11)
sage: J.degeneracy_map([44,44], [2,1])
Degeneracy map from Abelian variety J0(22) x J0(11) of dimension 3 to
Abelian variety J0(44) x J0(44) of dimension 8 defined by [2, 1]
sage: J.degeneracy_map([44,44], [2,1]).t()
[2, 1]

Special Functions: __init__,$ \,$ _repr_

_repr_( self)

Return the string representation of self.

sage: J0(22).degeneracy_map(44)._repr_()
'Degeneracy map from Abelian variety J0(22) of dimension 2 to Abelian
variety J0(44) of dimension 4 defined by [1]'

Class: HeckeOperator

class HeckeOperator
A Hecke operator acting on a modular abelian variety.
HeckeOperator( self, abvar, n)

Create the Hecke operator of index $ n$ acting on the abelian variety abvar.

Input:

abvar
- a modular abelian variety
n
- a positive integer

sage: J = J0(37)
sage: T2 = J.hecke_operator(2); T2
Hecke operator T_2 on Abelian variety J0(37) of dimension 2

Functions: action_on_homology,$ \,$ characteristic_polynomial,$ \,$ charpoly,$ \,$ index,$ \,$ matrix,$ \,$ n

action_on_homology( self, [R=Integer Ring])

Return the action of this Hecke operator on the homology $ H_1(A; R)$ of this abelian variety with coefficients in $ R$ .

sage: A = J0(43)
sage: t2 = A.hecke_operator(2); t2
Hecke operator T_2 on Abelian variety J0(43) of dimension 3
sage: h2 = t2.action_on_homology(); h2
Hecke operator T_2 on Integral Homology of Abelian variety J0(43) of
dimension 3
sage: h2.matrix()
[-2  1  0  0  0  0]
[-1  1  1  0 -1  0]
[-1  0 -1  2 -1  1]
[-1  0  1  1 -1  1]
[ 0 -2  0  2 -2  1]
[ 0 -1  0  1  0 -1]
sage: h2 = t2.action_on_homology(GF(2)); h2
Hecke operator T_2 on Homology with coefficients in Finite Field of size 2
of Abelian variety J0(43) of dimension 3
sage: h2.matrix()
[0 1 0 0 0 0]
[1 1 1 0 1 0]
[1 0 1 0 1 1]
[1 0 1 1 1 1]
[0 0 0 0 0 1]
[0 1 0 1 0 1]

characteristic_polynomial( self, [var=x])

Return the characteristic polynomial of this Hecke operator in the given variable.

Input:

var
- a string (default: 'x')

Output: a polynomial in var over the rational numbers.

sage: A = J0(43)[1]; A
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
sage: t2 = A.hecke_operator(2); t2
Hecke operator T_2 on Simple abelian subvariety 43b(1,43) of dimension 2 of
J0(43)
sage: f = t2.characteristic_polynomial(); f
x^2 - 2
sage: f.parent()
Univariate Polynomial Ring in x over Integer Ring
sage: f.factor()
x^2 - 2
sage: t2.characteristic_polynomial('y')
y^2 - 2

charpoly( self, [var=x])

Synonym for self.characteristic_polynomial(var).

Input:

var
- string (default: 'x')

sage: A = J1(13)
sage: t2 = A.hecke_operator(2); t2
Hecke operator T_2 on Abelian variety J1(13) of dimension 2
sage: f = t2.charpoly(); f
x^2 + 3*x + 3
sage: f.factor()
x^2 + 3*x + 3
sage: t2.charpoly('y')
y^2 + 3*y + 3

index( self)

Return the index of this Hecke operator. (For example, if this is the operator $ T_n$ , then the index is the integer $ n$ .)

Output:

n
- a (Sage) Integer

sage: J = J0(15)
sage: t = J.hecke_operator(53)
sage: t
Hecke operator T_53 on Abelian variety J0(15) of dimension 1
sage: t.index()
53
sage: t = J.hecke_operator(54)
sage: t
Hecke operator T_54 on Abelian variety J0(15) of dimension 1
sage: t.index()
54

sage: J = J1(12345) 
sage: t = J.hecke_operator(997) ; t
Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
sage: t.index() 
997
sage: type(t.index())
<type 'sage.rings.integer.Integer'>

matrix( self)

Return the matrix of self acting on the homology $ H_1(A, ZZ)$ of this abelian variety with coefficients in $ \mathbf{Z}$ .

sage: J0(47).hecke_operator(3).matrix()
[ 0  0  1 -2  1  0 -1  0]
[ 0  0  1  0 -1  0  0  0]
[-1  2  0  0  2 -2  1 -1]
[-2  1  1 -1  3 -1 -1  0]
[-1 -1  1  0  1  0 -1  1]
[-1  0  0 -1  2  0 -1  0]
[-1 -1  2 -2  2  0 -1  0]
[ 0 -1  0  0  1  0 -1  1]

sage: J0(11).hecke_operator(7).matrix()
[-2  0]
[ 0 -2]
sage: (J0(11) * J0(33)).hecke_operator(7).matrix()
[-2  0  0  0  0  0  0  0]
[ 0 -2  0  0  0  0  0  0]
[ 0  0  0  0  2 -2  2 -2]
[ 0  0  0 -2  2  0  2 -2]
[ 0  0  0  0  2  0  4 -4]
[ 0  0 -4  0  2  2  2 -2]
[ 0  0 -2  0  2  2  0 -2]
[ 0  0 -2  0  0  2  0 -2]

sage: J0(23).hecke_operator(2).matrix()
[ 0  1 -1  0]
[ 0  1 -1  1]
[-1  2 -2  1]
[-1  1  0 -1]

n( self)

Alias for self.index().

sage: J = J0(17)
sage: J.hecke_operator(5).n()
5

Special Functions: __init__,$ \,$ _repr_

_repr_( self)

String representation of this Hecke operator.

sage: J = J0(37)
sage: J.hecke_operator(2)._repr_()
'Hecke operator T_2 on Abelian variety J0(37) of dimension 2'

Class: Morphism

class Morphism

Functions: restrict_domain

restrict_domain( self, sub)

Restrict self to the subvariety sub of self.domain().

sage: J = J0(37) ; A, B = J.decomposition()
sage: A.lattice().matrix()
[ 1 -1  1  0]
[ 0  0  2 -1]
sage: B.lattice().matrix()
[1 1 1 0]
[0 0 0 1]
sage: T = J.hecke_operator(2) ; T.matrix()
[-1  1  1 -1]
[ 1 -1  1  0]
[ 0  0 -2  1]
[ 0  0  0  0]
sage: T.restrict_domain(A)
Abelian variety morphism:
  From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
  To:   Abelian variety J0(37) of dimension 2
sage: T.restrict_domain(A).matrix()
[-2  2 -2  0]
[ 0  0 -4  2]
sage: T.restrict_domain(B)
Abelian variety morphism:
  From: Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37)
  To:   Abelian variety J0(37) of dimension 2
sage: T.restrict_domain(B).matrix()
[0 0 0 0]
[0 0 0 0]

Class: Morphism_abstract

class Morphism_abstract
A morphism between modular abelian varieties.
sage: t = J0(11).hecke_operator(2)
sage: from sage.modular.abvar.morphism import Morphism
sage: isinstance(t, Morphism)
True

Functions: cokernel,$ \,$ complementary_isogeny,$ \,$ factor_out_component_group,$ \,$ image,$ \,$ is_isogeny,$ \,$ kernel

cokernel( self)

Return the cokernel of self.

Output:

A
- an abelian variety (the cokernel)
phi
- a quotient map from self.codomain() to the cokernel of self

sage: t = J0(33).hecke_operator(2)
sage: (t-1).cokernel()
(Abelian subvariety of dimension 1 of J0(33),
 Abelian variety morphism:
  From: Abelian variety J0(33) of dimension 3
  To:   Abelian subvariety of dimension 1 of J0(33))

Projection will always have cokernel zero.

sage: J0(37).projection(J0(37)[0]).cokernel()
(Simple abelian subvariety of dimension 0 of J0(37),
 Abelian variety morphism:
  From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
  To:   Simple abelian subvariety of dimension 0 of J0(37))

Here we have a nontrivial cokernel of a Hecke operator, as the T_2-eigenvalue for the newform 37b is 0.

sage: J0(37).hecke_operator(2).cokernel()
(Abelian subvariety of dimension 1 of J0(37),
 Abelian variety morphism:
  From: Abelian variety J0(37) of dimension 2
  To:   Abelian subvariety of dimension 1 of J0(37))
sage: AbelianVariety('37b').newform().q_expansion(5)
q + q^3 - 2*q^4 + O(q^5)

complementary_isogeny( self)

Returns the complementary isogeny of self.

sage: J = J0(43)
sage: A = J[1]
sage: T5 = A.hecke_operator(5)
sage: T5.is_isogeny()
True
sage: T5.complementary_isogeny()
Abelian variety endomorphism of Simple abelian subvariety 43b(1,43) of
dimension 2 of J0(43)
sage: (T5.complementary_isogeny() * T5).matrix()
[2 0 0 0]
[0 2 0 0]
[0 0 2 0]
[0 0 0 2]

factor_out_component_group( self)

View self as a morphism $ f:A \to B$ . Then $ \ker(f)$ is an extension of an abelian variety $ C$ by a finite component group $ G$ . This function constructs a morphism $ g$ with domain $ A$ and codomain Q isogenous to $ C$ such that $ \ker(g)$ is equal to $ C$ .

Output: a morphism

sage: A,B,C = J0(33)
sage: pi = J0(33).projection(A)
sage: pi.kernel()
(Finite subgroup with invariants [5] over QQbar of Abelian variety J0(33)
of dimension 3,
 Abelian subvariety of dimension 2 of J0(33))
sage: psi = pi.factor_out_component_group()
sage: psi.kernel()
(Finite subgroup with invariants [] over QQbar of Abelian variety J0(33) of
dimension 3,
 Abelian subvariety of dimension 2 of J0(33))

ALGORITHM: We compute a subgroup $ G$ of $ B$ so that the composition $ h: A\to B \to B/G$ has kernel that contains $ A[n]$ and component group isomorphic to $ (\mathbf{Z}/n\mathbf{Z})^{2d}$ , where $ d$ is the dimension of $ A$ . Then $ h$ factors through multiplication by $ n$ , so there is a morphism $ g: A\to B/G$ such that $ g \circ [n] = h$ . Then $ g$ is the desired morphism. We give more details below about how to transform this into linear algebra.

image( self)

Return the image of this morphism.

Output: an abelian variety

We compute the image of projection onto a factor of $ J_0(33)$ :

sage: A,B,C = J0(33)
sage: A
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: f = J0(33).projection(A)
sage: f.image()
Abelian subvariety of dimension 1 of J0(33)
sage: f.image() == A
True

We compute the image of a Hecke operator:

sage: t2 = J0(33).hecke_operator(2); t2.fcp()
(x - 1) * (x + 2)^2
sage: phi = t2 + 2
sage: phi.image()
Abelian subvariety of dimension 1 of J0(33)

The sum of the image and the kernel is the whole space:

sage: phi.kernel()[1] + phi.image() == J0(33)
True

is_isogeny( self)

Return True if this morphism is an isogeny of abelian varieties.

sage: J = J0(39)
sage: Id = J.hecke_operator(1)
sage: Id.is_isogeny()
True
sage: J.hecke_operator(19).is_isogeny()
False

kernel( self)

Return the kernel of this morphism.

Output:

G
- a finite group
A
- an abelian variety (identity component of the kernel)

We compute the kernel of a projection map. Notice that the kernel has a nontrivial abelian variety part.

sage: A, B, C = J0(33)
sage: pi = J0(33).projection(B)
sage: pi.kernel()
(Finite subgroup with invariants [20] over QQbar of Abelian variety J0(33)
of dimension 3,
 Abelian subvariety of dimension 2 of J0(33))

We compute the kernels of some Hecke operators:

sage: t2 = J0(33).hecke_operator(2)
sage: t2
Hecke operator T_2 on Abelian variety J0(33) of dimension 3
sage: t2.kernel()
(Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety
J0(33) of dimension 3,
 Abelian subvariety of dimension 0 of J0(33))
sage: t3 = J0(33).hecke_operator(3)
sage: t3.kernel()
(Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(33)
of dimension 3,
 Abelian subvariety of dimension 0 of J0(33))

Special Functions: __call__,$ \,$ _image_of_abvar,$ \,$ _image_of_element,$ \,$ _image_of_finite_subgroup,$ \,$ _repr_,$ \,$ _repr_type

__call__( self, X)

Input:

X
- abelian variety, finite group, or torsion element

Output: abelian variety, finite group, torsion element

We apply morphisms to elements:

sage: t2 = J0(33).hecke_operator(2)
sage: G  = J0(33).torsion_subgroup(2); G
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian
variety J0(33) of dimension 3
sage: t2(G.0)
[(-1/2, 0, 1/2, -1/2, 1/2, -1/2)]
sage: t2(G.0) in G
True
sage: t2(G.1)
[(0, -1, 1/2, 0, 1/2, -1/2)]
sage: t2(G.2)
[(0, 0, 0, 0, 0, 0)]
sage: K = t2.kernel()[0]; K
Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety
J0(33) of dimension 3
sage: t2(K.0)
[(0, 0, 0, 0, 0, 0)]

We apply morphisms to subgroups:

sage: t2 = J0(33).hecke_operator(2)
sage: G  = J0(33).torsion_subgroup(2); G
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian
variety J0(33) of dimension 3
sage: t2(G)
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of
dimension 3
sage: t2.fcp()
(x - 1) * (x + 2)^2

We apply morphisms to abelian subvarieties:

sage: E11a0, E11a1, B = J0(33)
sage: t2 = J0(33).hecke_operator(2)
sage: t3 = J0(33).hecke_operator(3)
sage: E11a0
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
sage: t3(E11a0)
Abelian subvariety of dimension 1 of J0(33)
sage: t3(E11a0).decomposition()
[
Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
]
sage: t3(E11a0) == E11a1
True
sage: t2(E11a0) == E11a0
True
sage: t3(E11a0) == E11a0
False
sage: t3(E11a0 + E11a1) == E11a0 + E11a1
True

We apply some Hecke operators to the cuspidal subgroup and split it up:

sage: C = J0(33).cuspidal_subgroup(); C
Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33)
of dimension 3
sage: t2 = J0(33).hecke_operator(2); t2.fcp()
(x - 1) * (x + 2)^2
sage: (t2 - 1)(C)
Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(33) of
dimension 3
sage: (t2 + 2)(C)
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of
dimension 3

Same but on a simple new factor:

sage: C = J0(33)[2].cuspidal_subgroup(); C
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety
33a(1,33) of dimension 1 of J0(33)
sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
x - 1
sage: t2(C)
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety
33a(1,33) of dimension 1 of J0(33)

_image_of_abvar( self, A)

Compute the image of the abelian variety $ A$ under this morphism.

Input:

A
- an abelian variety

OUTPUT an abelian variety

sage: t = J0(33).hecke_operator(2)
sage: t._image_of_abvar(J0(33).new_subvariety())
Abelian subvariety of dimension 1 of J0(33)

sage: t = J0(33).hecke_operator(3)
sage: A = J0(33)[0]
sage: B = t._image_of_abvar(A); B
Abelian subvariety of dimension 1 of J0(33)
sage: B == A
False
sage: A + B == J0(33).old_subvariety()
True

 sage: J = J0(37) ; A, B = J.decomposition()
sage: J.projection(A)._image_of_abvar(A)
Abelian subvariety of dimension 1 of J0(37)
sage: J.projection(A)._image_of_abvar(B)
Abelian subvariety of dimension 0 of J0(37)
sage: J.projection(B)._image_of_abvar(A)
Abelian subvariety of dimension 0 of J0(37)
sage: J.projection(B)._image_of_abvar(B)
Abelian subvariety of dimension 1 of J0(37)
sage: J.projection(B)._image_of_abvar(J)
Abelian subvariety of dimension 1 of J0(37)

_image_of_element( self, x)

Return the image of the torsion point $ x$ under this morphism.

The parent of the image element is always the group of all torsion elements of the abelian variety.

Input:

x
- a torsion point on an abelian variety

Output: a torsion point

sage: A = J0(11); t = A.hecke_operator(2)
sage: t.matrix()
[-2  0]
[ 0 -2]
sage: P = A.cuspidal_subgroup().0; P
[(0, 1/5)]
sage: t._image_of_element(P)
[(0, -2/5)]
sage: -2*P
[(0, -2/5)]

sage: J = J0(37) ; phi = J._isogeny_to_product_of_simples()
sage: phi._image_of_element(J.torsion_subgroup(5).gens()[0])
[(1/5, -1/5, -1/5, 1/5, 1/5, 1/5, 1/5, -1/5)]

sage: K = J[0].intersection(J[1])[0]
sage: K.list()
[[(0, 0, 0, 0)],
 [(1/2, -1/2, 1/2, 0)],
 [(0, 0, 1, -1/2)],
 [(1/2, -1/2, 3/2, -1/2)]]
sage: [ phi.restrict_domain(J[0])._image_of_element(k) for k in K ]
[[(0, 0, 0, 0, 0, 0, 0, 0)],
 [(0, 0, 0, 0, 0, 0, 0, 0)],
 [(0, 0, 0, 0, 0, 0, 0, 0)],
 [(0, 0, 0, 0, 0, 0, 0, 0)]]

_image_of_finite_subgroup( self, G)

Return the image of the finite group $ G$ under this morphism.

Input:

G
- a finite subgroup of the domain of this morphism

Output: a finite subgroup of the codomain

sage: J = J0(33); A = J[0]; B = J[1]
sage: C = A.intersection(B)[0] ; C
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety
11a(1,33) of dimension 1 of J0(33)
sage: t = J.hecke_operator(3)
sage: D = t(C); D
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of
dimension 3
sage: D == C
True

Or we directly test this function:

sage: D = t._image_of_finite_subgroup(C); D
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of
dimension 3
sage: phi = J0(11).degeneracy_map(22,2)
sage: J0(11).rational_torsion_subgroup().order()
5
sage: phi._image_of_finite_subgroup(J0(11).rational_torsion_subgroup())
Finite subgroup with invariants [5] over QQ of Abelian variety J0(22) of
dimension 2

_repr_( self)

Return string representation of this morphism.

          sage: t = J0(11).hecke_operator(2)
          sage: sage.modular.abvar.morphism.Morphism_abstract._repr_(t)
          'Abelian variety endomorphism of Abelian variety J0(11) of
dimension 1'
          sage: J0(42).projection(J0(42)[0])._repr_()
          'Abelian variety morphism:
From: Abelian variety J0(42) of dimension 5
To:   Simple abelian subvariety 14a(1,42) of dimension 1 of J0(42)'

_repr_type( self)

Return type of morphism.

sage: t = J0(11).hecke_operator(2)
sage: sage.modular.abvar.morphism.Morphism_abstract._repr_type(t)
'Abelian variety'

See About this document... for information on suggesting changes.