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,989 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Spaces of homomorphisms between modular abelian varieties
|
|
5
|
+
|
|
6
|
+
EXAMPLES:
|
|
7
|
+
|
|
8
|
+
First, we consider J0(37). This Jacobian has two simple factors,
|
|
9
|
+
corresponding to distinct newforms. These two intersect
|
|
10
|
+
nontrivially in J0(37).
|
|
11
|
+
|
|
12
|
+
::
|
|
13
|
+
|
|
14
|
+
sage: J = J0(37)
|
|
15
|
+
sage: D = J.decomposition() ; D
|
|
16
|
+
[Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37),
|
|
17
|
+
Simple abelian subvariety 37b(1,37) of dimension 1 of J0(37)]
|
|
18
|
+
sage: D[0].intersection(D[1])
|
|
19
|
+
(Finite subgroup with invariants [2, 2] over QQ of
|
|
20
|
+
Simple abelian subvariety 37a(1,37) of dimension 1 of J0(37),
|
|
21
|
+
Simple abelian subvariety of dimension 0 of J0(37))
|
|
22
|
+
|
|
23
|
+
As an abstract product, since these newforms are distinct, the
|
|
24
|
+
corresponding simple abelian varieties are not isogenous, and so
|
|
25
|
+
there are no maps between them. The endomorphism ring of the
|
|
26
|
+
corresponding product is thus isomorphic to the direct sum of the
|
|
27
|
+
endomorphism rings for each factor. Since the factors correspond to
|
|
28
|
+
abelian varieties of dimension 1, these endomorphism rings are each
|
|
29
|
+
isomorphic to ZZ.
|
|
30
|
+
|
|
31
|
+
::
|
|
32
|
+
|
|
33
|
+
sage: Hom(D[0],D[1]).gens()
|
|
34
|
+
()
|
|
35
|
+
sage: A = D[0] * D[1] ; A
|
|
36
|
+
Abelian subvariety of dimension 2 of J0(37) x J0(37)
|
|
37
|
+
sage: A.endomorphism_ring().gens()
|
|
38
|
+
(Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(37) x J0(37),
|
|
39
|
+
Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(37) x J0(37))
|
|
40
|
+
sage: [ x.matrix() for x in A.endomorphism_ring().gens() ]
|
|
41
|
+
[
|
|
42
|
+
[1 0 0 0] [0 0 0 0]
|
|
43
|
+
[0 1 0 0] [0 0 0 0]
|
|
44
|
+
[0 0 0 0] [0 0 1 0]
|
|
45
|
+
[0 0 0 0], [0 0 0 1]
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
However, these two newforms have a congruence between them modulo
|
|
49
|
+
2, which gives rise to interesting endomorphisms of J0(37).
|
|
50
|
+
|
|
51
|
+
::
|
|
52
|
+
|
|
53
|
+
sage: E = J.endomorphism_ring()
|
|
54
|
+
sage: E.gens()
|
|
55
|
+
(Abelian variety endomorphism of Abelian variety J0(37) of dimension 2,
|
|
56
|
+
Abelian variety endomorphism of Abelian variety J0(37) of dimension 2)
|
|
57
|
+
sage: [ x.matrix() for x in E.gens() ]
|
|
58
|
+
[
|
|
59
|
+
[1 0 0 0] [ 0 1 1 -1]
|
|
60
|
+
[0 1 0 0] [ 1 0 1 0]
|
|
61
|
+
[0 0 1 0] [ 0 0 -1 1]
|
|
62
|
+
[0 0 0 1], [ 0 0 0 1]
|
|
63
|
+
]
|
|
64
|
+
sage: (-1*E.gens()[0] + E.gens()[1]).matrix()
|
|
65
|
+
[-1 1 1 -1]
|
|
66
|
+
[ 1 -1 1 0]
|
|
67
|
+
[ 0 0 -2 1]
|
|
68
|
+
[ 0 0 0 0]
|
|
69
|
+
|
|
70
|
+
Of course, these endomorphisms will be reflected in the Hecke
|
|
71
|
+
algebra, which is in fact the full endomorphism ring of J0(37) in
|
|
72
|
+
this case::
|
|
73
|
+
|
|
74
|
+
sage: J.hecke_operator(2).matrix()
|
|
75
|
+
[-1 1 1 -1]
|
|
76
|
+
[ 1 -1 1 0]
|
|
77
|
+
[ 0 0 -2 1]
|
|
78
|
+
[ 0 0 0 0]
|
|
79
|
+
sage: T = E.image_of_hecke_algebra()
|
|
80
|
+
sage: T.gens()
|
|
81
|
+
(Abelian variety endomorphism of Abelian variety J0(37) of dimension 2,
|
|
82
|
+
Abelian variety endomorphism of Abelian variety J0(37) of dimension 2)
|
|
83
|
+
sage: [ x.matrix() for x in T.gens() ]
|
|
84
|
+
[
|
|
85
|
+
[1 0 0 0] [ 0 1 1 -1]
|
|
86
|
+
[0 1 0 0] [ 1 0 1 0]
|
|
87
|
+
[0 0 1 0] [ 0 0 -1 1]
|
|
88
|
+
[0 0 0 1], [ 0 0 0 1]
|
|
89
|
+
]
|
|
90
|
+
sage: T.index_in(E)
|
|
91
|
+
1
|
|
92
|
+
|
|
93
|
+
Next, we consider J0(33). In this case, we have both oldforms and
|
|
94
|
+
newforms. There are two copies of J0(11), one for each degeneracy
|
|
95
|
+
map from J0(11) to J0(33). There is also one newform at level 33.
|
|
96
|
+
The images of the two degeneracy maps are, of course, isogenous.
|
|
97
|
+
|
|
98
|
+
::
|
|
99
|
+
|
|
100
|
+
sage: J = J0(33)
|
|
101
|
+
sage: D = J.decomposition()
|
|
102
|
+
sage: D
|
|
103
|
+
[Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33),
|
|
104
|
+
Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33),
|
|
105
|
+
Simple abelian subvariety 33a(1,33) of dimension 1 of J0(33)]
|
|
106
|
+
sage: Hom(D[0],D[1]).gens()
|
|
107
|
+
(Abelian variety morphism:
|
|
108
|
+
From: Simple abelian subvariety 11a(1,33) of dimension 1 of J0(33)
|
|
109
|
+
To: Simple abelian subvariety 11a(3,33) of dimension 1 of J0(33),)
|
|
110
|
+
sage: Hom(D[0],D[1]).gens()[0].matrix()
|
|
111
|
+
[ 0 1]
|
|
112
|
+
[-1 0]
|
|
113
|
+
|
|
114
|
+
Then this gives that the component corresponding to the sum of the
|
|
115
|
+
oldforms will have a rank 4 endomorphism ring. We also have a rank
|
|
116
|
+
one endomorphism ring for the newform 33a (since it is again
|
|
117
|
+
1-dimensional), which gives a rank 5 endomorphism ring for J0(33).
|
|
118
|
+
|
|
119
|
+
::
|
|
120
|
+
|
|
121
|
+
sage: DD = J.decomposition(simple=False) ; DD
|
|
122
|
+
[Abelian subvariety of dimension 2 of J0(33),
|
|
123
|
+
Abelian subvariety of dimension 1 of J0(33)]
|
|
124
|
+
sage: A, B = DD
|
|
125
|
+
sage: A == D[0] + D[1]
|
|
126
|
+
True
|
|
127
|
+
sage: A.endomorphism_ring().gens()
|
|
128
|
+
(Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(33),
|
|
129
|
+
Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(33),
|
|
130
|
+
Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(33),
|
|
131
|
+
Abelian variety endomorphism of Abelian subvariety of dimension 2 of J0(33))
|
|
132
|
+
sage: B.endomorphism_ring().gens()
|
|
133
|
+
(Abelian variety endomorphism of Abelian subvariety of dimension 1 of J0(33),)
|
|
134
|
+
sage: E = J.endomorphism_ring() ; E.gens() # long time (3s on sage.math, 2011)
|
|
135
|
+
(Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
136
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
137
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
138
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
139
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3)
|
|
140
|
+
|
|
141
|
+
In this case, the image of the Hecke algebra will only have rank 3,
|
|
142
|
+
so that it is of infinite index in the full endomorphism ring.
|
|
143
|
+
However, if we call this image T, we can still ask about the index
|
|
144
|
+
of T in its saturation, which is 1 in this case.
|
|
145
|
+
|
|
146
|
+
::
|
|
147
|
+
|
|
148
|
+
sage: # long time
|
|
149
|
+
sage: T = E.image_of_hecke_algebra()
|
|
150
|
+
sage: T.gens()
|
|
151
|
+
(Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
152
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
153
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3)
|
|
154
|
+
sage: T.index_in(E)
|
|
155
|
+
+Infinity
|
|
156
|
+
sage: T.index_in_saturation()
|
|
157
|
+
1
|
|
158
|
+
|
|
159
|
+
TESTS::
|
|
160
|
+
|
|
161
|
+
sage: J = J0(37) ; J.Hom(J)(matrix(ZZ,4,[5..20]))
|
|
162
|
+
Abelian variety endomorphism of Abelian variety J0(37) of dimension 2
|
|
163
|
+
sage: K = J0(11) * J0(11) ; J.Hom(K)(matrix(ZZ,4,[5..20]))
|
|
164
|
+
Abelian variety morphism:
|
|
165
|
+
From: Abelian variety J0(37) of dimension 2
|
|
166
|
+
To: Abelian variety J0(11) x J0(11) of dimension 2
|
|
167
|
+
|
|
168
|
+
AUTHORS:
|
|
169
|
+
|
|
170
|
+
- William Stein (2007-03)
|
|
171
|
+
|
|
172
|
+
- Craig Citro, Robert Bradshaw (2008-03): Rewrote with modabvar overhaul
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
# ****************************************************************************
|
|
176
|
+
# Copyright (C) 2007 William Stein <wstein@gmail.com>
|
|
177
|
+
#
|
|
178
|
+
# This program is free software: you can redistribute it and/or modify
|
|
179
|
+
# it under the terms of the GNU General Public License as published by
|
|
180
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
181
|
+
# (at your option) any later version.
|
|
182
|
+
# https://www.gnu.org/licenses/
|
|
183
|
+
# ****************************************************************************
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
from copy import copy
|
|
187
|
+
|
|
188
|
+
from sage.categories.homset import HomsetWithBase
|
|
189
|
+
from sage.structure.element import parent
|
|
190
|
+
from sage.structure.parent import Parent
|
|
191
|
+
from sage.misc.lazy_attribute import lazy_attribute
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
from sage.modular.abvar import morphism
|
|
195
|
+
|
|
196
|
+
from sage.rings.infinity import Infinity
|
|
197
|
+
|
|
198
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
199
|
+
from sage.matrix.constructor import matrix, identity_matrix
|
|
200
|
+
from sage.structure.element import Matrix
|
|
201
|
+
|
|
202
|
+
from sage.rings.integer_ring import ZZ
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class Homspace(HomsetWithBase):
|
|
206
|
+
"""
|
|
207
|
+
A space of homomorphisms between two modular abelian varieties.
|
|
208
|
+
"""
|
|
209
|
+
Element = morphism.Morphism
|
|
210
|
+
|
|
211
|
+
def __init__(self, domain, codomain, cat):
|
|
212
|
+
"""
|
|
213
|
+
Create a homspace.
|
|
214
|
+
|
|
215
|
+
INPUT:
|
|
216
|
+
|
|
217
|
+
- ``domain, codomain`` -- modular abelian varieties
|
|
218
|
+
|
|
219
|
+
- ``cat`` -- category
|
|
220
|
+
|
|
221
|
+
EXAMPLES::
|
|
222
|
+
|
|
223
|
+
sage: H = Hom(J0(11), J0(22)); H
|
|
224
|
+
Space of homomorphisms from Abelian variety J0(11) of dimension 1
|
|
225
|
+
to Abelian variety J0(22) of dimension 2
|
|
226
|
+
sage: Hom(J0(11), J0(11))
|
|
227
|
+
Endomorphism ring of Abelian variety J0(11) of dimension 1
|
|
228
|
+
sage: type(H)
|
|
229
|
+
<class 'sage.modular.abvar.homspace.Homspace_with_category'>
|
|
230
|
+
sage: H.homset_category()
|
|
231
|
+
Category of modular abelian varieties over Rational Field
|
|
232
|
+
"""
|
|
233
|
+
from .abvar import ModularAbelianVariety_abstract
|
|
234
|
+
if not isinstance(domain, ModularAbelianVariety_abstract):
|
|
235
|
+
raise TypeError("domain must be a modular abelian variety")
|
|
236
|
+
if not isinstance(codomain, ModularAbelianVariety_abstract):
|
|
237
|
+
raise TypeError("codomain must be a modular abelian variety")
|
|
238
|
+
self._gens = None
|
|
239
|
+
HomsetWithBase.__init__(self, domain, codomain, category=cat)
|
|
240
|
+
|
|
241
|
+
def identity(self):
|
|
242
|
+
"""
|
|
243
|
+
Return the identity endomorphism.
|
|
244
|
+
|
|
245
|
+
EXAMPLES::
|
|
246
|
+
|
|
247
|
+
sage: E = End(J0(11))
|
|
248
|
+
sage: E.identity()
|
|
249
|
+
Abelian variety endomorphism of Abelian variety J0(11) of dimension 1
|
|
250
|
+
sage: E.one()
|
|
251
|
+
Abelian variety endomorphism of Abelian variety J0(11) of dimension 1
|
|
252
|
+
|
|
253
|
+
sage: H = Hom(J0(11), J0(22))
|
|
254
|
+
sage: H.identity()
|
|
255
|
+
Traceback (most recent call last):
|
|
256
|
+
...
|
|
257
|
+
TypeError: the identity map is only defined for endomorphisms
|
|
258
|
+
"""
|
|
259
|
+
if self.domain() is not self.codomain():
|
|
260
|
+
raise TypeError("the identity map is only defined for endomorphisms")
|
|
261
|
+
M = self.matrix_space().one()
|
|
262
|
+
return self.element_class(self, M)
|
|
263
|
+
|
|
264
|
+
@lazy_attribute
|
|
265
|
+
def _matrix_space(self):
|
|
266
|
+
"""
|
|
267
|
+
Return the matrix space of ``self``.
|
|
268
|
+
|
|
269
|
+
.. WARNING::
|
|
270
|
+
|
|
271
|
+
During unpickling, the domain and codomain may be unable to
|
|
272
|
+
provide the necessary information. This is why this is a lazy
|
|
273
|
+
attribute. See :issue:`14793`.
|
|
274
|
+
|
|
275
|
+
EXAMPLES::
|
|
276
|
+
|
|
277
|
+
sage: Hom(J0(11), J0(22))._matrix_space
|
|
278
|
+
Full MatrixSpace of 2 by 4 dense matrices over Integer Ring
|
|
279
|
+
"""
|
|
280
|
+
return MatrixSpace(ZZ, 2*self.domain().dimension(), 2*self.codomain().dimension())
|
|
281
|
+
|
|
282
|
+
def _element_constructor_from_element_class(self, *args, **keywords):
|
|
283
|
+
"""
|
|
284
|
+
Used in the coercion framework. Unfortunately, the default method
|
|
285
|
+
would get the order of parent and data different from what is expected
|
|
286
|
+
in ``MatrixMorphism.__init__``.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: H = Hom(J0(11), J0(22))
|
|
291
|
+
sage: phi = H(matrix(ZZ,2,4,[5..12])); phi # indirect doctest
|
|
292
|
+
Abelian variety morphism:
|
|
293
|
+
From: Abelian variety J0(11) of dimension 1
|
|
294
|
+
To: Abelian variety J0(22) of dimension 2
|
|
295
|
+
"""
|
|
296
|
+
return self.element_class(self, *args, **keywords)
|
|
297
|
+
|
|
298
|
+
def __call__(self, M, **kwds):
|
|
299
|
+
r"""
|
|
300
|
+
Create a homomorphism in this space from M. M can be any of the
|
|
301
|
+
following:
|
|
302
|
+
|
|
303
|
+
- a Morphism of abelian varieties
|
|
304
|
+
|
|
305
|
+
- a matrix of the appropriate size
|
|
306
|
+
(i.e. 2\*self.domain().dimension() x
|
|
307
|
+
2\*self.codomain().dimension()) whose entries are coercible
|
|
308
|
+
into self.base_ring()
|
|
309
|
+
|
|
310
|
+
- anything that can be coerced into self.matrix_space()
|
|
311
|
+
|
|
312
|
+
EXAMPLES::
|
|
313
|
+
|
|
314
|
+
sage: H = Hom(J0(11), J0(22))
|
|
315
|
+
sage: phi = H(matrix(ZZ,2,4,[5..12])) ; phi
|
|
316
|
+
Abelian variety morphism:
|
|
317
|
+
From: Abelian variety J0(11) of dimension 1
|
|
318
|
+
To: Abelian variety J0(22) of dimension 2
|
|
319
|
+
sage: phi.matrix()
|
|
320
|
+
[ 5 6 7 8]
|
|
321
|
+
[ 9 10 11 12]
|
|
322
|
+
sage: phi.matrix().parent()
|
|
323
|
+
Full MatrixSpace of 2 by 4 dense matrices over Integer Ring
|
|
324
|
+
|
|
325
|
+
::
|
|
326
|
+
|
|
327
|
+
sage: H = J0(22).Hom(J0(11)*J0(11))
|
|
328
|
+
sage: m1 = J0(22).degeneracy_map(11,1).matrix() ; m1
|
|
329
|
+
[ 0 1]
|
|
330
|
+
[-1 1]
|
|
331
|
+
[-1 0]
|
|
332
|
+
[ 0 -1]
|
|
333
|
+
sage: m2 = J0(22).degeneracy_map(11,2).matrix() ; m2
|
|
334
|
+
[ 1 -2]
|
|
335
|
+
[ 0 -2]
|
|
336
|
+
[ 1 -1]
|
|
337
|
+
[ 0 -1]
|
|
338
|
+
sage: m = m1.transpose().stack(m2.transpose()).transpose() ; m
|
|
339
|
+
[ 0 1 1 -2]
|
|
340
|
+
[-1 1 0 -2]
|
|
341
|
+
[-1 0 1 -1]
|
|
342
|
+
[ 0 -1 0 -1]
|
|
343
|
+
sage: phi = H(m) ; phi
|
|
344
|
+
Abelian variety morphism:
|
|
345
|
+
From: Abelian variety J0(22) of dimension 2
|
|
346
|
+
To: Abelian variety J0(11) x J0(11) of dimension 2
|
|
347
|
+
sage: phi.matrix()
|
|
348
|
+
[ 0 1 1 -2]
|
|
349
|
+
[-1 1 0 -2]
|
|
350
|
+
[-1 0 1 -1]
|
|
351
|
+
[ 0 -1 0 -1]
|
|
352
|
+
"""
|
|
353
|
+
side = kwds.get("side", "left")
|
|
354
|
+
if isinstance(M, morphism.Morphism):
|
|
355
|
+
if M.parent() is self:
|
|
356
|
+
return M
|
|
357
|
+
elif M.domain() == self.domain() and M.codomain() == self.codomain():
|
|
358
|
+
M = M.matrix()
|
|
359
|
+
else:
|
|
360
|
+
raise ValueError("cannot convert %s into %s" % (M, self))
|
|
361
|
+
elif isinstance(M, Matrix):
|
|
362
|
+
if M.base_ring() != ZZ:
|
|
363
|
+
M = M.change_ring(ZZ)
|
|
364
|
+
if side == "left":
|
|
365
|
+
if M.nrows() != 2*self.domain().dimension() or M.ncols() != 2*self.codomain().dimension():
|
|
366
|
+
raise TypeError("matrix has wrong dimension")
|
|
367
|
+
else:
|
|
368
|
+
if M.ncols() != 2*self.domain().dimension() or M.nrows() != 2*self.codomain().dimension():
|
|
369
|
+
raise TypeError("matrix has wrong dimension")
|
|
370
|
+
elif self.matrix_space().has_coerce_map_from(parent(M)):
|
|
371
|
+
M = self.matrix_space()(M)
|
|
372
|
+
else:
|
|
373
|
+
raise TypeError("can only coerce in matrices or morphisms")
|
|
374
|
+
return self.element_class(self, M, side)
|
|
375
|
+
|
|
376
|
+
def _repr_(self):
|
|
377
|
+
"""
|
|
378
|
+
String representation of a modular abelian variety homspace.
|
|
379
|
+
|
|
380
|
+
EXAMPLES::
|
|
381
|
+
|
|
382
|
+
sage: J = J0(11)
|
|
383
|
+
sage: End(J)._repr_()
|
|
384
|
+
'Endomorphism ring of Abelian variety J0(11) of dimension 1'
|
|
385
|
+
"""
|
|
386
|
+
return "Space of homomorphisms from %s to %s" %\
|
|
387
|
+
(self.domain(), self.codomain())
|
|
388
|
+
|
|
389
|
+
def _get_matrix(self, g):
|
|
390
|
+
"""
|
|
391
|
+
Given an object g, try to return a matrix corresponding to g with
|
|
392
|
+
dimensions the same as those of self.matrix_space().
|
|
393
|
+
|
|
394
|
+
INPUT:
|
|
395
|
+
|
|
396
|
+
- ``g`` -- a matrix or morphism or object with a list method
|
|
397
|
+
|
|
398
|
+
OUTPUT: a matrix
|
|
399
|
+
|
|
400
|
+
EXAMPLES::
|
|
401
|
+
|
|
402
|
+
sage: E = End(J0(11))
|
|
403
|
+
sage: E._get_matrix(matrix(QQ,2,[1,2,3,4]))
|
|
404
|
+
[1 2]
|
|
405
|
+
[3 4]
|
|
406
|
+
sage: E._get_matrix(J0(11).hecke_operator(2))
|
|
407
|
+
[-2 0]
|
|
408
|
+
[ 0 -2]
|
|
409
|
+
|
|
410
|
+
::
|
|
411
|
+
|
|
412
|
+
sage: H = Hom(J0(11) * J0(17), J0(22))
|
|
413
|
+
sage: H._get_matrix(tuple([8..23]))
|
|
414
|
+
[ 8 9 10 11]
|
|
415
|
+
[12 13 14 15]
|
|
416
|
+
[16 17 18 19]
|
|
417
|
+
[20 21 22 23]
|
|
418
|
+
sage: H._get_matrix(tuple([8..23]))
|
|
419
|
+
[ 8 9 10 11]
|
|
420
|
+
[12 13 14 15]
|
|
421
|
+
[16 17 18 19]
|
|
422
|
+
[20 21 22 23]
|
|
423
|
+
sage: H._get_matrix([8..23])
|
|
424
|
+
[ 8 9 10 11]
|
|
425
|
+
[12 13 14 15]
|
|
426
|
+
[16 17 18 19]
|
|
427
|
+
[20 21 22 23]
|
|
428
|
+
"""
|
|
429
|
+
try:
|
|
430
|
+
if g.parent() is self.matrix_space():
|
|
431
|
+
return g
|
|
432
|
+
except AttributeError:
|
|
433
|
+
pass
|
|
434
|
+
|
|
435
|
+
if isinstance(g, morphism.Morphism):
|
|
436
|
+
return g.matrix()
|
|
437
|
+
elif hasattr(g, 'list'):
|
|
438
|
+
return self.matrix_space()(g.list())
|
|
439
|
+
else:
|
|
440
|
+
return self.matrix_space()(g)
|
|
441
|
+
|
|
442
|
+
def free_module(self):
|
|
443
|
+
r"""
|
|
444
|
+
Return this endomorphism ring as a free submodule of a big
|
|
445
|
+
`\ZZ^{4nm}`, where `n` is the dimension of
|
|
446
|
+
the domain abelian variety and `m` the dimension of the
|
|
447
|
+
codomain.
|
|
448
|
+
|
|
449
|
+
OUTPUT: free module
|
|
450
|
+
|
|
451
|
+
EXAMPLES::
|
|
452
|
+
|
|
453
|
+
sage: E = Hom(J0(11), J0(22))
|
|
454
|
+
sage: E.free_module()
|
|
455
|
+
Free module of degree 8 and rank 2 over Integer Ring
|
|
456
|
+
Echelon basis matrix:
|
|
457
|
+
[ 1 0 -3 1 1 1 -1 -1]
|
|
458
|
+
[ 0 1 -3 1 1 1 -1 0]
|
|
459
|
+
"""
|
|
460
|
+
self.calculate_generators()
|
|
461
|
+
V = ZZ**(4*self.domain().dimension() * self.codomain().dimension())
|
|
462
|
+
return V.submodule([V(m.matrix().list()) for m in self.gens()])
|
|
463
|
+
|
|
464
|
+
def gen(self, i=0):
|
|
465
|
+
"""
|
|
466
|
+
Return `i`-th generator of ``self``.
|
|
467
|
+
|
|
468
|
+
INPUT:
|
|
469
|
+
|
|
470
|
+
- ``i`` -- integer
|
|
471
|
+
|
|
472
|
+
OUTPUT: a morphism
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: E = End(J0(22))
|
|
477
|
+
sage: E.gen(0).matrix()
|
|
478
|
+
[1 0 0 0]
|
|
479
|
+
[0 1 0 0]
|
|
480
|
+
[0 0 1 0]
|
|
481
|
+
[0 0 0 1]
|
|
482
|
+
"""
|
|
483
|
+
self.calculate_generators()
|
|
484
|
+
if i > self.ngens():
|
|
485
|
+
raise ValueError("self only has %s generators" % self.ngens())
|
|
486
|
+
return self.element_class(self, self._gens[i])
|
|
487
|
+
|
|
488
|
+
def ngens(self):
|
|
489
|
+
"""
|
|
490
|
+
Return number of generators of ``self``.
|
|
491
|
+
|
|
492
|
+
OUTPUT: integer
|
|
493
|
+
|
|
494
|
+
EXAMPLES::
|
|
495
|
+
|
|
496
|
+
sage: E = End(J0(22))
|
|
497
|
+
sage: E.ngens()
|
|
498
|
+
4
|
|
499
|
+
"""
|
|
500
|
+
self.calculate_generators()
|
|
501
|
+
return len(self._gens)
|
|
502
|
+
|
|
503
|
+
def gens(self) -> tuple:
|
|
504
|
+
"""
|
|
505
|
+
Return tuple of generators for this endomorphism ring.
|
|
506
|
+
|
|
507
|
+
EXAMPLES::
|
|
508
|
+
|
|
509
|
+
sage: E = End(J0(22))
|
|
510
|
+
sage: E.gens()
|
|
511
|
+
(Abelian variety endomorphism of Abelian variety J0(22) of dimension 2,
|
|
512
|
+
Abelian variety endomorphism of Abelian variety J0(22) of dimension 2,
|
|
513
|
+
Abelian variety endomorphism of Abelian variety J0(22) of dimension 2,
|
|
514
|
+
Abelian variety endomorphism of Abelian variety J0(22) of dimension 2)
|
|
515
|
+
"""
|
|
516
|
+
try:
|
|
517
|
+
return self._gen_morphisms
|
|
518
|
+
except AttributeError:
|
|
519
|
+
self.calculate_generators()
|
|
520
|
+
self._gen_morphisms = tuple([self.gen(i) for i in range(self.ngens())])
|
|
521
|
+
return self._gen_morphisms
|
|
522
|
+
|
|
523
|
+
def matrix_space(self):
|
|
524
|
+
"""
|
|
525
|
+
Return the underlying matrix space that we view this endomorphism
|
|
526
|
+
ring as being embedded into.
|
|
527
|
+
|
|
528
|
+
EXAMPLES::
|
|
529
|
+
|
|
530
|
+
sage: E = End(J0(22))
|
|
531
|
+
sage: E.matrix_space()
|
|
532
|
+
Full MatrixSpace of 4 by 4 dense matrices over Integer Ring
|
|
533
|
+
"""
|
|
534
|
+
return self._matrix_space
|
|
535
|
+
|
|
536
|
+
def calculate_generators(self):
|
|
537
|
+
"""
|
|
538
|
+
If generators haven't already been computed, calculate generators
|
|
539
|
+
for this homspace. If they have been computed, do nothing.
|
|
540
|
+
|
|
541
|
+
EXAMPLES::
|
|
542
|
+
|
|
543
|
+
sage: E = End(J0(11))
|
|
544
|
+
sage: E.calculate_generators()
|
|
545
|
+
"""
|
|
546
|
+
|
|
547
|
+
if self._gens is not None:
|
|
548
|
+
return
|
|
549
|
+
|
|
550
|
+
if (self.domain() == self.codomain()) and (self.domain().dimension() == 1):
|
|
551
|
+
self._gens = (identity_matrix(ZZ, 2),)
|
|
552
|
+
return
|
|
553
|
+
|
|
554
|
+
phi = self.domain()._isogeny_to_product_of_powers()
|
|
555
|
+
psi = self.codomain()._isogeny_to_product_of_powers()
|
|
556
|
+
|
|
557
|
+
H_simple = phi.codomain().Hom(psi.codomain())
|
|
558
|
+
im_gens = H_simple._calculate_product_gens()
|
|
559
|
+
|
|
560
|
+
M = phi.matrix()
|
|
561
|
+
Mt = psi.complementary_isogeny().matrix()
|
|
562
|
+
|
|
563
|
+
R = ZZ**(4*self.domain().dimension()*self.codomain().dimension())
|
|
564
|
+
gens = R.submodule([(M*self._get_matrix(g)*Mt).list()
|
|
565
|
+
for g in im_gens]).saturation().basis()
|
|
566
|
+
self._gens = tuple([self._get_matrix(g) for g in gens])
|
|
567
|
+
|
|
568
|
+
def _calculate_product_gens(self):
|
|
569
|
+
"""
|
|
570
|
+
For internal use.
|
|
571
|
+
|
|
572
|
+
Calculate generators for ``self``, assuming that ``self`` is a product
|
|
573
|
+
of simple factors.
|
|
574
|
+
|
|
575
|
+
EXAMPLES::
|
|
576
|
+
|
|
577
|
+
sage: E = End(J0(37))
|
|
578
|
+
sage: E.gens()
|
|
579
|
+
(Abelian variety endomorphism of Abelian variety J0(37) of dimension 2,
|
|
580
|
+
Abelian variety endomorphism of Abelian variety J0(37) of dimension 2)
|
|
581
|
+
sage: [ x.matrix() for x in E.gens() ]
|
|
582
|
+
[
|
|
583
|
+
[1 0 0 0] [ 0 1 1 -1]
|
|
584
|
+
[0 1 0 0] [ 1 0 1 0]
|
|
585
|
+
[0 0 1 0] [ 0 0 -1 1]
|
|
586
|
+
[0 0 0 1], [ 0 0 0 1]
|
|
587
|
+
]
|
|
588
|
+
sage: E._calculate_product_gens()
|
|
589
|
+
[
|
|
590
|
+
[1 0 0 0] [0 0 0 0]
|
|
591
|
+
[0 1 0 0] [0 0 0 0]
|
|
592
|
+
[0 0 0 0] [0 0 1 0]
|
|
593
|
+
[0 0 0 0], [0 0 0 1]
|
|
594
|
+
]
|
|
595
|
+
"""
|
|
596
|
+
Afactors = self.domain().decomposition(simple=False)
|
|
597
|
+
Bfactors = self.codomain().decomposition(simple=False)
|
|
598
|
+
if len(Afactors) == 1 and len(Bfactors) == 1:
|
|
599
|
+
Asimples = Afactors[0].decomposition()
|
|
600
|
+
Bsimples = Bfactors[0].decomposition()
|
|
601
|
+
if len(Asimples) == 1 and len(Bsimples) == 1:
|
|
602
|
+
# Handle the base case of A, B simple
|
|
603
|
+
gens = self._calculate_simple_gens()
|
|
604
|
+
|
|
605
|
+
else:
|
|
606
|
+
# Handle the case of A, B simple powers
|
|
607
|
+
gens = []
|
|
608
|
+
phi_matrix = Afactors[0]._isogeny_to_product_of_simples().matrix()
|
|
609
|
+
psi_t_matrix = Bfactors[0]._isogeny_to_product_of_simples().complementary_isogeny().matrix()
|
|
610
|
+
for i in range(len(Asimples)):
|
|
611
|
+
for j in range(len(Bsimples)):
|
|
612
|
+
hom_gens = Asimples[i].Hom(Bsimples[j]).gens()
|
|
613
|
+
for sub_gen in hom_gens:
|
|
614
|
+
sub_mat = sub_gen.matrix()
|
|
615
|
+
M = copy(self.matrix_space().zero_matrix())
|
|
616
|
+
M.set_block(sub_mat.nrows()*i, sub_mat.ncols()*j, sub_mat)
|
|
617
|
+
gens.append(phi_matrix * M * psi_t_matrix)
|
|
618
|
+
|
|
619
|
+
else:
|
|
620
|
+
# Handle the case of A, B generic
|
|
621
|
+
gens = []
|
|
622
|
+
cur_row = 0
|
|
623
|
+
for Afactor in Afactors:
|
|
624
|
+
cur_row += Afactor.dimension() * 2
|
|
625
|
+
cur_col = 0
|
|
626
|
+
for Bfactor in Bfactors:
|
|
627
|
+
cur_col += Bfactor.dimension() * 2
|
|
628
|
+
Asimple = Afactor[0]
|
|
629
|
+
Bsimple = Bfactor[0]
|
|
630
|
+
if Asimple.newform_label() == Bsimple.newform_label():
|
|
631
|
+
for sub_gen in Afactor.Hom(Bfactor).gens():
|
|
632
|
+
sub_mat = sub_gen.matrix()
|
|
633
|
+
M = copy(self.matrix_space().zero_matrix())
|
|
634
|
+
M.set_block(cur_row - sub_mat.nrows(),
|
|
635
|
+
cur_col - sub_mat.ncols(),
|
|
636
|
+
sub_mat)
|
|
637
|
+
gens.append(M)
|
|
638
|
+
|
|
639
|
+
return gens
|
|
640
|
+
|
|
641
|
+
def _calculate_simple_gens(self):
|
|
642
|
+
"""
|
|
643
|
+
Calculate generators for ``self``, where both the domain and codomain
|
|
644
|
+
for ``self`` are assumed to be simple abelian varieties.
|
|
645
|
+
|
|
646
|
+
The saturation of the span of these generators in ``self``
|
|
647
|
+
will be the full space of homomorphisms from the domain of
|
|
648
|
+
``self`` to its codomain.
|
|
649
|
+
|
|
650
|
+
EXAMPLES::
|
|
651
|
+
|
|
652
|
+
sage: H = Hom(J0(11), J0(22)[0])
|
|
653
|
+
sage: H._calculate_simple_gens()
|
|
654
|
+
[
|
|
655
|
+
[1 0]
|
|
656
|
+
[1 1]
|
|
657
|
+
]
|
|
658
|
+
sage: J = J0(11) * J0(33) ; J.decomposition()
|
|
659
|
+
[Simple abelian subvariety 11a(1,11) of dimension 1 of J0(11) x J0(33),
|
|
660
|
+
Simple abelian subvariety 11a(1,33) of dimension 1 of J0(11) x J0(33),
|
|
661
|
+
Simple abelian subvariety 11a(3,33) of dimension 1 of J0(11) x J0(33),
|
|
662
|
+
Simple abelian subvariety 33a(1,33) of dimension 1 of J0(11) x J0(33)]
|
|
663
|
+
sage: J[0].Hom(J[1])._calculate_simple_gens()
|
|
664
|
+
[
|
|
665
|
+
[ 0 -1]
|
|
666
|
+
[ 1 -1]
|
|
667
|
+
]
|
|
668
|
+
sage: J[0].Hom(J[2])._calculate_simple_gens()
|
|
669
|
+
[
|
|
670
|
+
[-1 0]
|
|
671
|
+
[-1 -1]
|
|
672
|
+
]
|
|
673
|
+
sage: J[0].Hom(J[0])._calculate_simple_gens()
|
|
674
|
+
[
|
|
675
|
+
[1 0]
|
|
676
|
+
[0 1]
|
|
677
|
+
]
|
|
678
|
+
sage: J[1].Hom(J[2])._calculate_simple_gens()
|
|
679
|
+
[
|
|
680
|
+
[ 0 -4]
|
|
681
|
+
[ 4 0]
|
|
682
|
+
]
|
|
683
|
+
|
|
684
|
+
::
|
|
685
|
+
|
|
686
|
+
sage: J = J0(23) ; J.decomposition()
|
|
687
|
+
[Simple abelian variety J0(23) of dimension 2]
|
|
688
|
+
sage: J[0].Hom(J[0])._calculate_simple_gens()
|
|
689
|
+
[
|
|
690
|
+
[1 0 0 0] [ 0 1 -1 0]
|
|
691
|
+
[0 1 0 0] [ 0 1 -1 1]
|
|
692
|
+
[0 0 1 0] [-1 2 -2 1]
|
|
693
|
+
[0 0 0 1], [-1 1 0 -1]
|
|
694
|
+
]
|
|
695
|
+
sage: J.hecke_operator(2).matrix()
|
|
696
|
+
[ 0 1 -1 0]
|
|
697
|
+
[ 0 1 -1 1]
|
|
698
|
+
[-1 2 -2 1]
|
|
699
|
+
[-1 1 0 -1]
|
|
700
|
+
|
|
701
|
+
::
|
|
702
|
+
|
|
703
|
+
sage: H = Hom(J0(11), J0(22)[0])
|
|
704
|
+
sage: H._calculate_simple_gens()
|
|
705
|
+
[
|
|
706
|
+
[1 0]
|
|
707
|
+
[1 1]
|
|
708
|
+
]
|
|
709
|
+
"""
|
|
710
|
+
A = self.domain()
|
|
711
|
+
B = self.codomain()
|
|
712
|
+
|
|
713
|
+
if A.newform_label() != B.newform_label():
|
|
714
|
+
return []
|
|
715
|
+
|
|
716
|
+
f = A._isogeny_to_newform_abelian_variety()
|
|
717
|
+
g = B._isogeny_to_newform_abelian_variety().complementary_isogeny()
|
|
718
|
+
|
|
719
|
+
Af = f.codomain()
|
|
720
|
+
ls = Af._calculate_endomorphism_generators()
|
|
721
|
+
|
|
722
|
+
Mf = f.matrix()
|
|
723
|
+
Mg = g.matrix()
|
|
724
|
+
|
|
725
|
+
return [Mf * self._get_matrix(e) * Mg for e in ls]
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
# NOTE/WARNING/TODO: Below in the __init__, etc. we do *not* check
|
|
729
|
+
# that the input gens are give something that spans a sub*ring*, as opposed
|
|
730
|
+
# to just a subgroup.
|
|
731
|
+
class EndomorphismSubring(Homspace):
|
|
732
|
+
|
|
733
|
+
def __init__(self, A, gens=None, category=None):
|
|
734
|
+
"""
|
|
735
|
+
A subring of the endomorphism ring.
|
|
736
|
+
|
|
737
|
+
INPUT:
|
|
738
|
+
|
|
739
|
+
- ``A`` -- an abelian variety
|
|
740
|
+
|
|
741
|
+
- ``gens`` -- (default: ``None``) if given
|
|
742
|
+
should be a tuple of the generators as matrices
|
|
743
|
+
|
|
744
|
+
EXAMPLES::
|
|
745
|
+
|
|
746
|
+
sage: J0(23).endomorphism_ring()
|
|
747
|
+
Endomorphism ring of Abelian variety J0(23) of dimension 2
|
|
748
|
+
sage: sage.modular.abvar.homspace.EndomorphismSubring(J0(25))
|
|
749
|
+
Endomorphism ring of Abelian variety J0(25) of dimension 0
|
|
750
|
+
sage: E = J0(11).endomorphism_ring()
|
|
751
|
+
sage: type(E)
|
|
752
|
+
<class 'sage.modular.abvar.homspace.EndomorphismSubring_with_category'>
|
|
753
|
+
sage: E.homset_category()
|
|
754
|
+
Category of modular abelian varieties over Rational Field
|
|
755
|
+
sage: E.category()
|
|
756
|
+
Category of endsets of modular abelian varieties over Rational Field
|
|
757
|
+
sage: E in Rings()
|
|
758
|
+
True
|
|
759
|
+
sage: TestSuite(E).run(skip=["_test_prod"])
|
|
760
|
+
|
|
761
|
+
TESTS:
|
|
762
|
+
|
|
763
|
+
The following tests against a problem on 32 bit machines that
|
|
764
|
+
occurred while working on :issue:`9944`::
|
|
765
|
+
|
|
766
|
+
sage: sage.modular.abvar.homspace.EndomorphismSubring(J1(12345))
|
|
767
|
+
Endomorphism ring of Abelian variety J1(12345) of dimension 5405473
|
|
768
|
+
|
|
769
|
+
:issue:`16275` removed the custom ``__reduce__`` method, since
|
|
770
|
+
:meth:`Homset.__reduce__` already implements appropriate
|
|
771
|
+
unpickling by construction::
|
|
772
|
+
|
|
773
|
+
sage: E.__reduce__.__module__
|
|
774
|
+
'sage.categories.homset'
|
|
775
|
+
sage: E.__reduce__()
|
|
776
|
+
(<function Hom at ...>,
|
|
777
|
+
(Abelian variety J0(11) of dimension 1,
|
|
778
|
+
Abelian variety J0(11) of dimension 1,
|
|
779
|
+
Category of modular abelian varieties over Rational Field,
|
|
780
|
+
False))
|
|
781
|
+
"""
|
|
782
|
+
self._J = A.ambient_variety()
|
|
783
|
+
self._A = A
|
|
784
|
+
|
|
785
|
+
# Initialise self with the correct category.
|
|
786
|
+
if category is None:
|
|
787
|
+
homset_cat = A.category()
|
|
788
|
+
else:
|
|
789
|
+
homset_cat = category
|
|
790
|
+
# Remark: Parent.__init__ will automatically form the join
|
|
791
|
+
# of the category of rings and of homset_cat
|
|
792
|
+
Parent.__init__(self, A.base_ring(), category=homset_cat.Endsets())
|
|
793
|
+
Homspace.__init__(self, A, A, cat=homset_cat)
|
|
794
|
+
if gens is None:
|
|
795
|
+
self._gens = None
|
|
796
|
+
else:
|
|
797
|
+
self._gens = tuple([self._get_matrix(g) for g in gens])
|
|
798
|
+
self._is_full_ring = gens is None
|
|
799
|
+
|
|
800
|
+
def _repr_(self):
|
|
801
|
+
"""
|
|
802
|
+
Return the string representation of ``self``.
|
|
803
|
+
|
|
804
|
+
EXAMPLES::
|
|
805
|
+
|
|
806
|
+
sage: J0(31).endomorphism_ring()._repr_()
|
|
807
|
+
'Endomorphism ring of Abelian variety J0(31) of dimension 2'
|
|
808
|
+
sage: J0(31).endomorphism_ring().image_of_hecke_algebra()._repr_()
|
|
809
|
+
'Subring of endomorphism ring of Abelian variety J0(31) of dimension 2'
|
|
810
|
+
"""
|
|
811
|
+
if self._is_full_ring:
|
|
812
|
+
return "Endomorphism ring of %s" % self._A
|
|
813
|
+
else:
|
|
814
|
+
return "Subring of endomorphism ring of %s" % self._A
|
|
815
|
+
|
|
816
|
+
def abelian_variety(self):
|
|
817
|
+
"""
|
|
818
|
+
Return the abelian variety that this endomorphism ring is attached
|
|
819
|
+
to.
|
|
820
|
+
|
|
821
|
+
EXAMPLES::
|
|
822
|
+
|
|
823
|
+
sage: J0(11).endomorphism_ring().abelian_variety()
|
|
824
|
+
Abelian variety J0(11) of dimension 1
|
|
825
|
+
"""
|
|
826
|
+
return self._A
|
|
827
|
+
|
|
828
|
+
def index_in(self, other, check=True):
|
|
829
|
+
"""
|
|
830
|
+
Return the index of ``self`` in ``other``.
|
|
831
|
+
|
|
832
|
+
INPUT:
|
|
833
|
+
|
|
834
|
+
- ``other`` -- another endomorphism subring of the
|
|
835
|
+
same abelian variety
|
|
836
|
+
|
|
837
|
+
- ``check`` -- boolean (default: ``True``); whether to do some
|
|
838
|
+
type and other consistency checks
|
|
839
|
+
|
|
840
|
+
EXAMPLES::
|
|
841
|
+
|
|
842
|
+
sage: R = J0(33).endomorphism_ring()
|
|
843
|
+
sage: R.index_in(R)
|
|
844
|
+
1
|
|
845
|
+
sage: J = J0(37) ; E = J.endomorphism_ring() ; T = E.image_of_hecke_algebra()
|
|
846
|
+
sage: T.index_in(E)
|
|
847
|
+
1
|
|
848
|
+
sage: J = J0(22) ; E = J.endomorphism_ring() ; T = E.image_of_hecke_algebra()
|
|
849
|
+
sage: T.index_in(E)
|
|
850
|
+
+Infinity
|
|
851
|
+
"""
|
|
852
|
+
if check:
|
|
853
|
+
if not isinstance(other, EndomorphismSubring):
|
|
854
|
+
raise ValueError("other must be a subring of an endomorphism ring of an abelian variety.")
|
|
855
|
+
if not (self.abelian_variety() == other.abelian_variety()):
|
|
856
|
+
raise ValueError("self and other must be endomorphisms of the same abelian variety")
|
|
857
|
+
|
|
858
|
+
M = self.free_module()
|
|
859
|
+
N = other.free_module()
|
|
860
|
+
if M.rank() < N.rank():
|
|
861
|
+
return Infinity
|
|
862
|
+
return M.index_in(N)
|
|
863
|
+
|
|
864
|
+
def index_in_saturation(self):
|
|
865
|
+
"""
|
|
866
|
+
Given a Hecke algebra T, compute its index in its saturation.
|
|
867
|
+
|
|
868
|
+
EXAMPLES::
|
|
869
|
+
|
|
870
|
+
sage: End(J0(23)).image_of_hecke_algebra().index_in_saturation()
|
|
871
|
+
1
|
|
872
|
+
sage: End(J0(44)).image_of_hecke_algebra().index_in_saturation()
|
|
873
|
+
2
|
|
874
|
+
"""
|
|
875
|
+
A = self.abelian_variety()
|
|
876
|
+
d = A.dimension()
|
|
877
|
+
M = ZZ**(4*d**2)
|
|
878
|
+
gens = [x.matrix().list() for x in self.gens()]
|
|
879
|
+
R = M.submodule(gens)
|
|
880
|
+
return R.index_in_saturation()
|
|
881
|
+
|
|
882
|
+
def discriminant(self):
|
|
883
|
+
"""
|
|
884
|
+
Return the discriminant of this ring, which is the discriminant of
|
|
885
|
+
the trace pairing.
|
|
886
|
+
|
|
887
|
+
.. NOTE::
|
|
888
|
+
|
|
889
|
+
One knows that for modular abelian varieties, the
|
|
890
|
+
endomorphism ring should be isomorphic to an order in a
|
|
891
|
+
number field. However, the discriminant returned by this
|
|
892
|
+
function will be `2^n` ( `n =`
|
|
893
|
+
self.dimension()) times the discriminant of that order,
|
|
894
|
+
since the elements are represented as 2d x 2d
|
|
895
|
+
matrices. Notice, for example, that the case of a one
|
|
896
|
+
dimensional abelian variety, whose endomorphism ring must
|
|
897
|
+
be ZZ, has discriminant 2, as in the example below.
|
|
898
|
+
|
|
899
|
+
EXAMPLES::
|
|
900
|
+
|
|
901
|
+
sage: J0(33).endomorphism_ring().discriminant()
|
|
902
|
+
-64800
|
|
903
|
+
sage: J0(46).endomorphism_ring().discriminant() # long time (6s on sage.math, 2011)
|
|
904
|
+
24200000000
|
|
905
|
+
sage: J0(11).endomorphism_ring().discriminant()
|
|
906
|
+
2
|
|
907
|
+
"""
|
|
908
|
+
g = self.gens()
|
|
909
|
+
M = matrix(ZZ, len(g), [(g[i]*g[j]).trace()
|
|
910
|
+
for i in range(len(g)) for j in range(len(g))])
|
|
911
|
+
return M.determinant()
|
|
912
|
+
|
|
913
|
+
def image_of_hecke_algebra(self, check_every=1):
|
|
914
|
+
"""
|
|
915
|
+
Compute the image of the Hecke algebra inside this endomorphism
|
|
916
|
+
subring.
|
|
917
|
+
|
|
918
|
+
We simply calculate Hecke operators up to the Sturm bound, and look
|
|
919
|
+
at the submodule spanned by them. While computing, we can check to
|
|
920
|
+
see if the submodule spanned so far is saturated and of maximal
|
|
921
|
+
dimension, in which case we may be done. The optional argument
|
|
922
|
+
check_every determines how many Hecke operators we add in before
|
|
923
|
+
checking to see if this condition is met.
|
|
924
|
+
|
|
925
|
+
INPUT:
|
|
926
|
+
|
|
927
|
+
- ``check_every`` -- integer (default: 1); if this integer is positive,
|
|
928
|
+
this integer determines how many Hecke operators we add in before
|
|
929
|
+
checking to see if the submodule spanned so far is maximal and
|
|
930
|
+
saturated
|
|
931
|
+
|
|
932
|
+
OUTPUT: the image of the Hecke algebra as a subring of ``self``
|
|
933
|
+
|
|
934
|
+
EXAMPLES::
|
|
935
|
+
|
|
936
|
+
sage: E = J0(33).endomorphism_ring()
|
|
937
|
+
sage: E.image_of_hecke_algebra()
|
|
938
|
+
Subring of endomorphism ring of Abelian variety J0(33) of dimension 3
|
|
939
|
+
sage: E.image_of_hecke_algebra().gens()
|
|
940
|
+
(Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
941
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3,
|
|
942
|
+
Abelian variety endomorphism of Abelian variety J0(33) of dimension 3)
|
|
943
|
+
sage: [ x.matrix() for x in E.image_of_hecke_algebra().gens() ]
|
|
944
|
+
[
|
|
945
|
+
[1 0 0 0 0 0] [ 0 2 0 -1 1 -1] [ 0 0 1 -1 1 -1]
|
|
946
|
+
[0 1 0 0 0 0] [-1 -2 2 -1 2 -1] [ 0 -1 1 0 1 -1]
|
|
947
|
+
[0 0 1 0 0 0] [ 0 0 1 -1 3 -1] [ 0 0 1 0 2 -2]
|
|
948
|
+
[0 0 0 1 0 0] [-2 2 0 1 1 -1] [-2 0 1 1 1 -1]
|
|
949
|
+
[0 0 0 0 1 0] [-1 1 0 2 0 -3] [-1 0 1 1 0 -1]
|
|
950
|
+
[0 0 0 0 0 1], [-1 1 -1 1 1 -2], [-1 0 0 1 0 -1]
|
|
951
|
+
]
|
|
952
|
+
sage: J0(33).hecke_operator(2).matrix()
|
|
953
|
+
[-1 0 1 -1 1 -1]
|
|
954
|
+
[ 0 -2 1 0 1 -1]
|
|
955
|
+
[ 0 0 0 0 2 -2]
|
|
956
|
+
[-2 0 1 0 1 -1]
|
|
957
|
+
[-1 0 1 1 -1 -1]
|
|
958
|
+
[-1 0 0 1 0 -2]
|
|
959
|
+
"""
|
|
960
|
+
try:
|
|
961
|
+
return self.__hecke_algebra_image
|
|
962
|
+
except AttributeError:
|
|
963
|
+
pass
|
|
964
|
+
|
|
965
|
+
A = self.abelian_variety()
|
|
966
|
+
if not A.is_hecke_stable():
|
|
967
|
+
raise ValueError("ambient variety is not Hecke stable")
|
|
968
|
+
|
|
969
|
+
M = A.modular_symbols()
|
|
970
|
+
|
|
971
|
+
d = A.dimension()
|
|
972
|
+
EndVecZ = ZZ**(4*d**2)
|
|
973
|
+
|
|
974
|
+
if d == 1:
|
|
975
|
+
self.__hecke_algebra_image = EndomorphismSubring(A, [[1, 0, 0, 1]])
|
|
976
|
+
return self.__hecke_algebra_image
|
|
977
|
+
|
|
978
|
+
V = EndVecZ.submodule([A.hecke_operator(1).matrix().list()])
|
|
979
|
+
|
|
980
|
+
for n in range(2, M.sturm_bound()+1):
|
|
981
|
+
if (check_every > 0 and
|
|
982
|
+
n % check_every == 0 and
|
|
983
|
+
V.dimension() == d and
|
|
984
|
+
V.index_in_saturation() == 1):
|
|
985
|
+
break
|
|
986
|
+
V += EndVecZ.submodule([A.hecke_operator(n).matrix().list()])
|
|
987
|
+
|
|
988
|
+
self.__hecke_algebra_image = EndomorphismSubring(A, V.basis())
|
|
989
|
+
return self.__hecke_algebra_image
|