Exemplo n.º 1
0
 def __init__(self, domain, codomain, cat):
     """
     Create a homspace.
     
     INPUT:
     
     
     -  ``domain, codomain`` - modular abelian varieties
     
     -  ``cat`` - category
     
     
     EXAMPLES::
     
         sage: H = Hom(J0(11), J0(22)); H
         Space of homomorphisms from Abelian variety J0(11) of dimension 1 to Abelian variety J0(22) of dimension 2
         sage: Hom(J0(11), J0(11))
         Endomorphism ring of Abelian variety J0(11) of dimension 1
         sage: type(H)
         <class 'sage.modular.abvar.homspace.Homspace_with_category'>
         sage: H.homset_category()
         Category of modular abelian varieties over Rational Field
     """
     if not abelian_variety.is_ModularAbelianVariety(domain):
         raise TypeError, "domain must be a modular abelian variety"
     if not abelian_variety.is_ModularAbelianVariety(codomain):
         raise TypeError, "codomain must be a modular abelian variety"
     self._matrix_space = MatrixSpace(ZZ, 2 * domain.dimension(),
                                      2 * codomain.dimension())
     self._gens = None
     HomsetWithBase.__init__(self, domain, codomain, cat)
Exemplo n.º 2
0
    def __init__(self, domain, codomain, cat):
        """
        Create a homspace.

        INPUT:


        -  ``domain, codomain`` - modular abelian varieties

        -  ``cat`` - category


        EXAMPLES::

            sage: H = Hom(J0(11), J0(22)); H
            Space of homomorphisms from Abelian variety J0(11) of dimension 1 to Abelian variety J0(22) of dimension 2
            sage: Hom(J0(11), J0(11))
            Endomorphism ring of Abelian variety J0(11) of dimension 1
            sage: type(H)
            <class 'sage.modular.abvar.homspace.Homspace_with_category'>
            sage: H.homset_category()
            Category of modular abelian varieties over Rational Field
        """
        if not abelian_variety.is_ModularAbelianVariety(domain):
            raise TypeError, "domain must be a modular abelian variety"
        if not abelian_variety.is_ModularAbelianVariety(codomain):
            raise TypeError, "codomain must be a modular abelian variety"
        self._matrix_space = MatrixSpace(ZZ,2*domain.dimension(), 2*codomain.dimension())
        self._gens = None
        HomsetWithBase.__init__(self, domain, codomain, cat)
Exemplo n.º 3
0
    def __init__(self, abvar, lattice, field_of_definition=QQbar, check=True):
        """
        A finite subgroup of a modular abelian variety that is defined by a
        given lattice.

        INPUT:

        -  ``abvar`` - a modular abelian variety

        -  ``lattice`` - a lattice that contains the lattice of
           abvar

        -  ``field_of_definition`` - the field of definition
           of this finite group scheme

        -  ``check`` - bool (default: True) whether or not to
           check that lattice contains the abvar lattice.

        EXAMPLES::

            sage: J = J0(11)
            sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
            Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
        """
        if check:
            if not is_FreeModule(lattice) or lattice.base_ring() != ZZ:
                raise TypeError, "lattice must be a free module over ZZ"
            if not abelian_variety.is_ModularAbelianVariety(abvar):
                raise TypeError, "abvar must be a modular abelian variety"
            if not abvar.lattice().is_submodule(lattice):
                lattice += abvar.lattice()
            if lattice.rank() != abvar.lattice().rank():
                raise ValueError, "lattice must contain the lattice of abvar with finite index"
        FiniteSubgroup.__init__(self, abvar, field_of_definition)
        self.__lattice = lattice
