passagemath-schemes 10.8.1a4__cp314-cp314t-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
- passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
- passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
- passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
- passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +727 -0
- sage/lfunctions/pari.py +971 -0
- sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5132 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
- sage/modular/abvar/abvar_newform.py +246 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +187 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +721 -0
- sage/modular/abvar/homspace.py +989 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +741 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1406 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +361 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +659 -0
- sage/modular/arithgroup/congroup_gammaH.py +1491 -0
- sage/modular/arithgroup/congroup_generic.py +630 -0
- sage/modular/arithgroup/congroup_sl2z.py +266 -0
- sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1067 -0
- sage/modular/arithgroup/tests.py +425 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3736 -0
- sage/modular/btquotients/pautomorphicform.py +2564 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1107 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +571 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1076 -0
- sage/modular/hecke/algebra.py +725 -0
- sage/modular/hecke/all.py +19 -0
- sage/modular/hecke/ambient_module.py +994 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +302 -0
- sage/modular/hecke/hecke_operator.py +736 -0
- sage/modular/hecke/homspace.py +185 -0
- sage/modular/hecke/module.py +1744 -0
- sage/modular/hecke/morphism.py +139 -0
- sage/modular/hecke/submodule.py +970 -0
- sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2020 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1070 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +817 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +120 -0
- sage/modular/modform/ambient_g1.py +199 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +487 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4105 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +127 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1859 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +380 -0
- sage/modular/modform/weight1.py +221 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3844 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1291 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +376 -0
- sage/modular/multiple_zeta.py +2635 -0
- sage/modular/multiple_zeta_F_algebra.py +789 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1879 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +776 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +856 -0
- sage/modular/pollack_stevens/modsym.py +1590 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1078 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +846 -0
- sage/modular/quasimodform/ring.py +826 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +700 -0
- sage/schemes/curves/affine_curve.py +2924 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +397 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3203 -0
- sage/schemes/curves/weighted_projective_curve.py +106 -0
- sage/schemes/curves/zariski_vankampen.py +1931 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +991 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1103 -0
- sage/schemes/elliptic_curves/constructor.py +1530 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
- sage/schemes/elliptic_curves/ell_egros.py +457 -0
- sage/schemes/elliptic_curves/ell_field.py +2837 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4944 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7328 -0
- sage/schemes/elliptic_curves/height.py +2108 -0
- sage/schemes/elliptic_curves/hom.py +1788 -0
- sage/schemes/elliptic_curves/hom_composite.py +1084 -0
- sage/schemes/elliptic_curves/hom_fractional.py +544 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +681 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +247 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +915 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +716 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +369 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +581 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +53 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- sage_wheels/share/ellcurves/rank9 +7 -0
|
@@ -0,0 +1,935 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint
|
|
3
|
+
r"""
|
|
4
|
+
Hecke operators and morphisms between modular abelian varieties
|
|
5
|
+
|
|
6
|
+
Sage can compute with Hecke operators on modular abelian varieties.
|
|
7
|
+
A Hecke operator is defined by given a modular abelian variety and
|
|
8
|
+
an index. Given a Hecke operator, Sage can compute the
|
|
9
|
+
characteristic polynomial, and the action of the Hecke operator on
|
|
10
|
+
various homology groups.
|
|
11
|
+
|
|
12
|
+
AUTHORS:
|
|
13
|
+
|
|
14
|
+
- William Stein (2007-03)
|
|
15
|
+
|
|
16
|
+
- Craig Citro (2008-03)
|
|
17
|
+
|
|
18
|
+
EXAMPLES::
|
|
19
|
+
|
|
20
|
+
sage: A = J0(54)
|
|
21
|
+
sage: t5 = A.hecke_operator(5); t5
|
|
22
|
+
Hecke operator T_5 on Abelian variety J0(54) of dimension 4
|
|
23
|
+
sage: t5.charpoly().factor()
|
|
24
|
+
(x - 3) * (x + 3) * x^2
|
|
25
|
+
sage: B = A.new_subvariety(); B
|
|
26
|
+
Abelian subvariety of dimension 2 of J0(54)
|
|
27
|
+
sage: t5 = B.hecke_operator(5); t5
|
|
28
|
+
Hecke operator T_5 on Abelian subvariety of dimension 2 of J0(54)
|
|
29
|
+
sage: t5.charpoly().factor()
|
|
30
|
+
(x - 3) * (x + 3)
|
|
31
|
+
sage: t5.action_on_homology().matrix()
|
|
32
|
+
[ 0 3 3 -3]
|
|
33
|
+
[-3 3 3 0]
|
|
34
|
+
[ 3 3 0 -3]
|
|
35
|
+
[-3 6 3 -3]
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
###########################################################################
|
|
39
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com> #
|
|
40
|
+
# Distributed under the terms of the GNU General Public License (GPL) #
|
|
41
|
+
# http://www.gnu.org/licenses/ #
|
|
42
|
+
###########################################################################
|
|
43
|
+
|
|
44
|
+
from sage.categories.morphism import Morphism as base_Morphism
|
|
45
|
+
from sage.rings.integer_ring import ZZ
|
|
46
|
+
from sage.rings.rational_field import QQ
|
|
47
|
+
|
|
48
|
+
import sage.modules.matrix_morphism
|
|
49
|
+
import sage.matrix.matrix_space as matrix_space
|
|
50
|
+
|
|
51
|
+
from .finite_subgroup import TorsionPoint
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class Morphism_abstract(sage.modules.matrix_morphism.MatrixMorphism_abstract):
|
|
55
|
+
"""
|
|
56
|
+
A morphism between modular abelian varieties.
|
|
57
|
+
|
|
58
|
+
EXAMPLES::
|
|
59
|
+
|
|
60
|
+
sage: t = J0(11).hecke_operator(2)
|
|
61
|
+
sage: from sage.modular.abvar.morphism import Morphism
|
|
62
|
+
sage: isinstance(t, Morphism)
|
|
63
|
+
True
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
def _repr_(self):
|
|
67
|
+
r"""
|
|
68
|
+
Return string representation of this morphism.
|
|
69
|
+
|
|
70
|
+
EXAMPLES::
|
|
71
|
+
|
|
72
|
+
sage: t = J0(11).hecke_operator(2)
|
|
73
|
+
sage: sage.modular.abvar.morphism.Morphism_abstract._repr_(t)
|
|
74
|
+
'Abelian variety endomorphism of Abelian variety J0(11) of dimension 1'
|
|
75
|
+
sage: J0(42).projection(J0(42)[0])._repr_()
|
|
76
|
+
'Abelian variety morphism:\n From: Abelian variety J0(42) of dimension 5\n To: Simple abelian subvariety 14a(1,42) of dimension 1 of J0(42)'
|
|
77
|
+
"""
|
|
78
|
+
return base_Morphism._repr_(self)
|
|
79
|
+
|
|
80
|
+
def _repr_type(self):
|
|
81
|
+
"""
|
|
82
|
+
Return type of morphism.
|
|
83
|
+
|
|
84
|
+
EXAMPLES::
|
|
85
|
+
|
|
86
|
+
sage: t = J0(11).hecke_operator(2)
|
|
87
|
+
sage: sage.modular.abvar.morphism.Morphism_abstract._repr_type(t)
|
|
88
|
+
'Abelian variety'
|
|
89
|
+
"""
|
|
90
|
+
return "Abelian variety"
|
|
91
|
+
|
|
92
|
+
def complementary_isogeny(self):
|
|
93
|
+
"""
|
|
94
|
+
Return the complementary isogeny of ``self``.
|
|
95
|
+
|
|
96
|
+
EXAMPLES::
|
|
97
|
+
|
|
98
|
+
sage: J = J0(43)
|
|
99
|
+
sage: A = J[1]
|
|
100
|
+
sage: T5 = A.hecke_operator(5)
|
|
101
|
+
sage: T5.is_isogeny()
|
|
102
|
+
True
|
|
103
|
+
sage: T5.complementary_isogeny()
|
|
104
|
+
Abelian variety endomorphism of Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
|
|
105
|
+
sage: (T5.complementary_isogeny() * T5).matrix()
|
|
106
|
+
[2 0 0 0]
|
|
107
|
+
[0 2 0 0]
|
|
108
|
+
[0 0 2 0]
|
|
109
|
+
[0 0 0 2]
|
|
110
|
+
"""
|
|
111
|
+
if not self.is_isogeny():
|
|
112
|
+
raise ValueError("self is not an isogeny")
|
|
113
|
+
M = self.matrix()
|
|
114
|
+
try:
|
|
115
|
+
iM, denom = M._invert_iml()
|
|
116
|
+
except AttributeError:
|
|
117
|
+
iM = M.matrix_over_field().invert()
|
|
118
|
+
iM, denom = iM._clear_denom()
|
|
119
|
+
return Morphism(self.parent().reversed(), iM)
|
|
120
|
+
|
|
121
|
+
def is_isogeny(self) -> bool:
|
|
122
|
+
"""
|
|
123
|
+
Return ``True`` if this morphism is an isogeny of abelian varieties.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: J = J0(39)
|
|
128
|
+
sage: Id = J.hecke_operator(1)
|
|
129
|
+
sage: Id.is_isogeny()
|
|
130
|
+
True
|
|
131
|
+
sage: J.hecke_operator(19).is_isogeny()
|
|
132
|
+
False
|
|
133
|
+
"""
|
|
134
|
+
M = self.matrix()
|
|
135
|
+
return M.nrows() == M.ncols() == M.rank()
|
|
136
|
+
|
|
137
|
+
def cokernel(self):
|
|
138
|
+
"""
|
|
139
|
+
Return the cokernel of ``self``.
|
|
140
|
+
|
|
141
|
+
OUTPUT:
|
|
142
|
+
|
|
143
|
+
- ``A`` -- an abelian variety (the cokernel)
|
|
144
|
+
|
|
145
|
+
- ``phi`` -- a quotient map from ``self.codomain()`` to the
|
|
146
|
+
cokernel of self
|
|
147
|
+
|
|
148
|
+
EXAMPLES::
|
|
149
|
+
|
|
150
|
+
sage: t = J0(33).hecke_operator(2)
|
|
151
|
+
sage: (t-1).cokernel()
|
|
152
|
+
(Abelian subvariety of dimension 1 of J0(33),
|
|
153
|
+
Abelian variety morphism:
|
|
154
|
+
From: Abelian variety J0(33) of dimension 3
|
|
155
|
+
To: Abelian subvariety of dimension 1 of J0(33))
|
|
156
|
+
|
|
157
|
+
Projection will always have cokernel zero.
|
|
158
|
+
|
|
159
|
+
::
|
|
160
|
+
|
|
161
|
+
sage: J0(37).projection(J0(37)[0]).cokernel()
|
|
162
|
+
(Simple abelian subvariety of dimension 0 of J0(37),
|
|
163
|
+
Abelian variety morphism:
|
|
164
|
+
From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
|
|
165
|
+
To: Simple abelian subvariety of dimension 0 of J0(37))
|
|
166
|
+
|
|
167
|
+
Here we have a nontrivial cokernel of a Hecke operator, as the
|
|
168
|
+
T_2-eigenvalue for the newform 37b is 0.
|
|
169
|
+
|
|
170
|
+
::
|
|
171
|
+
|
|
172
|
+
sage: J0(37).hecke_operator(2).cokernel()
|
|
173
|
+
(Abelian subvariety of dimension 1 of J0(37),
|
|
174
|
+
Abelian variety morphism:
|
|
175
|
+
From: Abelian variety J0(37) of dimension 2
|
|
176
|
+
To: Abelian subvariety of dimension 1 of J0(37))
|
|
177
|
+
sage: AbelianVariety('37b').newform().q_expansion(5)
|
|
178
|
+
q + q^3 - 2*q^4 + O(q^5)
|
|
179
|
+
"""
|
|
180
|
+
try:
|
|
181
|
+
return self.__cokernel
|
|
182
|
+
except AttributeError:
|
|
183
|
+
I = self.image()
|
|
184
|
+
C = self.codomain().quotient(I)
|
|
185
|
+
self.__cokernel = C
|
|
186
|
+
return C
|
|
187
|
+
|
|
188
|
+
def kernel(self):
|
|
189
|
+
"""
|
|
190
|
+
Return the kernel of this morphism.
|
|
191
|
+
|
|
192
|
+
OUTPUT:
|
|
193
|
+
|
|
194
|
+
- ``G`` -- a finite group
|
|
195
|
+
|
|
196
|
+
- ``A`` -- an abelian variety (identity component of the kernel)
|
|
197
|
+
|
|
198
|
+
EXAMPLES: We compute the kernel of a projection map. Notice that
|
|
199
|
+
the kernel has a nontrivial abelian variety part.
|
|
200
|
+
|
|
201
|
+
::
|
|
202
|
+
|
|
203
|
+
sage: A, B, C = J0(33)
|
|
204
|
+
sage: pi = J0(33).projection(B)
|
|
205
|
+
sage: pi.kernel()
|
|
206
|
+
(Finite subgroup with invariants [20] over QQbar of Abelian variety J0(33) of dimension 3,
|
|
207
|
+
Abelian subvariety of dimension 2 of J0(33))
|
|
208
|
+
|
|
209
|
+
We compute the kernels of some Hecke operators::
|
|
210
|
+
|
|
211
|
+
sage: t2 = J0(33).hecke_operator(2)
|
|
212
|
+
sage: t2
|
|
213
|
+
Hecke operator T_2 on Abelian variety J0(33) of dimension 3
|
|
214
|
+
sage: t2.kernel()
|
|
215
|
+
(Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3,
|
|
216
|
+
Abelian subvariety of dimension 0 of J0(33))
|
|
217
|
+
sage: t3 = J0(33).hecke_operator(3)
|
|
218
|
+
sage: t3.kernel()
|
|
219
|
+
(Finite subgroup with invariants [3, 3] over QQ of Abelian variety J0(33) of dimension 3,
|
|
220
|
+
Abelian subvariety of dimension 0 of J0(33))
|
|
221
|
+
"""
|
|
222
|
+
A = self.matrix()
|
|
223
|
+
L = A.image().change_ring(ZZ)
|
|
224
|
+
# Saturate the image of the matrix corresponding to self.
|
|
225
|
+
Lsat = L.saturation()
|
|
226
|
+
# Now find a matrix whose rows map exactly onto the
|
|
227
|
+
# saturation of L.
|
|
228
|
+
X = A.solve_left(Lsat.basis_matrix())
|
|
229
|
+
D = self.domain()
|
|
230
|
+
V = (A.kernel().basis_matrix() * D.vector_space().basis_matrix()).row_module()
|
|
231
|
+
Lambda = V.intersection(D._ambient_lattice())
|
|
232
|
+
from .abvar import ModularAbelianVariety
|
|
233
|
+
abvar = ModularAbelianVariety(D.groups(), Lambda, D.base_ring())
|
|
234
|
+
|
|
235
|
+
if Lambda.rank() == 0:
|
|
236
|
+
field_of_definition = QQ
|
|
237
|
+
else:
|
|
238
|
+
field_of_definition = None
|
|
239
|
+
|
|
240
|
+
lattice = (X * self.domain().lattice().basis_matrix()).row_module(ZZ)
|
|
241
|
+
|
|
242
|
+
K = D.finite_subgroup(lattice, field_of_definition=field_of_definition)
|
|
243
|
+
|
|
244
|
+
return K, abvar
|
|
245
|
+
|
|
246
|
+
def factor_out_component_group(self):
|
|
247
|
+
r"""
|
|
248
|
+
View ``self`` as a morphism `f:A \to B`. Then `\ker(f)`
|
|
249
|
+
is an extension of an abelian variety `C` by a finite
|
|
250
|
+
component group `G`. This function constructs a morphism
|
|
251
|
+
`g` with domain `A` and codomain Q isogenous to
|
|
252
|
+
`C` such that `\ker(g)` is equal to `C`.
|
|
253
|
+
|
|
254
|
+
OUTPUT: a morphism
|
|
255
|
+
|
|
256
|
+
EXAMPLES::
|
|
257
|
+
|
|
258
|
+
sage: A,B,C = J0(33)
|
|
259
|
+
sage: pi = J0(33).projection(A)
|
|
260
|
+
sage: pi.kernel()
|
|
261
|
+
(Finite subgroup with invariants [5] over QQbar of Abelian variety J0(33) of dimension 3,
|
|
262
|
+
Abelian subvariety of dimension 2 of J0(33))
|
|
263
|
+
sage: psi = pi.factor_out_component_group()
|
|
264
|
+
sage: psi.kernel()
|
|
265
|
+
(Finite subgroup with invariants [] over QQbar of Abelian variety J0(33) of dimension 3,
|
|
266
|
+
Abelian subvariety of dimension 2 of J0(33))
|
|
267
|
+
|
|
268
|
+
ALGORITHM: We compute a subgroup `G` of `B` so that
|
|
269
|
+
the composition `h: A\to B \to B/G` has kernel that
|
|
270
|
+
contains `A[n]` and component group isomorphic to
|
|
271
|
+
`(\ZZ/n\ZZ)^{2d}`, where `d` is the
|
|
272
|
+
dimension of `A`. Then `h` factors through
|
|
273
|
+
multiplication by `n`, so there is a morphism
|
|
274
|
+
`g: A\to B/G` such that `g \circ [n] = h`. Then
|
|
275
|
+
`g` is the desired morphism. We give more details below
|
|
276
|
+
about how to transform this into linear algebra.
|
|
277
|
+
"""
|
|
278
|
+
try:
|
|
279
|
+
return self.__factor_out
|
|
280
|
+
except AttributeError:
|
|
281
|
+
A = self.matrix()
|
|
282
|
+
L = A.image()
|
|
283
|
+
# Saturate the image of the matrix corresponding to self.
|
|
284
|
+
Lsat = L.saturation()
|
|
285
|
+
if L == Lsat: # easy case
|
|
286
|
+
self.__factor_out = self
|
|
287
|
+
return self
|
|
288
|
+
# Now find a matrix whose rows map exactly onto the
|
|
289
|
+
# saturation of L.
|
|
290
|
+
X = A.solve_left(Lsat.basis_matrix())
|
|
291
|
+
|
|
292
|
+
# Find an integer n such that 1/n times the lattice Lambda of A
|
|
293
|
+
# contains the row span of X.
|
|
294
|
+
n = X.denominator()
|
|
295
|
+
|
|
296
|
+
# Let M be the lattice of the codomain B of self.
|
|
297
|
+
# Now 1/n * Lambda contains Lambda and maps
|
|
298
|
+
# via the matrix of self to a lattice L' that
|
|
299
|
+
# contains Lsat. Consider the lattice
|
|
300
|
+
# R = M + L'.
|
|
301
|
+
# This is a lattice that contains the lattice M of B.
|
|
302
|
+
# Also 1/n*Lambda maps exactly to L' in R.
|
|
303
|
+
# We have
|
|
304
|
+
# R/L' = (M+L')/L' = M/(L'/\M) = M/Lsat
|
|
305
|
+
# which is torsion free!
|
|
306
|
+
|
|
307
|
+
Q = self.codomain()
|
|
308
|
+
M = Q.lattice()
|
|
309
|
+
one_over_n = ZZ.one() / n
|
|
310
|
+
Lprime = (one_over_n * self.matrix() * M.basis_matrix()).row_module(ZZ)
|
|
311
|
+
|
|
312
|
+
# This R is a lattice in the ambient space for B.
|
|
313
|
+
R = Lprime + M
|
|
314
|
+
|
|
315
|
+
from .abvar import ModularAbelianVariety
|
|
316
|
+
C = ModularAbelianVariety(Q.groups(), R, Q.base_field())
|
|
317
|
+
|
|
318
|
+
# We have to change the basis of the representation of A
|
|
319
|
+
# to the basis for R instead of the basis for M. Each row
|
|
320
|
+
# of A is written in terms of M, but needs to be in terms
|
|
321
|
+
# of R's basis, which contains M with finite index.
|
|
322
|
+
change_basis_from_M_to_R = R.basis_matrix().solve_left(M.basis_matrix())
|
|
323
|
+
matrix = one_over_n * A * change_basis_from_M_to_R
|
|
324
|
+
|
|
325
|
+
# Finally
|
|
326
|
+
g = Morphism(self.domain().Hom(C), matrix)
|
|
327
|
+
self.__factor_out = g
|
|
328
|
+
return g
|
|
329
|
+
|
|
330
|
+
def image(self):
|
|
331
|
+
"""
|
|
332
|
+
Return the image of this morphism.
|
|
333
|
+
|
|
334
|
+
OUTPUT: an abelian variety
|
|
335
|
+
|
|
336
|
+
EXAMPLES: We compute the image of projection onto a factor of
|
|
337
|
+
`J_0(33)`::
|
|
338
|
+
|
|
339
|
+
sage: A,B,C = J0(33)
|
|
340
|
+
sage: A
|
|
341
|
+
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
|
|
342
|
+
sage: f = J0(33).projection(A)
|
|
343
|
+
sage: f.image()
|
|
344
|
+
Abelian subvariety of dimension 1 of J0(33)
|
|
345
|
+
sage: f.image() == A
|
|
346
|
+
True
|
|
347
|
+
|
|
348
|
+
We compute the image of a Hecke operator::
|
|
349
|
+
|
|
350
|
+
sage: t2 = J0(33).hecke_operator(2); t2.fcp()
|
|
351
|
+
(x - 1) * (x + 2)^2
|
|
352
|
+
sage: phi = t2 + 2
|
|
353
|
+
sage: phi.image()
|
|
354
|
+
Abelian subvariety of dimension 1 of J0(33)
|
|
355
|
+
|
|
356
|
+
The sum of the image and the kernel is the whole space::
|
|
357
|
+
|
|
358
|
+
sage: phi.kernel()[1] + phi.image() == J0(33)
|
|
359
|
+
True
|
|
360
|
+
"""
|
|
361
|
+
return self(self.domain())
|
|
362
|
+
|
|
363
|
+
def __call__(self, X):
|
|
364
|
+
"""
|
|
365
|
+
INPUT:
|
|
366
|
+
|
|
367
|
+
- ``X`` -- abelian variety, finite group, or torsion element
|
|
368
|
+
|
|
369
|
+
OUTPUT: abelian variety, finite group, torsion element
|
|
370
|
+
|
|
371
|
+
EXAMPLES: We apply morphisms to elements::
|
|
372
|
+
|
|
373
|
+
sage: t2 = J0(33).hecke_operator(2)
|
|
374
|
+
sage: G = J0(33).torsion_subgroup(2); G
|
|
375
|
+
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
|
|
376
|
+
sage: t2(G.0)
|
|
377
|
+
[(-1/2, 0, 1/2, -1/2, 1/2, -1/2)]
|
|
378
|
+
sage: t2(G.0) in G
|
|
379
|
+
True
|
|
380
|
+
sage: t2(G.1)
|
|
381
|
+
[(0, -1, 1/2, 0, 1/2, -1/2)]
|
|
382
|
+
sage: t2(G.2)
|
|
383
|
+
[(0, 0, 0, 0, 0, 0)]
|
|
384
|
+
sage: K = t2.kernel()[0]; K
|
|
385
|
+
Finite subgroup with invariants [2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
|
|
386
|
+
sage: t2(K.0)
|
|
387
|
+
[(0, 0, 0, 0, 0, 0)]
|
|
388
|
+
|
|
389
|
+
We apply morphisms to subgroups::
|
|
390
|
+
|
|
391
|
+
sage: t2 = J0(33).hecke_operator(2)
|
|
392
|
+
sage: G = J0(33).torsion_subgroup(2); G
|
|
393
|
+
Finite subgroup with invariants [2, 2, 2, 2, 2, 2] over QQ of Abelian variety J0(33) of dimension 3
|
|
394
|
+
sage: t2(G)
|
|
395
|
+
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
|
|
396
|
+
sage: t2.fcp()
|
|
397
|
+
(x - 1) * (x + 2)^2
|
|
398
|
+
|
|
399
|
+
We apply morphisms to abelian subvarieties::
|
|
400
|
+
|
|
401
|
+
sage: E11a0, E11a1, B = J0(33)
|
|
402
|
+
sage: t2 = J0(33).hecke_operator(2)
|
|
403
|
+
sage: t3 = J0(33).hecke_operator(3)
|
|
404
|
+
sage: E11a0
|
|
405
|
+
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
|
|
406
|
+
sage: t3(E11a0)
|
|
407
|
+
Abelian subvariety of dimension 1 of J0(33)
|
|
408
|
+
sage: t3(E11a0).decomposition()
|
|
409
|
+
[Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33)]
|
|
410
|
+
sage: t3(E11a0) == E11a1
|
|
411
|
+
True
|
|
412
|
+
sage: t2(E11a0) == E11a0
|
|
413
|
+
True
|
|
414
|
+
sage: t3(E11a0) == E11a0
|
|
415
|
+
False
|
|
416
|
+
sage: t3(E11a0 + E11a1) == E11a0 + E11a1
|
|
417
|
+
True
|
|
418
|
+
|
|
419
|
+
We apply some Hecke operators to the cuspidal subgroup and split it
|
|
420
|
+
up::
|
|
421
|
+
|
|
422
|
+
sage: C = J0(33).cuspidal_subgroup(); C
|
|
423
|
+
Finite subgroup with invariants [10, 10] over QQ of Abelian variety J0(33) of dimension 3
|
|
424
|
+
sage: t2 = J0(33).hecke_operator(2); t2.fcp()
|
|
425
|
+
(x - 1) * (x + 2)^2
|
|
426
|
+
sage: (t2 - 1)(C)
|
|
427
|
+
Finite subgroup with invariants [5, 5] over QQ of Abelian variety J0(33) of dimension 3
|
|
428
|
+
sage: (t2 + 2)(C)
|
|
429
|
+
Finite subgroup with invariants [2, 2] over QQ of Abelian variety J0(33) of dimension 3
|
|
430
|
+
|
|
431
|
+
Same but on a simple new factor::
|
|
432
|
+
|
|
433
|
+
sage: C = J0(33)[2].cuspidal_subgroup(); C
|
|
434
|
+
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
|
|
435
|
+
sage: t2 = J0(33)[2].hecke_operator(2); t2.fcp()
|
|
436
|
+
x - 1
|
|
437
|
+
sage: t2(C)
|
|
438
|
+
Finite subgroup with invariants [2, 2] over QQ of Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)
|
|
439
|
+
"""
|
|
440
|
+
from .abvar import ModularAbelianVariety_abstract
|
|
441
|
+
from .finite_subgroup import FiniteSubgroup
|
|
442
|
+
if isinstance(X, TorsionPoint):
|
|
443
|
+
return self._image_of_element(X)
|
|
444
|
+
elif isinstance(X, ModularAbelianVariety_abstract):
|
|
445
|
+
return self._image_of_abvar(X)
|
|
446
|
+
elif isinstance(X, FiniteSubgroup):
|
|
447
|
+
return self._image_of_finite_subgroup(X)
|
|
448
|
+
else:
|
|
449
|
+
raise TypeError("X must be an abelian variety or finite subgroup")
|
|
450
|
+
|
|
451
|
+
def _image_of_element(self, x):
|
|
452
|
+
"""
|
|
453
|
+
Return the image of the torsion point `x` under this
|
|
454
|
+
morphism.
|
|
455
|
+
|
|
456
|
+
The parent of the image element is always the group of all torsion
|
|
457
|
+
elements of the abelian variety.
|
|
458
|
+
|
|
459
|
+
INPUT:
|
|
460
|
+
|
|
461
|
+
- ``x`` -- a torsion point on an abelian variety
|
|
462
|
+
|
|
463
|
+
OUTPUT: a torsion point
|
|
464
|
+
|
|
465
|
+
EXAMPLES::
|
|
466
|
+
|
|
467
|
+
sage: A = J0(11); t = A.hecke_operator(2)
|
|
468
|
+
sage: t.matrix()
|
|
469
|
+
[-2 0]
|
|
470
|
+
[ 0 -2]
|
|
471
|
+
sage: P = A.cuspidal_subgroup().0; P
|
|
472
|
+
[(0, 1/5)]
|
|
473
|
+
sage: t._image_of_element(P)
|
|
474
|
+
[(0, -2/5)]
|
|
475
|
+
sage: -2*P
|
|
476
|
+
[(0, -2/5)]
|
|
477
|
+
|
|
478
|
+
::
|
|
479
|
+
|
|
480
|
+
sage: J = J0(37) ; phi = J._isogeny_to_product_of_simples()
|
|
481
|
+
sage: phi._image_of_element(J.torsion_subgroup(5).gens()[0])
|
|
482
|
+
[(1/5, -1/5, -1/5, 1/5, 1/5, 1/5, 1/5, -1/5)]
|
|
483
|
+
|
|
484
|
+
::
|
|
485
|
+
|
|
486
|
+
sage: K = J[0].intersection(J[1])[0]
|
|
487
|
+
sage: K.list()
|
|
488
|
+
[[(0, 0, 0, 0)],
|
|
489
|
+
[(1/2, -1/2, 1/2, 0)],
|
|
490
|
+
[(0, 0, 1, -1/2)],
|
|
491
|
+
[(1/2, -1/2, 3/2, -1/2)]]
|
|
492
|
+
sage: [ phi.restrict_domain(J[0])._image_of_element(k) for k in K ]
|
|
493
|
+
[[(0, 0, 0, 0, 0, 0, 0, 0)],
|
|
494
|
+
[(0, 0, 0, 0, 0, 0, 0, 0)],
|
|
495
|
+
[(0, 0, 0, 0, 0, 0, 0, 0)],
|
|
496
|
+
[(0, 0, 0, 0, 0, 0, 0, 0)]]
|
|
497
|
+
"""
|
|
498
|
+
v = x._relative_element() * self.matrix() * self.codomain().lattice().basis_matrix()
|
|
499
|
+
T = self.codomain().qbar_torsion_subgroup()
|
|
500
|
+
return T(v)
|
|
501
|
+
|
|
502
|
+
def _image_of_finite_subgroup(self, G):
|
|
503
|
+
"""
|
|
504
|
+
Return the image of the finite group `G` under ``self``.
|
|
505
|
+
|
|
506
|
+
INPUT:
|
|
507
|
+
|
|
508
|
+
- ``G`` -- a finite subgroup of the domain of ``self``
|
|
509
|
+
|
|
510
|
+
OUTPUT: a finite subgroup of the codomain
|
|
511
|
+
|
|
512
|
+
EXAMPLES::
|
|
513
|
+
|
|
514
|
+
sage: J = J0(33); A = J[0]; B = J[1]
|
|
515
|
+
sage: C = A.intersection(B)[0]; C
|
|
516
|
+
Finite subgroup with invariants [5] over QQ of Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
|
|
517
|
+
sage: t = J.hecke_operator(3)
|
|
518
|
+
sage: D = t(C); D
|
|
519
|
+
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
|
|
520
|
+
sage: D == C
|
|
521
|
+
True
|
|
522
|
+
|
|
523
|
+
Or we directly test this function::
|
|
524
|
+
|
|
525
|
+
sage: D = t._image_of_finite_subgroup(C); D
|
|
526
|
+
Finite subgroup with invariants [5] over QQ of Abelian variety J0(33) of dimension 3
|
|
527
|
+
sage: phi = J0(11).degeneracy_map(22,2)
|
|
528
|
+
sage: J0(11).rational_torsion_subgroup().order()
|
|
529
|
+
5
|
|
530
|
+
sage: phi._image_of_finite_subgroup(J0(11).rational_torsion_subgroup())
|
|
531
|
+
Finite subgroup with invariants [5] over QQ of Abelian variety J0(22) of dimension 2
|
|
532
|
+
"""
|
|
533
|
+
B = G._relative_basis_matrix() * self.restrict_domain(G.abelian_variety()).matrix() * self.codomain().lattice().basis_matrix()
|
|
534
|
+
lattice = B.row_module(ZZ)
|
|
535
|
+
return self.codomain().finite_subgroup(lattice,
|
|
536
|
+
field_of_definition=G.field_of_definition())
|
|
537
|
+
|
|
538
|
+
def _image_of_abvar(self, A):
|
|
539
|
+
"""
|
|
540
|
+
Compute the image of the abelian variety `A` under this
|
|
541
|
+
morphism.
|
|
542
|
+
|
|
543
|
+
INPUT:
|
|
544
|
+
|
|
545
|
+
- ``A`` -- an abelian variety
|
|
546
|
+
|
|
547
|
+
OUTPUT an abelian variety
|
|
548
|
+
|
|
549
|
+
EXAMPLES::
|
|
550
|
+
|
|
551
|
+
sage: t = J0(33).hecke_operator(2)
|
|
552
|
+
sage: t._image_of_abvar(J0(33).new_subvariety())
|
|
553
|
+
Abelian subvariety of dimension 1 of J0(33)
|
|
554
|
+
|
|
555
|
+
::
|
|
556
|
+
|
|
557
|
+
sage: t = J0(33).hecke_operator(3)
|
|
558
|
+
sage: A = J0(33)[0]
|
|
559
|
+
sage: B = t._image_of_abvar(A); B
|
|
560
|
+
Abelian subvariety of dimension 1 of J0(33)
|
|
561
|
+
sage: B == A
|
|
562
|
+
False
|
|
563
|
+
sage: A + B == J0(33).old_subvariety()
|
|
564
|
+
True
|
|
565
|
+
|
|
566
|
+
::
|
|
567
|
+
|
|
568
|
+
sage: J = J0(37) ; A, B = J.decomposition()
|
|
569
|
+
sage: J.projection(A)._image_of_abvar(A)
|
|
570
|
+
Abelian subvariety of dimension 1 of J0(37)
|
|
571
|
+
sage: J.projection(A)._image_of_abvar(B)
|
|
572
|
+
Abelian subvariety of dimension 0 of J0(37)
|
|
573
|
+
sage: J.projection(B)._image_of_abvar(A)
|
|
574
|
+
Abelian subvariety of dimension 0 of J0(37)
|
|
575
|
+
sage: J.projection(B)._image_of_abvar(B)
|
|
576
|
+
Abelian subvariety of dimension 1 of J0(37)
|
|
577
|
+
sage: J.projection(B)._image_of_abvar(J)
|
|
578
|
+
Abelian subvariety of dimension 1 of J0(37)
|
|
579
|
+
"""
|
|
580
|
+
from .abvar import ModularAbelianVariety
|
|
581
|
+
D = self.domain()
|
|
582
|
+
C = self.codomain()
|
|
583
|
+
if A is D:
|
|
584
|
+
B = self.matrix()
|
|
585
|
+
else:
|
|
586
|
+
if not A.is_subvariety(D):
|
|
587
|
+
raise ValueError("A must be an abelian subvariety of self.")
|
|
588
|
+
# Write the vector space corresponding to A in terms of self's
|
|
589
|
+
# vector space, then take the image under self.
|
|
590
|
+
B = D.vector_space().coordinate_module(A.vector_space()).basis_matrix() * self.matrix()
|
|
591
|
+
|
|
592
|
+
V = (B * C.vector_space().basis_matrix()).row_module(QQ)
|
|
593
|
+
|
|
594
|
+
lattice = V.intersection(C.lattice())
|
|
595
|
+
base_field = C.base_field()
|
|
596
|
+
return ModularAbelianVariety(C.groups(), lattice, base_field)
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
class Morphism(Morphism_abstract, sage.modules.matrix_morphism.MatrixMorphism):
|
|
600
|
+
|
|
601
|
+
def restrict_domain(self, sub):
|
|
602
|
+
"""
|
|
603
|
+
Restrict ``self`` to the subvariety sub of ``self.domain()``.
|
|
604
|
+
|
|
605
|
+
EXAMPLES::
|
|
606
|
+
|
|
607
|
+
sage: J = J0(37) ; A, B = J.decomposition()
|
|
608
|
+
sage: A.lattice().matrix()
|
|
609
|
+
[ 1 -1 1 0]
|
|
610
|
+
[ 0 0 2 -1]
|
|
611
|
+
sage: B.lattice().matrix()
|
|
612
|
+
[1 1 1 0]
|
|
613
|
+
[0 0 0 1]
|
|
614
|
+
sage: T = J.hecke_operator(2) ; T.matrix()
|
|
615
|
+
[-1 1 1 -1]
|
|
616
|
+
[ 1 -1 1 0]
|
|
617
|
+
[ 0 0 -2 1]
|
|
618
|
+
[ 0 0 0 0]
|
|
619
|
+
sage: T.restrict_domain(A)
|
|
620
|
+
Abelian variety morphism:
|
|
621
|
+
From: Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37)
|
|
622
|
+
To: Abelian variety J0(37) of dimension 2
|
|
623
|
+
sage: T.restrict_domain(A).matrix()
|
|
624
|
+
[-2 2 -2 0]
|
|
625
|
+
[ 0 0 -4 2]
|
|
626
|
+
sage: T.restrict_domain(B)
|
|
627
|
+
Abelian variety morphism:
|
|
628
|
+
From: Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37)
|
|
629
|
+
To: Abelian variety J0(37) of dimension 2
|
|
630
|
+
sage: T.restrict_domain(B).matrix()
|
|
631
|
+
[0 0 0 0]
|
|
632
|
+
[0 0 0 0]
|
|
633
|
+
"""
|
|
634
|
+
if not sub.is_subvariety(self.domain()):
|
|
635
|
+
raise ValueError("sub must be a subvariety of self.domain()")
|
|
636
|
+
|
|
637
|
+
if sub == self.domain():
|
|
638
|
+
return self
|
|
639
|
+
|
|
640
|
+
L = self.domain().lattice()
|
|
641
|
+
B = sub.lattice().basis()
|
|
642
|
+
ims = sum(((L(b) * self.matrix()).list() for b in B), [])
|
|
643
|
+
MS = matrix_space.MatrixSpace(self.base_ring(), len(B), self.codomain().rank())
|
|
644
|
+
H = sub.Hom(self.codomain(), self.category_for())
|
|
645
|
+
return H(MS(ims))
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
class DegeneracyMap(Morphism):
|
|
649
|
+
def __init__(self, parent, A, t, side='left'):
|
|
650
|
+
"""
|
|
651
|
+
Create the degeneracy map of index t in parent defined by the
|
|
652
|
+
matrix A.
|
|
653
|
+
|
|
654
|
+
INPUT:
|
|
655
|
+
|
|
656
|
+
- ``parent`` -- a space of homomorphisms of abelian varieties
|
|
657
|
+
|
|
658
|
+
- ``A`` -- a matrix defining self
|
|
659
|
+
|
|
660
|
+
- ``t`` -- list of indices defining the degeneracy map
|
|
661
|
+
|
|
662
|
+
EXAMPLES::
|
|
663
|
+
|
|
664
|
+
sage: J0(44).degeneracy_map(11,2)
|
|
665
|
+
Degeneracy map from Abelian variety J0(44) of dimension 4 to Abelian variety J0(11) of dimension 1 defined by [2]
|
|
666
|
+
sage: J0(44)[0].degeneracy_map(88,2)
|
|
667
|
+
Degeneracy map from Simple abelian subvariety 11a(1,44) of dimension 1 of J0(44) to Abelian variety J0(88) of dimension 9 defined by [2]
|
|
668
|
+
"""
|
|
669
|
+
if not isinstance(t, list):
|
|
670
|
+
t = [t]
|
|
671
|
+
self._t = t
|
|
672
|
+
Morphism.__init__(self, parent, A, side)
|
|
673
|
+
|
|
674
|
+
def t(self):
|
|
675
|
+
"""
|
|
676
|
+
Return the list of indices defining ``self``.
|
|
677
|
+
|
|
678
|
+
EXAMPLES::
|
|
679
|
+
|
|
680
|
+
sage: J0(22).degeneracy_map(44).t()
|
|
681
|
+
[1]
|
|
682
|
+
sage: J = J0(22) * J0(11)
|
|
683
|
+
sage: J.degeneracy_map([44,44], [2,1])
|
|
684
|
+
Degeneracy map from Abelian variety J0(22) x J0(11) of dimension 3 to Abelian variety J0(44) x J0(44) of dimension 8 defined by [2, 1]
|
|
685
|
+
sage: J.degeneracy_map([44,44], [2,1]).t()
|
|
686
|
+
[2, 1]
|
|
687
|
+
"""
|
|
688
|
+
return self._t
|
|
689
|
+
|
|
690
|
+
def _repr_(self):
|
|
691
|
+
"""
|
|
692
|
+
Return the string representation of ``self``.
|
|
693
|
+
|
|
694
|
+
EXAMPLES::
|
|
695
|
+
|
|
696
|
+
sage: J0(22).degeneracy_map(44)._repr_()
|
|
697
|
+
'Degeneracy map from Abelian variety J0(22) of dimension 2 to Abelian variety J0(44) of dimension 4 defined by [1]'
|
|
698
|
+
"""
|
|
699
|
+
return "Degeneracy map from %s to %s defined by %s" % (self.domain(), self.codomain(), self._t)
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
class HeckeOperator(Morphism):
|
|
703
|
+
"""
|
|
704
|
+
A Hecke operator acting on a modular abelian variety.
|
|
705
|
+
"""
|
|
706
|
+
def __init__(self, abvar, n, side='left'):
|
|
707
|
+
"""
|
|
708
|
+
Create the Hecke operator of index `n` acting on the
|
|
709
|
+
abelian variety abvar.
|
|
710
|
+
|
|
711
|
+
INPUT:
|
|
712
|
+
|
|
713
|
+
- ``abvar`` -- a modular abelian variety
|
|
714
|
+
|
|
715
|
+
- ``n`` -- positive integer
|
|
716
|
+
|
|
717
|
+
EXAMPLES::
|
|
718
|
+
|
|
719
|
+
sage: J = J0(37)
|
|
720
|
+
sage: T2 = J.hecke_operator(2); T2
|
|
721
|
+
Hecke operator T_2 on Abelian variety J0(37) of dimension 2
|
|
722
|
+
sage: T2.parent()
|
|
723
|
+
Endomorphism ring of Abelian variety J0(37) of dimension 2
|
|
724
|
+
"""
|
|
725
|
+
from .abvar import ModularAbelianVariety_abstract
|
|
726
|
+
n = ZZ(n)
|
|
727
|
+
if n <= 0:
|
|
728
|
+
raise ValueError("n must be positive")
|
|
729
|
+
if not isinstance(abvar, ModularAbelianVariety_abstract):
|
|
730
|
+
raise TypeError("abvar must be a modular abelian variety")
|
|
731
|
+
self.__abvar = abvar
|
|
732
|
+
self.__n = n
|
|
733
|
+
sage.modules.matrix_morphism.MatrixMorphism_abstract.__init__(self, abvar.Hom(abvar), side)
|
|
734
|
+
|
|
735
|
+
def _repr_(self):
|
|
736
|
+
"""
|
|
737
|
+
String representation of this Hecke operator.
|
|
738
|
+
|
|
739
|
+
EXAMPLES::
|
|
740
|
+
|
|
741
|
+
sage: J = J0(37)
|
|
742
|
+
sage: J.hecke_operator(2)._repr_()
|
|
743
|
+
'Hecke operator T_2 on Abelian variety J0(37) of dimension 2'
|
|
744
|
+
"""
|
|
745
|
+
return "Hecke operator T_%s on %s" % (self.__n, self.__abvar)
|
|
746
|
+
|
|
747
|
+
def index(self):
|
|
748
|
+
"""
|
|
749
|
+
Return the index of this Hecke operator. (For example, if this is
|
|
750
|
+
the operator `T_n`, then the index is the integer `n`.)
|
|
751
|
+
|
|
752
|
+
OUTPUT:
|
|
753
|
+
|
|
754
|
+
- ``n`` -- a (Sage) Integer
|
|
755
|
+
|
|
756
|
+
EXAMPLES::
|
|
757
|
+
|
|
758
|
+
sage: J = J0(15)
|
|
759
|
+
sage: t = J.hecke_operator(53)
|
|
760
|
+
sage: t
|
|
761
|
+
Hecke operator T_53 on Abelian variety J0(15) of dimension 1
|
|
762
|
+
sage: t.index()
|
|
763
|
+
53
|
|
764
|
+
sage: t = J.hecke_operator(54)
|
|
765
|
+
sage: t
|
|
766
|
+
Hecke operator T_54 on Abelian variety J0(15) of dimension 1
|
|
767
|
+
sage: t.index()
|
|
768
|
+
54
|
|
769
|
+
|
|
770
|
+
::
|
|
771
|
+
|
|
772
|
+
sage: J = J1(12345)
|
|
773
|
+
sage: t = J.hecke_operator(997) ; t
|
|
774
|
+
Hecke operator T_997 on Abelian variety J1(12345) of dimension 5405473
|
|
775
|
+
sage: t.index()
|
|
776
|
+
997
|
|
777
|
+
sage: type(t.index())
|
|
778
|
+
<class 'sage.rings.integer.Integer'>
|
|
779
|
+
"""
|
|
780
|
+
return self.__n
|
|
781
|
+
|
|
782
|
+
def n(self):
|
|
783
|
+
r"""
|
|
784
|
+
Alias for ``self.index()``.
|
|
785
|
+
|
|
786
|
+
EXAMPLES::
|
|
787
|
+
|
|
788
|
+
sage: J = J0(17)
|
|
789
|
+
sage: J.hecke_operator(5).n()
|
|
790
|
+
5
|
|
791
|
+
"""
|
|
792
|
+
return self.index()
|
|
793
|
+
|
|
794
|
+
def characteristic_polynomial(self, var='x'):
|
|
795
|
+
"""
|
|
796
|
+
Return the characteristic polynomial of this Hecke operator in the
|
|
797
|
+
given variable.
|
|
798
|
+
|
|
799
|
+
INPUT:
|
|
800
|
+
|
|
801
|
+
- ``var`` -- string (default: ``'x'``)
|
|
802
|
+
|
|
803
|
+
OUTPUT: a polynomial in var over the rational numbers
|
|
804
|
+
|
|
805
|
+
EXAMPLES::
|
|
806
|
+
|
|
807
|
+
sage: A = J0(43)[1]; A
|
|
808
|
+
Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
|
|
809
|
+
sage: t2 = A.hecke_operator(2); t2
|
|
810
|
+
Hecke operator T_2 on Simple abelian subvariety 43b(1,43) of dimension 2 of J0(43)
|
|
811
|
+
sage: f = t2.characteristic_polynomial(); f
|
|
812
|
+
x^2 - 2
|
|
813
|
+
sage: f.parent()
|
|
814
|
+
Univariate Polynomial Ring in x over Integer Ring
|
|
815
|
+
sage: f.factor()
|
|
816
|
+
x^2 - 2
|
|
817
|
+
sage: t2.characteristic_polynomial('y')
|
|
818
|
+
y^2 - 2
|
|
819
|
+
"""
|
|
820
|
+
return self.__abvar.rational_homology().hecke_polynomial(self.__n, var).change_ring(ZZ)
|
|
821
|
+
|
|
822
|
+
def charpoly(self, var='x'):
|
|
823
|
+
r"""
|
|
824
|
+
Synonym for ``self.characteristic_polynomial(var)``.
|
|
825
|
+
|
|
826
|
+
INPUT:
|
|
827
|
+
|
|
828
|
+
- ``var`` -- string (default: ``'x'``)
|
|
829
|
+
|
|
830
|
+
EXAMPLES::
|
|
831
|
+
|
|
832
|
+
sage: A = J1(13)
|
|
833
|
+
sage: t2 = A.hecke_operator(2); t2
|
|
834
|
+
Hecke operator T_2 on Abelian variety J1(13) of dimension 2
|
|
835
|
+
sage: f = t2.charpoly(); f
|
|
836
|
+
x^2 + 3*x + 3
|
|
837
|
+
sage: f.factor()
|
|
838
|
+
x^2 + 3*x + 3
|
|
839
|
+
sage: t2.charpoly('y')
|
|
840
|
+
y^2 + 3*y + 3
|
|
841
|
+
"""
|
|
842
|
+
return self.characteristic_polynomial(var)
|
|
843
|
+
|
|
844
|
+
def fcp(self, var='x'):
|
|
845
|
+
"""
|
|
846
|
+
Return the factorization of the characteristic polynomial.
|
|
847
|
+
|
|
848
|
+
EXAMPLES::
|
|
849
|
+
|
|
850
|
+
sage: t2 = J0(33).hecke_operator(2)
|
|
851
|
+
sage: t2.charpoly()
|
|
852
|
+
x^3 + 3*x^2 - 4
|
|
853
|
+
sage: t2.fcp()
|
|
854
|
+
(x - 1) * (x + 2)^2
|
|
855
|
+
"""
|
|
856
|
+
return self.charpoly(var).factor()
|
|
857
|
+
|
|
858
|
+
def action_on_homology(self, R=ZZ):
|
|
859
|
+
r"""
|
|
860
|
+
Return the action of this Hecke operator on the homology
|
|
861
|
+
`H_1(A; R)` of this abelian variety with coefficients in
|
|
862
|
+
`R`.
|
|
863
|
+
|
|
864
|
+
EXAMPLES::
|
|
865
|
+
|
|
866
|
+
sage: A = J0(43)
|
|
867
|
+
sage: t2 = A.hecke_operator(2); t2
|
|
868
|
+
Hecke operator T_2 on Abelian variety J0(43) of dimension 3
|
|
869
|
+
sage: h2 = t2.action_on_homology(); h2
|
|
870
|
+
Hecke operator T_2 on Integral Homology of Abelian variety J0(43) of dimension 3
|
|
871
|
+
sage: h2.matrix()
|
|
872
|
+
[-2 1 0 0 0 0]
|
|
873
|
+
[-1 1 1 0 -1 0]
|
|
874
|
+
[-1 0 -1 2 -1 1]
|
|
875
|
+
[-1 0 1 1 -1 1]
|
|
876
|
+
[ 0 -2 0 2 -2 1]
|
|
877
|
+
[ 0 -1 0 1 0 -1]
|
|
878
|
+
sage: h2 = t2.action_on_homology(GF(2)); h2
|
|
879
|
+
Hecke operator T_2 on Homology with coefficients in Finite Field of size 2 of Abelian variety J0(43) of dimension 3
|
|
880
|
+
sage: h2.matrix()
|
|
881
|
+
[0 1 0 0 0 0]
|
|
882
|
+
[1 1 1 0 1 0]
|
|
883
|
+
[1 0 1 0 1 1]
|
|
884
|
+
[1 0 1 1 1 1]
|
|
885
|
+
[0 0 0 0 0 1]
|
|
886
|
+
[0 1 0 1 0 1]
|
|
887
|
+
"""
|
|
888
|
+
return self.__abvar.homology(R).hecke_operator(self.index())
|
|
889
|
+
|
|
890
|
+
def matrix(self):
|
|
891
|
+
r"""
|
|
892
|
+
Return the matrix of ``self`` acting on the homology
|
|
893
|
+
`H_1(A, ZZ)` of this abelian variety with coefficients in `\ZZ`.
|
|
894
|
+
|
|
895
|
+
EXAMPLES::
|
|
896
|
+
|
|
897
|
+
sage: J0(47).hecke_operator(3).matrix()
|
|
898
|
+
[ 0 0 1 -2 1 0 -1 0]
|
|
899
|
+
[ 0 0 1 0 -1 0 0 0]
|
|
900
|
+
[-1 2 0 0 2 -2 1 -1]
|
|
901
|
+
[-2 1 1 -1 3 -1 -1 0]
|
|
902
|
+
[-1 -1 1 0 1 0 -1 1]
|
|
903
|
+
[-1 0 0 -1 2 0 -1 0]
|
|
904
|
+
[-1 -1 2 -2 2 0 -1 0]
|
|
905
|
+
[ 0 -1 0 0 1 0 -1 1]
|
|
906
|
+
|
|
907
|
+
::
|
|
908
|
+
|
|
909
|
+
sage: J0(11).hecke_operator(7).matrix()
|
|
910
|
+
[-2 0]
|
|
911
|
+
[ 0 -2]
|
|
912
|
+
sage: (J0(11) * J0(33)).hecke_operator(7).matrix()
|
|
913
|
+
[-2 0 0 0 0 0 0 0]
|
|
914
|
+
[ 0 -2 0 0 0 0 0 0]
|
|
915
|
+
[ 0 0 0 0 2 -2 2 -2]
|
|
916
|
+
[ 0 0 0 -2 2 0 2 -2]
|
|
917
|
+
[ 0 0 0 0 2 0 4 -4]
|
|
918
|
+
[ 0 0 -4 0 2 2 2 -2]
|
|
919
|
+
[ 0 0 -2 0 2 2 0 -2]
|
|
920
|
+
[ 0 0 -2 0 0 2 0 -2]
|
|
921
|
+
|
|
922
|
+
::
|
|
923
|
+
|
|
924
|
+
sage: J0(23).hecke_operator(2).matrix()
|
|
925
|
+
[ 0 1 -1 0]
|
|
926
|
+
[ 0 1 -1 1]
|
|
927
|
+
[-1 2 -2 1]
|
|
928
|
+
[-1 1 0 -1]
|
|
929
|
+
"""
|
|
930
|
+
try:
|
|
931
|
+
return self._matrix
|
|
932
|
+
except AttributeError:
|
|
933
|
+
pass
|
|
934
|
+
self._matrix = self.action_on_homology().matrix()
|
|
935
|
+
return self._matrix
|