Hecke operators and morphisms between 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.

AUTHORS:

  • William Stein (2007-03)

  • Craig Citro (2008-03)

EXAMPLES:

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]
>>> from sage.all import *
>>> A = J0(Integer(54))
>>> t5 = A.hecke_operator(Integer(5)); t5
Hecke operator T_5 on Abelian variety J0(54) of dimension 4
>>> t5.charpoly().factor()
(x - 3) * (x + 3) * x^2
>>> B = A.new_subvariety(); B
Abelian subvariety of dimension 2 of J0(54)
>>> t5 = B.hecke_operator(Integer(5)); t5
Hecke operator T_5 on Abelian subvariety of dimension 2 of J0(54)
>>> t5.charpoly().factor()
(x - 3) * (x + 3)
>>> t5.action_on_homology().matrix()
[ 0  3  3 -3]
[-3  3  3  0]
[ 3  3  0 -3]
[-3  6  3 -3]
A = J0(54)
t5 = A.hecke_operator(5); t5
t5.charpoly().factor()
B = A.new_subvariety(); B
t5 = B.hecke_operator(5); t5
t5.charpoly().factor()
t5.action_on_homology().matrix()
class sage.modular.abvar.morphism.DegeneracyMap(parent, A, t, side='left')[source]

Bases: Morphism

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 – list of indices defining the degeneracy map

EXAMPLES:

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]
>>> from sage.all import *
>>> J0(Integer(44)).degeneracy_map(Integer(11),Integer(2))
Degeneracy map from Abelian variety J0(44) of dimension 4 to Abelian variety J0(11) of dimension 1 defined by [2]
>>> J0(Integer(44))[Integer(0)].degeneracy_map(Integer(88),Integer(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]
J0(44).degeneracy_map(11,2)
J0(44)[0].degeneracy_map(88,2)
t()[source]

Return the list of indices defining self.

EXAMPLES:

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]
>>> from sage.all import *
>>> J0(Integer(22)).degeneracy_map(Integer(44)).t()
[1]
>>> J = J0(Integer(22)) * J0(Integer(11))
>>> J.degeneracy_map([Integer(44),Integer(44)], [Integer(2),Integer(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]
>>> J.degeneracy_map([Integer(44),Integer(44)], [Integer(2),Integer(1)]).t()
[2, 1]
J0(22).degeneracy_map(44).t()
J = J0(22) * J0(11)
J.degeneracy_map([44,44], [2,1])
J.degeneracy_map([44,44], [2,1]).t()
class sage.modular.abvar.morphism.HeckeOperator(abvar, n, side='left')[source]

Bases: Morphism

A Hecke operator acting on a modular abelian variety.

action_on_homology(R=Integer Ring)[source]

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

EXAMPLES:

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]
>>> from sage.all import *
>>> A = J0(Integer(43))
>>> t2 = A.hecke_operator(Integer(2)); t2
Hecke operator T_2 on Abelian variety J0(43) of dimension 3
>>> h2 = t2.action_on_homology(); h2
Hecke operator T_2 on Integral Homology of Abelian variety J0(43) of dimension 3
>>> 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]
>>> h2 = t2.action_on_homology(GF(Integer(2))); h2
Hecke operator T_2 on Homology with coefficients in Finite Field of size 2 of Abelian variety J0(43) of dimension 3
>>> 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]
A = J0(43)
t2 = A.hecke_operator(2); t2
h2 = t2.action_on_homology(); h2
h2.matrix()
h2 = t2.action_on_homology(GF(2)); h2
h2.matrix()
characteristic_polynomial(var='x')[source]

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

INPUT:

  • var – string (default: 'x')

OUTPUT: a polynomial in var over the rational numbers