Exemplo n.º 4
0
    def __init__(self, abvar, field_of_definition=QQ):
        """
        A finite subgroup of a modular abelian variety.

        INPUT:

        -  ``abvar`` - a modular abelian variety

        -  ``field_of_definition`` - a field over which this
           group is defined.

        EXAMPLES: This is an abstract base class, so there are no instances
        of this class itself.

        ::

            sage: A = J0(37)
            sage: G = A.torsion_subgroup(3); G
            Finite subgroup with invariants [3, 3, 3, 3] over QQ of Abelian variety J0(37) of dimension 2
            sage: type(G)
            <class 'sage.modular.abvar.finite_subgroup.FiniteSubgroup_lattice'>
            sage: from sage.modular.abvar.finite_subgroup import FiniteSubgroup
            sage: isinstance(G, FiniteSubgroup)
            True
        """
        if field_of_definition not in _Fields:
            raise TypeError, "field_of_definition must be a field"
        if not abelian_variety.is_ModularAbelianVariety(abvar):
            raise TypeError, "abvar must be a modular abelian variety"
        Module_old.__init__(self, ZZ)
        self.__abvar = abvar
        self.__field_of_definition = field_of_definition
Exemplo n.º 5
0
 def __init__(self, abvar, field_of_definition=QQ):
     """
     A finite subgroup of a modular abelian variety.
     
     INPUT:
     
     
     -  ``abvar`` - a modular abelian variety
     
     -  ``field_of_definition`` - a field over which this
        group is defined.
     
     
     EXAMPLES: This is an abstract base class, so there are no instances
     of this class itself.
     
     ::
     
         sage: A = J0(37)
         sage: G = A.torsion_subgroup(3); G
         Finite subgroup with invariants [3, 3, 3, 3] over QQ of Abelian variety J0(37) of dimension 2
         sage: type(G)
         <class 'sage.modular.abvar.finite_subgroup.FiniteSubgroup_lattice'>
         sage: from sage.modular.abvar.finite_subgroup import FiniteSubgroup
         sage: isinstance(G, FiniteSubgroup)
         True
     """
     if field_of_definition not in _Fields:
         raise TypeError, "field_of_definition must be a field"
     if not abelian_variety.is_ModularAbelianVariety(abvar):
         raise TypeError, "abvar must be a modular abelian variety"
     Module_old.__init__(self, ZZ)
     self.__abvar = abvar
     self.__field_of_definition = field_of_definition
Exemplo n.º 6
0
    def __init__(self, abvar, n):
        """
        Create the Hecke operator of index `n` acting on the
        abelian variety abvar.

        INPUT:


        -  ``abvar`` - a modular abelian variety

        -  ``n`` - a positive integer


        EXAMPLES::

            sage: J = J0(37)
            sage: T2 = J.hecke_operator(2); T2
            Hecke operator T_2 on Abelian variety J0(37) of dimension 2
            sage: T2.parent()
            Endomorphism ring of Abelian variety J0(37) of dimension 2
        """
        n = ZZ(n)
        if n <= 0:
            raise ValueError("n must be positive")
        if not abelian_variety.is_ModularAbelianVariety(abvar):
            raise TypeError("abvar must be a modular abelian variety")
        self.__abvar = abvar
        self.__n = n
        sage.modules.matrix_morphism.MatrixMorphism_abstract.__init__(
            self, abvar.Hom(abvar))
Exemplo n.º 7
0
 def __init__(self, abvar, n):
     """
     Create the Hecke operator of index `n` acting on the
     abelian variety abvar.
     
     INPUT:
     
     
     -  ``abvar`` - a modular abelian variety
     
     -  ``n`` - a positive integer
     
     
     EXAMPLES::
     
         sage: J = J0(37)
         sage: T2 = J.hecke_operator(2); T2
         Hecke operator T_2 on Abelian variety J0(37) of dimension 2
         sage: T2.parent()
         Endomorphism ring of Abelian variety J0(37) of dimension 2
     """
     n = ZZ(n)
     if n <= 0:
         raise ValueError, "n must be positive"
     if not abelian_variety.is_ModularAbelianVariety(abvar):
         raise TypeError, "abvar must be a modular abelian variety"
     self.__abvar = abvar
     self.__n = n
     sage.modules.matrix_morphism.MatrixMorphism_abstract.__init__(self, abvar.Hom(abvar))
