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,994 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Ambient Hecke modules
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Sage: Open Source Mathematical Software
|
|
8
|
+
#
|
|
9
|
+
# Copyright (C) 2005 William Stein <wstein@gmail.com>
|
|
10
|
+
#
|
|
11
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
12
|
+
#
|
|
13
|
+
# This code is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
16
|
+
# General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# The full text of the GPL is available at:
|
|
19
|
+
#
|
|
20
|
+
# https://www.gnu.org/licenses/
|
|
21
|
+
# ****************************************************************************
|
|
22
|
+
from . import degenmap
|
|
23
|
+
from . import module
|
|
24
|
+
from . import submodule
|
|
25
|
+
|
|
26
|
+
from sage.modules.free_module import FreeModule, FreeModule_generic
|
|
27
|
+
from sage.rings.integer import Integer
|
|
28
|
+
|
|
29
|
+
import sage.arith.misc as arith
|
|
30
|
+
|
|
31
|
+
import sage.matrix.matrix_space as matrix_space
|
|
32
|
+
from sage.matrix.constructor import matrix
|
|
33
|
+
|
|
34
|
+
from sage.modular.arithgroup.congroup_gamma0 import Gamma0_constructor as Gamma0 # for Sturm bound
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class AmbientHeckeModule(module.HeckeModule_free_module):
|
|
38
|
+
"""
|
|
39
|
+
An ambient Hecke module, i.e. a Hecke module that is isomorphic as a module
|
|
40
|
+
over its base ring `R` to the standard free module `R^k` for some `k`. This
|
|
41
|
+
is the base class for ambient spaces of modular forms and modular symbols,
|
|
42
|
+
and for Brandt modules.
|
|
43
|
+
"""
|
|
44
|
+
def __init__(self, base_ring, rank, level, weight, category=None):
|
|
45
|
+
r"""
|
|
46
|
+
Create an ambient Hecke module.
|
|
47
|
+
|
|
48
|
+
EXAMPLES::
|
|
49
|
+
|
|
50
|
+
sage: ModularSymbols(6) # indirect doctest
|
|
51
|
+
Modular Symbols space of dimension 3 for Gamma_0(6) of weight 2 with sign 0 over Rational Field
|
|
52
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)
|
|
53
|
+
Generic ambient Hecke module of rank 3, level 2 and weight 4 over Rational Field
|
|
54
|
+
"""
|
|
55
|
+
rank = Integer(rank)
|
|
56
|
+
if rank < 0:
|
|
57
|
+
raise ValueError("rank (=%s) must be nonnegative" % rank)
|
|
58
|
+
self.__rank = rank
|
|
59
|
+
module.HeckeModule_free_module.__init__(self, base_ring, level,
|
|
60
|
+
weight, category=category)
|
|
61
|
+
|
|
62
|
+
def rank(self):
|
|
63
|
+
"""
|
|
64
|
+
Return the rank of this ambient Hecke module.
|
|
65
|
+
|
|
66
|
+
OUTPUT: integer
|
|
67
|
+
|
|
68
|
+
EXAMPLES::
|
|
69
|
+
|
|
70
|
+
sage: M = sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 11, 2); M
|
|
71
|
+
Generic ambient Hecke module of rank 3, level 11 and weight 2 over Rational Field
|
|
72
|
+
sage: M.rank()
|
|
73
|
+
3
|
|
74
|
+
"""
|
|
75
|
+
return self.__rank
|
|
76
|
+
|
|
77
|
+
def __add__(self, other):
|
|
78
|
+
r"""
|
|
79
|
+
Return the sum of ``self`` and ``other``.
|
|
80
|
+
|
|
81
|
+
As ``self`` is an ambient space, this will only make sense if
|
|
82
|
+
``other`` is a subspace of ``self``, in which case the answer
|
|
83
|
+
is ``self``.
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: M = ModularSymbols(23)
|
|
88
|
+
sage: M + M is M
|
|
89
|
+
True
|
|
90
|
+
sage: M + 3
|
|
91
|
+
Traceback (most recent call last):
|
|
92
|
+
...
|
|
93
|
+
TypeError: other (=3) must be a Hecke module
|
|
94
|
+
"""
|
|
95
|
+
if not isinstance(other, module.HeckeModule_free_module):
|
|
96
|
+
raise TypeError("other (=%s) must be a Hecke module" % other)
|
|
97
|
+
if other.ambient_hecke_module() == self:
|
|
98
|
+
return self
|
|
99
|
+
raise ArithmeticError("sum only defined for subspaces of a common ambient Hecke module")
|
|
100
|
+
|
|
101
|
+
def _repr_(self):
|
|
102
|
+
r"""
|
|
103
|
+
Return the string representation of ``self``.
|
|
104
|
+
|
|
105
|
+
This should be overridden by derived classes.
|
|
106
|
+
|
|
107
|
+
EXAMPLES::
|
|
108
|
+
|
|
109
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._repr_()
|
|
110
|
+
'Generic ambient Hecke module of rank 3, level 2 and weight 4 over Rational Field'
|
|
111
|
+
"""
|
|
112
|
+
return "Generic ambient Hecke module of rank %s, level %s and weight %s over %s" % (self.rank(), self.level(), self.weight(), self.base_ring())
|
|
113
|
+
|
|
114
|
+
def _degeneracy_raising_matrix(self, codomain):
|
|
115
|
+
"""
|
|
116
|
+
Matrix of the degeneracy map (with t = 1) from ``self`` to ``codomain``,
|
|
117
|
+
whose level should be a multiple of the level of ``self``.
|
|
118
|
+
|
|
119
|
+
EXAMPLES::
|
|
120
|
+
|
|
121
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._degeneracy_raising_matrix(4)
|
|
122
|
+
Traceback (most recent call last):
|
|
123
|
+
...
|
|
124
|
+
NotImplementedError
|
|
125
|
+
"""
|
|
126
|
+
raise NotImplementedError
|
|
127
|
+
|
|
128
|
+
def _degeneracy_lowering_matrix(self, codomain, t):
|
|
129
|
+
"""
|
|
130
|
+
Matrix of the degeneracy map of index t from ``self`` to ``codomain``,
|
|
131
|
+
whose level should be a divisor of the level of ``self``.
|
|
132
|
+
|
|
133
|
+
EXAMPLES::
|
|
134
|
+
|
|
135
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._degeneracy_lowering_matrix(2, 2)
|
|
136
|
+
Traceback (most recent call last):
|
|
137
|
+
...
|
|
138
|
+
NotImplementedError
|
|
139
|
+
"""
|
|
140
|
+
raise NotImplementedError
|
|
141
|
+
|
|
142
|
+
def _hecke_image_of_ith_basis_element(self, n, i):
|
|
143
|
+
"""
|
|
144
|
+
Return the image under the Hecke operator `T_n` of the `i`-th basis
|
|
145
|
+
element.
|
|
146
|
+
|
|
147
|
+
EXAMPLES::
|
|
148
|
+
|
|
149
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule(QQ, 3, 2, 4)._hecke_image_of_ith_basis_element(4, 2)
|
|
150
|
+
Traceback (most recent call last):
|
|
151
|
+
...
|
|
152
|
+
NotImplementedError: All subclasses must implement _compute_hecke_matrix_prime
|
|
153
|
+
"""
|
|
154
|
+
return self.hecke_operator(n)(self.gen(i))
|
|
155
|
+
|
|
156
|
+
def _set_dual_free_module(self, V):
|
|
157
|
+
r"""
|
|
158
|
+
Store the embedded dual module of this module.
|
|
159
|
+
|
|
160
|
+
Since this module is an ambient module, this is not necessary.
|
|
161
|
+
|
|
162
|
+
EXAMPLES::
|
|
163
|
+
|
|
164
|
+
sage: ModularForms(11, 2)._set_dual_free_module(None)
|
|
165
|
+
"""
|
|
166
|
+
pass # setting dual free module of ambient space is not necessary
|
|
167
|
+
|
|
168
|
+
def ambient_hecke_module(self):
|
|
169
|
+
r"""
|
|
170
|
+
Return the ambient space that contains this ambient space.
|
|
171
|
+
|
|
172
|
+
This is, of course, just this space again.
|
|
173
|
+
|
|
174
|
+
EXAMPLES::
|
|
175
|
+
|
|
176
|
+
sage: M = ModularForms(11, 4); M.ambient_hecke_module() is M
|
|
177
|
+
True
|
|
178
|
+
"""
|
|
179
|
+
return self
|
|
180
|
+
|
|
181
|
+
def complement(self):
|
|
182
|
+
"""
|
|
183
|
+
Return the largest Hecke-stable complement of this space.
|
|
184
|
+
|
|
185
|
+
EXAMPLES::
|
|
186
|
+
|
|
187
|
+
sage: M = ModularSymbols(11,2,1); M
|
|
188
|
+
Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
|
|
189
|
+
sage: M.complement()
|
|
190
|
+
Modular Symbols subspace of dimension 0 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
|
|
191
|
+
sage: C = M.cuspidal_subspace(); C
|
|
192
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
|
|
193
|
+
sage: C.complement()
|
|
194
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2 for Gamma_0(11) of weight 2 with sign 1 over Rational Field
|
|
195
|
+
"""
|
|
196
|
+
return self.zero_submodule()
|
|
197
|
+
|
|
198
|
+
def decomposition_matrix(self):
|
|
199
|
+
r"""
|
|
200
|
+
Return the matrix whose columns form a basis for the canonical
|
|
201
|
+
sorted decomposition of ``self`` coming from the Hecke operators.
|
|
202
|
+
|
|
203
|
+
If the simple factors are `D_0, \ldots, D_n`, then the
|
|
204
|
+
first few columns are an echelonized basis for `D_0`, the
|
|
205
|
+
next an echelonized basis for `D_1`, the next for
|
|
206
|
+
`D_2`, etc.
|
|
207
|
+
|
|
208
|
+
EXAMPLES::
|
|
209
|
+
|
|
210
|
+
sage: S = ModularSymbols(37, 2)
|
|
211
|
+
sage: S.decomposition_matrix()
|
|
212
|
+
[ 1 0 0 0 -1/3]
|
|
213
|
+
[ 0 1 -1 0 1/2]
|
|
214
|
+
[ 0 0 0 1 -1/2]
|
|
215
|
+
[ 0 1 1 1 0]
|
|
216
|
+
[ 0 0 0 0 1]
|
|
217
|
+
"""
|
|
218
|
+
try:
|
|
219
|
+
return self.__decomposition_matrix_cache
|
|
220
|
+
except AttributeError:
|
|
221
|
+
rows = [x.list() for A in self.decomposition()
|
|
222
|
+
for x in A.basis()]
|
|
223
|
+
A = matrix_space.MatrixSpace(self.base_ring(), self.rank())(rows)
|
|
224
|
+
self.__decomposition_matrix_cache = A
|
|
225
|
+
return self.__decomposition_matrix_cache
|
|
226
|
+
|
|
227
|
+
def decomposition_matrix_inverse(self):
|
|
228
|
+
"""
|
|
229
|
+
Return the inverse of the decomposition matrix.
|
|
230
|
+
|
|
231
|
+
This is the inverse of the matrix returned by
|
|
232
|
+
:meth:`decomposition_matrix`.
|
|
233
|
+
|
|
234
|
+
EXAMPLES::
|
|
235
|
+
|
|
236
|
+
sage: S = ModularSymbols(37, 2)
|
|
237
|
+
sage: t = S.decomposition_matrix_inverse(); t
|
|
238
|
+
[ 1 0 0 0 1/3]
|
|
239
|
+
[ 0 1/2 -1/2 1/2 -1/2]
|
|
240
|
+
[ 0 -1/2 -1/2 1/2 0]
|
|
241
|
+
[ 0 0 1 0 1/2]
|
|
242
|
+
[ 0 0 0 0 1]
|
|
243
|
+
sage: t * S.decomposition_matrix() == 1
|
|
244
|
+
True
|
|
245
|
+
"""
|
|
246
|
+
try:
|
|
247
|
+
return self.__decomposition_matrix_inverse_cache
|
|
248
|
+
except AttributeError:
|
|
249
|
+
self.__decomposition_matrix_inverse_cache = ~self.decomposition_matrix()
|
|
250
|
+
return self.__decomposition_matrix_inverse_cache
|
|
251
|
+
|
|
252
|
+
def degeneracy_map(self, codomain, t=1):
|
|
253
|
+
"""
|
|
254
|
+
The `t`-th degeneracy map from ``self`` to the module ``codomain``.
|
|
255
|
+
|
|
256
|
+
The level of the codomain must be a divisor or multiple of
|
|
257
|
+
level, and `t` must be a divisor of the quotient.
|
|
258
|
+
|
|
259
|
+
INPUT:
|
|
260
|
+
|
|
261
|
+
- ``codomain`` -- a Hecke module, which should be of the same type as
|
|
262
|
+
self, or a positive integer (in which case Sage will use
|
|
263
|
+
:meth:`~hecke_module_of_level` to find the "natural" module of the
|
|
264
|
+
corresponding level).
|
|
265
|
+
- ``t`` -- integer; the parameter of the degeneracy map, i.e., the map
|
|
266
|
+
is related to `f(q)` - `f(q^t)`
|
|
267
|
+
|
|
268
|
+
OUTPUT: a morphism from ``self`` to ``codomain``
|
|
269
|
+
|
|
270
|
+
EXAMPLES::
|
|
271
|
+
|
|
272
|
+
sage: M = ModularSymbols(11,sign=1)
|
|
273
|
+
sage: d1 = M.degeneracy_map(33); d1
|
|
274
|
+
Hecke module morphism degeneracy map corresponding to f(q) |--> f(q)
|
|
275
|
+
defined by the matrix
|
|
276
|
+
[ 1 0 0 0 -2 -1]
|
|
277
|
+
[ 0 -1 1 0 0 0]
|
|
278
|
+
Domain: Modular Symbols space of dimension 2 for Gamma_0(11) of weight ...
|
|
279
|
+
Codomain: Modular Symbols space of dimension 6 for Gamma_0(33) of weight ...
|
|
280
|
+
sage: M.degeneracy_map(33, 3).matrix()
|
|
281
|
+
[ 3 2 0 2 -2 1]
|
|
282
|
+
[ 0 0 -1 1 0 0]
|
|
283
|
+
sage: M = ModularSymbols(33, sign=1)
|
|
284
|
+
sage: d2 = M.degeneracy_map(11); d2.matrix()
|
|
285
|
+
[ 1 0]
|
|
286
|
+
[ 0 -2]
|
|
287
|
+
[ 0 2]
|
|
288
|
+
[ 0 1]
|
|
289
|
+
[-1 0]
|
|
290
|
+
[-1 0]
|
|
291
|
+
sage: (d2*d1).matrix()
|
|
292
|
+
[4 0]
|
|
293
|
+
[0 4]
|
|
294
|
+
|
|
295
|
+
::
|
|
296
|
+
|
|
297
|
+
sage: M = ModularSymbols(3, 12, sign=1)
|
|
298
|
+
sage: M.degeneracy_map(1)
|
|
299
|
+
Hecke module morphism degeneracy map corresponding to f(q) |--> f(q)
|
|
300
|
+
defined by the matrix
|
|
301
|
+
[1 0]
|
|
302
|
+
[0 0]
|
|
303
|
+
[0 1]
|
|
304
|
+
[0 1]
|
|
305
|
+
[0 1]
|
|
306
|
+
Domain: Modular Symbols space of dimension 5 for Gamma_0(3) of weight ...
|
|
307
|
+
Codomain: Modular Symbols space of dimension 2 for Gamma_0(1) of weight ...
|
|
308
|
+
|
|
309
|
+
::
|
|
310
|
+
|
|
311
|
+
sage: S = M.cuspidal_submodule()
|
|
312
|
+
sage: S.degeneracy_map(1)
|
|
313
|
+
Hecke module morphism defined by the matrix
|
|
314
|
+
[1 0]
|
|
315
|
+
[0 0]
|
|
316
|
+
[0 0]
|
|
317
|
+
Domain: Modular Symbols subspace of dimension 3 of Modular Symbols space ...
|
|
318
|
+
Codomain: Modular Symbols space of dimension 2 for Gamma_0(1) of weight ...
|
|
319
|
+
|
|
320
|
+
::
|
|
321
|
+
|
|
322
|
+
sage: D = ModularSymbols(10,4).cuspidal_submodule().decomposition()
|
|
323
|
+
sage: D
|
|
324
|
+
[Modular Symbols subspace of dimension 2 of Modular Symbols space of dimension 10 for Gamma_0(10) of weight 4 with sign 0 over Rational Field,
|
|
325
|
+
Modular Symbols subspace of dimension 4 of Modular Symbols space of dimension 10 for Gamma_0(10) of weight 4 with sign 0 over Rational Field]
|
|
326
|
+
sage: D[1].degeneracy_map(5)
|
|
327
|
+
Hecke module morphism defined by the matrix
|
|
328
|
+
[ 0 0 -1 1]
|
|
329
|
+
[ 0 1/2 3/2 -2]
|
|
330
|
+
[ 0 -1 1 0]
|
|
331
|
+
[ 0 -3/4 -1/4 1]
|
|
332
|
+
Domain: Modular Symbols subspace of dimension 4 of Modular Symbols space ...
|
|
333
|
+
Codomain: Modular Symbols space of dimension 4 for Gamma_0(5) of weight ...
|
|
334
|
+
|
|
335
|
+
We check for a subtle caching bug that came up in work on :issue:`10453`::
|
|
336
|
+
|
|
337
|
+
sage: loads(dumps(J0(33).decomposition()[0].modular_symbols()))
|
|
338
|
+
Modular Symbols subspace of dimension 2 of
|
|
339
|
+
Modular Symbols space of dimension 9 for
|
|
340
|
+
Gamma_0(33) of weight 2 with sign 0 over Rational Field
|
|
341
|
+
|
|
342
|
+
We check that certain absurd inputs are correctly caught::
|
|
343
|
+
|
|
344
|
+
sage: chi = kronecker_character(7)
|
|
345
|
+
sage: ModularSymbols(Gamma0(7), 4).degeneracy_map(ModularSymbols(chi, 4))
|
|
346
|
+
Traceback (most recent call last):
|
|
347
|
+
...
|
|
348
|
+
ValueError: the characters of the domain and codomain must match
|
|
349
|
+
"""
|
|
350
|
+
if isinstance(codomain, AmbientHeckeModule):
|
|
351
|
+
M = codomain
|
|
352
|
+
level = int(M.level())
|
|
353
|
+
else:
|
|
354
|
+
level = int(codomain)
|
|
355
|
+
M = None
|
|
356
|
+
|
|
357
|
+
t = int(t)
|
|
358
|
+
|
|
359
|
+
err = False
|
|
360
|
+
if self.level() % level == 0:
|
|
361
|
+
quo = self.level() // level
|
|
362
|
+
if quo % t != 0:
|
|
363
|
+
err = True
|
|
364
|
+
elif level % self.level() == 0:
|
|
365
|
+
quo = level // self.level()
|
|
366
|
+
if quo % t != 0:
|
|
367
|
+
err = True
|
|
368
|
+
else:
|
|
369
|
+
err = True
|
|
370
|
+
if err:
|
|
371
|
+
raise ValueError(("the level of self (=%s) must be a divisor or multiple of "
|
|
372
|
+
"level (=%s) and t (=%s) must be a divisor of the quotient") % (self.level(), level, t))
|
|
373
|
+
|
|
374
|
+
eps = self.character()
|
|
375
|
+
if eps is not None and level % eps.conductor() != 0:
|
|
376
|
+
raise ArithmeticError("the conductor of the character of this space "
|
|
377
|
+
"(=%s) must be divisible by the level (=%s)" % (eps.conductor(), level))
|
|
378
|
+
|
|
379
|
+
if M is None:
|
|
380
|
+
M = self.hecke_module_of_level(level)
|
|
381
|
+
|
|
382
|
+
if eps is not None and M.character() is not None:
|
|
383
|
+
if eps.primitive_character() != M.character().primitive_character():
|
|
384
|
+
raise ValueError("the characters of the domain and codomain must match")
|
|
385
|
+
|
|
386
|
+
key = (M.group(), t)
|
|
387
|
+
# bad idea to use (M, t) as the key, because using complicated objects
|
|
388
|
+
# like modular forms spaces as dictionary keys causes weird behaviour;
|
|
389
|
+
# on the other hand, (M.level(), t) isn't enough information.
|
|
390
|
+
try:
|
|
391
|
+
self._degeneracy_maps
|
|
392
|
+
except AttributeError:
|
|
393
|
+
self._degeneracy_maps = {}
|
|
394
|
+
|
|
395
|
+
if key in self._degeneracy_maps:
|
|
396
|
+
return self._degeneracy_maps[key]
|
|
397
|
+
|
|
398
|
+
if M.rank() == 0:
|
|
399
|
+
A = matrix_space.MatrixSpace(self.base_ring(), self.rank(), 0)(0)
|
|
400
|
+
|
|
401
|
+
elif self.level() % level == 0: # lower the level
|
|
402
|
+
A = self._degeneracy_lowering_matrix(M, t)
|
|
403
|
+
|
|
404
|
+
elif level % self.level() == 0: # raise the level
|
|
405
|
+
A = self._degeneracy_raising_matrix(M, t)
|
|
406
|
+
|
|
407
|
+
d = degenmap.DegeneracyMap(A, self, M, t)
|
|
408
|
+
self._degeneracy_maps[key] = d
|
|
409
|
+
return d
|
|
410
|
+
|
|
411
|
+
def dual_free_module(self):
|
|
412
|
+
r"""
|
|
413
|
+
The free module dual to ``self``, as a submodule of the dual
|
|
414
|
+
module of the ambient space. As this space is ambient anyway,
|
|
415
|
+
this just returns ``self.free_module()``.
|
|
416
|
+
|
|
417
|
+
EXAMPLES::
|
|
418
|
+
|
|
419
|
+
sage: M = ModularForms(2,8); M.dual_free_module()
|
|
420
|
+
Vector space of dimension 3 over Rational Field
|
|
421
|
+
sage: M.dual_free_module() is M.free_module()
|
|
422
|
+
True
|
|
423
|
+
"""
|
|
424
|
+
return self.free_module()
|
|
425
|
+
|
|
426
|
+
def fcp(self, n, var='x'):
|
|
427
|
+
"""
|
|
428
|
+
Return the factorization of the characteristic polynomial of
|
|
429
|
+
the Hecke operator `T_n` of index `n` acting on this space.
|
|
430
|
+
|
|
431
|
+
INPUT:
|
|
432
|
+
|
|
433
|
+
- ``self`` -- Hecke module invariant under the Hecke operator of index
|
|
434
|
+
`n`
|
|
435
|
+
|
|
436
|
+
- ``n`` --- a positive integer.
|
|
437
|
+
|
|
438
|
+
- ``var`` --- variable of polynomial (default: ``'x'``)
|
|
439
|
+
|
|
440
|
+
OUTPUT:
|
|
441
|
+
|
|
442
|
+
- ``list`` -- list of the pairs `(g,e)`, where `g` is an
|
|
443
|
+
irreducible factor of the characteristic polynomial of `T_n`, and `e`
|
|
444
|
+
is its multiplicity.
|
|
445
|
+
|
|
446
|
+
EXAMPLES::
|
|
447
|
+
|
|
448
|
+
sage: m = ModularSymbols(23, 2, sign=1)
|
|
449
|
+
sage: m.fcp(2)
|
|
450
|
+
(x - 3) * (x^2 + x - 1)
|
|
451
|
+
sage: m.hecke_operator(2).charpoly('x').factor()
|
|
452
|
+
(x - 3) * (x^2 + x - 1)
|
|
453
|
+
"""
|
|
454
|
+
n = int(n)
|
|
455
|
+
if n <= 0:
|
|
456
|
+
raise ArithmeticError("n (=%s) must be positive" % n)
|
|
457
|
+
return self.hecke_operator(n).fcp(var)
|
|
458
|
+
|
|
459
|
+
def free_module(self):
|
|
460
|
+
"""
|
|
461
|
+
Return the free module underlying this ambient Hecke module (the
|
|
462
|
+
forgetful functor from Hecke modules to modules over the base ring)
|
|
463
|
+
|
|
464
|
+
EXAMPLES::
|
|
465
|
+
|
|
466
|
+
sage: ModularForms(59, 2).free_module()
|
|
467
|
+
Vector space of dimension 6 over Rational Field
|
|
468
|
+
"""
|
|
469
|
+
try:
|
|
470
|
+
return self.__free_module
|
|
471
|
+
except AttributeError:
|
|
472
|
+
M = FreeModule(self.base_ring(), self.rank())
|
|
473
|
+
self.__free_module = M
|
|
474
|
+
return M
|
|
475
|
+
|
|
476
|
+
def hecke_bound(self):
|
|
477
|
+
r"""
|
|
478
|
+
Return an integer `B` such that the Hecke operators `T_n`, for `n\leq B`,
|
|
479
|
+
generate the full Hecke algebra as a module over the base ring. Note
|
|
480
|
+
that we include the `n` with `n` not coprime to the level.
|
|
481
|
+
|
|
482
|
+
At present this returns an unproven guess for non-cuspidal spaces which
|
|
483
|
+
appears to be valid for `M_k(\Gamma_0(N))`, where `k` and `N` are the
|
|
484
|
+
weight and level of ``self``. (It is clearly valid for *cuspidal* spaces
|
|
485
|
+
of any fixed character, as a consequence of the Sturm bound theorem.)
|
|
486
|
+
It returns a hopelessly wrong answer for spaces of full level
|
|
487
|
+
`\Gamma_1`.
|
|
488
|
+
|
|
489
|
+
TODO: Get rid of this dreadful bit of code.
|
|
490
|
+
|
|
491
|
+
EXAMPLES::
|
|
492
|
+
|
|
493
|
+
sage: ModularSymbols(17, 4).hecke_bound()
|
|
494
|
+
15
|
|
495
|
+
sage: ModularSymbols(Gamma1(17), 4).hecke_bound() # wrong!
|
|
496
|
+
15
|
|
497
|
+
"""
|
|
498
|
+
from sage.misc.verbose import verbose
|
|
499
|
+
try:
|
|
500
|
+
if self.is_cuspidal():
|
|
501
|
+
return Gamma0(self.level()).sturm_bound(self.weight())
|
|
502
|
+
except AttributeError:
|
|
503
|
+
pass
|
|
504
|
+
verbose("WARNING: ambient.py -- hecke_bound; returning unproven guess.")
|
|
505
|
+
return Gamma0(self.level()).sturm_bound(self.weight()) + 2 * Gamma0(self.level()).dimension_eis(self.weight()) + 5
|
|
506
|
+
|
|
507
|
+
def hecke_module_of_level(self, level):
|
|
508
|
+
r"""
|
|
509
|
+
Return the Hecke module corresponding to ``self`` at the given level, which
|
|
510
|
+
should be either a divisor or a multiple of the level of ``self``.
|
|
511
|
+
|
|
512
|
+
This raises :exc:`NotImplementedError`, and should be overridden in
|
|
513
|
+
derived classes.
|
|
514
|
+
|
|
515
|
+
EXAMPLES::
|
|
516
|
+
|
|
517
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule.hecke_module_of_level(ModularForms(2, 8),6)
|
|
518
|
+
Traceback (most recent call last):
|
|
519
|
+
...
|
|
520
|
+
NotImplementedError
|
|
521
|
+
"""
|
|
522
|
+
raise NotImplementedError
|
|
523
|
+
|
|
524
|
+
def hecke_images(self, i, v):
|
|
525
|
+
"""
|
|
526
|
+
Return images of the `i`-th standard basis vector under the
|
|
527
|
+
Hecke operators `T_p` for all integers in `v`.
|
|
528
|
+
|
|
529
|
+
INPUT:
|
|
530
|
+
|
|
531
|
+
- ``i`` -- nonnegative integer
|
|
532
|
+
|
|
533
|
+
- ``v`` -- list of positive integer
|
|
534
|
+
|
|
535
|
+
OUTPUT: ``matrix`` -- whose rows are the Hecke images
|
|
536
|
+
|
|
537
|
+
EXAMPLES::
|
|
538
|
+
|
|
539
|
+
sage: M = ModularSymbols(DirichletGroup(13).0, 3)
|
|
540
|
+
sage: M.T(2)(M.0).element()
|
|
541
|
+
(zeta12 + 4, 0, -1, 1)
|
|
542
|
+
sage: M.hecke_images(0, [1,2])
|
|
543
|
+
[ 1 0 0 0]
|
|
544
|
+
[zeta12 + 4 0 -1 1]
|
|
545
|
+
"""
|
|
546
|
+
try:
|
|
547
|
+
return self._hecke_images(i, v)
|
|
548
|
+
except (AttributeError, NotImplementedError):
|
|
549
|
+
pass
|
|
550
|
+
# Use slow generic algorithm
|
|
551
|
+
x = self.gen(i)
|
|
552
|
+
X = [self.hecke_operator(n).apply_sparse(x).element() for n in v]
|
|
553
|
+
return matrix(self.base_ring(), X)
|
|
554
|
+
|
|
555
|
+
def intersection(self, other):
|
|
556
|
+
"""
|
|
557
|
+
Return the intersection of ``self`` and ``other``, which must both lie in
|
|
558
|
+
a common ambient space of modular symbols.
|
|
559
|
+
|
|
560
|
+
EXAMPLES::
|
|
561
|
+
|
|
562
|
+
sage: M = ModularSymbols(43, sign=1)
|
|
563
|
+
sage: A = M[0] + M[1]
|
|
564
|
+
sage: B = M[1] + M[2]
|
|
565
|
+
sage: A.rank(), B.rank()
|
|
566
|
+
(2, 3)
|
|
567
|
+
sage: C = A.intersection(B); C.rank() # TODO
|
|
568
|
+
1
|
|
569
|
+
"""
|
|
570
|
+
if not isinstance(other, module.HeckeModule_free_module):
|
|
571
|
+
raise TypeError("other (=%s) must be a Hecke module" % other)
|
|
572
|
+
if self.ambient_hecke_module() != other.ambient_hecke_module():
|
|
573
|
+
raise ArithmeticError("intersection only defined for subspaces of a common ambient Hecke module")
|
|
574
|
+
return other # since self is ambient, so the intersection must equal other.
|
|
575
|
+
|
|
576
|
+
def is_ambient(self) -> bool:
|
|
577
|
+
r"""
|
|
578
|
+
Return ``True`` if and only if ``self`` is an ambient Hecke module.
|
|
579
|
+
|
|
580
|
+
.. warning::
|
|
581
|
+
|
|
582
|
+
``self`` can only be ambient by being of type
|
|
583
|
+
:class:`AmbientHeckeModule`.
|
|
584
|
+
|
|
585
|
+
For example, decomposing a simple ambient space yields a
|
|
586
|
+
single factor, and that factor is *not* considered an
|
|
587
|
+
ambient space.
|
|
588
|
+
|
|
589
|
+
EXAMPLES::
|
|
590
|
+
|
|
591
|
+
sage: m = ModularSymbols(10)
|
|
592
|
+
sage: m.is_ambient()
|
|
593
|
+
True
|
|
594
|
+
|
|
595
|
+
::
|
|
596
|
+
|
|
597
|
+
sage: a = m[0] # the unique simple factor
|
|
598
|
+
sage: a == m
|
|
599
|
+
True
|
|
600
|
+
sage: a.is_ambient()
|
|
601
|
+
False
|
|
602
|
+
"""
|
|
603
|
+
return True
|
|
604
|
+
|
|
605
|
+
def is_full_hecke_module(self, compute=True) -> bool:
|
|
606
|
+
"""
|
|
607
|
+
Return ``True`` if this space is invariant under the action of
|
|
608
|
+
all Hecke operators, even those that divide the level. This is
|
|
609
|
+
always true for ambient Hecke modules, so return ``True``.
|
|
610
|
+
|
|
611
|
+
EXAMPLES::
|
|
612
|
+
|
|
613
|
+
sage: ModularSymbols(11, 4).is_full_hecke_module()
|
|
614
|
+
True
|
|
615
|
+
"""
|
|
616
|
+
return True
|
|
617
|
+
|
|
618
|
+
def is_new(self, p=None) -> bool:
|
|
619
|
+
r"""
|
|
620
|
+
Return ``True`` if this module is entirely new.
|
|
621
|
+
|
|
622
|
+
EXAMPLES::
|
|
623
|
+
|
|
624
|
+
sage: ModularSymbols(11, 4).is_new()
|
|
625
|
+
False
|
|
626
|
+
sage: ModularSymbols(1, 12).is_new()
|
|
627
|
+
True
|
|
628
|
+
"""
|
|
629
|
+
try:
|
|
630
|
+
if p in self.__is_new:
|
|
631
|
+
return self.__is_new[p]
|
|
632
|
+
except AttributeError:
|
|
633
|
+
pass
|
|
634
|
+
AmbientHeckeModule.new_submodule(self, p)
|
|
635
|
+
return self.__is_new[p]
|
|
636
|
+
|
|
637
|
+
def is_old(self, p=None) -> bool:
|
|
638
|
+
r"""
|
|
639
|
+
Return ``True`` if this module is entirely old.
|
|
640
|
+
|
|
641
|
+
EXAMPLES::
|
|
642
|
+
|
|
643
|
+
sage: ModularSymbols(22).is_old()
|
|
644
|
+
True
|
|
645
|
+
sage: ModularSymbols(3, 12).is_old()
|
|
646
|
+
False
|
|
647
|
+
"""
|
|
648
|
+
try:
|
|
649
|
+
if p in self.__is_old:
|
|
650
|
+
return self.__is_old[p]
|
|
651
|
+
except AttributeError:
|
|
652
|
+
pass
|
|
653
|
+
self.old_submodule(p)
|
|
654
|
+
return self.__is_old[p]
|
|
655
|
+
|
|
656
|
+
def is_submodule(self, V) -> bool:
|
|
657
|
+
"""
|
|
658
|
+
Return ``True`` if and only if ``self`` is a submodule of ``V``.
|
|
659
|
+
|
|
660
|
+
Since this is an ambient space, this returns ``True`` if and
|
|
661
|
+
only if ``V`` is equal to ``self``.
|
|
662
|
+
|
|
663
|
+
EXAMPLES::
|
|
664
|
+
|
|
665
|
+
sage: ModularSymbols(1, 4).is_submodule(ModularSymbols(11,4))
|
|
666
|
+
False
|
|
667
|
+
sage: ModularSymbols(11, 4).is_submodule(ModularSymbols(11,4))
|
|
668
|
+
True
|
|
669
|
+
"""
|
|
670
|
+
if not isinstance(V, module.HeckeModule_free_module):
|
|
671
|
+
raise TypeError("V must be a Hecke module")
|
|
672
|
+
if not V.is_ambient():
|
|
673
|
+
return False
|
|
674
|
+
return V.ambient_hecke_module() == self
|
|
675
|
+
|
|
676
|
+
def linear_combination_of_basis(self, v):
|
|
677
|
+
r"""
|
|
678
|
+
Given a list or vector of length equal to the dimension of ``self``,
|
|
679
|
+
construct the appropriate linear combination of the basis vectors of
|
|
680
|
+
``self``.
|
|
681
|
+
|
|
682
|
+
EXAMPLES::
|
|
683
|
+
|
|
684
|
+
sage: ModularForms(3, 12).linear_combination_of_basis([1,0,0,0,1])
|
|
685
|
+
2*q + 2049*q^2 + 177147*q^3 + 4196177*q^4 + 48830556*q^5 + O(q^6)
|
|
686
|
+
"""
|
|
687
|
+
return self(v)
|
|
688
|
+
|
|
689
|
+
def new_submodule(self, p=None):
|
|
690
|
+
"""
|
|
691
|
+
Return the new or `p`-new submodule of ``self``.
|
|
692
|
+
|
|
693
|
+
INPUT:
|
|
694
|
+
|
|
695
|
+
- ``p`` -- (default: ``None``) if not ``None``, return only
|
|
696
|
+
the `p`-new submodule
|
|
697
|
+
|
|
698
|
+
OUTPUT: the new or `p`-new submodule of ``self``, i.e. the intersection of
|
|
699
|
+
the kernel of the degeneracy lowering maps to level `N/p` (for the
|
|
700
|
+
given prime `p`, or for all prime divisors of `N` if `p` is not given).
|
|
701
|
+
|
|
702
|
+
If ``self`` is cuspidal, this is a Hecke-invariant complement of the
|
|
703
|
+
corresponding old submodule, but this may break down on Eisenstein
|
|
704
|
+
subspaces (see the amusing example in William Stein's book of a form
|
|
705
|
+
which is new and old at the same time).
|
|
706
|
+
|
|
707
|
+
EXAMPLES::
|
|
708
|
+
|
|
709
|
+
sage: m = ModularSymbols(33); m.rank()
|
|
710
|
+
9
|
|
711
|
+
sage: m.new_submodule().rank()
|
|
712
|
+
3
|
|
713
|
+
sage: m.new_submodule(3).rank()
|
|
714
|
+
4
|
|
715
|
+
sage: m.new_submodule(11).rank()
|
|
716
|
+
8
|
|
717
|
+
"""
|
|
718
|
+
try:
|
|
719
|
+
if self.__is_new[p]:
|
|
720
|
+
return self
|
|
721
|
+
except AttributeError:
|
|
722
|
+
self.__is_new = {}
|
|
723
|
+
except KeyError:
|
|
724
|
+
pass
|
|
725
|
+
|
|
726
|
+
if self.rank() == 0:
|
|
727
|
+
self.__is_new[p] = True
|
|
728
|
+
return self
|
|
729
|
+
try:
|
|
730
|
+
return self.__new_submodule[p]
|
|
731
|
+
except AttributeError:
|
|
732
|
+
self.__new_submodule = {}
|
|
733
|
+
except KeyError:
|
|
734
|
+
pass
|
|
735
|
+
|
|
736
|
+
# Construct the degeneracy map d.
|
|
737
|
+
N = self.level()
|
|
738
|
+
d = None
|
|
739
|
+
eps = self.character()
|
|
740
|
+
if eps is None:
|
|
741
|
+
f = 1
|
|
742
|
+
else:
|
|
743
|
+
f = eps.conductor()
|
|
744
|
+
if p is None:
|
|
745
|
+
D = arith.prime_divisors(N)
|
|
746
|
+
else:
|
|
747
|
+
if N % p != 0:
|
|
748
|
+
raise ValueError("p must divide the level")
|
|
749
|
+
D = [p]
|
|
750
|
+
for q in D:
|
|
751
|
+
# Here we are only using degeneracy *lowering* maps, so it is fine
|
|
752
|
+
# to be careless and pass an integer for the level. One needs to be
|
|
753
|
+
# a bit more careful with degeneracy *raising* maps for the Gamma1
|
|
754
|
+
# and GammaH cases.
|
|
755
|
+
if ((N // q) % f) == 0:
|
|
756
|
+
NN = N // q
|
|
757
|
+
d1 = self.degeneracy_map(NN, 1).matrix()
|
|
758
|
+
if d is None:
|
|
759
|
+
d = d1
|
|
760
|
+
else:
|
|
761
|
+
d = d.augment(d1)
|
|
762
|
+
d = d.augment(self.degeneracy_map(NN, q).matrix())
|
|
763
|
+
|
|
764
|
+
if d is None or d == 0:
|
|
765
|
+
self.__is_new[p] = True
|
|
766
|
+
return self
|
|
767
|
+
else:
|
|
768
|
+
self.__is_new[p] = False
|
|
769
|
+
ns = self.submodule(d.kernel(), check=False)
|
|
770
|
+
ns.__is_new = {p: True}
|
|
771
|
+
ns._is_full_hecke_module = True
|
|
772
|
+
self.__new_submodule[p] = ns
|
|
773
|
+
return ns
|
|
774
|
+
|
|
775
|
+
def nonembedded_free_module(self):
|
|
776
|
+
r"""
|
|
777
|
+
Return the free module corresponding to ``self`` as an abstract free module
|
|
778
|
+
(rather than as a submodule of an ambient free module).
|
|
779
|
+
|
|
780
|
+
As this module is ambient anyway, this just returns
|
|
781
|
+
``self.free_module()``.
|
|
782
|
+
|
|
783
|
+
EXAMPLES::
|
|
784
|
+
|
|
785
|
+
sage: M = ModularSymbols(11, 2)
|
|
786
|
+
sage: M.nonembedded_free_module() is M.free_module()
|
|
787
|
+
True
|
|
788
|
+
"""
|
|
789
|
+
return self.free_module()
|
|
790
|
+
|
|
791
|
+
def old_submodule(self, p=None):
|
|
792
|
+
"""
|
|
793
|
+
Return the old or `p`-old submodule of ``self``, i.e. the sum of the images
|
|
794
|
+
of the degeneracy maps from level `N/p` (for the given prime `p`, or
|
|
795
|
+
for all primes `p` dividing `N` if `p` is not given).
|
|
796
|
+
|
|
797
|
+
INPUT:
|
|
798
|
+
|
|
799
|
+
- ``p`` -- (default: ``None``) if not ``None``, return only the `p`-old
|
|
800
|
+
submodule
|
|
801
|
+
|
|
802
|
+
OUTPUT: the old or `p`-old submodule of ``self``
|
|
803
|
+
|
|
804
|
+
EXAMPLES::
|
|
805
|
+
|
|
806
|
+
sage: m = ModularSymbols(33); m.rank()
|
|
807
|
+
9
|
|
808
|
+
sage: m.old_submodule().rank()
|
|
809
|
+
7
|
|
810
|
+
sage: m.old_submodule(3).rank()
|
|
811
|
+
6
|
|
812
|
+
sage: m.new_submodule(11).rank()
|
|
813
|
+
8
|
|
814
|
+
|
|
815
|
+
::
|
|
816
|
+
|
|
817
|
+
sage: e = DirichletGroup(16)([-1, 1])
|
|
818
|
+
sage: M = ModularSymbols(e, 3, sign=1); M
|
|
819
|
+
Modular Symbols space of dimension 4 and level 16, weight 3,
|
|
820
|
+
character [-1, 1], sign 1, over Rational Field
|
|
821
|
+
sage: M.old_submodule()
|
|
822
|
+
Modular Symbols subspace of dimension 3 of
|
|
823
|
+
Modular Symbols space of dimension 4 and level 16, weight 3,
|
|
824
|
+
character [-1, 1], sign 1, over Rational Field
|
|
825
|
+
|
|
826
|
+
Illustrate that :issue:`10664` is fixed::
|
|
827
|
+
|
|
828
|
+
sage: ModularSymbols(DirichletGroup(42)[7], 6, sign=1).old_subspace(3)
|
|
829
|
+
Modular Symbols subspace of dimension 0 of
|
|
830
|
+
Modular Symbols space of dimension 40 and level 42, weight 6,
|
|
831
|
+
character [-1, -1], sign 1, over Rational Field
|
|
832
|
+
"""
|
|
833
|
+
try:
|
|
834
|
+
if self.__is_old[p]:
|
|
835
|
+
return self
|
|
836
|
+
except AttributeError:
|
|
837
|
+
self.__is_old = {}
|
|
838
|
+
except KeyError:
|
|
839
|
+
pass
|
|
840
|
+
|
|
841
|
+
if self.rank() == 0:
|
|
842
|
+
self.__is_old[p] = True
|
|
843
|
+
return self
|
|
844
|
+
try:
|
|
845
|
+
return self.__old_submodule[p]
|
|
846
|
+
except AttributeError:
|
|
847
|
+
self.__old_submodule = {}
|
|
848
|
+
except KeyError:
|
|
849
|
+
pass
|
|
850
|
+
|
|
851
|
+
# Construct the degeneracy map d.
|
|
852
|
+
N = self.level()
|
|
853
|
+
d = None
|
|
854
|
+
|
|
855
|
+
eps = self.character()
|
|
856
|
+
if eps is None:
|
|
857
|
+
f = 1
|
|
858
|
+
else:
|
|
859
|
+
f = eps.conductor()
|
|
860
|
+
|
|
861
|
+
if p is None:
|
|
862
|
+
D = arith.prime_divisors(N)
|
|
863
|
+
else:
|
|
864
|
+
if N % p != 0:
|
|
865
|
+
raise ValueError("p must divide the level")
|
|
866
|
+
D = [p]
|
|
867
|
+
|
|
868
|
+
for q in D:
|
|
869
|
+
NN = N // q
|
|
870
|
+
if NN % f == 0:
|
|
871
|
+
M = self.hecke_module_of_level(NN)
|
|
872
|
+
|
|
873
|
+
# Here it is vital to pass self as an argument to
|
|
874
|
+
# degeneracy_map, because M and the level N don't uniquely
|
|
875
|
+
# determine self (e.g. the degeneracy map from level 1 to level
|
|
876
|
+
# N could go to Gamma0(N), Gamma1(N) or anything in between)
|
|
877
|
+
d1 = M.degeneracy_map(self, 1).matrix()
|
|
878
|
+
|
|
879
|
+
if d is None:
|
|
880
|
+
d = d1
|
|
881
|
+
else:
|
|
882
|
+
d = d.stack(d1)
|
|
883
|
+
d = d.stack(M.degeneracy_map(self, q).matrix())
|
|
884
|
+
|
|
885
|
+
if d is None:
|
|
886
|
+
os = self.zero_submodule()
|
|
887
|
+
else:
|
|
888
|
+
os = self.submodule(d.image(), check=False)
|
|
889
|
+
|
|
890
|
+
self.__is_old[p] = (os == self)
|
|
891
|
+
|
|
892
|
+
os.__is_old = {p: True}
|
|
893
|
+
os._is_full_hecke_module = True
|
|
894
|
+
self.__old_submodule[p] = os
|
|
895
|
+
return os
|
|
896
|
+
|
|
897
|
+
def submodule(self, M, Mdual=None, check=True):
|
|
898
|
+
"""
|
|
899
|
+
Return the Hecke submodule of ``self`` generated by `M`, which may be a
|
|
900
|
+
submodule of the free module of ``self``, or a list of elements of ``self``.
|
|
901
|
+
|
|
902
|
+
EXAMPLES::
|
|
903
|
+
|
|
904
|
+
sage: M = ModularForms(37, 2)
|
|
905
|
+
sage: A = M.submodule([M.newforms()[0].element(), M.newforms()[1].element()]); A
|
|
906
|
+
Modular Forms subspace of dimension 2 of
|
|
907
|
+
Modular Forms space of dimension 3 for
|
|
908
|
+
Congruence Subgroup Gamma0(37) of weight 2 over Rational Field
|
|
909
|
+
"""
|
|
910
|
+
if check:
|
|
911
|
+
if not isinstance(M, FreeModule_generic):
|
|
912
|
+
V = self.free_module()
|
|
913
|
+
if isinstance(M, (list, tuple)):
|
|
914
|
+
M = V.span([V(x.element()) for x in M])
|
|
915
|
+
else:
|
|
916
|
+
M = V.span(M)
|
|
917
|
+
if not M.is_submodule(self.free_module()):
|
|
918
|
+
raise TypeError("M must be a submodule of the free module associated to this module")
|
|
919
|
+
if M == self.free_module():
|
|
920
|
+
return self
|
|
921
|
+
return self._submodule_class()(self, M, Mdual, check=check)
|
|
922
|
+
|
|
923
|
+
def _submodule_class(self):
|
|
924
|
+
r"""
|
|
925
|
+
The class of submodules of this module. This is a separate method so it
|
|
926
|
+
can be overridden in derived classes.
|
|
927
|
+
|
|
928
|
+
EXAMPLES::
|
|
929
|
+
|
|
930
|
+
sage: sage.modular.hecke.ambient_module.AmbientHeckeModule._submodule_class(ModularForms(1, 24))
|
|
931
|
+
<class 'sage.modular.hecke.submodule.HeckeSubmodule'>
|
|
932
|
+
sage: ModularForms(1, 24)._submodule_class()
|
|
933
|
+
<class 'sage.modular.modform.submodule.ModularFormsSubmodule'>
|
|
934
|
+
"""
|
|
935
|
+
return submodule.HeckeSubmodule
|
|
936
|
+
|
|
937
|
+
def submodule_from_nonembedded_module(self, V, Vdual=None, check=True):
|
|
938
|
+
"""
|
|
939
|
+
Create a submodule of this module, from a submodule of an ambient free
|
|
940
|
+
module of the same rank as the rank of ``self``.
|
|
941
|
+
|
|
942
|
+
INPUT:
|
|
943
|
+
|
|
944
|
+
- ``V`` -- submodule of ambient free module of the same rank as the
|
|
945
|
+
rank of ``self``
|
|
946
|
+
|
|
947
|
+
- ``Vdual`` -- used to pass in dual submodule (may be ``None``)
|
|
948
|
+
|
|
949
|
+
- ``check`` -- whether to check that submodule is Hecke-equivariant
|
|
950
|
+
|
|
951
|
+
OUTPUT: Hecke submodule of ``self``
|
|
952
|
+
|
|
953
|
+
EXAMPLES::
|
|
954
|
+
|
|
955
|
+
sage: V = QQ^8
|
|
956
|
+
sage: ModularForms(24, 2).submodule_from_nonembedded_module(V.submodule([0]))
|
|
957
|
+
Modular Forms subspace of dimension 0 of
|
|
958
|
+
Modular Forms space of dimension 8 for
|
|
959
|
+
Congruence Subgroup Gamma0(24) of weight 2 over Rational Field
|
|
960
|
+
"""
|
|
961
|
+
return self.submodule(V, Vdual, check=check)
|
|
962
|
+
|
|
963
|
+
def submodule_generated_by_images(self, M):
|
|
964
|
+
"""
|
|
965
|
+
Return the submodule of this ambient modular symbols space
|
|
966
|
+
generated by the images under all degeneracy maps of `M`.
|
|
967
|
+
|
|
968
|
+
The space `M` must have the same weight, sign, and group or
|
|
969
|
+
character as this ambient space.
|
|
970
|
+
|
|
971
|
+
EXAMPLES::
|
|
972
|
+
|
|
973
|
+
sage: ModularSymbols(6, 12).submodule_generated_by_images(ModularSymbols(1,12))
|
|
974
|
+
Modular Symbols subspace of dimension 12 of
|
|
975
|
+
Modular Symbols space of dimension 22 for
|
|
976
|
+
Gamma_0(6) of weight 12 with sign 0 over Rational Field
|
|
977
|
+
"""
|
|
978
|
+
S = self.zero_submodule()
|
|
979
|
+
if self.level() % M.level() == 0:
|
|
980
|
+
D = arith.divisors(self.level() // M.level())
|
|
981
|
+
elif M.level() % self.level() == 0:
|
|
982
|
+
D = arith.divisors(M.level() // self.level())
|
|
983
|
+
else:
|
|
984
|
+
D = []
|
|
985
|
+
for t in D:
|
|
986
|
+
d = M.degeneracy_map(self, t)
|
|
987
|
+
if d.codomain() != self:
|
|
988
|
+
raise ArithmeticError("incompatible spaces of modular symbols")
|
|
989
|
+
S += d.image()
|
|
990
|
+
|
|
991
|
+
if self.is_full_hecke_module(compute=False):
|
|
992
|
+
S._is_full_hecke_module = True
|
|
993
|
+
|
|
994
|
+
return S
|