passagemath-schemes 10.6.40__cp314-cp314-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.
Potentially problematic release.
This version of passagemath-schemes might be problematic. Click here for more details.
- 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.6.40.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
- passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.40.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 +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-314-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -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 +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-314-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -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 +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-314-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -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 +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -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 +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -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 +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314-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 +1860 -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 +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -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 +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -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 +3846 -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-314-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 +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list.cpython-314-darwin.so +0 -0
- sage/modular/modsym/p1list.pxd +29 -0
- sage/modular/modsym/p1list.pyx +1372 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-314-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 +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -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 +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -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 +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -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 +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -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 +1036 -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 +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -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 +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -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 +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -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 +682 -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 +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -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 +943 -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-314-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-314-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -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 +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -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 +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -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 +3871 -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 +580 -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 +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -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,746 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Hecke algebras
|
|
5
|
+
|
|
6
|
+
In Sage a "Hecke algebra" always refers to an algebra of endomorphisms of some
|
|
7
|
+
explicit module, rather than the abstract Hecke algebra of double cosets
|
|
8
|
+
attached to a subgroup of the modular group.
|
|
9
|
+
|
|
10
|
+
We distinguish between "anemic Hecke algebras", which are algebras of Hecke
|
|
11
|
+
operators whose indices do not divide some integer N (the level), and "full
|
|
12
|
+
Hecke algebras", which include Hecke operators coprime to the level. Morphisms
|
|
13
|
+
in the category of Hecke modules are not required to commute with the action of
|
|
14
|
+
the full Hecke algebra, only with the anemic algebra.
|
|
15
|
+
"""
|
|
16
|
+
# ****************************************************************************
|
|
17
|
+
# Copyright (C) 2004 William Stein <wstein@gmail.com>
|
|
18
|
+
#
|
|
19
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
20
|
+
#
|
|
21
|
+
# This code is distributed in the hope that it will be useful,
|
|
22
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
23
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
24
|
+
# General Public License for more details.
|
|
25
|
+
#
|
|
26
|
+
# The full text of the GPL is available at:
|
|
27
|
+
#
|
|
28
|
+
# https://www.gnu.org/licenses/
|
|
29
|
+
# ****************************************************************************
|
|
30
|
+
from collections.abc import Iterator
|
|
31
|
+
|
|
32
|
+
from sage.rings.infinity import infinity
|
|
33
|
+
from sage.categories.algebras import Algebras
|
|
34
|
+
from sage.matrix.constructor import matrix
|
|
35
|
+
from sage.arith.functions import lcm
|
|
36
|
+
from sage.arith.misc import gcd
|
|
37
|
+
from sage.misc.latex import latex
|
|
38
|
+
from sage.matrix.matrix_space import MatrixSpace
|
|
39
|
+
from sage.rings.integer_ring import ZZ
|
|
40
|
+
from sage.rings.rational_field import QQ
|
|
41
|
+
from sage.structure.element import Element
|
|
42
|
+
from sage.structure.unique_representation import CachedRepresentation
|
|
43
|
+
from sage.misc.cachefunc import cached_method
|
|
44
|
+
from sage.structure.parent import Parent
|
|
45
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def is_HeckeAlgebra(x) -> bool:
|
|
49
|
+
r"""
|
|
50
|
+
Return ``True`` if x is of type HeckeAlgebra.
|
|
51
|
+
|
|
52
|
+
EXAMPLES::
|
|
53
|
+
|
|
54
|
+
sage: from sage.modular.hecke.algebra import is_HeckeAlgebra
|
|
55
|
+
sage: is_HeckeAlgebra(CuspForms(1, 12).anemic_hecke_algebra())
|
|
56
|
+
doctest:warning...
|
|
57
|
+
DeprecationWarning: the function is_HeckeAlgebra is deprecated;
|
|
58
|
+
use 'isinstance(..., HeckeAlgebra_base)' instead
|
|
59
|
+
See https://github.com/sagemath/sage/issues/37895 for details.
|
|
60
|
+
True
|
|
61
|
+
sage: is_HeckeAlgebra(ZZ)
|
|
62
|
+
False
|
|
63
|
+
"""
|
|
64
|
+
from sage.misc.superseded import deprecation
|
|
65
|
+
deprecation(37895, "the function is_HeckeAlgebra is deprecated; use 'isinstance(..., HeckeAlgebra_base)' instead")
|
|
66
|
+
return isinstance(x, HeckeAlgebra_base)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _heckebasis(M):
|
|
70
|
+
r"""
|
|
71
|
+
Return a basis of the Hecke algebra of M as a ZZ-module.
|
|
72
|
+
|
|
73
|
+
INPUT:
|
|
74
|
+
|
|
75
|
+
- ``M`` -- a Hecke module
|
|
76
|
+
|
|
77
|
+
OUTPUT: list of Hecke algebra elements represented as matrices
|
|
78
|
+
|
|
79
|
+
EXAMPLES::
|
|
80
|
+
|
|
81
|
+
sage: M = ModularSymbols(11,2,1)
|
|
82
|
+
sage: sage.modular.hecke.algebra._heckebasis(M)
|
|
83
|
+
[Hecke operator on Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field defined by:
|
|
84
|
+
[1 0]
|
|
85
|
+
[0 1],
|
|
86
|
+
Hecke operator on Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field defined by:
|
|
87
|
+
[0 2]
|
|
88
|
+
[0 5]]
|
|
89
|
+
"""
|
|
90
|
+
d = M.rank()
|
|
91
|
+
WW = ZZ**(d**2)
|
|
92
|
+
MM = MatrixSpace(QQ, d)
|
|
93
|
+
S = []
|
|
94
|
+
Denom = []
|
|
95
|
+
B1 = []
|
|
96
|
+
for i in range(1, M.hecke_bound() + 1):
|
|
97
|
+
v = M.hecke_operator(i).matrix()
|
|
98
|
+
den = v.denominator()
|
|
99
|
+
Denom.append(den)
|
|
100
|
+
S.append(v)
|
|
101
|
+
den = lcm(Denom)
|
|
102
|
+
B = [WW((den * m).list()) for m in S]
|
|
103
|
+
UU = WW.submodule(B)
|
|
104
|
+
for u in UU.basis():
|
|
105
|
+
u1 = u.list()
|
|
106
|
+
m1 = M.hecke_algebra()(MM(u1), check=False)
|
|
107
|
+
B1.append((1 / den) * m1)
|
|
108
|
+
return B1
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@richcmp_method
|
|
112
|
+
class HeckeAlgebra_base(CachedRepresentation, Parent):
|
|
113
|
+
"""
|
|
114
|
+
Base class for algebras of Hecke operators on a fixed Hecke module.
|
|
115
|
+
|
|
116
|
+
INPUT:
|
|
117
|
+
|
|
118
|
+
- ``M`` -- a Hecke module
|
|
119
|
+
|
|
120
|
+
EXAMPLES::
|
|
121
|
+
|
|
122
|
+
sage: CuspForms(1, 12).hecke_algebra() # indirect doctest
|
|
123
|
+
Full Hecke algebra acting on Cuspidal subspace of dimension 1 of Modular Forms space of dimension 2 for Modular Group SL(2,Z) of weight 12 over Rational Field
|
|
124
|
+
"""
|
|
125
|
+
@staticmethod
|
|
126
|
+
def __classcall__(cls, M):
|
|
127
|
+
r"""
|
|
128
|
+
We need to work around a problem originally discovered by David
|
|
129
|
+
Loeffler on 2009-04-13: The problem is that if one creates two
|
|
130
|
+
subspaces of a Hecke module which are equal as subspaces but have
|
|
131
|
+
different bases, then the caching machinery needs to distinguish
|
|
132
|
+
between them. So we need to add ``basis_matrix`` to the cache key even
|
|
133
|
+
though it is not looked at by the constructor.
|
|
134
|
+
|
|
135
|
+
TESTS:
|
|
136
|
+
|
|
137
|
+
We test that coercion is OK between the Hecke algebras associated to two submodules which are equal but have different bases::
|
|
138
|
+
|
|
139
|
+
sage: M = CuspForms(Gamma0(57))
|
|
140
|
+
sage: f1,f2,f3 = M.newforms()
|
|
141
|
+
sage: N1 = M.submodule(M.free_module().submodule_with_basis([f1.element().element(), f2.element().element()]))
|
|
142
|
+
sage: N2 = M.submodule(M.free_module().submodule_with_basis([f1.element().element(), (f1.element() + f2.element()).element()]))
|
|
143
|
+
sage: N1.hecke_operator(5).matrix_form()
|
|
144
|
+
Hecke operator on Modular Forms subspace of dimension 2 of ... defined by:
|
|
145
|
+
[-3 0]
|
|
146
|
+
[ 0 1]
|
|
147
|
+
sage: N2.hecke_operator(5).matrix_form()
|
|
148
|
+
Hecke operator on Modular Forms subspace of dimension 2 of ... defined by:
|
|
149
|
+
[-3 0]
|
|
150
|
+
[-4 1]
|
|
151
|
+
sage: N1.hecke_algebra()(N2.hecke_operator(5)).matrix_form()
|
|
152
|
+
Hecke operator on Modular Forms subspace of dimension 2 of ... defined by:
|
|
153
|
+
[-3 0]
|
|
154
|
+
[ 0 1]
|
|
155
|
+
sage: N1.hecke_algebra()(N2.hecke_operator(5).matrix_form())
|
|
156
|
+
Hecke operator on Modular Forms subspace of dimension 2 of ... defined by:
|
|
157
|
+
[-3 0]
|
|
158
|
+
[ 0 1]
|
|
159
|
+
"""
|
|
160
|
+
if isinstance(M, tuple):
|
|
161
|
+
M = M[0]
|
|
162
|
+
try:
|
|
163
|
+
M = (M, M.basis_matrix())
|
|
164
|
+
except AttributeError:
|
|
165
|
+
# The AttributeError occurs if M is not a free module; then it might not have a basis_matrix method
|
|
166
|
+
pass
|
|
167
|
+
return super().__classcall__(cls, M)
|
|
168
|
+
|
|
169
|
+
def __init__(self, M) -> None:
|
|
170
|
+
"""
|
|
171
|
+
Initialization.
|
|
172
|
+
|
|
173
|
+
EXAMPLES::
|
|
174
|
+
|
|
175
|
+
sage: from sage.modular.hecke.algebra import HeckeAlgebra_base
|
|
176
|
+
sage: type(HeckeAlgebra_base(CuspForms(1, 12)))
|
|
177
|
+
<class 'sage.modular.hecke.algebra.HeckeAlgebra_base_with_category'>
|
|
178
|
+
"""
|
|
179
|
+
if isinstance(M, tuple):
|
|
180
|
+
M = M[0]
|
|
181
|
+
from .module import HeckeModule_generic
|
|
182
|
+
if not isinstance(M, HeckeModule_generic):
|
|
183
|
+
msg = f"M (={M}) must be a HeckeModule"
|
|
184
|
+
raise TypeError(msg)
|
|
185
|
+
self.__M = M
|
|
186
|
+
cat = Algebras(M.base_ring()).Commutative()
|
|
187
|
+
Parent.__init__(self, base=M.base_ring(), category=cat)
|
|
188
|
+
|
|
189
|
+
def _an_element_(self):
|
|
190
|
+
r"""
|
|
191
|
+
Return an element of this algebra.
|
|
192
|
+
|
|
193
|
+
Used by the coercion machinery.
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: CuspForms(1, 12).hecke_algebra().an_element() # indirect doctest
|
|
198
|
+
Hecke operator T_2 on Cuspidal subspace of dimension 1 of Modular Forms space of dimension 2 for Modular Group SL(2,Z) of weight 12 over Rational Field
|
|
199
|
+
"""
|
|
200
|
+
return self.hecke_operator(self.level() + 1)
|
|
201
|
+
|
|
202
|
+
def _element_constructor_(self, x, check=True):
|
|
203
|
+
r"""
|
|
204
|
+
Convert x into an element of this Hecke algebra. Here x is either:
|
|
205
|
+
|
|
206
|
+
- an element of a Hecke algebra equal to this one
|
|
207
|
+
|
|
208
|
+
- an element of the corresponding anemic Hecke algebra, if x is a full
|
|
209
|
+
Hecke algebra
|
|
210
|
+
|
|
211
|
+
- an element of the corresponding full Hecke algebra of the
|
|
212
|
+
form `T_i` where i is coprime to ``self.level()``, if self
|
|
213
|
+
is an anemic Hecke algebra
|
|
214
|
+
|
|
215
|
+
- something that can be converted into an element of the
|
|
216
|
+
underlying matrix space.
|
|
217
|
+
|
|
218
|
+
In the last case, the parameter ``check`` controls whether or
|
|
219
|
+
not to check that this element really does lie in the
|
|
220
|
+
appropriate algebra. At present, setting ``check=True`` raises
|
|
221
|
+
a :exc:`NotImplementedError` unless x is a scalar (or a diagonal
|
|
222
|
+
matrix).
|
|
223
|
+
|
|
224
|
+
EXAMPLES::
|
|
225
|
+
|
|
226
|
+
sage: T = ModularSymbols(11).hecke_algebra()
|
|
227
|
+
sage: T.gen(2) in T
|
|
228
|
+
True
|
|
229
|
+
sage: 5 in T
|
|
230
|
+
True
|
|
231
|
+
sage: T.gen(2).matrix() in T
|
|
232
|
+
Traceback (most recent call last):
|
|
233
|
+
...
|
|
234
|
+
NotImplementedError: membership testing for '...' not implemented
|
|
235
|
+
sage: T(T.gen(2).matrix(), check=False)
|
|
236
|
+
Hecke operator on Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field defined by:
|
|
237
|
+
[ 3 0 -1]
|
|
238
|
+
[ 0 -2 0]
|
|
239
|
+
[ 0 0 -2]
|
|
240
|
+
sage: A = ModularSymbols(11).anemic_hecke_algebra()
|
|
241
|
+
sage: A(T.gen(3))
|
|
242
|
+
Hecke operator T_3 on Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
|
|
243
|
+
sage: A(T.gen(11))
|
|
244
|
+
Traceback (most recent call last):
|
|
245
|
+
...
|
|
246
|
+
TypeError: Don't know how to construct an element of Anemic Hecke algebra acting on Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field from Hecke operator T_11 on Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
|
|
247
|
+
"""
|
|
248
|
+
from .hecke_operator import HeckeAlgebraElement_matrix, HeckeOperator, HeckeAlgebraElement
|
|
249
|
+
|
|
250
|
+
if not isinstance(x, Element):
|
|
251
|
+
x = self.base_ring()(x)
|
|
252
|
+
|
|
253
|
+
parent = x.parent()
|
|
254
|
+
|
|
255
|
+
if parent is self.base_ring():
|
|
256
|
+
return HeckeAlgebraElement_matrix(self, x * self.matrix_space().one())
|
|
257
|
+
|
|
258
|
+
if parent is self:
|
|
259
|
+
return x
|
|
260
|
+
|
|
261
|
+
if isinstance(x, HeckeOperator):
|
|
262
|
+
if x.parent() == self \
|
|
263
|
+
or (not self.is_anemic() and x.parent() == self.anemic_subalgebra()) \
|
|
264
|
+
or (self.is_anemic() and x.parent().anemic_subalgebra() == self and gcd(x.index(), self.level()) == 1):
|
|
265
|
+
return HeckeOperator(self, x.index())
|
|
266
|
+
|
|
267
|
+
if isinstance(x, HeckeAlgebraElement):
|
|
268
|
+
if x.parent() == self or (not self.is_anemic() and x.parent() == self.anemic_subalgebra()):
|
|
269
|
+
if x.parent().module().basis_matrix() == self.module().basis_matrix():
|
|
270
|
+
return HeckeAlgebraElement_matrix(self, x.matrix())
|
|
271
|
+
else:
|
|
272
|
+
A = matrix([self.module().coordinate_vector(x.parent().module().gen(i))
|
|
273
|
+
for i in range(x.parent().module().rank())])
|
|
274
|
+
return HeckeAlgebraElement_matrix(self, ~A * x.matrix() * A)
|
|
275
|
+
|
|
276
|
+
try:
|
|
277
|
+
A = self.matrix_space()(x)
|
|
278
|
+
if check:
|
|
279
|
+
if not A.is_scalar():
|
|
280
|
+
msg = f"membership testing for '{self}' not implemented"
|
|
281
|
+
raise NotImplementedError(msg)
|
|
282
|
+
return HeckeAlgebraElement_matrix(self, A)
|
|
283
|
+
except TypeError:
|
|
284
|
+
raise TypeError("Don't know how to construct an element of %s from %s" % (self, x))
|
|
285
|
+
|
|
286
|
+
def _coerce_map_from_(self, R):
|
|
287
|
+
"""
|
|
288
|
+
Coercion of a parent ``R`` into this Hecke algebra.
|
|
289
|
+
|
|
290
|
+
The parents that coerce into ``self`` are: Hecke
|
|
291
|
+
algebras which are equal to ``self``, or to the anemic subalgebra
|
|
292
|
+
of ``self`` if ``self`` is not anemic; and parents that coerce into
|
|
293
|
+
the base ring of ``self``.
|
|
294
|
+
|
|
295
|
+
EXAMPLES::
|
|
296
|
+
|
|
297
|
+
sage: C = CuspForms(3, 12)
|
|
298
|
+
sage: A = C.anemic_hecke_algebra()
|
|
299
|
+
sage: F = C.hecke_algebra()
|
|
300
|
+
sage: F.coerce(A.2) # indirect doctest
|
|
301
|
+
Hecke operator T_2 on Cuspidal subspace of dimension 3 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(3) of weight 12 over Rational Field
|
|
302
|
+
"""
|
|
303
|
+
if R == self:
|
|
304
|
+
return True
|
|
305
|
+
if not self.is_anemic() and R == self.anemic_subalgebra():
|
|
306
|
+
return True
|
|
307
|
+
return self.base_ring().has_coerce_map_from(R)
|
|
308
|
+
|
|
309
|
+
def gen(self, n):
|
|
310
|
+
"""
|
|
311
|
+
Return the `n`-th Hecke operator.
|
|
312
|
+
|
|
313
|
+
EXAMPLES::
|
|
314
|
+
|
|
315
|
+
sage: T = ModularSymbols(11).hecke_algebra()
|
|
316
|
+
sage: T.gen(2)
|
|
317
|
+
Hecke operator T_2 on Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
|
|
318
|
+
"""
|
|
319
|
+
return self.hecke_operator(n)
|
|
320
|
+
|
|
321
|
+
def ngens(self):
|
|
322
|
+
r"""
|
|
323
|
+
The size of the set of generators returned by gens(), which is clearly
|
|
324
|
+
infinity.
|
|
325
|
+
|
|
326
|
+
(This is not necessarily a minimal set of generators.)
|
|
327
|
+
|
|
328
|
+
EXAMPLES::
|
|
329
|
+
|
|
330
|
+
sage: CuspForms(1, 12).anemic_hecke_algebra().ngens()
|
|
331
|
+
+Infinity
|
|
332
|
+
"""
|
|
333
|
+
return infinity
|
|
334
|
+
|
|
335
|
+
def one(self):
|
|
336
|
+
"""
|
|
337
|
+
Return the unit of the Hecke algebra.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: M = ModularSymbols(11,2,1)
|
|
342
|
+
sage: H = M.hecke_algebra()
|
|
343
|
+
sage: H.one()
|
|
344
|
+
Hecke operator on Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field defined by:
|
|
345
|
+
[1 0]
|
|
346
|
+
[0 1]
|
|
347
|
+
"""
|
|
348
|
+
from .hecke_operator import HeckeAlgebraElement_matrix
|
|
349
|
+
A = self.matrix_space()
|
|
350
|
+
return HeckeAlgebraElement_matrix(self, A.one())
|
|
351
|
+
|
|
352
|
+
def is_noetherian(self) -> bool:
|
|
353
|
+
"""
|
|
354
|
+
Return ``True`` if this Hecke algebra is Noetherian as a ring.
|
|
355
|
+
|
|
356
|
+
This is true if and only if the base ring is Noetherian.
|
|
357
|
+
|
|
358
|
+
EXAMPLES::
|
|
359
|
+
|
|
360
|
+
sage: CuspForms(1, 12).anemic_hecke_algebra().is_noetherian()
|
|
361
|
+
True
|
|
362
|
+
"""
|
|
363
|
+
return self.base_ring().is_noetherian()
|
|
364
|
+
|
|
365
|
+
@cached_method
|
|
366
|
+
def matrix_space(self):
|
|
367
|
+
r"""
|
|
368
|
+
Return the underlying matrix space of this module.
|
|
369
|
+
|
|
370
|
+
EXAMPLES::
|
|
371
|
+
|
|
372
|
+
sage: CuspForms(3, 24, base_ring=Qp(5)).anemic_hecke_algebra().matrix_space()
|
|
373
|
+
Full MatrixSpace of 7 by 7 dense matrices over 5-adic Field with capped relative precision 20
|
|
374
|
+
"""
|
|
375
|
+
return MatrixSpace(self.base_ring(), self.module().rank())
|
|
376
|
+
|
|
377
|
+
def _latex_(self) -> str:
|
|
378
|
+
r"""
|
|
379
|
+
LaTeX representation of ``self``.
|
|
380
|
+
|
|
381
|
+
EXAMPLES::
|
|
382
|
+
|
|
383
|
+
sage: latex(CuspForms(3, 24).hecke_algebra()) # indirect doctest
|
|
384
|
+
\mathbf{T}_{\text{\texttt{Cuspidal...Gamma0(3)...24...}
|
|
385
|
+
"""
|
|
386
|
+
return "\\mathbf{T}_{%s}" % latex(self.__M)
|
|
387
|
+
|
|
388
|
+
def level(self):
|
|
389
|
+
r"""
|
|
390
|
+
Return the level of this Hecke algebra, which is (by definition) the
|
|
391
|
+
level of the Hecke module on which it acts.
|
|
392
|
+
|
|
393
|
+
EXAMPLES::
|
|
394
|
+
|
|
395
|
+
sage: ModularSymbols(37).hecke_algebra().level()
|
|
396
|
+
37
|
|
397
|
+
"""
|
|
398
|
+
return self.module().level()
|
|
399
|
+
|
|
400
|
+
def module(self):
|
|
401
|
+
"""
|
|
402
|
+
The Hecke module on which this algebra is acting.
|
|
403
|
+
|
|
404
|
+
EXAMPLES::
|
|
405
|
+
|
|
406
|
+
sage: T = ModularSymbols(1,12).hecke_algebra()
|
|
407
|
+
sage: T.module()
|
|
408
|
+
Modular Symbols space of dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
|
|
409
|
+
"""
|
|
410
|
+
return self.__M
|
|
411
|
+
|
|
412
|
+
def rank(self):
|
|
413
|
+
r"""
|
|
414
|
+
The rank of this Hecke algebra as a module over its base
|
|
415
|
+
ring. Not implemented at present.
|
|
416
|
+
|
|
417
|
+
EXAMPLES::
|
|
418
|
+
|
|
419
|
+
sage: ModularSymbols(Gamma1(3), 3).hecke_algebra().rank()
|
|
420
|
+
Traceback (most recent call last):
|
|
421
|
+
...
|
|
422
|
+
NotImplementedError
|
|
423
|
+
"""
|
|
424
|
+
raise NotImplementedError
|
|
425
|
+
|
|
426
|
+
@cached_method
|
|
427
|
+
def basis(self):
|
|
428
|
+
r"""
|
|
429
|
+
Return a basis for this Hecke algebra as a free module over
|
|
430
|
+
its base ring.
|
|
431
|
+
|
|
432
|
+
EXAMPLES::
|
|
433
|
+
|
|
434
|
+
sage: ModularSymbols(Gamma1(3), 3).hecke_algebra().basis()
|
|
435
|
+
(Hecke operator on Modular Symbols space of dimension 2 for Gamma_1(3) of weight 3 with sign 0 over Rational Field defined by:
|
|
436
|
+
[1 0]
|
|
437
|
+
[0 1],
|
|
438
|
+
Hecke operator on Modular Symbols space of dimension 2 for Gamma_1(3) of weight 3 with sign 0 over Rational Field defined by:
|
|
439
|
+
[0 0]
|
|
440
|
+
[0 2])
|
|
441
|
+
|
|
442
|
+
sage: M = ModularSymbols(Gamma0(22), sign=1)
|
|
443
|
+
sage: H = M.hecke_algebra()
|
|
444
|
+
sage: B = H.basis()
|
|
445
|
+
sage: len(B)
|
|
446
|
+
5
|
|
447
|
+
sage: all(b in H for b in B)
|
|
448
|
+
True
|
|
449
|
+
sage: [B[0, 0] for B in M.anemic_hecke_algebra().basis()]
|
|
450
|
+
Traceback (most recent call last):
|
|
451
|
+
...
|
|
452
|
+
NotImplementedError: basis not implemented for anemic Hecke algebra
|
|
453
|
+
"""
|
|
454
|
+
bound = self.__M.hecke_bound()
|
|
455
|
+
dim = self.__M.rank()
|
|
456
|
+
|
|
457
|
+
# current implementation gets stuck in an infinite loop when dimension of Hecke alg != dimension of space
|
|
458
|
+
if self.is_anemic():
|
|
459
|
+
raise NotImplementedError("basis not implemented for anemic Hecke algebra")
|
|
460
|
+
|
|
461
|
+
if dim == 0:
|
|
462
|
+
basis = []
|
|
463
|
+
elif dim == 1:
|
|
464
|
+
basis = [self.hecke_operator(1)]
|
|
465
|
+
else:
|
|
466
|
+
span = [self.hecke_operator(n) for n in range(1, bound + 1)]
|
|
467
|
+
rand_max = 5
|
|
468
|
+
while True:
|
|
469
|
+
# Project the full Hecke module to a random submodule to ease the HNF reduction.
|
|
470
|
+
v = (ZZ**dim).random_element(x=rand_max)
|
|
471
|
+
proj_span = matrix([T.matrix() * v for T in span])._clear_denom()[0]
|
|
472
|
+
proj_basis = proj_span.hermite_form()
|
|
473
|
+
if proj_basis[dim - 1] == 0:
|
|
474
|
+
# We got unlucky, choose another projection.
|
|
475
|
+
rand_max *= 2
|
|
476
|
+
continue
|
|
477
|
+
# Lift the projected basis to a basis in the Hecke algebra.
|
|
478
|
+
trans = proj_span.solve_left(proj_basis)
|
|
479
|
+
basis = [sum(c * T for c, T in zip(row, span) if c != 0)
|
|
480
|
+
for row in trans[:dim]]
|
|
481
|
+
break
|
|
482
|
+
|
|
483
|
+
return tuple(basis)
|
|
484
|
+
|
|
485
|
+
@cached_method
|
|
486
|
+
def discriminant(self):
|
|
487
|
+
r"""
|
|
488
|
+
Return the discriminant of this Hecke algebra.
|
|
489
|
+
|
|
490
|
+
This is the
|
|
491
|
+
determinant of the matrix `{\rm Tr}(x_i x_j)` where `x_1,
|
|
492
|
+
\dots,x_d` is a basis for self, and `{\rm Tr}(x)` signifies
|
|
493
|
+
the trace (in the sense of linear algebra) of left
|
|
494
|
+
multiplication by `x` on the algebra (*not* the trace of the
|
|
495
|
+
operator `x` acting on the underlying Hecke module!). For
|
|
496
|
+
further discussion and conjectures see Calegari + Stein,
|
|
497
|
+
*Conjectures about discriminants of Hecke algebras of prime
|
|
498
|
+
level*, Springer LNCS 3076.
|
|
499
|
+
|
|
500
|
+
EXAMPLES::
|
|
501
|
+
|
|
502
|
+
sage: BrandtModule(3, 4).hecke_algebra().discriminant()
|
|
503
|
+
1
|
|
504
|
+
sage: ModularSymbols(65, sign=1).cuspidal_submodule().hecke_algebra().discriminant()
|
|
505
|
+
6144
|
|
506
|
+
sage: ModularSymbols(1,4,sign=1).cuspidal_submodule().hecke_algebra().discriminant()
|
|
507
|
+
1
|
|
508
|
+
sage: H = CuspForms(1, 24).hecke_algebra()
|
|
509
|
+
sage: H.discriminant()
|
|
510
|
+
83041344
|
|
511
|
+
"""
|
|
512
|
+
basis = self.basis()
|
|
513
|
+
d = len(basis)
|
|
514
|
+
if d <= 1:
|
|
515
|
+
return ZZ.one()
|
|
516
|
+
trace_matrix = matrix(ZZ, d)
|
|
517
|
+
for i in range(d):
|
|
518
|
+
for j in range(i + 1):
|
|
519
|
+
trace_matrix[i, j] = trace_matrix[j, i] = basis[i].matrix().trace_of_product(basis[j].matrix())
|
|
520
|
+
return trace_matrix.det()
|
|
521
|
+
|
|
522
|
+
def gens(self) -> Iterator:
|
|
523
|
+
r"""
|
|
524
|
+
Return a generator over all Hecke operator `T_n`
|
|
525
|
+
for `n = 1, 2, 3, \ldots`.
|
|
526
|
+
|
|
527
|
+
This is infinite.
|
|
528
|
+
|
|
529
|
+
EXAMPLES::
|
|
530
|
+
|
|
531
|
+
sage: T = ModularSymbols(1,12).hecke_algebra()
|
|
532
|
+
sage: g = T.gens()
|
|
533
|
+
sage: next(g)
|
|
534
|
+
Hecke operator T_1 on Modular Symbols space of dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
|
|
535
|
+
sage: next(g)
|
|
536
|
+
Hecke operator T_2 on Modular Symbols space of dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
|
|
537
|
+
"""
|
|
538
|
+
n = 1
|
|
539
|
+
while True:
|
|
540
|
+
yield self.hecke_operator(n)
|
|
541
|
+
n += 1
|
|
542
|
+
|
|
543
|
+
@cached_method(key=lambda self, n: int(n))
|
|
544
|
+
def hecke_operator(self, n):
|
|
545
|
+
"""
|
|
546
|
+
Return the `n`-th Hecke operator `T_n`.
|
|
547
|
+
|
|
548
|
+
EXAMPLES::
|
|
549
|
+
|
|
550
|
+
sage: T = ModularSymbols(1,12).hecke_algebra()
|
|
551
|
+
sage: T.hecke_operator(2)
|
|
552
|
+
Hecke operator T_2 on Modular Symbols space of dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
|
|
553
|
+
"""
|
|
554
|
+
return self.__M._hecke_operator_class()(self, n)
|
|
555
|
+
|
|
556
|
+
def hecke_matrix(self, n, *args, **kwds):
|
|
557
|
+
"""
|
|
558
|
+
Return the matrix of the `n`-th Hecke operator `T_n`.
|
|
559
|
+
|
|
560
|
+
EXAMPLES::
|
|
561
|
+
|
|
562
|
+
sage: T = ModularSymbols(1,12).hecke_algebra()
|
|
563
|
+
sage: T.hecke_matrix(2)
|
|
564
|
+
[ -24 0 0]
|
|
565
|
+
[ 0 -24 0]
|
|
566
|
+
[4860 0 2049]
|
|
567
|
+
"""
|
|
568
|
+
return self.__M.hecke_matrix(n, *args, **kwds)
|
|
569
|
+
|
|
570
|
+
def diamond_bracket_matrix(self, d):
|
|
571
|
+
r"""
|
|
572
|
+
Return the matrix of the diamond bracket operator `\langle d \rangle`.
|
|
573
|
+
|
|
574
|
+
EXAMPLES::
|
|
575
|
+
|
|
576
|
+
sage: T = ModularSymbols(Gamma1(7), 4).hecke_algebra()
|
|
577
|
+
sage: d3 = T.diamond_bracket_matrix(3)
|
|
578
|
+
sage: x = d3.charpoly().variables()[0]
|
|
579
|
+
sage: d3.charpoly() == (x^3-1)^4
|
|
580
|
+
True
|
|
581
|
+
"""
|
|
582
|
+
return self.__M.diamond_bracket_matrix(d)
|
|
583
|
+
|
|
584
|
+
@cached_method(key=lambda self, d: int(d) % self.__M.level())
|
|
585
|
+
def diamond_bracket_operator(self, d):
|
|
586
|
+
r"""
|
|
587
|
+
Return the diamond bracket operator `\langle d \rangle`.
|
|
588
|
+
|
|
589
|
+
EXAMPLES::
|
|
590
|
+
|
|
591
|
+
sage: T = ModularSymbols(Gamma1(7), 4).hecke_algebra()
|
|
592
|
+
sage: T.diamond_bracket_operator(3)
|
|
593
|
+
Diamond bracket operator <3> on Modular Symbols space of dimension 12 for Gamma_1(7) of weight 4 with sign 0 over Rational Field
|
|
594
|
+
"""
|
|
595
|
+
return self.__M._diamond_operator_class()(self, d)
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
class HeckeAlgebra_full(HeckeAlgebra_base):
|
|
599
|
+
r"""
|
|
600
|
+
A full Hecke algebra (including the operators `T_n` where `n` is not
|
|
601
|
+
assumed to be coprime to the level).
|
|
602
|
+
"""
|
|
603
|
+
def _repr_(self) -> str:
|
|
604
|
+
r"""
|
|
605
|
+
String representation of ``self``.
|
|
606
|
+
|
|
607
|
+
EXAMPLES::
|
|
608
|
+
|
|
609
|
+
sage: ModularForms(37).hecke_algebra()._repr_()
|
|
610
|
+
'Full Hecke algebra acting on Modular Forms space of dimension 3 for Congruence Subgroup Gamma0(37) of weight 2 over Rational Field'
|
|
611
|
+
"""
|
|
612
|
+
return "Full Hecke algebra acting on %s" % self.module()
|
|
613
|
+
|
|
614
|
+
def __richcmp__(self, other, op) -> bool:
|
|
615
|
+
r"""
|
|
616
|
+
Compare ``self`` to ``other``.
|
|
617
|
+
|
|
618
|
+
EXAMPLES::
|
|
619
|
+
|
|
620
|
+
sage: A = ModularForms(37).hecke_algebra()
|
|
621
|
+
sage: A == QQ
|
|
622
|
+
False
|
|
623
|
+
sage: A == ModularForms(37).anemic_hecke_algebra()
|
|
624
|
+
False
|
|
625
|
+
sage: A == A
|
|
626
|
+
True
|
|
627
|
+
"""
|
|
628
|
+
if not isinstance(other, HeckeAlgebra_full):
|
|
629
|
+
return NotImplemented
|
|
630
|
+
return richcmp(self.module(), other.module(), op)
|
|
631
|
+
|
|
632
|
+
def is_anemic(self) -> bool:
|
|
633
|
+
"""
|
|
634
|
+
Return ``False``, since this the full Hecke algebra.
|
|
635
|
+
|
|
636
|
+
EXAMPLES::
|
|
637
|
+
|
|
638
|
+
sage: H = CuspForms(3, 12).hecke_algebra()
|
|
639
|
+
sage: H.is_anemic()
|
|
640
|
+
False
|
|
641
|
+
"""
|
|
642
|
+
return False
|
|
643
|
+
|
|
644
|
+
def anemic_subalgebra(self):
|
|
645
|
+
r"""
|
|
646
|
+
The subalgebra of ``self`` generated by the Hecke operators of
|
|
647
|
+
index coprime to the level.
|
|
648
|
+
|
|
649
|
+
EXAMPLES::
|
|
650
|
+
|
|
651
|
+
sage: H = CuspForms(3, 12).hecke_algebra()
|
|
652
|
+
sage: H.anemic_subalgebra()
|
|
653
|
+
Anemic Hecke algebra acting on Cuspidal subspace of dimension 3 of Modular Forms space of dimension 5 for Congruence Subgroup Gamma0(3) of weight 12 over Rational Field
|
|
654
|
+
"""
|
|
655
|
+
return self.module().anemic_hecke_algebra()
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
HeckeAlgebra = HeckeAlgebra_full
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
class HeckeAlgebra_anemic(HeckeAlgebra_base):
|
|
662
|
+
r"""
|
|
663
|
+
An anemic Hecke algebra, generated by Hecke operators with index coprime to the level.
|
|
664
|
+
"""
|
|
665
|
+
def _repr_(self) -> str:
|
|
666
|
+
r"""
|
|
667
|
+
EXAMPLES::
|
|
668
|
+
|
|
669
|
+
sage: H = CuspForms(3, 12).anemic_hecke_algebra()._repr_()
|
|
670
|
+
"""
|
|
671
|
+
return "Anemic Hecke algebra acting on %s" % self.module()
|
|
672
|
+
|
|
673
|
+
def __richcmp__(self, other, op) -> bool:
|
|
674
|
+
r"""
|
|
675
|
+
Compare ``self`` to ``other``.
|
|
676
|
+
|
|
677
|
+
EXAMPLES::
|
|
678
|
+
|
|
679
|
+
sage: A = ModularForms(23).anemic_hecke_algebra()
|
|
680
|
+
sage: A == QQ
|
|
681
|
+
False
|
|
682
|
+
sage: A == ModularForms(23).hecke_algebra()
|
|
683
|
+
False
|
|
684
|
+
sage: A == A
|
|
685
|
+
True
|
|
686
|
+
"""
|
|
687
|
+
if not isinstance(other, HeckeAlgebra_anemic):
|
|
688
|
+
return NotImplemented
|
|
689
|
+
return richcmp(self.module(), other.module(), op)
|
|
690
|
+
|
|
691
|
+
def hecke_operator(self, n):
|
|
692
|
+
"""
|
|
693
|
+
Return the `n`-th Hecke operator, for `n` any
|
|
694
|
+
positive integer coprime to the level.
|
|
695
|
+
|
|
696
|
+
EXAMPLES::
|
|
697
|
+
|
|
698
|
+
sage: T = ModularSymbols(Gamma1(5),3).anemic_hecke_algebra()
|
|
699
|
+
sage: T.hecke_operator(2)
|
|
700
|
+
Hecke operator T_2 on Modular Symbols space of dimension 4 for Gamma_1(5) of weight 3 with sign 0 over Rational Field
|
|
701
|
+
sage: T.hecke_operator(5)
|
|
702
|
+
Traceback (most recent call last):
|
|
703
|
+
...
|
|
704
|
+
IndexError: Hecke operator T_5 not defined in the anemic Hecke algebra
|
|
705
|
+
"""
|
|
706
|
+
n = int(n)
|
|
707
|
+
if gcd(self.module().level(), n) != 1:
|
|
708
|
+
raise IndexError("Hecke operator T_%s not defined in the anemic Hecke algebra" % n)
|
|
709
|
+
return self.module()._hecke_operator_class()(self, n)
|
|
710
|
+
|
|
711
|
+
def is_anemic(self) -> bool:
|
|
712
|
+
"""
|
|
713
|
+
Return ``True``, since this is the anemic Hecke algebra.
|
|
714
|
+
|
|
715
|
+
EXAMPLES::
|
|
716
|
+
|
|
717
|
+
sage: H = CuspForms(3, 12).anemic_hecke_algebra()
|
|
718
|
+
sage: H.is_anemic()
|
|
719
|
+
True
|
|
720
|
+
"""
|
|
721
|
+
return True
|
|
722
|
+
|
|
723
|
+
def gens(self) -> Iterator:
|
|
724
|
+
r"""
|
|
725
|
+
Return a generator over all Hecke operator `T_n` for
|
|
726
|
+
`n = 1, 2, 3, \ldots`, with `n` coprime to the
|
|
727
|
+
level. This is an infinite sequence.
|
|
728
|
+
|
|
729
|
+
EXAMPLES::
|
|
730
|
+
|
|
731
|
+
sage: T = ModularSymbols(12,2).anemic_hecke_algebra()
|
|
732
|
+
sage: g = T.gens()
|
|
733
|
+
sage: next(g)
|
|
734
|
+
Hecke operator T_1 on Modular Symbols space of dimension 5 for Gamma_0(12) of weight 2 with sign 0 over Rational Field
|
|
735
|
+
sage: next(g)
|
|
736
|
+
Hecke operator T_5 on Modular Symbols space of dimension 5 for Gamma_0(12) of weight 2 with sign 0 over Rational Field
|
|
737
|
+
"""
|
|
738
|
+
level = self.level()
|
|
739
|
+
n = 1
|
|
740
|
+
while True:
|
|
741
|
+
if gcd(n, level) == 1:
|
|
742
|
+
yield self.hecke_operator(n)
|
|
743
|
+
n += 1
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
AnemicHeckeAlgebra = HeckeAlgebra_anemic
|