Exemplo n.º 8
0
    def __init__(self, abvar, lattice, field_of_definition=QQbar, check=True):
        """
        A finite subgroup of a modular abelian variety that is defined by a
        given lattice.

        INPUT:

        -  ``abvar`` - a modular abelian variety

        -  ``lattice`` - a lattice that contains the lattice of
           abvar

        -  ``field_of_definition`` - the field of definition
           of this finite group scheme

        -  ``check`` - bool (default: True) whether or not to
           check that lattice contains the abvar lattice.

        EXAMPLES::

            sage: J = J0(11)
            sage: G = J.finite_subgroup([[1/3,0], [0,1/5]]); G
            Finite subgroup with invariants [15] over QQbar of Abelian variety J0(11) of dimension 1
        """
        if check:
            if not is_FreeModule(lattice) or lattice.base_ring() != ZZ:
                raise TypeError, "lattice must be a free module over ZZ"
            if not abelian_variety.is_ModularAbelianVariety(abvar):
                raise TypeError, "abvar must be a modular abelian variety"
            if not abvar.lattice().is_submodule(lattice):
                lattice += abvar.lattice()
            if lattice.rank() != abvar.lattice().rank():
                raise ValueError, "lattice must contain the lattice of abvar with finite index"
        FiniteSubgroup.__init__(self, abvar, field_of_definition)
        self.__lattice = lattice
Exemplo n.º 9
0
    def __init__(self, abvar, field_of_definition=QQ):
        """
        Initialize ``self``.

        TESTS::

            sage: A = J0(11)
            sage: G = A.torsion_subgroup(2)
            sage: TestSuite(G).run() # long time
        """
        from sage.categories.category import Category
        from sage.categories.fields import Fields
        from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
        from sage.categories.modules import Modules

        if field_of_definition not in Fields():
            raise TypeError("field_of_definition must be a field")
        if not abelian_variety.is_ModularAbelianVariety(abvar):
            raise TypeError("abvar must be a modular abelian variety")
        category = Category.join((Modules(ZZ), FiniteEnumeratedSets()))
        Module.__init__(self, ZZ, category=category)
        self.__abvar = abvar
        self.__field_of_definition = field_of_definition
Exemplo n.º 10
0
    def __init__(self, abvar, field_of_definition=QQ):
        """
        Initialize ``self``.

        TESTS::
            sage: from sage_modabvar import J0
            sage: A = J0(11)
            sage: G = A.torsion_subgroup(2)
            sage: TestSuite(G).run() # long time
        """
        from sage.categories.category import Category
        from sage.categories.fields import Fields
        from sage.categories.finite_enumerated_sets import FiniteEnumeratedSets
        from sage.categories.modules import Modules

        if field_of_definition not in Fields():
            raise TypeError("field_of_definition must be a field")
        if not abelian_variety.is_ModularAbelianVariety(abvar):
            raise TypeError("abvar must be a modular abelian variety")
        category = Category.join((Modules(ZZ), FiniteEnumeratedSets()))
        Module.__init__(self, ZZ, category=category)
        self.__abvar = abvar
        self.__field_of_definition = field_of_definition