EXAMPLES:

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
>>> from sage.all import *
>>> A = J0(Integer(43))[Integer(1)]; A
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
>>> t2 = A.hecke_operator(Integer(2)); t2
Hecke operator T_2 on Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
>>> f = t2.characteristic_polynomial(); f
x^2 - 2
>>> f.parent()
Univariate Polynomial Ring in x over Integer Ring
>>> f.factor()
x^2 - 2
>>> t2.characteristic_polynomial('y')
y^2 - 2
A = J0(43)[1]; A
t2 = A.hecke_operator(2); t2
f = t2.characteristic_polynomial(); f
f.parent()
f.factor()
t2.characteristic_polynomial('y')
charpoly(var='x')[source]

Synonym for self.characteristic_polynomial(var).

INPUT:

  • var – string (default: 'x')

EXAMPLES:

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
>>> from sage.all import *
>>> A = J1(Integer(13))
>>> t2 = A.hecke_operator(Integer(2)); t2
Hecke operator T_2 on Abelian variety J1(13) of dimension 2
>>> f = t2.charpoly(); f
x^2 + 3*x + 3
>>> f.factor()
x^2 + 3*x + 3
>>> t2.charpoly('y')
y^2 + 3*y + 3
A = J1(13)
t2 = A.hecke_operator(2); t2
f = t2.charpoly(); f
f.factor()
t2.charpoly('y')
fcp(var='x')[source]

Return the factorization of the characteristic polynomial.

EXAMPLES:

sage: t2 = J0(33).hecke_operator(2)
sage: t2.charpoly()
x^3 + 3*x^2 - 4
sage: t2.fcp()
(x - 1) * (x + 2)^2
>>> from sage.all import *
>>> t2 = J0(Integer(33)).hecke_operator(Integer(2))
>>> t2.charpoly()
x^3 + 3*x^2 - 4
>>> t2.fcp()
(x - 1) * (x + 2)^2
t2 = J0(33).hecke_operator(2)
t2.charpoly()
t2.fcp()
index()[source]

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

EXAMPLES:

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
>>> from sage.all import *
>>> J = J0(Integer(15))
>>> t = J.hecke_operator(Integer(53))
>>> t
Hecke operator T_53 on Abelian variety J0(15) of dimension 1
>>> t.index()
53
>>> t = J.hecke_operator(Integer(54))
>>> t
Hecke operator T_54 on Abelian variety J0(15) of dimension 1
>>> t.index()
54
J = J0(15)
t = J.hecke_operator(53)
t
t.index()
t = J.hecke_operator(54)
t
t.index()
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())
<class 'sage.rings.integer.Integer'>
>>> from sage.all import *
>>> J = J1(Integer(12345))
>>> t = J.hecke_operator(Integer(997)) ; t
Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
>>> t.index()
997
>>> type(t.index())
<class 'sage.rings.integer.Integer'>
J = J1(12345)
t = J.hecke_operator(997) ; t
t.index()
type(t.index())
>>> from sage.all import *
>>> J = J1(Integer(12345))
>>> t = J.hecke_operator(Integer(997)) ; t
Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
>>> t.index()
997
>>> type(t.index())
<class 'sage.rings.integer.Integer'>
J = J1(12345)
t = J.hecke_operator(997) ; t
t.index()
type(t.index())
matrix()[source]

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

