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