Exemplo n.º 11
0
    def intersection(self, other):
        """
        Return the intersection of the finite subgroups self and other.

        INPUT:

        -  ``other`` - a finite group

        OUTPUT: a finite group

        EXAMPLES::

            sage: E11a0, E11a1, B = J0(33)
            sage: G = E11a0.torsion_subgroup(6); H = E11a0.torsion_subgroup(9)
            sage: G.intersection(H)
            Finite subgroup with invariants [3, 3] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: W = E11a1.torsion_subgroup(15)
            sage: G.intersection(W)
            Finite subgroup with invariants [] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: E11a0.intersection(E11a1)[0]
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)

        We intersect subgroups of different abelian varieties.

        ::

            sage: E11a0, E11a1, B = J0(33)
            sage: G = E11a0.torsion_subgroup(5); H = E11a1.torsion_subgroup(5)
            sage: G.intersection(H)
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: E11a0.intersection(E11a1)[0]
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)

        We intersect abelian varieties with subgroups::

            sage: t = J0(33).hecke_operator(7)
            sage: G = t.kernel()[0]; G
            Finite subgroup with invariants [2, 2, 2, 2, 4, 4] over QQ of Abelian variety J0(33) of dimension 3
            sage: A = J0(33).old_subvariety()
            sage: A.intersection(G)
            Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
            sage: A.hecke_operator(7).kernel()[0]
            Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
            sage: B = J0(33).new_subvariety()
            sage: B.intersection(G)
            Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
            sage: B.hecke_operator(7).kernel()[0]
            Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
            sage: A.intersection(B)[0]
            Finite subgroup with invariants [3, 3] over QQ of Abelian subvariety of dimension 2 of J0(33)
        """
        A = self.abelian_variety()
        if abelian_variety.is_ModularAbelianVariety(other):
            amb = other
            B = other
            M = B.lattice().scale(Integer(1) / self.exponent())
            K = composite_field(self.field_of_definition(), other.base_field())
        else:
            amb = A
            if not isinstance(other, FiniteSubgroup):
                raise TypeError, "only addition of two finite subgroups is defined"
            B = other.abelian_variety()
            if A.ambient_variety() != B.ambient_variety():
                raise TypeError, "finite subgroups must be in the same ambient product Jacobian"
            M = other.lattice()
            K = composite_field(self.field_of_definition(),
                                other.field_of_definition())

        L = self.lattice()
        if A != B:
            # TODO: This might be way slower than what we could do if
            # we think more carefully.
            C = A + B
            L = L + C.lattice()
            M = M + C.lattice()
        W = L.intersection(M).intersection(amb.vector_space())
        return FiniteSubgroup_lattice(amb, W, field_of_definition=K)
Exemplo n.º 12
0
    def intersection(self, other):
        """
        Return the intersection of the finite subgroups self and other.
        
        INPUT:
        
        
        -  ``other`` - a finite group
        
        
        OUTPUT: a finite group
        
        EXAMPLES::
        
            sage: E11a0, E11a1, B = J0(33)
            sage: G = E11a0.torsion_subgroup(6); H = E11a0.torsion_subgroup(9)
            sage: G.intersection(H)
            Finite subgroup with invariants [3, 3] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: W = E11a1.torsion_subgroup(15)
            sage: G.intersection(W)
            Finite subgroup with invariants [] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: E11a0.intersection(E11a1)[0]
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        
        We intersect subgroups of different abelian varieties.
        
        ::
        
            sage: E11a0, E11a1, B = J0(33)
            sage: G = E11a0.torsion_subgroup(5); H = E11a1.torsion_subgroup(5)
            sage: G.intersection(H)
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
            sage: E11a0.intersection(E11a1)[0]
            Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
        
        We intersect abelian varieties with subgroups::
        
            sage: t = J0(33).hecke_operator(7)
            sage: G = t.kernel()[0]; G
            Finite subgroup with invariants [2, 2, 2, 2, 4, 4] over QQ of Abelian variety J0(33) of dimension 3
            sage: A = J0(33).old_subvariety()
            sage: A.intersection(G)
            Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
            sage: A.hecke_operator(7).kernel()[0]
            Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian subvariety of dimension 2 of J0(33)
            sage: B = J0(33).new_subvariety()
            sage: B.intersection(G)
            Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
            sage: B.hecke_operator(7).kernel()[0]
            Finite subgroup with invariants [4, 4] over QQ of Abelian subvariety of dimension 1 of J0(33)
            sage: A.intersection(B)[0]
            Finite subgroup with invariants [3, 3] over QQ of Abelian subvariety of dimension 2 of J0(33)
        """
        A = self.abelian_variety()
        if abelian_variety.is_ModularAbelianVariety(other):
            amb = other
            B = other
            M = B.lattice().scale(Integer(1)/self.exponent())
            K = composite_field(self.field_of_definition(), other.base_field())
        else:
            amb = A
            if not isinstance(other, FiniteSubgroup):
                raise TypeError, "only addition of two finite subgroups is defined"
            B = other.abelian_variety()
            if A.ambient_variety() != B.ambient_variety():
                raise TypeError, "finite subgroups must be in the same ambient product Jacobian"
            M = other.lattice()
            K = composite_field(self.field_of_definition(), other.field_of_definition())

        L = self.lattice()
        if A != B:
            # TODO: This might be way slower than what we could do if
            # we think more carefully.
            C = A + B
            L = L + C.lattice()
            M = M + C.lattice()
        W = L.intersection(M).intersection(amb.vector_space())
        return FiniteSubgroup_lattice(amb, W, field_of_definition=K)
