Base class for modular abelian varieties - Modular Abelian Varieties

Skip to content
Back to top
View this page
Edit this page

# Base class for modular abelian varieties

AUTHORS:

- William Stein (2007-03)

class sage.modular.abvar.abvar.ModularAbelianVariety(groups, lattice=None, base_field=Rational Field, is_simple=None, newform_level=None, isogeny_number=None, number=None, check=True)

  Bases: `ModularAbelianVariety_abstract`

  Create a modular abelian variety with given level and base field.

  INPUT:

  - `groups` – tuple of congruence subgroups

  - `lattice` – (default: \(\ZZ^n\)) a full lattice in \(\ZZ^n\), where \(n\) is the sum of the dimensions of the spaces of cuspidal modular symbols corresponding to each \(\Gamma \in\) groups

  - `base_field` – a field (default: \(\QQ\))

  EXAMPLES:

  Sage

      sage: J0(23)
      Abelian variety J0(23) of dimension 2

  Python

      >>> from sage.all import *
      >>> J0(Integer(23))
      Abelian variety J0(23) of dimension 2

  lattice()

    Return the lattice that defines this abelian variety.

    OUTPUT:

    - `lattice` – a lattice embedded in the rational homology of the ambient product Jacobian

    EXAMPLES:

    Sage

        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_with_category'>
        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]

    Python

        >>> from sage.all import *
        >>> A = (J0(Integer(11)) * J0(Integer(37)))[Integer(1)]; A
        Simple abelian subvariety 37a(1,37) of dimension 1 of J0(11) x J0(37)
        >>> type(A)
        <class 'sage.modular.abvar.abvar.ModularAbelianVariety_with_category'>
        >>> 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]