EXAMPLES:

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]
>>> from sage.all import *
>>> J0(Integer(47)).hecke_operator(Integer(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]
J0(47).hecke_operator(3).matrix()
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]
>>> from sage.all import *
>>> J0(Integer(11)).hecke_operator(Integer(7)).matrix()
[-2  0]
[ 0 -2]
>>> (J0(Integer(11)) * J0(Integer(33))).hecke_operator(Integer(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]
J0(11).hecke_operator(7).matrix()
(J0(11) * J0(33)).hecke_operator(7).matrix()
>>> from sage.all import *
>>> J0(Integer(11)).hecke_operator(Integer(7)).matrix()
[-2  0]
[ 0 -2]
>>> (J0(Integer(11)) * J0(Integer(33))).hecke_operator(Integer(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]
J0(11).hecke_operator(7).matrix()
(J0(11) * J0(33)).hecke_operator(7).matrix()
sage: J0(23).hecke_operator(2).matrix()
[ 0  1 -1  0]
[ 0  1 -1  1]
[-1  2 -2  1]
[-1  1  0 -1]
>>> from sage.all import *
>>> J0(Integer(23)).hecke_operator(Integer(2)).matrix()
[ 0  1 -1  0]
[ 0  1 -1  1]
[-1  2 -2  1]
[-1  1  0 -1]
J0(23).hecke_operator(2).matrix()
>>> from sage.all import *
>>> J0(Integer(23)).hecke_operator(Integer(2)).matrix()
[ 0  1 -1  0]
[ 0  1 -1  1]
[-1  2 -2  1]
[-1  1  0 -1]
J0(23).hecke_operator(2).matrix()
n()[source]

Alias for self.index().

EXAMPLES:

sage: J = J0(17)
sage: J.hecke_operator(5).n()
5
>>> from sage.all import *
>>> J = J0(Integer(17))
>>> J.hecke_operator(Integer(5)).n()
5
J = J0(17)
J.hecke_operator(5).n()
class sage.modular.abvar.morphism.Morphism(parent, A, copy_matrix=True, side='left')[source]

Bases: Morphism_abstract, MatrixMorphism

restrict_domain(sub)[source]

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

EXAMPLES:

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]
>>> from sage.all import *
>>> J = J0(Integer(37)) ; A, B = J.decomposition()
>>> A.lattice().matrix()
[ 1 -1  1  0]
[ 0  0  2 -1]
>>> B.lattice().matrix()
[1 1 1 0]
[0 0 0 1]
>>> T = J.hecke_operator(Integer(2)) ; T.matrix()
[-1  1  1 -1]
[ 1 -1  1  0]
[ 0  0 -2  1]
[ 0  0  0  0]
>>> 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
>>> T.restrict_domain(A).matrix()
[-2  2 -2  0]
[ 0  0 -4  2]
>>> 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
>>> T.restrict_domain(B).matrix()
[0 0 0 0]
[0 0 0 0]
J = J0(37) ; A, B = J.decomposition()
A.lattice().matrix()
B.lattice().matrix()
T = J.hecke_operator(2) ; T.matrix()
T.restrict_domain(A)
T.restrict_domain(A).matrix()
T.restrict_domain(B)
T.restrict_domain(B).matrix()
class sage.modular.abvar.morphism.Morphism_abstract(parent, side='left')[source]

Bases: MatrixMorphism_abstract

A morphism between modular abelian varieties.

EXAMPLES:

sage: t = J0(11).hecke_operator(2)
sage: from sage.modular.abvar.morphism import Morphism
sage: isinstance(t, Morphism)
True
>>> from sage.all import *
>>> t = J0(Integer(11)).hecke_operator(Integer(2))
>>> from sage.modular.abvar.morphism import Morphism
>>> isinstance(t, Morphism)
True
t = J0(11).hecke_operator(2)
from sage.modular.abvar.morphism import Morphism
isinstance(t, Morphism)
cokernel()[source]

Return the cokernel of self.

OUTPUT:

  • A – an abelian variety (the cokernel)

  • phi – a quotient map from self.codomain() to the cokernel of self

EXAMPLES:

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))
>>> from sage.all import *
>>> t = J0(Integer(33)).hecke_operator(Integer(2))
>>> (t-Integer(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))
t = J0(33).hecke_operator(2)
(t-1).cokernel()

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))
>>> from sage.all import *
>>> J0(Integer(37)).projection(J0(Integer(37))[Integer(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))
J0(37).projection(J0(37)[0]).cokernel()

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)
>>> from sage.all import *
>>> J0(Integer(37)).hecke_operator(Integer(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))
>>> AbelianVariety('37b').newform().q_expansion(Integer(5))
q + q^3 - 2*q^4 + O(q^5)
J0(37).hecke_operator(2).cokernel()
AbelianVariety('37b').newform().q_expansion(5)
complementary_isogeny()[source]