Exemplo n.º 13
0
    def __call__(self, X):
        """
        INPUT:


        -  ``X`` - abelian variety, finite group, or torsion
           element


        OUTPUT: abelian variety, finite group, torsion element

        EXAMPLES: We apply morphisms to elements::

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

        We apply morphisms to subgroups::

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

        We apply morphisms to abelian subvarieties::

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

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

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

        Same but on a simple new factor::

            sage: C = J0(33)[2].cuspidal_subgroup(); C
            Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
            sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
            x - 1
            sage: t2(C)
            Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
        """
        from abvar import is_ModularAbelianVariety
        from finite_subgroup import FiniteSubgroup
        if isinstance(X, TorsionPoint):
            return self._image_of_element(X)
        elif is_ModularAbelianVariety(X):
            return self._image_of_abvar(X)
        elif isinstance(X, FiniteSubgroup):
            return self._image_of_finite_subgroup(X)
        else:
            raise TypeError("X must be an abelian variety or finite subgroup")
Exemplo n.º 14
0
 def __call__(self, X):
     """
     INPUT:
     
     
     -  ``X`` - abelian variety, finite group, or torsion
        element
     
     
     OUTPUT: abelian variety, finite group, torsion element
     
     EXAMPLES: We apply morphisms to elements::
     
         sage: t2 = J0(33).hecke_operator(2)
         sage: G  = J0(33).torsion_subgroup(2); G
         Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
         sage: t2(G.0)
         [(-1/2, 0, 1/2, -1/2, 1/2, -1/2)]
         sage: t2(G.0) in G
         True
         sage: t2(G.1)
         [(0, -1, 1/2, 0, 1/2, -1/2)]
         sage: t2(G.2)
         [(0, 0, 0, 0, 0, 0)]
         sage: K = t2.kernel()[0]; K
         Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
         sage: t2(K.0)
         [(0, 0, 0, 0, 0, 0)]
     
     We apply morphisms to subgroups::
     
         sage: t2 = J0(33).hecke_operator(2)
         sage: G  = J0(33).torsion_subgroup(2); G
         Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
         sage: t2(G)
         Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
         sage: t2.fcp()
         (x - 1) * (x + 2)^2
     
     We apply morphisms to abelian subvarieties::
     
         sage: E11a0, E11a1, B = J0(33)
         sage: t2 = J0(33).hecke_operator(2)
         sage: t3 = J0(33).hecke_operator(3)
         sage: E11a0
         Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
         sage: t3(E11a0)
         Abelian subvariety of dimension 1 of J0(33)
         sage: t3(E11a0).decomposition()
         [
         Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)
         ]
         sage: t3(E11a0) == E11a1
         True
         sage: t2(E11a0) == E11a0
         True
         sage: t3(E11a0) == E11a0
         False
         sage: t3(E11a0 + E11a1) == E11a0 + E11a1
         True
     
     We apply some Hecke operators to the cuspidal subgroup and split it
     up::
     
         sage: C = J0(33).cuspidal_subgroup(); C
         Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
         sage: t2 = J0(33).hecke_operator(2); t2.fcp()
         (x - 1) * (x + 2)^2
         sage: (t2 - 1)(C)
         Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(33) of dimension 3
         sage: (t2 + 2)(C)
         Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
     
     Same but on a simple new factor::
     
         sage: C = J0(33)[2].cuspidal_subgroup(); C
         Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
         sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
         x - 1
         sage: t2(C)
         Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
     """
     from abvar import is_ModularAbelianVariety
     from finite_subgroup import FiniteSubgroup
     if isinstance(X, TorsionPoint):
         return self._image_of_element(X)
     elif is_ModularAbelianVariety(X):
         return self._image_of_abvar(X)
     elif isinstance(X, FiniteSubgroup):
         return self._image_of_finite_subgroup(X)
     else:
         raise TypeError, "X must be an abelian variety or finite subgroup"