class sage.modular.abvar.abvar.ModularAbelianVariety_abstract(groups, base_field, is_simple=None, newform_level=None, isogeny_number=None, number=None, check=True)

  Bases: `Parent`

  Abstract base class for modular abelian varieties.

  INPUT:

  - `groups` – tuple of congruence subgroups

  - `base_field` – a field

  - `is_simple` – boolean; whether or not `self` is simple

  - `newform_level` – if `self` is isogenous to a newform abelian variety, returns the level of that abelian variety

  - `isogeny_number` – which isogeny class the corresponding newform is in; this corresponds to the Cremona letter code

  - `number` – the t number of the degeneracy map that this abelian variety is the image under

  - `check` – whether to do some type checking on the defining data

  EXAMPLES: One should not create an instance of this class, but we do so anyways here as an example:

  Sage

      sage: A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(37),), QQ)
      sage: type(A)
      <class 'sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category'>

  Python

      >>> from sage.all import *
      >>> A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(Integer(37)),), QQ)
      >>> type(A)
      <class 'sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category'>

  All hell breaks loose if you try to do anything with \(A\):

  Sage

      sage: A
      <repr(<sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category at 0x...>) failed: NotImplementedError: BUG -- lattice method must be defined in derived class>

  [Python]

      >>> from sage.all import *
      >>> A
      <repr(<sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category at 0x...>) failed: NotImplementedError: BUG -- lattice method must be defined in derived class>

  All instances of this class are in the category of modular abelian varieties:

  Sage

      sage: A.category()
      Category of modular abelian varieties over Rational Field
      sage: J0(23).category()
      Category of modular abelian varieties over Rational Field

  Python

      >>> from sage.all import *
      >>> A.category()
      Category of modular abelian varieties over Rational Field
      >>> J0(Integer(23)).category()
      Category of modular abelian varieties over Rational Field

  ambient_morphism()

    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.

    EXAMPLES: We compute the ambient structure morphism for an abelian subvariety of \(J_0(33)\):

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> A,B,C = J0(Integer(33))
        >>> phi = A.ambient_morphism()
        >>> phi.domain()
        Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> phi.codomain()
        Abelian variety J0(33) of dimension 3
        >>> phi.matrix()
        [ 1  1 -2  0  2 -1]
        [ 0  3 -2 -1  2  0]

    `phi` is of course injective:

    Sage

        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))

    [Python]

        >>> from sage.all import *
        >>> 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

        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]

    Python

        >>> from sage.all import *
        >>> 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-injective map to an ambient space:

    Sage

        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)

    [Python]

        >>> from sage.all import *
        >>> Q,pi = J0(Integer(33))/A
        >>> phi = Q.ambient_morphism()
        >>> 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]
        >>> phi.kernel()[Integer(0)]
        Finite subgroup with invariants [5, 15, 15] over QQ of Abelian
         variety factor of dimension 2 of J0(33)

  ambient_variety()

    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

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(33))[Integer(0)]; A
        Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> A.ambient_variety()
        Abelian variety J0(33) of dimension 3

  base_extend(K)

    EXAMPLES:

    Sage

        sage: A = J0(37); A
        Abelian variety J0(37) of dimension 2
        sage: A.base_extend(QQbar)                                                  # needs sage.rings.number_field
        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

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37)); A
        Abelian variety J0(37) of dimension 2
        >>> A.base_extend(QQbar)                                                  # needs sage.rings.number_field
        Abelian variety J0(37) over Algebraic Field of dimension 2
        >>> A.base_extend(GF(Integer(7)))
        Abelian variety J0(37) over Finite Field of size 7 of dimension 2

  base_field()

    Synonym for `self.base_ring()`.

    EXAMPLES:

    Sage

        sage: J0(11).base_field()
        Rational Field

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).base_field()
        Rational Field

  change_ring(R)

    Change the base ring of this modular abelian variety.

    EXAMPLES:

    Sage

        sage: A = J0(23)
        sage: A.change_ring(QQ)
        Abelian variety J0(23) of dimension 2

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(23))
        >>> A.change_ring(QQ)
        Abelian variety J0(23) of dimension 2

  complement(A=None)

    Return a complement of this abelian variety.

    INPUT:

    - `A` – (default: `None`) if given, `A` must be an abelian variety that contains `self`, in which case the complement of `self` is taken inside `A`. Otherwise the complement is taken in the ambient product Jacobian.

    OUTPUT: abelian variety

    EXAMPLES:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> a,b,c = J0(Integer(33))
        >>> (a+b).complement()
        Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
        >>> (a+b).complement() == c
        True
        >>> a.complement(a+b)
        Abelian subvariety of dimension 1 of J0(33)

  conductor()

    Return the conductor of this abelian variety.

    EXAMPLES:

    Sage

        sage: A = J0(23)
        sage: A.conductor().factor()
        23^2

        sage: A = J1(25)
        sage: A.conductor().factor()
        5^24

        sage: A = J0(11^2); A.decomposition()
        [Simple abelian subvariety 11a(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 11a(11,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121a(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121b(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121c(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121d(1,121) of dimension 1 of J0(121)]
        sage: A.conductor().factor()
        11^10

        sage: A = J0(33)[0]; A
        Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        sage: A.conductor()
        11
        sage: A.elliptic_curve().conductor()
        11

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(23))
        >>> A.conductor().factor()
        23^2

        >>> A = J1(Integer(25))
        >>> A.conductor().factor()
        5^24

        >>> A = J0(Integer(11)**Integer(2)); A.decomposition()
        [Simple abelian subvariety 11a(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 11a(11,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121a(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121b(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121c(1,121) of dimension 1 of J0(121),
         Simple abelian subvariety 121d(1,121) of dimension 1 of J0(121)]
        >>> A.conductor().factor()
        11^10

        >>> A = J0(Integer(33))[Integer(0)]; A
        Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> A.conductor()
        11
        >>> A.elliptic_curve().conductor()
        11

  cuspidal_subgroup()

    Return the cuspidal subgroup of this modular abelian variety. This is the subgroup generated by rational cusps.

    EXAMPLES:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(54))
        >>> C = J.cuspidal_subgroup()
        >>> 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)])
        >>> C.invariants()
        [3, 3, 3, 3, 3, 9]
        >>> J1(Integer(13)).cuspidal_subgroup()
        Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
        >>> A = J0(Integer(33))[Integer(0)]
        >>> A.cuspidal_subgroup()
        Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)

  decomposition(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` – boolean (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.

    - `bound` – integer (default: `None`); if given, only use Hecke operators up to this bound when decomposing. This can give wrong answers, so use with caution!

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> m = ModularSymbols(Integer(11)).cuspidal_submodule()
        >>> d1 = m.degeneracy_map(Integer(33),Integer(1)).matrix(); d3=m.degeneracy_map(Integer(33),Integer(3)).matrix()
        >>> w = ModularSymbols(Integer(33)).submodule((d1 + d3).image(), check=False)
        >>> A = w.abelian_variety(); A
        Abelian subvariety of dimension 1 of J0(33)
        >>> D = A.decomposition(); D
        [Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)]
        >>> D[Integer(0)] == A
        True
        >>> B = A + J0(Integer(33))[Integer(0)]; B
        Abelian subvariety of dimension 2 of J0(33)
        >>> dd = B.decomposition(simple=False); dd
        [Abelian subvariety of dimension 2 of J0(33)]
        >>> dd[Integer(0)] == B
        True
        >>> 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)]
        >>> sum(dd) == B
        True

    We decompose a product of two Jacobians:

    Sage

        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)]

    [Python]

        >>> from sage.all import *
        >>> (J0(Integer(33)) * J0(Integer(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)]

  degen_t(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 \((t,N)\), where \(N\) is the ambient level and \(t\) is an integer that divides the quotient of \(N\) by the newform level. This function returns the tuple \((t,N)\), or raises a `ValueError` if `self` is not simple.

    Note

    It need not be the case that `self` is literally equal to the image of the newform abelian variety under the \(t\)-th degeneracy map. See the documentation for the label method for more details.

    INPUT:

    - `none_if_not_known` – (default: `False`) if `True`, return `None` instead of attempting to compute the degen map’s \(t\), if it isn’t known. This `None` result is not cached.

    OUTPUT: a pair (integer, integer)

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> D = J0(Integer(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)]
        >>> D[Integer(0)].degen_t()
        (1, 33)
        >>> D[Integer(1)].degen_t()
        (3, 33)
        >>> D[Integer(2)].degen_t()
        (1, 33)
        >>> J0(Integer(33)).degen_t()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

  degeneracy_map(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:

    - `M`, `t` – integers level and \(t\), or

    - `Mlist, tlist` – if `self` is in a nontrivial product ambient Jacobian, input consists of a list of levels and corresponding list of \(t\)’s.

    OUTPUT: a degeneracy map

    EXAMPLES: We make several degeneracy maps related to \(J_0(11)\) and \(J_0(33)\) and compute their matrices.

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> d1 = J0(Integer(11)).degeneracy_map(Integer(33), Integer(1)); d1
        Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [1]
        >>> d1.matrix()
        [ 0 -3  2  1 -2  0]
        [ 1 -2  0  1  0 -1]
        >>> d2 = J0(Integer(11)).degeneracy_map(Integer(33), Integer(3)); d2
        Degeneracy map from Abelian variety J0(11) of dimension 1 to Abelian variety J0(33) of dimension 3 defined by [3]
        >>> d2.matrix()
        [-1  0  0  0  1 -2]
        [-1 -1  1 -1  1  0]
        >>> d3 = J0(Integer(33)).degeneracy_map(Integer(11), Integer(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 \(11\) to level \(33\), then back is multiplication by \(4\):

    Sage

        sage: d1.matrix() * d3.matrix()
        [4 0]
        [0 4]

    [Python]

        >>> from sage.all import *
        >>> d1.matrix() * d3.matrix()
        [4 0]
        [0 4]

    We compute a more complicated 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

        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]

    Python

        >>> from sage.all import *
        >>> d = (J0(Integer(11))*J0(Integer(11))).degeneracy_map([Integer(33),Integer(33)], [Integer(1),Integer(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]
        >>> 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]

  degree()

    Return the degree of this abelian variety, which is the dimension of the ambient Jacobian product.

    EXAMPLES:

    Sage

        sage: A = J0(23)
        sage: A.dimension()
        2

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(23))
        >>> A.dimension()
        2

  dimension()

    Return the dimension of this abelian variety.

    EXAMPLES:

    Sage

        sage: A = J0(23)
        sage: A.dimension()
        2

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(23))
        >>> A.dimension()
        2

  direct_product(other)

    Compute the direct product of `self` and `other`.

    INPUT:

    - `self`, `other` – modular abelian varieties

    OUTPUT: abelian variety

    EXAMPLES:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).direct_product(J1(Integer(13)))
        Abelian variety J0(11) x J1(13) of dimension 3
        >>> A = J0(Integer(33))[Integer(0)].direct_product(J0(Integer(33))[Integer(1)]); A
        Abelian subvariety of dimension 2 of J0(33) x J0(33)
        >>> 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]

  dual()

    Return the dual of this abelian variety.

    OUTPUT:

    - dual abelian variety

    - morphism from `self` to dual

    - covering morphism from J to dual

    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.

    EXAMPLES: We compute the dual of the elliptic curve newform abelian variety of level \(33\), and find the kernel of the modular map, which has structure \((\ZZ/3)^2\).

    Sage

        sage: A,B,C = J0(33)
        sage: C
        Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
        sage: Cd, f, pi = 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)

    Python

        >>> from sage.all import *
        >>> A,B,C = J0(Integer(33))
        >>> C
        Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
        >>> Cd, f, pi = C.dual()
        >>> f.matrix()
        [3 0]
        [0 3]
        >>> f.kernel()[Integer(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 \(3\):

    Sage

        sage: E = EllipticCurve('33a')
        sage: E.modular_degree()
        3

    [Python]

        >>> from sage.all import *
        >>> E = EllipticCurve('33a')
        >>> E.modular_degree()
        3

    Next we compute the dual of a \(2\)-dimensional new simple abelian subvariety of \(J_0(43)\).

    Sage

        sage: A = AbelianVariety('43b'); A
        Newform abelian subvariety 43b of dimension 2 of J0(43)
        sage: Ad, f, pi = A.dual()

    Python

        >>> from sage.all import *
        >>> A = AbelianVariety('43b'); A
        Newform abelian subvariety 43b of dimension 2 of J0(43)
        >>> Ad, f, pi = A.dual()

    The kernel shows that the modular degree is \(2\):

    Sage

        sage: f.kernel()[0]
        Finite subgroup with invariants [2, 2] over QQ of Newform abelian subvariety 43b of dimension 2 of J0(43)

    [Python]

        >>> from sage.all import *
        >>> f.kernel()[Integer(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

        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.

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(22))[Integer(0)]; A
        Simple abelian subvariety 11a(1,22) of dimension 1 of J0(22)
        >>> A.dual()
        Traceback (most recent call last):
        ...
        NotImplementedError: dual not implemented unless complement shares no simple factors with self.

  elliptic_curve()

    Return an elliptic curve isogenous to `self`.

    If `self` is not dimension 1 with rational base ring, this raises a `ValueError`.

    The elliptic curve is found by looking it up in the CremonaDatabase. The CremonaDatabase contains all curves up to some large conductor. If a curve is not found in the CremonaDatabase, a `RuntimeError` will be raised. In practice, only the most committed users will see this `RuntimeError`.

    OUTPUT: an elliptic curve isogenous to `self`

    EXAMPLES:

    Sage

        sage: J = J0(11)
        sage: J.elliptic_curve()
        Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field

        sage: J = J0(49)
        sage: J.elliptic_curve()
        Elliptic Curve defined by y^2 + x*y = x^3 - x^2 - 2*x - 1 over Rational Field

        sage: A = J0(37)[1]
        sage: E = A.elliptic_curve()
        sage: A.lseries()(1)
        0.725681061936153
        sage: E.lseries()(1)
        0.725681061936153

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(11))
        >>> J.elliptic_curve()
        Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field

        >>> J = J0(Integer(49))
        >>> J.elliptic_curve()
        Elliptic Curve defined by y^2 + x*y = x^3 - x^2 - 2*x - 1 over Rational Field

        >>> A = J0(Integer(37))[Integer(1)]
        >>> E = A.elliptic_curve()
        >>> A.lseries()(Integer(1))
        0.725681061936153
        >>> E.lseries()(Integer(1))
        0.725681061936153

    Elliptic curves are of dimension 1.

    Sage

        sage: J = J0(23)
        sage: J.elliptic_curve()
        Traceback (most recent call last):
        ...
        ValueError: self must be of dimension 1

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(23))
        >>> J.elliptic_curve()
        Traceback (most recent call last):
        ...
        ValueError: self must be of dimension 1

    This is only implemented for curves over QQ.

    Sage

        sage: J = J0(11).change_ring(CC)
        sage: J.elliptic_curve()
        Traceback (most recent call last):
        ...
        ValueError: base ring must be QQ

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(11)).change_ring(CC)
        >>> J.elliptic_curve()
        Traceback (most recent call last):
        ...
        ValueError: base ring must be QQ

  endomorphism_ring(category=None)

    Return the endomorphism ring of `self`.

    OUTPUT: b = self.sturm_bound()

    EXAMPLES: We compute a few endomorphism rings:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).endomorphism_ring()
        Endomorphism ring of Abelian variety J0(11) of dimension 1
        >>> J0(Integer(37)).endomorphism_ring()
        Endomorphism ring of Abelian variety J0(37) of dimension 2
        >>> J0(Integer(33))[Integer(2)].endomorphism_ring()
        Endomorphism ring of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)

    No real computation is done:

    Sage

        sage: J1(123456).endomorphism_ring()
        Endomorphism ring of Abelian variety J1(123456) of dimension 423185857

    [Python]

        >>> from sage.all import *
        >>> J1(Integer(123456)).endomorphism_ring()
        Endomorphism ring of Abelian variety J1(123456) of dimension 423185857

  finite_subgroup(X, field_of_definition=None, check=True)

    Return a finite subgroup of this modular abelian variety.

    INPUT:

    - `X` – list of elements of other finite subgroups of this modular abelian variety or elements that coerce into the rational homology (viewed as a rational vector space); also X could be a finite subgroup itself that is contained in this abelian variety.

    - `field_of_definition` – (default: `None`) field over which this group is defined. If `None` try to figure out the best base field.

    OUTPUT: a finite subgroup of a modular abelian variety

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(11))
        >>> J.finite_subgroup([[Integer(1)/Integer(5),Integer(0)], [Integer(0),Integer(1)/Integer(3)]])
        Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(33)); C = J[Integer(0)].cuspidal_subgroup(); C
        Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> J.finite_subgroup([[Integer(0),Integer(0),Integer(0),Integer(0),Integer(0),Integer(1)/Integer(6)]])
        Finite subgroup with invariants [6] over QQbar of Abelian variety J0(33) of dimension 3
        >>> J.finite_subgroup(C)
        Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3

    This method gives a way of changing the ambient abelian variety of a finite subgroup. This caused an issue in Issue #6392 but should be fixed now.

    Sage

        sage: A, B = J0(43)
        sage: G, _ = A.intersection(B)
        sage: G
        Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 43a(1,43) of dimension 1 of J0(43)
        sage: B.finite_subgroup(G)
        Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)

    Python

        >>> from sage.all import *
        >>> A, B = J0(Integer(43))
        >>> G, _ = A.intersection(B)
        >>> G
        Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 43a(1,43) of dimension 1 of J0(43)
        >>> B.finite_subgroup(G)
        Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)

  free_module()

    Synonym for `self.lattice()`.

    OUTPUT: a free module over \(\ZZ\)

    EXAMPLES:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> J0(Integer(37)).free_module()
        Ambient free module of rank 4 over the principal ideal domain Integer Ring
        >>> J0(Integer(37))[Integer(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]

  frobenius_polynomial(p, var='x')

    Compute the frobenius polynomial at \(p\).

    INPUT:

    - `p` – prime number

    OUTPUT: a monic integral polynomial

    EXAMPLES:

    Sage

        sage: f = Newform('39b','a')
        sage: A = AbelianVariety(f)
        sage: A.frobenius_polynomial(5)
        x^4 + 2*x^2 + 25

        sage: J = J0(23)
        sage: J.frobenius_polynomial(997)
        x^4 + 20*x^3 + 1374*x^2 + 19940*x + 994009

        sage: J = J0(33)
        sage: J.frobenius_polynomial(7)
        x^6 + 9*x^4 - 16*x^3 + 63*x^2 + 343

        sage: J = J0(19)
        sage: J.frobenius_polynomial(3, var='y')
        y^2 + 2*y + 3

        sage: J = J0(3); J
        Abelian variety J0(3) of dimension 0
        sage: J.frobenius_polynomial(11)
        1

        sage: A = J1(27)[1]; A
        Simple abelian subvariety 27bG1(1,27) of dimension 12 of J1(27)
        sage: A.frobenius_polynomial(11)
        x^24 - 3*x^23 - 15*x^22 + 126*x^21 - 201*x^20 - 1488*x^19 + 7145*x^18 - 1530*x^17 - 61974*x^16 + 202716*x^15 - 19692*x^14 - 1304451*x^13 + 4526883*x^12 - 14348961*x^11 - 2382732*x^10 + 269814996*x^9 - 907361334*x^8 - 246408030*x^7 + 12657803345*x^6 - 28996910448*x^5 - 43086135081*x^4 + 297101409066*x^3 - 389061369015*x^2 - 855935011833*x + 3138428376721

        sage: J = J1(33)
        sage: J.frobenius_polynomial(11)
        Traceback (most recent call last):
        ...
        ValueError: p must not divide the level of self
        sage: J.frobenius_polynomial(4)
        Traceback (most recent call last):
        ...
        ValueError: p must be prime

    Python

        >>> from sage.all import *
        >>> f = Newform('39b','a')
        >>> A = AbelianVariety(f)
        >>> A.frobenius_polynomial(Integer(5))
        x^4 + 2*x^2 + 25

        >>> J = J0(Integer(23))
        >>> J.frobenius_polynomial(Integer(997))
        x^4 + 20*x^3 + 1374*x^2 + 19940*x + 994009

        >>> J = J0(Integer(33))
        >>> J.frobenius_polynomial(Integer(7))
        x^6 + 9*x^4 - 16*x^3 + 63*x^2 + 343

        >>> J = J0(Integer(19))
        >>> J.frobenius_polynomial(Integer(3), var='y')
        y^2 + 2*y + 3

        >>> J = J0(Integer(3)); J
        Abelian variety J0(3) of dimension 0
        >>> J.frobenius_polynomial(Integer(11))
        1

        >>> A = J1(Integer(27))[Integer(1)]; A
        Simple abelian subvariety 27bG1(1,27) of dimension 12 of J1(27)
        >>> A.frobenius_polynomial(Integer(11))
        x^24 - 3*x^23 - 15*x^22 + 126*x^21 - 201*x^20 - 1488*x^19 + 7145*x^18 - 1530*x^17 - 61974*x^16 + 202716*x^15 - 19692*x^14 - 1304451*x^13 + 4526883*x^12 - 14348961*x^11 - 2382732*x^10 + 269814996*x^9 - 907361334*x^8 - 246408030*x^7 + 12657803345*x^6 - 28996910448*x^5 - 43086135081*x^4 + 297101409066*x^3 - 389061369015*x^2 - 855935011833*x + 3138428376721

        >>> J = J1(Integer(33))
        >>> J.frobenius_polynomial(Integer(11))
        Traceback (most recent call last):
        ...
        ValueError: p must not divide the level of self
        >>> J.frobenius_polynomial(Integer(4))
        Traceback (most recent call last):
        ...
        ValueError: p must be prime

  groups()

    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 \(J_\Gamma\). This function returns a tuple containing the groups \(\Gamma\).

    EXAMPLES:

    Sage

        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))

    Python

        >>> from sage.all import *
        >>> A = (J0(Integer(37)) * J1(Integer(13)))[Integer(0)]; A
        Simple abelian subvariety 13aG1(1,13) of dimension 2 of J0(37) x J1(13)
        >>> A.groups()
        (Congruence Subgroup Gamma0(37), Congruence Subgroup Gamma1(13))

  hecke_operator(n)

    Return the \(n\)-th Hecke operator on the modular abelian variety, if this makes sense [[elaborate]]. Otherwise raise a `ValueError`.

    EXAMPLES: We compute \(T_2\) on \(J_0(37)\).

    Sage

        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

    Python

        >>> from sage.all import *
        >>> t2 = J0(Integer(37)).hecke_operator(Integer(2)); t2
        Hecke operator T_2 on Abelian variety J0(37) of dimension 2
        >>> t2.charpoly().factor()
        x * (x + 2)
        >>> 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

        sage: t2.action_on_homology().matrix()
        [-1  1  1 -1]
        [ 1 -1  1  0]
        [ 0  0 -2  1]
        [ 0  0  0  0]

    [Python]

        >>> from sage.all import *
        >>> t2.action_on_homology().matrix()
        [-1  1  1 -1]
        [ 1 -1  1  0]
        [ 0  0 -2  1]
        [ 0  0  0  0]

  hecke_polynomial(n, var='x')

    Return the characteristic polynomial of the \(n\)-th Hecke operator \(T_n\) acting on `self`. Raises an `ArithmeticError` if `self` is not Hecke equivariant.

    INPUT:

    - `n` – integer \(\geq 1\)

    - `var` – string (default: `'x'`); valid variable name

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(33)).hecke_polynomial(Integer(2))
        x^3 + 3*x^2 - 4
        >>> f = J0(Integer(33)).hecke_polynomial(Integer(2), 'y'); f
        y^3 + 3*y^2 - 4
        >>> f.parent()
        Univariate Polynomial Ring in y over Rational Field
        >>> J0(Integer(33))[Integer(2)].hecke_polynomial(Integer(3))
        x + 1
        >>> J0(Integer(33))[Integer(0)].hecke_polynomial(Integer(5))
        x - 1
        >>> J0(Integer(33))[Integer(0)].hecke_polynomial(Integer(11))
        x - 1
        >>> J0(Integer(33))[Integer(0)].hecke_polynomial(Integer(3))
        Traceback (most recent call last):
        ...
        ArithmeticError: subspace is not invariant under matrix

  homology(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.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(389)).homology(GF(Integer(7)))
        Homology with coefficients in Finite Field of size 7 of Abelian variety J0(389) of dimension 32
        >>> J0(Integer(389)).homology(QQ)
        Rational Homology of Abelian variety J0(389) of dimension 32
        >>> J0(Integer(389)).homology(ZZ)
        Integral Homology of Abelian variety J0(389) of dimension 32

  in_same_ambient_variety(other)

    Return `True` if `self` and `other` are abelian subvarieties of the same ambient product Jacobian.

    EXAMPLES:

    Sage

        sage: A,B,C = J0(33)
        sage: A.in_same_ambient_variety(B)
        True
        sage: A.in_same_ambient_variety(J0(11))
        False

    Python

        >>> from sage.all import *
        >>> A,B,C = J0(Integer(33))
        >>> A.in_same_ambient_variety(B)
        True
        >>> A.in_same_ambient_variety(J0(Integer(11)))
        False

  integral_homology()

    Return the integral homology of this modular abelian variety.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> H = J0(Integer(43)).integral_homology(); H
        Integral Homology of Abelian variety J0(43) of dimension 3
        >>> H.rank()
        6
        >>> H = J1(Integer(17)).integral_homology(); H
        Integral Homology of Abelian variety J1(17) of dimension 5
        >>> H.rank()
        10

    If you just ask for the rank of the homology, no serious calculations are done, so the following is fast:

    Sage

        sage: H = J0(50000).integral_homology(); H
        Integral Homology of Abelian variety J0(50000) of dimension 7351
        sage: H.rank()
        14702

    [Python]

        >>> from sage.all import *
        >>> H = J0(Integer(50000)).integral_homology(); H
        Integral Homology of Abelian variety J0(50000) of dimension 7351
        >>> H.rank()
        14702

    A product:

    Sage

        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 -1 -1 -1  1]
        [ 0  0  1 -2 -1  0]
        [ 0  0  0  0 -2  1]
        [ 0  0  0  0 -1 -1]

    Python

        >>> from sage.all import *
        >>> H = (J0(Integer(11)) * J1(Integer(13))).integral_homology()
        >>> H.hecke_operator(Integer(2))
        Hecke operator T_2 on Integral Homology of Abelian variety J0(11) x J1(13) of dimension 3
        >>> H.hecke_operator(Integer(2)).matrix()
        [-2  0  0  0  0  0]
        [ 0 -2  0  0  0  0]
        [ 0  0 -1 -1 -1  1]
        [ 0  0  1 -2 -1  0]
        [ 0  0  0  0 -2  1]
        [ 0  0  0  0 -1 -1]

  intersection(other)

    Return the intersection of `self` and `other` inside a common ambient Jacobian product.

    When `other` is a modular abelian variety, the output will be a tuple `(G, A)`, where `G` is a finite subgroup that surjects onto the component group and `A` is the identity component. So in particular, the intersection is the variety `G+A`. Note that `G` is not chosen in any canonical way. When `other` is a finite group, the intersection will be returned as a finite group.

    INPUT:

    - `other` – a modular abelian variety or a finite group

    OUTPUT: if other is a modular abelian variety:

    - `G` – finite subgroup of self

    - `A` – abelian variety (identity component of intersection)

    If other is a finite group:

    - `G` – a finite group

    EXAMPLES: We intersect some abelian varieties with finite intersection.

    Sage

        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))

    Python

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

        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))

    [Python]

        >>> from sage.all import *
        >>> D = list(J0(Integer(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)]
        >>> D[Integer(0)].intersection(D[Integer(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))
        >>> (D[Integer(0)]+D[Integer(1)]).intersection(D[Integer(1)]+D[Integer(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

        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))

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(33))
        >>> J[Integer(0)].intersection(J[Integer(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

        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))

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(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)]
        >>> (D[Integer(0)] + D[Integer(1)]).intersection(D[Integer(1)] + D[Integer(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))

    When the intersection is infinite, the output is `(G, A)`, where `G` surjects onto the component group. This choice of `G` is not canonical (see Issue #26189). In this following example, `B` is a subvariety of `J`:

    Sage

        sage: d1 = J0(11).degeneracy_map(22, 1)
        sage: d2 = J0(11).degeneracy_map(22, 2)
        sage: B = (d1-d2).image()
        sage: J = J0(22)
        sage: J.intersection(B)
        (Finite subgroup with invariants [] over QQbar of Abelian variety J0(22) of dimension 2,
         Abelian subvariety of dimension 1 of J0(22))
        sage: G, B = B.intersection(J); G, B
        (Finite subgroup with invariants [2] over QQbar of Abelian subvariety of dimension 1 of J0(22),
         Abelian subvariety of dimension 1 of J0(22))
        sage: G.is_subgroup(B)
        True

    Python

        >>> from sage.all import *
        >>> d1 = J0(Integer(11)).degeneracy_map(Integer(22), Integer(1))
        >>> d2 = J0(Integer(11)).degeneracy_map(Integer(22), Integer(2))
        >>> B = (d1-d2).image()
        >>> J = J0(Integer(22))
        >>> J.intersection(B)
        (Finite subgroup with invariants [] over QQbar of Abelian variety J0(22) of dimension 2,
         Abelian subvariety of dimension 1 of J0(22))
        >>> G, B = B.intersection(J); G, B
        (Finite subgroup with invariants [2] over QQbar of Abelian subvariety of dimension 1 of J0(22),
         Abelian subvariety of dimension 1 of J0(22))
        >>> G.is_subgroup(B)
        True

  is_J0()

    Return whether or not `self` is of the form J0(N).

    OUTPUT: boolean

    EXAMPLES:

    Sage

        sage: J0(23).is_J0()
        True
        sage: J1(11).is_J0()
        False
        sage: (J0(23) * J1(11)).is_J0()
        False
        sage: J0(37)[0].is_J0()
        False
        sage: (J0(23) * J0(21)).is_J0()
        False

    Python

        >>> from sage.all import *
        >>> J0(Integer(23)).is_J0()
        True
        >>> J1(Integer(11)).is_J0()
        False
        >>> (J0(Integer(23)) * J1(Integer(11))).is_J0()
        False
        >>> J0(Integer(37))[Integer(0)].is_J0()
        False
        >>> (J0(Integer(23)) * J0(Integer(21))).is_J0()
        False

  is_J1()

    Return whether or not `self` is of the form J1(N).

    OUTPUT: boolean

    EXAMPLES:

    Sage

        sage: J1(23).is_J1()
        True
        sage: J0(23).is_J1()
        False
        sage: (J1(11) * J1(13)).is_J1()
        False
        sage: (J1(11) * J0(13)).is_J1()
        False
        sage: J1(23)[0].is_J1()
        False

    Python

        >>> from sage.all import *
        >>> J1(Integer(23)).is_J1()
        True
        >>> J0(Integer(23)).is_J1()
        False
        >>> (J1(Integer(11)) * J1(Integer(13))).is_J1()
        False
        >>> (J1(Integer(11)) * J0(Integer(13))).is_J1()
        False
        >>> J1(Integer(23))[Integer(0)].is_J1()
        False

  is_ambient()

    Return `True` if `self` equals the ambient product Jacobian.

    OUTPUT: boolean

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> A,B,C = J0(Integer(33))
        >>> A.is_ambient()
        False
        >>> J0(Integer(33)).is_ambient()
        True
        >>> (A+B).is_ambient()
        False
        >>> (A+B+C).is_ambient()
        True

  is_hecke_stable()

    Return `True` if `self` is stable under the Hecke operators of its ambient Jacobian.

    OUTPUT: boolean

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).is_hecke_stable()
        True
        >>> J0(Integer(33))[Integer(2)].is_hecke_stable()
        True
        >>> J0(Integer(33))[Integer(0)].is_hecke_stable()
        False
        >>> (J0(Integer(33))[Integer(0)] + J0(Integer(33))[Integer(1)]).is_hecke_stable()
        True

  is_simple(none_if_not_known=False)

    Return whether or not this modular abelian variety is simple.

    This means that it has no proper nonzero abelian subvarieties.

    INPUT:

    - `none_if_not_known` – boolean (default: `False`); if `True` then this function may return `None` instead of `True` of `False` if we don’t already know whether or not `self` is simple.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(5)).is_simple(none_if_not_known=True) is None  # this may fail if J0(5) comes up elsewhere...
        True
        >>> J0(Integer(33)).is_simple()
        False
        >>> J0(Integer(33)).is_simple(none_if_not_known=True)
        False
        >>> J0(Integer(33))[Integer(1)].is_simple()
        True
        >>> J1(Integer(17)).is_simple()
        False

  is_subvariety(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.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(37)); J
        Abelian variety J0(37) of dimension 2
        >>> A = J[Integer(0)]; A
        Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
        >>> A.is_subvariety(A)
        True
        >>> A.is_subvariety(J)
        True

  is_subvariety_of_ambient_jacobian()

    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.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(33)).is_subvariety_of_ambient_jacobian()
        True
        >>> A = J0(Integer(33))[Integer(0)]; A
        Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> A.is_subvariety_of_ambient_jacobian()
        True
        >>> B, phi = A / A.torsion_subgroup(Integer(2))
        >>> B
        Abelian variety factor of dimension 1 of J0(33)
        >>> phi.matrix()
        [2 0]
        [0 2]
        >>> B.is_subvariety_of_ambient_jacobian()
        False

  isogeny_number(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, this raises a `ValueError` exception.

    INPUT:

    - `none_if_not_known` – boolean (default: `False`); if `True` then this function may return `None` instead of `True` or `False` if we do not already know the isogeny number of `self`.

    EXAMPLES: We test the `none_if_not_known` flag first:

    Sage

        sage: J0(33).isogeny_number(none_if_not_known=True) is None
        True

    Python

        >>> from sage.all import *
        >>> J0(Integer(33)).isogeny_number(none_if_not_known=True) is None
        True

    Of course, \(J_0(33)\) is not simple, so this function raises a `ValueError`:

    Sage

        sage: J0(33).isogeny_number()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

    [Python]

        >>> from sage.all import *
        >>> J0(Integer(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

        sage: J0(33)[1].isogeny_number()
        0
        sage: J0(33)[2].isogeny_number()
        0

    Python

        >>> from sage.all import *
        >>> J0(Integer(33))[Integer(1)].isogeny_number()
        0
        >>> J0(Integer(33))[Integer(2)].isogeny_number()
        0

    Next consider \(J_0(37)\) where there are two distinct newform factors:

    Sage

        sage: J0(37)[1].isogeny_number()
        1

    [Python]

        >>> from sage.all import *
        >>> J0(Integer(37))[Integer(1)].isogeny_number()
        1

  label()

    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 \(B\) has the above label, this implies only that \(B\) is isogenous to the newform abelian variety \(A_f\) associated to the newform with label [level][isogeny class][group]. The [group] is empty for \(\Gamma_0(N)\), is G1 for \(\Gamma_1(N)\) and is GH[…] for \(\Gamma_H(N)\).

    Warning

    The sum of \(\delta_s(A_f)\) for all \(s\mid t\) contains \(A\), but no sum for a proper divisor of \(t\) contains \(A\). It need not be the case that \(B\) is equal to \(\delta_t(A_f)\)!!!

    OUTPUT: string

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).label()
        '11a(1,11)'
        >>> J0(Integer(11))[Integer(0)].label()
        '11a(1,11)'
        >>> J0(Integer(33))[Integer(2)].label()
        '33a(1,33)'
        >>> J0(Integer(22)).label()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

    We illustrate that `self` need not equal \(\delta_t(A_f)\):

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(11)); phi = J.degeneracy_map(Integer(33), Integer(1)) + J.degeneracy_map(Integer(33),Integer(3))
        >>> B = phi.image(); B
        Abelian subvariety of dimension 1 of J0(33)
        >>> B.decomposition()
        [Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)]
        >>> C = J.degeneracy_map(Integer(33),Integer(3)).image(); C
        Abelian subvariety of dimension 1 of J0(33)
        >>> C == B
        False

  lattice()

    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 \(\ZZ\)

    EXAMPLES:

    Sage

        sage: A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(37),), QQ)
        sage: A
        <repr(<sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category at 0x...>) failed: NotImplementedError: BUG -- lattice method must be defined in derived class>

    Python

        >>> from sage.all import *
        >>> A = sage.modular.abvar.abvar.ModularAbelianVariety_abstract((Gamma0(Integer(37)),), QQ)
        >>> A
        <repr(<sage.modular.abvar.abvar.ModularAbelianVariety_abstract_with_category at 0x...>) failed: NotImplementedError: BUG -- lattice method must be defined in derived class>

  level()

    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 \(J_1(N)\). In the case that the ambient variety of `self` is a product of Jacobians, return the LCM of their levels.

    EXAMPLES:

    Sage

        sage: J1(5077).level()
        5077
        sage: JH(389,[4]).level()
        389
        sage: (J0(11)*J0(17)).level()
        187

    Python

        >>> from sage.all import *
        >>> J1(Integer(5077)).level()
        5077
        >>> JH(Integer(389),[Integer(4)]).level()
        389
        >>> (J0(Integer(11))*J0(Integer(17))).level()
        187

  lseries()

    Return the complex \(L\)-series of this modular abelian variety.

    EXAMPLES:

    Sage

        sage: A = J0(37)
        sage: A.lseries()
        Complex L-series attached to Abelian variety J0(37) of dimension 2

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37))
        >>> A.lseries()
        Complex L-series attached to Abelian variety J0(37) of dimension 2

  modular_degree()

    Return the modular degree of this abelian variety, which is the square root of the degree of the modular kernel.

    EXAMPLES:

    Sage

        sage: A = AbelianVariety('37a')
        sage: A.modular_degree()
        2

    Python

        >>> from sage.all import *
        >>> A = AbelianVariety('37a')
        >>> A.modular_degree()
        2

  modular_kernel()

    Return the modular kernel of this abelian variety, which is the kernel of the canonical polarization of `self`.

    EXAMPLES:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> A = AbelianVariety('33a'); A
        Newform abelian subvariety 33a of dimension 1 of J0(33)
        >>> A.modular_kernel()
        Finite subgroup with invariants [3, 3] over QQ of Newform abelian subvariety 33a of dimension 1 of J0(33)

  newform(names=None)

    Return the newform \(f\) such that this abelian variety is isogenous to the newform abelian variety \(A_f\).

    If this abelian variety is not simple, this raises a `ValueError`.

    INPUT:

    - `names` – (default: `None`) if the newform has coefficients in a number field, then a generator name must be specified

    OUTPUT: a newform \(f\) so that `self` is isogenous to \(A_f\)

    EXAMPLES:

    Sage

        sage: J0(11).newform()
        q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6)

        sage: f = J0(23).newform(names='a')
        sage: AbelianVariety(f) == J0(23)
        True

        sage: J = J0(33)
        sage: [s.newform('a') for s in J.decomposition()]
        [q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
         q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
         q + q^2 - q^3 - q^4 - 2*q^5 + O(q^6)]

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).newform()
        q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6)

        >>> f = J0(Integer(23)).newform(names='a')
        >>> AbelianVariety(f) == J0(Integer(23))
        True

        >>> J = J0(Integer(33))
        >>> [s.newform('a') for s in J.decomposition()]
        [q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
         q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
         q + q^2 - q^3 - q^4 - 2*q^5 + O(q^6)]

    The following fails since \(J_0(33)\) is not simple:

    Sage

        sage: J0(33).newform()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

    [Python]

        >>> from sage.all import *
        >>> J0(Integer(33)).newform()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

  newform_decomposition(names=None)

    Return the newforms of the simple subvarieties in the decomposition of `self` as a product of simple subvarieties, up to isogeny.

    OUTPUT: an array of newforms

    EXAMPLES:

    Sage

        sage: J = J1(11) * J0(23)
        sage: J.newform_decomposition('a')
        [q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
        q + a0*q^2 + (-2*a0 - 1)*q^3 + (-a0 - 1)*q^4 + 2*a0*q^5 + O(q^6)]

    Python

        >>> from sage.all import *
        >>> J = J1(Integer(11)) * J0(Integer(23))
        >>> J.newform_decomposition('a')
        [q - 2*q^2 - q^3 + 2*q^4 + q^5 + O(q^6),
        q + a0*q^2 + (-2*a0 - 1)*q^3 + (-a0 - 1)*q^4 + 2*a0*q^5 + O(q^6)]

  newform_label()

    Return the label [level][isogeny class][group] of the newform \(f\) such that this abelian variety is isogenous to the newform abelian variety \(A_f\).

    If this abelian variety is not simple, this raises a `ValueError`.

    OUTPUT: string

    EXAMPLES:

    Sage

        sage: J0(11).newform_label()
        '11a'
        sage: J0(33)[2].newform_label()
        '33a'

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).newform_label()
        '11a'
        >>> J0(Integer(33))[Integer(2)].newform_label()
        '33a'

    The following fails since \(J_0(33)\) is not simple:

    Sage

        sage: J0(33).newform_label()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

    [Python]

        >>> from sage.all import *
        >>> J0(Integer(33)).newform_label()
        Traceback (most recent call last):
        ...
        ValueError: self must be simple

  newform_level(none_if_not_known=False)

    Write `self` as a product (up to isogeny) of newform abelian varieties \(A_f\). Then this function return the least common multiple of the levels of the newforms \(f\), along with the corresponding group or list of groups (the groups do not appear with multiplicity).

    INPUT:

    - `none_if_not_known` – boolean (default: `False`); if `True`, return `None` instead of attempting to compute the newform level, if it isn’t already known. This None result is not cached.

    OUTPUT: integer group or list of distinct groups

    EXAMPLES:

    Sage

        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))

    Python

        >>> from sage.all import *
        >>> J0(Integer(33))[Integer(0)].newform_level()
        (11, Congruence Subgroup Gamma0(33))
        >>> J0(Integer(33))[Integer(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

        sage: (J0(11) * J1(13)).newform_level()
        (143, [Congruence Subgroup Gamma0(11), Congruence Subgroup Gamma1(13)])

    [Python]

        >>> from sage.all import *
        >>> (J0(Integer(11)) * J1(Integer(13))).newform_level()
        (143, [Congruence Subgroup Gamma0(11), Congruence Subgroup Gamma1(13)])

  number_of_rational_points()

    Return the number of rational points of this modular abelian variety.

    It is not always possible to compute the order of the torsion subgroup. The BSD conjecture is assumed to compute the algebraic rank.

    OUTPUT: a positive integer or infinity

    EXAMPLES:

    Sage

        sage: J0(23).number_of_rational_points()
        11
        sage: J0(29).number_of_rational_points()
        7
        sage: J0(37).number_of_rational_points()
        +Infinity

        sage: J0(12); J0(12).number_of_rational_points()
        Abelian variety J0(12) of dimension 0
        1

        sage: J1(17).number_of_rational_points()
        584

        sage: J1(16).number_of_rational_points()
        Traceback (most recent call last):
        ...
        RuntimeError: Unable to compute order of torsion subgroup (it is in [1, 2, 4, 5, 10, 20])

    Python

        >>> from sage.all import *
        >>> J0(Integer(23)).number_of_rational_points()
        11
        >>> J0(Integer(29)).number_of_rational_points()
        7
        >>> J0(Integer(37)).number_of_rational_points()
        +Infinity

        >>> J0(Integer(12)); J0(Integer(12)).number_of_rational_points()
        Abelian variety J0(12) of dimension 0
        1

        >>> J1(Integer(17)).number_of_rational_points()
        584

        >>> J1(Integer(16)).number_of_rational_points()
        Traceback (most recent call last):
        ...
        RuntimeError: Unable to compute order of torsion subgroup (it is in [1, 2, 4, 5, 10, 20])

  padic_lseries(p)

    Return the \(p\)-adic \(L\)-series of this modular abelian variety.

    EXAMPLES:

    Sage

        sage: A = J0(37)
        sage: A.padic_lseries(7)
        7-adic L-series attached to Abelian variety J0(37) of dimension 2

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37))
        >>> A.padic_lseries(Integer(7))
        7-adic L-series attached to Abelian variety J0(37) of dimension 2

  project_to_factor(n)

    If `self` is an ambient product of Jacobians, return a projection from `self` to the \(n\)-th such Jacobian.

    EXAMPLES:

    Sage

        sage: J = J0(33)
        sage: J.project_to_factor(0)
        Abelian variety endomorphism of Abelian variety J0(33) of dimension 3

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(33))
        >>> J.project_to_factor(Integer(0))
        Abelian variety endomorphism of Abelian variety J0(33) of dimension 3

    Sage

        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]

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(33)) * J0(Integer(37)) * J0(Integer(11))
        >>> J.project_to_factor(Integer(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
        >>> J.project_to_factor(Integer(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]

  projection(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:

    - `A` – an abelian variety

    OUTPUT: a morphism

    EXAMPLES:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> a,b,c = J0(Integer(33))
        >>> pi = J0(Integer(33)).projection(a); pi.matrix()
        [ 3 -2]
        [-5  5]
        [-4  1]
        [ 3 -2]
        [ 5  0]
        [ 1  1]
        >>> pi = (a+b).projection(a); pi.matrix()
        [ 0  0]
        [-3  2]
        [-4  1]
        [-1 -1]
        >>> pi = a.projection(a); pi.matrix()
        [1 0]
        [0 1]

    We project onto a factor in a product of two Jacobians:

    Sage

        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]

    [Python]

        >>> from sage.all import *
        >>> A = J0(Integer(11))*J0(Integer(11)); A
        Abelian variety J0(11) x J0(11) of dimension 2
        >>> A[Integer(0)]
        Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(11)
        >>> A.projection(A[Integer(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)
        >>> A.projection(A[Integer(0)]).matrix()
        [0 0]
        [0 0]
        [1 0]
        [0 1]
        >>> A.projection(A[Integer(1)]).matrix()
        [1 0]
        [0 1]
        [0 0]
        [0 0]

  qbar_torsion_subgroup()

    Return the group of all points of finite order in the algebraic closure of this abelian variety.

    EXAMPLES:

    Sage

        sage: T = J0(33).qbar_torsion_subgroup(); T
        Group of all torsion points in QQbar on Abelian variety J0(33) of dimension 3

    Python

        >>> from sage.all import *
        >>> T = J0(Integer(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

        sage: T.field_of_definition()
        Rational Field

    [Python]

        >>> from sage.all import *
        >>> T.field_of_definition()
        Rational Field

    On the other hand, T is a module over \(\ZZ\).

    Sage

        sage: T.base_ring()
        Integer Ring

    Python

        >>> from sage.all import *
        >>> T.base_ring()
        Integer Ring

  quotient(other, **kwds)

    Compute the quotient of `self` and `other`, where other is either an abelian subvariety of `self` or a finite subgroup of `self`.

    INPUT:

    - `other` – a finite subgroup or subvariety

    - further named arguments, that are currently ignored

    OUTPUT: a pair (A, phi) with phi the quotient map from `self` to A

    EXAMPLES: We quotient \(J_0(33)\) out by an abelian subvariety:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> Q, f = J0(Integer(33)).quotient(J0(Integer(33))[Integer(0)])
        >>> Q
        Abelian variety factor of dimension 2 of J0(33)
        >>> f
        Abelian variety morphism:
          From: Abelian variety J0(33) of dimension 3
          To:   Abelian variety factor of dimension 2 of J0(33)

    We quotient \(J_0(33)\) by the cuspidal subgroup:

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> C = J0(Integer(33)).cuspidal_subgroup()
        >>> Q, f = J0(Integer(33)).quotient(C)
        >>> Q
        Abelian variety factor of dimension 3 of J0(33)
        >>> f.kernel()[Integer(0)]
        Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
        >>> C
        Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
        >>> J0(Integer(11)).direct_product(J1(Integer(13)))
        Abelian variety J0(11) x J1(13) of dimension 3

  rank()

    Return the rank of the underlying lattice of `self`.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(33))
        >>> J.rank()
        6
        >>> J[Integer(1)]
        Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
        >>> (J[Integer(1)] * J[Integer(1)]).rank()
        4

  rational_cusp_subgroup()

    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 \(\Gamma_0(N)\).

    EXAMPLES:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(54))
        >>> CQ = J.rational_cusp_subgroup(); CQ
        Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
        >>> 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)])
        >>> factor(CQ.order())
        3^4
        >>> CQ.invariants()
        [3, 3, 9]

    In this example the rational cuspidal subgroup and the cuspidal subgroup differ by a lot.

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(49))
        >>> J.cuspidal_subgroup()
        Finite subgroup with invariants [2, 14] over QQ of Abelian variety J0(49) of dimension 1
        >>> 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 \(\Gamma_1\).

    Sage

        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.

    Python

        >>> from sage.all import *
        >>> J = J1(Integer(13))
        >>> J.cuspidal_subgroup()
        Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
        >>> J.rational_cusp_subgroup()
        Traceback (most recent call last):
        ...
        NotImplementedError: computation of rational cusps only implemented in Gamma0 case.

  rational_cuspidal_subgroup()

    Return the rational subgroup of the cuspidal subgroup of this modular abelian variety.

    This is a subgroup of the group of rational points in the cuspidal subgroup.

    Warning

    This is only currently implemented for \(\Gamma_0(N)\).

    EXAMPLES:

    Sage

        sage: J = J0(54)
        sage: CQ = J.rational_cuspidal_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]

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(54))
        >>> CQ = J.rational_cuspidal_subgroup(); CQ
        Finite subgroup with invariants [3, 3, 9] over QQ of Abelian variety J0(54) of dimension 4
        >>> 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)])
        >>> factor(CQ.order())
        3^4
        >>> CQ.invariants()
        [3, 3, 9]

    In this example the rational cuspidal subgroup and the cuspidal subgroup differ by a lot.

    Sage

        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_cuspidal_subgroup()
        Finite subgroup with invariants [2] over QQ of Abelian variety J0(49) of dimension 1

    [Python]

        >>> from sage.all import *
        >>> J = J0(Integer(49))
        >>> J.cuspidal_subgroup()
        Finite subgroup with invariants [2, 14] over QQ of Abelian variety J0(49) of dimension 1
        >>> J.rational_cuspidal_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 \(\Gamma_1\).

    Sage

        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_cuspidal_subgroup()
        Traceback (most recent call last):
        ...
        NotImplementedError: only implemented when group is Gamma0

    Python

        >>> from sage.all import *
        >>> J = J1(Integer(13))
        >>> J.cuspidal_subgroup()
        Finite subgroup with invariants [19, 19] over QQ of Abelian variety J1(13) of dimension 2
        >>> J.rational_cuspidal_subgroup()
        Traceback (most recent call last):
        ...
        NotImplementedError: only implemented when group is Gamma0

  rational_homology()

    Return the rational homology of this modular abelian variety.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> H = J0(Integer(37)).rational_homology(); H
        Rational Homology of Abelian variety J0(37) of dimension 2
        >>> H.rank()
        4
        >>> H.base_ring()
        Rational Field
        >>> H = J1(Integer(17)).rational_homology(); H
        Rational Homology of Abelian variety J1(17) of dimension 5
        >>> H.rank()
        10
        >>> H.base_ring()
        Rational Field

  rational_torsion_order(proof=True)

    Return the order of the rational torsion subgroup of this modular abelian variety.

    This function is really an alias for `order()` See the docstring there for a more in-depth reference and more interesting examples.

    INPUT:

    - `proof` – boolean (default: `True`)

    OUTPUT:

    The order of the rational torsion subgroup of this modular abelian variety.

    EXAMPLES:

    Sage

        sage: J0(11).rational_torsion_subgroup().order()
        5
        sage: J0(11).rational_torsion_order()
        5

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).rational_torsion_subgroup().order()
        5
        >>> J0(Integer(11)).rational_torsion_order()
        5

  rational_torsion_subgroup()

    Return the maximal torsion subgroup of `self` defined over \(\QQ\).

    EXAMPLES:

    Sage

        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(); t
        Torsion subgroup of Abelian subvariety of dimension 1 of J0(33)
        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)])

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(33))
        >>> A = J.new_subvariety()
        >>> A
        Abelian subvariety of dimension 1 of J0(33)
        >>> t = A.rational_torsion_subgroup(); t
        Torsion subgroup of Abelian subvariety of dimension 1 of J0(33)
        >>> t.multiple_of_order()
        4
        >>> t.divisor_of_order()
        4
        >>> t.order()
        4
        >>> t.gens()
        ([(1/2, 0, 0, -1/2, 0, 0)], [(0, 0, 1/2, 0, 1/2, -1/2)])

  shimura_subgroup()

    Return the Shimura subgroup of this modular abelian variety.

    This is the kernel of \(J_0(N) \rightarrow J_1(N)\) under the natural map.

    Here we compute the Shimura subgroup as the kernel of \(J_0(N) \rightarrow J_0(Np)\) where the map is the difference between the two degeneracy maps.

    EXAMPLES:

    Sage

        sage: J = J0(11)
        sage: J.shimura_subgroup()
        Finite subgroup with invariants [5] over QQ of Abelian variety J0(11) of dimension 1

        sage: J = J0(17)
        sage: G = J.cuspidal_subgroup(); G
        Finite subgroup with invariants [4] over QQ of Abelian variety J0(17) of dimension 1
        sage: S = J.shimura_subgroup(); S
        Finite subgroup with invariants [4] over QQ of Abelian variety J0(17) of dimension 1
        sage: G.intersection(S)
        Finite subgroup with invariants [2] over QQ of Abelian variety J0(17) of dimension 1

        sage: J = J0(33)
        sage: A = J.decomposition()[0]
        sage: A.shimura_subgroup()
        Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        sage: J.shimura_subgroup()
        Finite subgroup with invariants [10] over QQ of Abelian variety J0(33) of dimension 3

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(11))
        >>> J.shimura_subgroup()
        Finite subgroup with invariants [5] over QQ of Abelian variety J0(11) of dimension 1

        >>> J = J0(Integer(17))
        >>> G = J.cuspidal_subgroup(); G
        Finite subgroup with invariants [4] over QQ of Abelian variety J0(17) of dimension 1
        >>> S = J.shimura_subgroup(); S
        Finite subgroup with invariants [4] over QQ of Abelian variety J0(17) of dimension 1
        >>> G.intersection(S)
        Finite subgroup with invariants [2] over QQ of Abelian variety J0(17) of dimension 1

        >>> J = J0(Integer(33))
        >>> A = J.decomposition()[Integer(0)]
        >>> A.shimura_subgroup()
        Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        >>> J.shimura_subgroup()
        Finite subgroup with invariants [10] over QQ of Abelian variety J0(33) of dimension 3

  sturm_bound()

    Return a bound \(B\) such that all Hecke operators \(T_n\) for \(n\leq B\) generate the Hecke algebra.

    OUTPUT: integer

    EXAMPLES:

    Sage

        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()
        228

    Python

        >>> from sage.all import *
        >>> J0(Integer(11)).sturm_bound()
        2
        >>> J0(Integer(33)).sturm_bound()
        8
        >>> J1(Integer(17)).sturm_bound()
        48
        >>> J1(Integer(123456)).sturm_bound()
        1693483008
        >>> JH(Integer(37),[Integer(2),Integer(3)]).sturm_bound()
        7
        >>> J1(Integer(37)).sturm_bound()
        228

  torsion_subgroup(n)

    If \(n\) is an integer, return the subgroup of points of order \(n\). Return the \(n\)-torsion subgroup of elements of order dividing \(n\) of this modular abelian variety \(A\), i.e., the group \(A[n]\).

    EXAMPLES:

    Sage

        sage: J1(13).torsion_subgroup(19)
        Finite subgroup with invariants [19, 19, 19, 19] over QQ of Abelian variety J1(13) of dimension 2

    Python

        >>> from sage.all import *
        >>> J1(Integer(13)).torsion_subgroup(Integer(19))
        Finite subgroup with invariants [19, 19, 19, 19] over QQ of Abelian variety J1(13) of dimension 2

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> A = J0(Integer(23))
        >>> G = A.torsion_subgroup(Integer(5)); G
        Finite subgroup with invariants [5, 5, 5, 5] over QQ of Abelian variety J0(23) of dimension 2
        >>> G.order()
        625
        >>> G.gens()
        ([(1/5, 0, 0, 0)], [(0, 1/5, 0, 0)], [(0, 0, 1/5, 0)], [(0, 0, 0, 1/5)])
        >>> A = J0(Integer(23))
        >>> A.torsion_subgroup(Integer(2)).order()
        16

  vector_space()

    Return vector space corresponding to the modular abelian variety.

    This is the lattice tensored with \(\QQ\).

    EXAMPLES:

    Sage

        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]

    Python

        >>> from sage.all import *
        >>> J0(Integer(37)).vector_space()
        Vector space of dimension 4 over Rational Field
        >>> J0(Integer(37))[Integer(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]

  zero_subgroup()

    Return the zero subgroup of this modular abelian variety, as a finite group.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> A =J0(Integer(54)); G = A.zero_subgroup(); G
        Finite subgroup with invariants [] over QQ of Abelian variety J0(54) of dimension 4
        >>> G.is_subgroup(A)
        True

  zero_subvariety()

    Return the zero subvariety of `self`.

    EXAMPLES:

    Sage

        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, [])

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(37))
        >>> J.zero_subvariety()
        Simple abelian subvariety of dimension 0 of J0(37)
        >>> J.zero_subvariety().level()
        37
        >>> J.zero_subvariety().newform_level()
        (1, [])

class sage.modular.abvar.abvar.ModularAbelianVariety_modsym(modsym, lattice=None, newform_level=None, is_simple=None, isogeny_number=None, number=None, check=True)

  Bases: `ModularAbelianVariety_modsym_abstract`

  Modular abelian variety that corresponds to a Hecke stable space of cuspidal modular symbols.

  EXAMPLES: We create a modular abelian variety attached to a space of modular symbols.

  Sage

      sage: M = ModularSymbols(23).cuspidal_submodule()
      sage: A = M.abelian_variety(); A
      Abelian variety J0(23) of dimension 2

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(23)).cuspidal_submodule()
      >>> A = M.abelian_variety(); A
      Abelian variety J0(23) of dimension 2

  brandt_module(p)

    Return the Brandt module at p that corresponds to `self`. This is the factor of the vector space on the ideal class set in an order of level \(N\) in the quaternion algebra ramified at \(p\) and infinity.

    INPUT:

    - `p` – prime that exactly divides the level

    OUTPUT: Brandt module space that corresponds to self

    EXAMPLES:

    Sage

        sage: J0(43)[1].brandt_module(43)
        Subspace of dimension 2 of Brandt module of dimension 4 of level 43 of weight 2 over Rational Field
        sage: J0(43)[1].brandt_module(43).basis()
        ((1, 0, -1/2, -1/2), (0, 1, -1/2, -1/2))
        sage: J0(43)[0].brandt_module(43).basis()
        ((0, 0, 1, -1),)
        sage: J0(35)[0].brandt_module(5).basis()
        ((1, 0, -1, 0),)
        sage: J0(35)[0].brandt_module(7).basis()
        ((1, -1, 1, -1),)

    Python

        >>> from sage.all import *
        >>> J0(Integer(43))[Integer(1)].brandt_module(Integer(43))
        Subspace of dimension 2 of Brandt module of dimension 4 of level 43 of weight 2 over Rational Field
        >>> J0(Integer(43))[Integer(1)].brandt_module(Integer(43)).basis()
        ((1, 0, -1/2, -1/2), (0, 1, -1/2, -1/2))
        >>> J0(Integer(43))[Integer(0)].brandt_module(Integer(43)).basis()
        ((0, 0, 1, -1),)
        >>> J0(Integer(35))[Integer(0)].brandt_module(Integer(5)).basis()
        ((1, 0, -1, 0),)
        >>> J0(Integer(35))[Integer(0)].brandt_module(Integer(7)).basis()
        ((1, -1, 1, -1),)

  component_group_order(p)

    Return the order of the component group of the special fiber at \(p\) of the Neron model of `self`.

    Note

    For bad primes, this is only implemented when the group is \(\Gamma_0\) and \(p\) exactly divides the level.

    Note

    The input abelian variety must be simple.

    ALGORITHM: See “Component Groups of Quotients of J0(N)” by Kohel and Stein. That paper is about optimal quotients; however, section 4.1 of Conrad-Stein “Component Groups of Purely Toric Quotients”, one sees that the component group of an optimal quotient is the same as the component group of its dual (which is the subvariety).

    INPUT:

    - `p` – a prime number

    OUTPUT: integer

    EXAMPLES:

    Sage

        sage: A = J0(37)[1]
        sage: A.component_group_order(37)
        3
        sage: A = J0(43)[1]
        sage: A.component_group_order(37)
        1
        sage: A.component_group_order(43)
        7
        sage: A = J0(23)[0]
        sage: A.component_group_order(23)
        11

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37))[Integer(1)]
        >>> A.component_group_order(Integer(37))
        3
        >>> A = J0(Integer(43))[Integer(1)]
        >>> A.component_group_order(Integer(37))
        1
        >>> A.component_group_order(Integer(43))
        7
        >>> A = J0(Integer(23))[Integer(0)]
        >>> A.component_group_order(Integer(23))
        11

  tamagawa_number(p)

    Return the Tamagawa number of this abelian variety at p.

    NOTE: For bad primes, this is only implemented when the group if Gamma0 and p exactly divides the level and Atkin-Lehner acts diagonally on this abelian variety (e.g., if this variety is new and simple). See the self.component_group command for more information.

    NOTE: the input abelian variety must be simple

    In cases where this function doesn’t work, consider using the self.tamagawa_number_bounds functions.

    INPUT:

    - `p` – a prime number

    OUTPUT: integer

    EXAMPLES:

    Sage

        sage: A = J0(37)[1]
        sage: A.tamagawa_number(37)
        3
        sage: A = J0(43)[1]
        sage: A.tamagawa_number(37)
        1
        sage: A.tamagawa_number(43)
        7
        sage: A = J0(23)[0]
        sage: A.tamagawa_number(23)
        11

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37))[Integer(1)]
        >>> A.tamagawa_number(Integer(37))
        3
        >>> A = J0(Integer(43))[Integer(1)]
        >>> A.tamagawa_number(Integer(37))
        1
        >>> A.tamagawa_number(Integer(43))
        7
        >>> A = J0(Integer(23))[Integer(0)]
        >>> A.tamagawa_number(Integer(23))
        11

  tamagawa_number_bounds(p)

    Return a divisor and multiple of the Tamagawa number of `self` at \(p\).

    NOTE: the input abelian variety must be simple.

    INPUT:

    - `p` – a prime number

    OUTPUT:

    - `div` – integer; divisor of Tamagawa number at \(p\)

    - `mul` – integer; multiple of Tamagawa number at \(p\)

    - `mul_primes` – tuple; in case `mul==0`, a list of all primes that can possibly divide the Tamagawa number at \(p\)

    EXAMPLES:

    Sage

        sage: A = J0(63).new_subvariety()[1]; A
        Simple abelian subvariety 63b(1,63) of dimension 2 of J0(63)
        sage: A.tamagawa_number_bounds(7)
        (3, 3, ())
        sage: A.tamagawa_number_bounds(3)
        (1, 0, (2, 3, 5))

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(63)).new_subvariety()[Integer(1)]; A
        Simple abelian subvariety 63b(1,63) of dimension 2 of J0(63)
        >>> A.tamagawa_number_bounds(Integer(7))
        (3, 3, ())
        >>> A.tamagawa_number_bounds(Integer(3))
        (1, 0, (2, 3, 5))

class sage.modular.abvar.abvar.ModularAbelianVariety_modsym_abstract(groups, base_field, is_simple=None, newform_level=None, isogeny_number=None, number=None, check=True)

  Bases: `ModularAbelianVariety_abstract`

  decomposition(simple=True, bound=None)

    Decompose this modular abelian variety as a product of abelian subvarieties, up to isogeny.

    INPUT:

    - `simple` – boolean (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.

    - `bound` – integer (default: `None`); if given, only use Hecke operators up to this bound when decomposing. This can give wrong answers, so use with caution!

    EXAMPLES:

    Sage

        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)]

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(33))
        >>> 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)]
        >>> J1(Integer(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)]

  dimension()

    Return the dimension of this modular abelian variety.

    EXAMPLES:

    Sage

        sage: J0(37)[0].dimension()
        1
        sage: J0(43)[1].dimension()
        2
        sage: J1(17)[1].dimension()
        4

    Python

        >>> from sage.all import *
        >>> J0(Integer(37))[Integer(0)].dimension()
        1
        >>> J0(Integer(43))[Integer(1)].dimension()
        2
        >>> J1(Integer(17))[Integer(1)].dimension()
        4

  group()

    Return the congruence subgroup associated that this modular abelian variety is associated to.

    EXAMPLES:

    Sage

        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),)

    Python

        >>> from sage.all import *
        >>> J0(Integer(13)).group()
        Congruence Subgroup Gamma0(13)
        >>> J1(Integer(997)).group()
        Congruence Subgroup Gamma1(997)
        >>> JH(Integer(37),[Integer(3)]).group()
        Congruence Subgroup Gamma_H(37) with H generated by [3]
        >>> J0(Integer(37))[Integer(1)].groups()
        (Congruence Subgroup Gamma0(37),)

  groups()

    Return the tuple of groups associated to the modular symbols abelian variety. This is always a 1-tuple.

    OUTPUT: tuple

    EXAMPLES:

    Sage

        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_with_category'>

    Python

        >>> from sage.all import *
        >>> A = ModularSymbols(Integer(33)).cuspidal_submodule().abelian_variety(); A
        Abelian variety J0(33) of dimension 3
        >>> A.groups()
        (Congruence Subgroup Gamma0(33),)
        >>> type(A)
        <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym_with_category'>

  is_ambient()

    Return `True` if this abelian variety attached to a modular symbols space is attached to the cuspidal subspace of the ambient modular symbols space.

    OUTPUT: boolean

    EXAMPLES:

    Sage

        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_with_category'>
        sage: A = ModularSymbols(43).cuspidal_subspace()[1].abelian_variety(); A
        Abelian subvariety of dimension 2 of J0(43)
        sage: A.is_ambient()
        False

    Python

        >>> from sage.all import *
        >>> A = ModularSymbols(Integer(43)).cuspidal_subspace().abelian_variety(); A
        Abelian variety J0(43) of dimension 3
        >>> A.is_ambient()
        True
        >>> type(A)
        <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym_with_category'>
        >>> A = ModularSymbols(Integer(43)).cuspidal_subspace()[Integer(1)].abelian_variety(); A
        Abelian subvariety of dimension 2 of J0(43)
        >>> A.is_ambient()
        False

  is_subvariety(other)

    Return `True` if `self` is a subvariety of `other`.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(37)); J
        Abelian variety J0(37) of dimension 2
        >>> A = J[Integer(0)]; A
        Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
        >>> A.is_subvariety(J)
        True
        >>> A.is_subvariety(J0(Integer(11)))
        False

    There may be a way to map \(A\) into \(J_0(74)\), but \(A\) is not equipped with any special structure of an embedding.

    Sage

        sage: A.is_subvariety(J0(74))
        False

    [Python]

        >>> from sage.all import *
        >>> A.is_subvariety(J0(Integer(74)))
        False

    Some ambient examples:

    Sage

        sage: J = J0(37)
        sage: J.is_subvariety(J)
        True
        sage: J.is_subvariety(25)
        False

    Python

        >>> from sage.all import *
        >>> J = J0(Integer(37))
        >>> J.is_subvariety(J)
        True
        >>> J.is_subvariety(Integer(25))
        False

    More examples:

    Sage

        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

    [Python]

        >>> from sage.all import *
        >>> A = J0(Integer(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)]
        >>> D[Integer(0)].is_subvariety(A)
        True
        >>> D[Integer(1)].is_subvariety(D[Integer(0)] + D[Integer(1)])
        True
        >>> D[Integer(2)].is_subvariety(D[Integer(0)] + D[Integer(1)])
        False

  lattice()

    Return the lattice defining this modular abelian variety.

    OUTPUT:

    A free \(\ZZ\)-module embedded in an ambient \(\QQ\)-vector space.

    EXAMPLES:

    Sage

        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
        User basis matrix:
        [ 1  0  0 -1  0  0]
        [ 0  0  1  0  1 -1]
        sage: type(A)
        <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym_with_category'>

    Python

        >>> from sage.all import *
        >>> A = ModularSymbols(Integer(33)).cuspidal_submodule()[Integer(0)].abelian_variety(); A
        Abelian subvariety of dimension 1 of J0(33)
        >>> A.lattice()
        Free module of degree 6 and rank 2 over Integer Ring
        User basis matrix:
        [ 1  0  0 -1  0  0]
        [ 0  0  1  0  1 -1]
        >>> type(A)
        <class 'sage.modular.abvar.abvar.ModularAbelianVariety_modsym_with_category'>

  modular_symbols(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.

    EXAMPLES:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(37))
        >>> 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
        >>> A.modular_symbols(Integer(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

        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

    [Python]

        >>> from sage.all import *
        >>> J0(Integer(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
        >>> J0(Integer(11)).modular_symbols(sign=Integer(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
        >>> J0(Integer(11)).modular_symbols(sign=Integer(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
        >>> J0(Integer(11)).modular_symbols(sign=-Integer(1))
        Modular Symbols space of dimension 1 for Gamma_0(11) of weight 2 with sign -1 over Rational Field

    Even more examples:

    Sage

        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

    Python

        >>> from sage.all import *
        >>> A = J0(Integer(33))[Integer(1)]; A
        Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
        >>> 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

        sage: A.modular_symbols(1)
        Traceback (most recent call last):
        ...
        RuntimeError: unable to determine sign (=1) space of modular symbols

    [Python]

        >>> from sage.all import *
        >>> A.modular_symbols(Integer(1))
        Traceback (most recent call last):
        ...
        RuntimeError: unable to determine sign (=1) space of modular symbols

    Sage

        sage: A.modular_symbols(-1)
        Traceback (most recent call last):
        ...
        RuntimeError: unable to determine sign (=-1) space of modular symbols

    Python

        >>> from sage.all import *
        >>> A.modular_symbols(-Integer(1))
        Traceback (most recent call last):
        ...
        RuntimeError: unable to determine sign (=-1) space of modular symbols

  new_subvariety(p=None)

    Return the new or \(p\)-new subvariety of `self`.

    INPUT:

    - `self` – a modular abelian variety

    - `p` – prime number or None (default); if \(p\) is a prime, return the \(p\)-new subvariety. Otherwise return the full new subvariety.

    EXAMPLES:

    Sage

        sage: J0(34).new_subvariety()
        Abelian subvariety of dimension 1 of J0(34)
        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

    Python

        >>> from sage.all import *
        >>> J0(Integer(34)).new_subvariety()
        Abelian subvariety of dimension 1 of J0(34)
        >>> J0(Integer(100)).new_subvariety()
        Abelian subvariety of dimension 1 of J0(100)
        >>> J1(Integer(13)).new_subvariety()
        Abelian variety J1(13) of dimension 2

  old_subvariety(p=None)

    Return the old or \(p\)-old abelian variety of `self`.

    INPUT:

    - `self` – a modular abelian variety

    - `p` – prime number or `None` (default); if \(p\) is a prime, return the \(p\)-old subvariety. Otherwise return the full old subvariety.

    EXAMPLES:

    Sage

        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)

    Python

        >>> from sage.all import *
        >>> J0(Integer(33)).old_subvariety()
        Abelian subvariety of dimension 2 of J0(33)
        >>> J0(Integer(100)).old_subvariety()
        Abelian subvariety of dimension 6 of J0(100)
        >>> J1(Integer(13)).old_subvariety()
        Abelian subvariety of dimension 0 of J1(13)

sage.modular.abvar.abvar.factor_modsym_space_new_factors(M)

  Return the factorizations of all the new subspaces of \(M\).

  INPUT:

  - `M` – ambient modular symbols space

  OUTPUT: list of decompositions corresponding to each new space

  EXAMPLES:

  Sage

      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]]

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(33))
      >>> 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]]

sage.modular.abvar.abvar.factor_new_space(M)

  Given a new space \(M\) of modular symbols, return the decomposition into simple of \(M\) under the Hecke operators.

  INPUT:

  - `M` – modular symbols space

  OUTPUT: list of factors

  EXAMPLES:

  Sage

      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]

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(37)).cuspidal_subspace()
      >>> 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]

sage.modular.abvar.abvar.is_ModularAbelianVariety(x)

  Return `True` if x is a modular abelian variety.

  INPUT:

  - `x` – object

  EXAMPLES:

  Sage

      sage: from sage.modular.abvar.abvar import is_ModularAbelianVariety
      sage: is_ModularAbelianVariety(5)
      doctest:warning...
      DeprecationWarning: The function is_ModularAbelianVariety is deprecated; use 'isinstance(..., ModularAbelianVariety_abstract)' instead.
      See https://github.com/sagemath/sage/issues/38035 for details.
      False
      sage: is_ModularAbelianVariety(J0(37))
      True

  Python

      >>> from sage.all import *
      >>> from sage.modular.abvar.abvar import is_ModularAbelianVariety
      >>> is_ModularAbelianVariety(Integer(5))
      doctest:warning...
      DeprecationWarning: The function is_ModularAbelianVariety is deprecated; use 'isinstance(..., ModularAbelianVariety_abstract)' instead.
      See https://github.com/sagemath/sage/issues/38035 for details.
      False
      >>> is_ModularAbelianVariety(J0(Integer(37)))
      True

  Returning `True` is a statement about the data type not whether or not some abelian variety is modular:

  Sage

      sage: is_ModularAbelianVariety(EllipticCurve('37a'))
      False

  [Python]

      >>> from sage.all import *
      >>> is_ModularAbelianVariety(EllipticCurve('37a'))
      False

sage.modular.abvar.abvar.modsym_lattices(M, factors)

  Append lattice information to the output of simple_factorization_of_modsym_space.

  INPUT:

  - `M` – modular symbols spaces

  - `factors` – sequence (simple_factorization_of_modsym_space)

  OUTPUT: sequence with more information for each factor (the lattice)

  EXAMPLES:

  Sage

      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])]

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(33))
      >>> factors = sage.modular.abvar.abvar.simple_factorization_of_modsym_space(M, simple=False)
      >>> 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])]

sage.modular.abvar.abvar.random_hecke_operator(M, t=None, p=2)

  Return a random Hecke operator acting on \(M\), got by adding to \(t\) a random multiple of \(T_p\)

  INPUT:

  - `M` – modular symbols space

  - `t` – `None` or a Hecke operator

  - `p` – a prime

  OUTPUT: Hecke operator prime

  EXAMPLES:

  Sage

      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

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(11)).cuspidal_subspace()
      >>> t, p = sage.modular.abvar.abvar.random_hecke_operator(M)
      >>> p
      3
      >>> t, p = sage.modular.abvar.abvar.random_hecke_operator(M, t, p)
      >>> p
      5

sage.modular.abvar.abvar.simple_factorization_of_modsym_space(M, simple=True)

  Return the canonical factorization of \(M\) into (simple) subspaces.

  INPUT:

  - `M` – ambient modular symbols space

  - `simple` – boolean (default: `True`); if set to `False`, isogenous simple factors are grouped together

  OUTPUT: sequence

  EXAMPLES:

  Sage

      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)]

  Python

      >>> from sage.all import *
      >>> M = ModularSymbols(Integer(33))
      >>> 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.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)]

sage.modular.abvar.abvar.sqrt_poly(f)

  Return the square root of the polynomial \(f\).

  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.

  EXAMPLES:

  Sage

      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

  Python

      >>> from sage.all import *
      >>> R = QQ['x']; (x,) = R._first_ngens(1)
      >>> f = (x-Integer(1))*(x+Integer(2))*(x**Integer(2) + Integer(1)/Integer(3)*x + Integer(5))
      >>> f
      x^4 + 4/3*x^3 + 10/3*x^2 + 13/3*x - 10
      >>> sage.modular.abvar.abvar.sqrt_poly(f**Integer(2))
      x^4 + 4/3*x^3 + 10/3*x^2 + 13/3*x - 10
      >>> sage.modular.abvar.abvar.sqrt_poly(f)
      Traceback (most recent call last):
      ...
      ValueError: f must be a perfect square
      >>> sage.modular.abvar.abvar.sqrt_poly(Integer(2)*f**Integer(2))
      Traceback (most recent call last):
      ...
      ValueError: f must be monic