Return the complementary isogeny of self.

EXAMPLES:

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]
>>> from sage.all import *
>>> J = J0(Integer(43))
>>> A = J[Integer(1)]
>>> T5 = A.hecke_operator(Integer(5))
>>> T5.is_isogeny()
True
>>> T5.complementary_isogeny()
Abelian variety endomorphism of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
>>> (T5.complementary_isogeny() * T5).matrix()
[2 0 0 0]
[0 2 0 0]
[0 0 2 0]
[0 0 0 2]
J = J0(43)
A = J[1]
T5 = A.hecke_operator(5)
T5.is_isogeny()
T5.complementary_isogeny()
(T5.complementary_isogeny() * T5).matrix()
factor_out_component_group()[source]

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

EXAMPLES:

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))
>>> from sage.all import *
>>> A,B,C = J0(Integer(33))
>>> pi = J0(Integer(33)).projection(A)
>>> 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))
>>> psi = pi.factor_out_component_group()
>>> psi.kernel()
(Finite subgroup with invariants [] over QQbar of Abelian variety J0(33) of dimension 3,
 Abelian subvariety of dimension 2 of J0(33))
A,B,C = J0(33)
pi = J0(33).projection(A)
pi.kernel()
psi = pi.factor_out_component_group()
psi.kernel()

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 \((\ZZ/n\ZZ)^{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()[source]

Return the image of this morphism.

OUTPUT: an abelian variety

EXAMPLES: 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
>>> from sage.all import *
>>> A,B,C = J0(Integer(33))
>>> A
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
>>> f = J0(Integer(33)).projection(A)
>>> f.image()
Abelian subvariety of dimension 1 of J0(33)
>>> f.image() == A
True
A,B,C = J0(33)
A
f = J0(33).projection(A)
f.image()
f.image() == A

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)
>>> from sage.all import *
>>> t2 = J0(Integer(33)).hecke_operator(Integer(2)); t2.fcp()
(x - 1) * (x + 2)^2
>>> phi = t2 + Integer(2)
>>> phi.image()
Abelian subvariety of dimension 1 of J0(33)
t2 = J0(33).hecke_operator(2); t2.fcp()
phi = t2 + 2
phi.image()

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

sage: phi.kernel()[1] + phi.image() == J0(33)
True
>>> from sage.all import *
>>> phi.kernel()[Integer(1)] + phi.image() == J0(Integer(33))
True
phi.kernel()[1] + phi.image() == J0(33)
is_isogeny()[source]

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

EXAMPLES:

sage: J = J0(39)
sage: Id = J.hecke_operator(1)
sage: Id.is_isogeny()
True
sage: J.hecke_operator(19).is_isogeny()
False
>>> from sage.all import *
>>> J = J0(Integer(39))
>>> Id = J.hecke_operator(Integer(1))
>>> Id.is_isogeny()
True
>>> J.hecke_operator(Integer(19)).is_isogeny()
False
J = J0(39)
Id = J.hecke_operator(1)
Id.is_isogeny()
J.hecke_operator(19).is_isogeny()
kernel()[source]

Return the kernel of this morphism.

OUTPUT:

  • G – a finite group

  • A – an abelian variety (identity component of the kernel)

EXAMPLES: 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))
>>> from sage.all import *
>>> A, B, C = J0(Integer(33))
>>> pi = J0(Integer(33)).projection(B)
>>> 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))
A, B, C = J0(33)
pi = J0(33).projection(B)
pi.kernel()

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))
>>> from sage.all import *
>>> t2 = J0(Integer(33)).hecke_operator(Integer(2))
>>> t2
Hecke operator T_2 on Abelian variety J0(33) of dimension 3
>>> 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))
>>> t3 = J0(Integer(33)).hecke_operator(Integer(3))
>>> 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))
t2 = J0(33).hecke_operator(2)
t2
t2.kernel()
t3 = J0(33).hecke_operator(3)
t3.kernel()