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,663 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
The Eisenstein subspace
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from sage.arith.functions import lcm
|
|
8
|
+
from sage.arith.misc import euler_phi
|
|
9
|
+
from sage.categories.objects import Objects
|
|
10
|
+
from sage.matrix.constructor import Matrix
|
|
11
|
+
from sage.misc.cachefunc import cached_method
|
|
12
|
+
from sage.misc.lazy_import import lazy_import
|
|
13
|
+
from sage.rings.integer import Integer
|
|
14
|
+
from sage.structure.sequence import Sequence
|
|
15
|
+
|
|
16
|
+
lazy_import('sage.rings.number_field.number_field', 'CyclotomicField')
|
|
17
|
+
|
|
18
|
+
from . import eis_series
|
|
19
|
+
from . import element
|
|
20
|
+
from . import submodule
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EisensteinSubmodule(submodule.ModularFormsSubmodule):
|
|
24
|
+
"""
|
|
25
|
+
The Eisenstein submodule of an ambient space of modular forms.
|
|
26
|
+
"""
|
|
27
|
+
def __init__(self, ambient_space):
|
|
28
|
+
"""
|
|
29
|
+
Return the Eisenstein submodule of the given space.
|
|
30
|
+
|
|
31
|
+
EXAMPLES::
|
|
32
|
+
|
|
33
|
+
sage: E = ModularForms(23,4).eisenstein_subspace() # indirect doctest
|
|
34
|
+
sage: E
|
|
35
|
+
Eisenstein subspace of dimension 2 of Modular Forms space of dimension 7
|
|
36
|
+
for Congruence Subgroup Gamma0(23) of weight 4 over Rational Field
|
|
37
|
+
sage: E == loads(dumps(E))
|
|
38
|
+
True
|
|
39
|
+
"""
|
|
40
|
+
from sage.misc.verbose import verbose
|
|
41
|
+
verbose('creating eisenstein submodule of %s' % ambient_space)
|
|
42
|
+
d = ambient_space._dim_eisenstein()
|
|
43
|
+
V = ambient_space.module()
|
|
44
|
+
n = V.dimension()
|
|
45
|
+
self._start_position = int(n - d)
|
|
46
|
+
S = V.submodule([V.gen(i) for i in range(n-d,n)], check=False,
|
|
47
|
+
already_echelonized=True)
|
|
48
|
+
submodule.ModularFormsSubmodule.__init__(self, ambient_space, S)
|
|
49
|
+
|
|
50
|
+
def _repr_(self):
|
|
51
|
+
"""
|
|
52
|
+
Return the string representation of ``self``.
|
|
53
|
+
|
|
54
|
+
EXAMPLES::
|
|
55
|
+
|
|
56
|
+
sage: E = ModularForms(23,4).eisenstein_subspace() # indirect doctest
|
|
57
|
+
sage: E._repr_()
|
|
58
|
+
'Eisenstein subspace of dimension 2 of Modular Forms space of dimension 7 for Congruence Subgroup Gamma0(23) of weight 4 over Rational Field'
|
|
59
|
+
"""
|
|
60
|
+
return "Eisenstein subspace of dimension %s of %s" % (self.dimension(), self.ambient_module())
|
|
61
|
+
|
|
62
|
+
def eisenstein_submodule(self):
|
|
63
|
+
"""
|
|
64
|
+
Return the Eisenstein submodule of ``self``.
|
|
65
|
+
(Yes, this is just self.)
|
|
66
|
+
|
|
67
|
+
EXAMPLES::
|
|
68
|
+
|
|
69
|
+
sage: E = ModularForms(23,4).eisenstein_subspace()
|
|
70
|
+
sage: E == E.eisenstein_submodule()
|
|
71
|
+
True
|
|
72
|
+
"""
|
|
73
|
+
return self
|
|
74
|
+
|
|
75
|
+
@cached_method
|
|
76
|
+
def modular_symbols(self, sign=0):
|
|
77
|
+
r"""
|
|
78
|
+
Return the corresponding space of modular symbols with given sign. This
|
|
79
|
+
will fail in weight 1.
|
|
80
|
+
|
|
81
|
+
.. warning::
|
|
82
|
+
|
|
83
|
+
If sign != 0, then the space of modular symbols will, in general,
|
|
84
|
+
only correspond to a *subspace* of this space of modular forms.
|
|
85
|
+
This can be the case for both sign +1 or -1.
|
|
86
|
+
|
|
87
|
+
EXAMPLES::
|
|
88
|
+
|
|
89
|
+
sage: E = ModularForms(11,2).eisenstein_submodule()
|
|
90
|
+
sage: M = E.modular_symbols(); M
|
|
91
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space
|
|
92
|
+
of dimension 3 for Gamma_0(11) of weight 2 with sign 0 over Rational Field
|
|
93
|
+
sage: M.sign()
|
|
94
|
+
0
|
|
95
|
+
|
|
96
|
+
sage: M = E.modular_symbols(sign=-1); M
|
|
97
|
+
Modular Symbols subspace of dimension 0 of Modular Symbols space of
|
|
98
|
+
dimension 1 for Gamma_0(11) of weight 2 with sign -1 over Rational Field
|
|
99
|
+
|
|
100
|
+
sage: E = ModularForms(1,12).eisenstein_submodule()
|
|
101
|
+
sage: E.modular_symbols()
|
|
102
|
+
Modular Symbols subspace of dimension 1 of Modular Symbols space of
|
|
103
|
+
dimension 3 for Gamma_0(1) of weight 12 with sign 0 over Rational Field
|
|
104
|
+
|
|
105
|
+
sage: eps = DirichletGroup(13).0
|
|
106
|
+
sage: E = EisensteinForms(eps^2, 2)
|
|
107
|
+
sage: E.modular_symbols()
|
|
108
|
+
Modular Symbols subspace of dimension 2 of Modular Symbols space of
|
|
109
|
+
dimension 4 and level 13, weight 2, character [zeta6], sign 0,
|
|
110
|
+
over Cyclotomic Field of order 6 and degree 2
|
|
111
|
+
|
|
112
|
+
sage: E = EisensteinForms(eps, 1); E
|
|
113
|
+
Eisenstein subspace of dimension 1 of Modular Forms space of character
|
|
114
|
+
[zeta12] and weight 1 over Cyclotomic Field of order 12 and degree 4
|
|
115
|
+
sage: E.modular_symbols()
|
|
116
|
+
Traceback (most recent call last):
|
|
117
|
+
...
|
|
118
|
+
ValueError: the weight must be at least 2
|
|
119
|
+
"""
|
|
120
|
+
A = self.ambient_module()
|
|
121
|
+
return A.modular_symbols(sign).eisenstein_submodule()
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class EisensteinSubmodule_params(EisensteinSubmodule):
|
|
125
|
+
|
|
126
|
+
@cached_method
|
|
127
|
+
def parameters(self):
|
|
128
|
+
r"""
|
|
129
|
+
Return a list of parameters for each Eisenstein series
|
|
130
|
+
spanning ``self``. That is, for each such series, return a triple
|
|
131
|
+
of the form (`\psi`, `\chi`, level), where `\psi` and `\chi`
|
|
132
|
+
are the characters defining the Eisenstein series, and level
|
|
133
|
+
is the smallest level at which this series occurs.
|
|
134
|
+
|
|
135
|
+
EXAMPLES::
|
|
136
|
+
|
|
137
|
+
sage: ModularForms(24,2).eisenstein_submodule().parameters()
|
|
138
|
+
[(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
|
|
139
|
+
Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1, 2),
|
|
140
|
+
...
|
|
141
|
+
Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1, 24)]
|
|
142
|
+
sage: EisensteinForms(12,6).parameters()[-1]
|
|
143
|
+
(Dirichlet character modulo 12 of conductor 1 mapping 7 |--> 1, 5 |--> 1,
|
|
144
|
+
Dirichlet character modulo 12 of conductor 1 mapping 7 |--> 1, 5 |--> 1, 12)
|
|
145
|
+
|
|
146
|
+
sage: pars = ModularForms(DirichletGroup(24).0,3).eisenstein_submodule().parameters()
|
|
147
|
+
sage: [(x[0].values_on_gens(),x[1].values_on_gens(),x[2]) for x in pars]
|
|
148
|
+
[((1, 1, 1), (-1, 1, 1), 1),
|
|
149
|
+
((1, 1, 1), (-1, 1, 1), 2),
|
|
150
|
+
((1, 1, 1), (-1, 1, 1), 3),
|
|
151
|
+
((1, 1, 1), (-1, 1, 1), 6),
|
|
152
|
+
((-1, 1, 1), (1, 1, 1), 1),
|
|
153
|
+
((-1, 1, 1), (1, 1, 1), 2),
|
|
154
|
+
((-1, 1, 1), (1, 1, 1), 3),
|
|
155
|
+
((-1, 1, 1), (1, 1, 1), 6)]
|
|
156
|
+
sage: EisensteinForms(DirichletGroup(24).0,1).parameters()
|
|
157
|
+
[(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
|
|
158
|
+
Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 1),
|
|
159
|
+
(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
|
|
160
|
+
Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 2),
|
|
161
|
+
(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
|
|
162
|
+
Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 3),
|
|
163
|
+
(Dirichlet character modulo 24 of conductor 1 mapping 7 |--> 1, 13 |--> 1, 17 |--> 1,
|
|
164
|
+
Dirichlet character modulo 24 of conductor 4 mapping 7 |--> -1, 13 |--> 1, 17 |--> 1, 6)]
|
|
165
|
+
"""
|
|
166
|
+
char = self._parameters_character()
|
|
167
|
+
if char is None:
|
|
168
|
+
return eis_series.compute_eisenstein_params(self.level(), self.weight())
|
|
169
|
+
else:
|
|
170
|
+
return eis_series.compute_eisenstein_params(char, self.weight())
|
|
171
|
+
|
|
172
|
+
def new_submodule(self, p=None):
|
|
173
|
+
r"""
|
|
174
|
+
Return the new submodule of ``self``.
|
|
175
|
+
|
|
176
|
+
EXAMPLES::
|
|
177
|
+
|
|
178
|
+
sage: e = EisensteinForms(Gamma0(225), 2).new_submodule(); e
|
|
179
|
+
Modular Forms subspace of dimension 3 of Modular Forms space of dimension 42
|
|
180
|
+
for Congruence Subgroup Gamma0(225) of weight 2 over Rational Field
|
|
181
|
+
sage: e.basis()
|
|
182
|
+
[q + O(q^6), q^2 + O(q^6), q^4 + O(q^6)]
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
if p is not None:
|
|
186
|
+
raise NotImplementedError
|
|
187
|
+
return self.submodule([self(x) for x in self._compute_q_expansion_basis(self.sturm_bound(), new=True)], check=False)
|
|
188
|
+
|
|
189
|
+
def _parameters_character(self):
|
|
190
|
+
"""
|
|
191
|
+
Return the character defining ``self``.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: EisensteinForms(DirichletGroup(33).1,5)._parameters_character()
|
|
196
|
+
Dirichlet character modulo 33 of conductor 11 mapping 23 |--> 1, 13 |--> zeta10
|
|
197
|
+
"""
|
|
198
|
+
return self.character()
|
|
199
|
+
|
|
200
|
+
def change_ring(self, base_ring):
|
|
201
|
+
"""
|
|
202
|
+
Return ``self`` as a module over ``base_ring``.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: E = EisensteinForms(12,2) ; E
|
|
207
|
+
Eisenstein subspace of dimension 5 of Modular Forms space of dimension 5
|
|
208
|
+
for Congruence Subgroup Gamma0(12) of weight 2 over Rational Field
|
|
209
|
+
sage: E.basis()
|
|
210
|
+
[1 + O(q^6), q + 6*q^5 + O(q^6), q^2 + O(q^6), q^3 + O(q^6), q^4 + O(q^6)]
|
|
211
|
+
sage: E.change_ring(GF(5))
|
|
212
|
+
Eisenstein subspace of dimension 5 of Modular Forms space of dimension 5
|
|
213
|
+
for Congruence Subgroup Gamma0(12) of weight 2 over Finite Field of size 5
|
|
214
|
+
sage: E.change_ring(GF(5)).basis()
|
|
215
|
+
[1 + O(q^6), q + q^5 + O(q^6), q^2 + O(q^6), q^3 + O(q^6), q^4 + O(q^6)]
|
|
216
|
+
"""
|
|
217
|
+
if base_ring == self.base_ring():
|
|
218
|
+
return self
|
|
219
|
+
A = self.ambient_module()
|
|
220
|
+
B = A.change_ring(base_ring)
|
|
221
|
+
return B.eisenstein_submodule()
|
|
222
|
+
|
|
223
|
+
def eisenstein_series(self):
|
|
224
|
+
"""
|
|
225
|
+
Return the Eisenstein series that span this space (over the
|
|
226
|
+
algebraic closure).
|
|
227
|
+
|
|
228
|
+
EXAMPLES::
|
|
229
|
+
|
|
230
|
+
sage: EisensteinForms(11,2).eisenstein_series()
|
|
231
|
+
[5/12 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + O(q^6)]
|
|
232
|
+
sage: EisensteinForms(1,4).eisenstein_series()
|
|
233
|
+
[1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6)]
|
|
234
|
+
sage: EisensteinForms(1,24).eisenstein_series()
|
|
235
|
+
[236364091/131040 + q + 8388609*q^2 + 94143178828*q^3 + 70368752566273*q^4 + 11920928955078126*q^5 + O(q^6)]
|
|
236
|
+
sage: EisensteinForms(5,4).eisenstein_series()
|
|
237
|
+
[1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6), 1/240 + q^5 + O(q^6)]
|
|
238
|
+
sage: EisensteinForms(13,2).eisenstein_series()
|
|
239
|
+
[1/2 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + O(q^6)]
|
|
240
|
+
|
|
241
|
+
sage: E = EisensteinForms(Gamma1(7),2)
|
|
242
|
+
sage: E.set_precision(4)
|
|
243
|
+
sage: E.eisenstein_series()
|
|
244
|
+
[1/4 + q + 3*q^2 + 4*q^3 + O(q^4),
|
|
245
|
+
1/7*zeta6 - 3/7 + q + (-2*zeta6 + 1)*q^2 + (3*zeta6 - 2)*q^3 + O(q^4),
|
|
246
|
+
q + (-zeta6 + 2)*q^2 + (zeta6 + 2)*q^3 + O(q^4),
|
|
247
|
+
-1/7*zeta6 - 2/7 + q + (2*zeta6 - 1)*q^2 + (-3*zeta6 + 1)*q^3 + O(q^4),
|
|
248
|
+
q + (zeta6 + 1)*q^2 + (-zeta6 + 3)*q^3 + O(q^4)]
|
|
249
|
+
|
|
250
|
+
sage: eps = DirichletGroup(13).0^2
|
|
251
|
+
sage: ModularForms(eps,2).eisenstein_series()
|
|
252
|
+
[-7/13*zeta6 - 11/13 + q + (2*zeta6 + 1)*q^2 + (-3*zeta6 + 1)*q^3 + (6*zeta6 - 3)*q^4 - 4*q^5 + O(q^6),
|
|
253
|
+
q + (zeta6 + 2)*q^2 + (-zeta6 + 3)*q^3 + (3*zeta6 + 3)*q^4 + 4*q^5 + O(q^6)]
|
|
254
|
+
|
|
255
|
+
sage: M = ModularForms(19,3).eisenstein_subspace()
|
|
256
|
+
sage: M.eisenstein_series()
|
|
257
|
+
[]
|
|
258
|
+
|
|
259
|
+
sage: M = ModularForms(DirichletGroup(13).0, 1)
|
|
260
|
+
sage: M.eisenstein_series()
|
|
261
|
+
[-1/13*zeta12^3 + 6/13*zeta12^2 + 4/13*zeta12 + 2/13 + q + (zeta12 + 1)*q^2 + zeta12^2*q^3 + (zeta12^2 + zeta12 + 1)*q^4 + (-zeta12^3 + 1)*q^5 + O(q^6)]
|
|
262
|
+
|
|
263
|
+
sage: M = ModularForms(GammaH(15, [4]), 4)
|
|
264
|
+
sage: M.eisenstein_series()
|
|
265
|
+
[1/240 + q + 9*q^2 + 28*q^3 + 73*q^4 + 126*q^5 + O(q^6),
|
|
266
|
+
1/240 + q^3 + O(q^6),
|
|
267
|
+
1/240 + q^5 + O(q^6),
|
|
268
|
+
1/240 + O(q^6),
|
|
269
|
+
1 + q - 7*q^2 - 26*q^3 + 57*q^4 + q^5 + O(q^6),
|
|
270
|
+
1 + q^3 + O(q^6),
|
|
271
|
+
q + 7*q^2 + 26*q^3 + 57*q^4 + 125*q^5 + O(q^6),
|
|
272
|
+
q^3 + O(q^6)]
|
|
273
|
+
"""
|
|
274
|
+
P = self.parameters()
|
|
275
|
+
E = Sequence([element.EisensteinSeries(self.change_ring(chi.base_ring()),
|
|
276
|
+
None, t, chi, psi) for chi, psi, t in P],
|
|
277
|
+
immutable=True, cr=True, universe=Objects())
|
|
278
|
+
assert len(E) == self.dimension(), "bug in enumeration of Eisenstein series."
|
|
279
|
+
return E
|
|
280
|
+
|
|
281
|
+
def new_eisenstein_series(self):
|
|
282
|
+
r"""
|
|
283
|
+
Return a list of the Eisenstein series in this space that are new.
|
|
284
|
+
|
|
285
|
+
EXAMPLES::
|
|
286
|
+
|
|
287
|
+
sage: E = EisensteinForms(25, 4)
|
|
288
|
+
sage: E.new_eisenstein_series()
|
|
289
|
+
[q + 7*zeta4*q^2 - 26*zeta4*q^3 - 57*q^4 + O(q^6),
|
|
290
|
+
q - 9*q^2 - 28*q^3 + 73*q^4 + O(q^6),
|
|
291
|
+
q - 7*zeta4*q^2 + 26*zeta4*q^3 - 57*q^4 + O(q^6)]
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
return [x for x in self.eisenstein_series() if x.new_level() == self.level()]
|
|
295
|
+
|
|
296
|
+
def _compute_q_expansion_basis(self, prec=None, new=False):
|
|
297
|
+
"""
|
|
298
|
+
Compute a `q`-expansion basis for ``self`` to precision ``prec``.
|
|
299
|
+
|
|
300
|
+
EXAMPLES::
|
|
301
|
+
|
|
302
|
+
sage: EisensteinForms(22,4)._compute_q_expansion_basis(6)
|
|
303
|
+
[1 + O(q^6),
|
|
304
|
+
q + 28*q^3 - 8*q^4 + 126*q^5 + O(q^6),
|
|
305
|
+
q^2 + 9*q^4 + O(q^6),
|
|
306
|
+
O(q^6)]
|
|
307
|
+
sage: EisensteinForms(22,4)._compute_q_expansion_basis(15)
|
|
308
|
+
[1 + O(q^15),
|
|
309
|
+
q + 28*q^3 - 8*q^4 + 126*q^5 + 344*q^7 - 72*q^8 + 757*q^9 - 224*q^12 + 2198*q^13 + O(q^15),
|
|
310
|
+
q^2 + 9*q^4 + 28*q^6 + 73*q^8 + 126*q^10 + 252*q^12 + 344*q^14 + O(q^15),
|
|
311
|
+
q^11 + O(q^15)]
|
|
312
|
+
"""
|
|
313
|
+
if prec is None:
|
|
314
|
+
prec = self.prec()
|
|
315
|
+
else:
|
|
316
|
+
prec = Integer(prec)
|
|
317
|
+
|
|
318
|
+
if new:
|
|
319
|
+
E = self.new_eisenstein_series()
|
|
320
|
+
else:
|
|
321
|
+
E = self.eisenstein_series()
|
|
322
|
+
K = self.base_ring()
|
|
323
|
+
V = K**prec
|
|
324
|
+
G = []
|
|
325
|
+
for e in E:
|
|
326
|
+
f = e.q_expansion(prec)
|
|
327
|
+
w = f.padded_list(prec)
|
|
328
|
+
L = f.base_ring()
|
|
329
|
+
if K.has_coerce_map_from(L):
|
|
330
|
+
G.append(V(w))
|
|
331
|
+
else:
|
|
332
|
+
# restrict scalars from L to K
|
|
333
|
+
r,d = cyclotomic_restriction(L,K)
|
|
334
|
+
s = [r(x) for x in w]
|
|
335
|
+
for i in range(d):
|
|
336
|
+
G.append(V([x[i] for x in s]))
|
|
337
|
+
|
|
338
|
+
W = V.submodule(G, check=False)
|
|
339
|
+
R = self._q_expansion_ring()
|
|
340
|
+
X = [R(f.list(), prec) for f in W.basis()]
|
|
341
|
+
if not new:
|
|
342
|
+
return X + [R(0,prec)]*(self.dimension() - len(X))
|
|
343
|
+
else:
|
|
344
|
+
return X
|
|
345
|
+
|
|
346
|
+
def _q_expansion(self, element, prec):
|
|
347
|
+
"""
|
|
348
|
+
Compute a `q`-expansion for a given element of self, expressed
|
|
349
|
+
as a vector of coefficients for the basis vectors of self,
|
|
350
|
+
viewing ``self`` as a subspace of the corresponding space of
|
|
351
|
+
modular forms.
|
|
352
|
+
|
|
353
|
+
EXAMPLES::
|
|
354
|
+
|
|
355
|
+
sage: E = EisensteinForms(17,4)
|
|
356
|
+
sage: (11*E.0 + 3*E.1).q_expansion(20)
|
|
357
|
+
11 + 3*q + 27*q^2 + 84*q^3 + 219*q^4 + 378*q^5 + 756*q^6 + 1032*q^7 + 1755*q^8 + 2271*q^9 + 3402*q^10 + 3996*q^11 + 6132*q^12 + 6594*q^13 + 9288*q^14 + 10584*q^15 + 14043*q^16 + 17379*q^17 + 20439*q^18 + 20580*q^19 + O(q^20)
|
|
358
|
+
sage: E._q_expansion([0,0,0,0,11,3],20)
|
|
359
|
+
11 + 3*q + 27*q^2 + 84*q^3 + 219*q^4 + 378*q^5 + 756*q^6 + 1032*q^7 + 1755*q^8 + 2271*q^9 + 3402*q^10 + 3996*q^11 + 6132*q^12 + 6594*q^13 + 9288*q^14 + 10584*q^15 + 14043*q^16 + 17379*q^17 + 20439*q^18 + 20580*q^19 + O(q^20)
|
|
360
|
+
"""
|
|
361
|
+
B = self.q_expansion_basis(prec)
|
|
362
|
+
f = self._q_expansion_zero()
|
|
363
|
+
for i in range(self._start_position, len(element)):
|
|
364
|
+
if element[i] != 0:
|
|
365
|
+
f += element[i] * B[i - self._start_position]
|
|
366
|
+
return f
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class EisensteinSubmodule_g0_Q(EisensteinSubmodule_params):
|
|
370
|
+
r"""
|
|
371
|
+
Space of Eisenstein forms for `\Gamma_0(N)`.
|
|
372
|
+
"""
|
|
373
|
+
def _pari_init_(self):
|
|
374
|
+
"""
|
|
375
|
+
Conversion to Pari.
|
|
376
|
+
|
|
377
|
+
EXAMPLES::
|
|
378
|
+
|
|
379
|
+
sage: E = EisensteinForms(17,4)
|
|
380
|
+
sage: pari.mfdim(E)
|
|
381
|
+
2
|
|
382
|
+
sage: pari.mfparams(E)
|
|
383
|
+
[17, 4, 1, 3, t - 1]
|
|
384
|
+
"""
|
|
385
|
+
from sage.libs.pari import pari
|
|
386
|
+
return pari.mfinit([self.level(), self.weight()], 3)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
class EisensteinSubmodule_gH_Q(EisensteinSubmodule_params):
|
|
390
|
+
r"""
|
|
391
|
+
Space of Eisenstein forms for `\Gamma_H(N)`.
|
|
392
|
+
"""
|
|
393
|
+
def _parameters_character(self):
|
|
394
|
+
"""
|
|
395
|
+
Return the character defining ``self``. Since ``self`` is
|
|
396
|
+
a space of Eisenstein forms on GammaH(N) rather than a space with fixed
|
|
397
|
+
character, we return the group GammaH(N) itself.
|
|
398
|
+
|
|
399
|
+
EXAMPLES::
|
|
400
|
+
|
|
401
|
+
sage: EisensteinForms(GammaH(9, [4]),4)._parameters_character()
|
|
402
|
+
Congruence Subgroup Gamma_H(9) with H generated by [4]
|
|
403
|
+
"""
|
|
404
|
+
return self.group()
|
|
405
|
+
|
|
406
|
+
def _convert_matrix_from_modsyms_eis(self, A):
|
|
407
|
+
r"""
|
|
408
|
+
Given a matrix acting on the space of modular symbols corresponding to
|
|
409
|
+
this space, calculate the matrix of the operator it induces on this
|
|
410
|
+
space itself. Used for Hecke and diamond operators.
|
|
411
|
+
|
|
412
|
+
This is a minor modification of the code used for cusp forms, which is
|
|
413
|
+
required because modular symbols "don't see the constant term": the
|
|
414
|
+
modular symbol method calculates the matrix of the operator with
|
|
415
|
+
respect to the unique basis of the modular forms space for which the
|
|
416
|
+
*non-constant* coefficients are in echelon form, and we need to modify
|
|
417
|
+
this to get a matrix with respect to the basis we're actually using.
|
|
418
|
+
|
|
419
|
+
EXAMPLES::
|
|
420
|
+
|
|
421
|
+
sage: EisensteinForms(Gamma1(6), 3).hecke_matrix(3) # indirect doctest
|
|
422
|
+
[ 1 0 72 0]
|
|
423
|
+
[ 0 0 36 -9]
|
|
424
|
+
[ 0 0 9 0]
|
|
425
|
+
[ 0 1 -4 10]
|
|
426
|
+
"""
|
|
427
|
+
from .cuspidal_submodule import _convert_matrix_from_modsyms
|
|
428
|
+
symbs = self.modular_symbols(sign=0)
|
|
429
|
+
d = self.rank()
|
|
430
|
+
wrong_mat, pivs = _convert_matrix_from_modsyms(symbs, A)
|
|
431
|
+
c = Matrix(self.base_ring(), d, [self.basis()[i][j+1] for i in range(d) for j in pivs])
|
|
432
|
+
return c * wrong_mat * ~c
|
|
433
|
+
|
|
434
|
+
def _compute_hecke_matrix(self, n, bound=None):
|
|
435
|
+
r"""
|
|
436
|
+
Calculate the matrix of the Hecke operator `T_n` acting on this
|
|
437
|
+
space, via modular symbols.
|
|
438
|
+
|
|
439
|
+
INPUT:
|
|
440
|
+
|
|
441
|
+
- ``n`` -- positive integer
|
|
442
|
+
|
|
443
|
+
- ``bound`` -- integer such that any element of this space with
|
|
444
|
+
coefficients a_1, ..., a_b all zero must be the zero
|
|
445
|
+
element. If this turns out not to be true, the code will
|
|
446
|
+
increase the bound and try again. Setting bound = None is
|
|
447
|
+
equivalent to setting bound = self.dimension().
|
|
448
|
+
|
|
449
|
+
OUTPUT: matrix (over `\QQ`)
|
|
450
|
+
|
|
451
|
+
ALGORITHM:
|
|
452
|
+
|
|
453
|
+
This uses the usual pairing between modular symbols and
|
|
454
|
+
modular forms, but in a slightly non-standard way. As for
|
|
455
|
+
cusp forms, we can find a basis for this space made up of
|
|
456
|
+
forms with `q`-expansions `c_m(f) = a_{i,j}(T_m)`, where
|
|
457
|
+
`T_m` denotes the matrix of the Hecke operator on the
|
|
458
|
+
corresponding modular symbols space. Then `c_m(T_n f) =
|
|
459
|
+
a_{i,j}(T_n* T_m)`. But we can't find the constant terms
|
|
460
|
+
by this method, so an extra step is required.
|
|
461
|
+
|
|
462
|
+
EXAMPLES::
|
|
463
|
+
|
|
464
|
+
sage: EisensteinForms(Gamma1(6), 3).hecke_matrix(3) # indirect doctest
|
|
465
|
+
[ 1 0 72 0]
|
|
466
|
+
[ 0 0 36 -9]
|
|
467
|
+
[ 0 0 9 0]
|
|
468
|
+
[ 0 1 -4 10]
|
|
469
|
+
"""
|
|
470
|
+
symbs = self.modular_symbols(sign=0)
|
|
471
|
+
T = symbs.hecke_matrix(n)
|
|
472
|
+
return self._convert_matrix_from_modsyms_eis(T)
|
|
473
|
+
|
|
474
|
+
def _compute_diamond_matrix(self, d):
|
|
475
|
+
r"""
|
|
476
|
+
Calculate the matrix of the diamond bracket operator <d> on this space,
|
|
477
|
+
using modular symbols.
|
|
478
|
+
|
|
479
|
+
EXAMPLES::
|
|
480
|
+
|
|
481
|
+
sage: E = EisensteinForms(Gamma1(7), 3)
|
|
482
|
+
sage: E._compute_diamond_matrix(3)
|
|
483
|
+
[ 27 126 294 770 2142 3528]
|
|
484
|
+
[56/3 85 200 530 1445 2408]
|
|
485
|
+
[11/3 14 22 66 233 392]
|
|
486
|
+
[ -1 -3 -3 -11 -51 -87]
|
|
487
|
+
[ -1 -4 -7 -20 -67 -112]
|
|
488
|
+
[-1/3 -2 -6 -15 -34 -56]
|
|
489
|
+
"""
|
|
490
|
+
symbs = self.modular_symbols(sign=0)
|
|
491
|
+
T = symbs.diamond_bracket_matrix(d)
|
|
492
|
+
return self._convert_matrix_from_modsyms_eis(T)
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
class EisensteinSubmodule_g1_Q(EisensteinSubmodule_gH_Q):
|
|
496
|
+
r"""
|
|
497
|
+
Space of Eisenstein forms for `\Gamma_1(N)`.
|
|
498
|
+
"""
|
|
499
|
+
def _parameters_character(self):
|
|
500
|
+
r"""
|
|
501
|
+
Return the character defining ``self``.
|
|
502
|
+
|
|
503
|
+
Since ``self`` is a space of Eisenstein
|
|
504
|
+
forms on `\Gamma_1(N)`, all characters modulo the level are possible,
|
|
505
|
+
so we return the level.
|
|
506
|
+
|
|
507
|
+
EXAMPLES::
|
|
508
|
+
|
|
509
|
+
sage: EisensteinForms(Gamma1(7),4)._parameters_character()
|
|
510
|
+
7
|
|
511
|
+
"""
|
|
512
|
+
return self.level()
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
class EisensteinSubmodule_eps(EisensteinSubmodule_params):
|
|
516
|
+
"""
|
|
517
|
+
Space of Eisenstein forms with given Dirichlet character.
|
|
518
|
+
|
|
519
|
+
EXAMPLES::
|
|
520
|
+
|
|
521
|
+
sage: e = DirichletGroup(27,CyclotomicField(3)).0**2
|
|
522
|
+
sage: M = ModularForms(e,2,prec=10).eisenstein_subspace()
|
|
523
|
+
sage: M.dimension()
|
|
524
|
+
6
|
|
525
|
+
|
|
526
|
+
sage: M.eisenstein_series()
|
|
527
|
+
[-1/3*zeta6 - 1/3 + q + (2*zeta6 - 1)*q^2 + q^3 + (-2*zeta6 - 1)*q^4 + (-5*zeta6 + 1)*q^5 + O(q^6),
|
|
528
|
+
-1/3*zeta6 - 1/3 + q^3 + O(q^6),
|
|
529
|
+
q + (-2*zeta6 + 1)*q^2 + (-2*zeta6 - 1)*q^4 + (5*zeta6 - 1)*q^5 + O(q^6),
|
|
530
|
+
q + (zeta6 + 1)*q^2 + 3*q^3 + (zeta6 + 2)*q^4 + (-zeta6 + 5)*q^5 + O(q^6),
|
|
531
|
+
q^3 + O(q^6),
|
|
532
|
+
q + (-zeta6 - 1)*q^2 + (zeta6 + 2)*q^4 + (zeta6 - 5)*q^5 + O(q^6)]
|
|
533
|
+
sage: M.eisenstein_subspace().T(2).matrix().fcp()
|
|
534
|
+
(x + 2*zeta3 + 1) * (x + zeta3 + 2) * (x - zeta3 - 2)^2 * (x - 2*zeta3 - 1)^2
|
|
535
|
+
sage: ModularSymbols(e,2).eisenstein_subspace().T(2).matrix().fcp()
|
|
536
|
+
(x + 2*zeta3 + 1) * (x + zeta3 + 2) * (x - zeta3 - 2)^2 * (x - 2*zeta3 - 1)^2
|
|
537
|
+
|
|
538
|
+
sage: M.basis()
|
|
539
|
+
[1 - 3*zeta3*q^6 + (-2*zeta3 + 2)*q^9 + O(q^10),
|
|
540
|
+
q + (5*zeta3 + 5)*q^7 + O(q^10),
|
|
541
|
+
q^2 - 2*zeta3*q^8 + O(q^10),
|
|
542
|
+
q^3 + (zeta3 + 2)*q^6 + 3*q^9 + O(q^10),
|
|
543
|
+
q^4 - 2*zeta3*q^7 + O(q^10),
|
|
544
|
+
q^5 + (zeta3 + 1)*q^8 + O(q^10)]
|
|
545
|
+
"""
|
|
546
|
+
def _pari_init_(self):
|
|
547
|
+
"""
|
|
548
|
+
Conversion to Pari.
|
|
549
|
+
|
|
550
|
+
EXAMPLES::
|
|
551
|
+
|
|
552
|
+
sage: e = DirichletGroup(27,CyclotomicField(3)).0**2
|
|
553
|
+
sage: M = ModularForms(e,2,prec=10).eisenstein_subspace()
|
|
554
|
+
sage: pari.mfdim(M)
|
|
555
|
+
6
|
|
556
|
+
sage: pari.mfparams(M)
|
|
557
|
+
[27, 2, Mod(10, 27), 3, t^2 + t + 1]
|
|
558
|
+
"""
|
|
559
|
+
from sage.libs.pari import pari
|
|
560
|
+
return pari.mfinit([self.level(), self.weight(), self.character()], 3)
|
|
561
|
+
|
|
562
|
+
# TODO
|
|
563
|
+
# def _compute_q_expansion_basis(self, prec):
|
|
564
|
+
# B = EisensteinSubmodule_params._compute_q_expansion_basis(self, prec)
|
|
565
|
+
# raise NotImplementedError("must restrict scalars down correctly.")
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
def cyclotomic_restriction(L, K):
|
|
569
|
+
r"""
|
|
570
|
+
Given two cyclotomic fields `L` and `K`, compute the compositum
|
|
571
|
+
`M` of `K` and `L`, and return a function `f` and the index `[M:K]`.
|
|
572
|
+
|
|
573
|
+
The function `f` is a map that acts as follows (here `M =\QQ(\zeta_m)`):
|
|
574
|
+
|
|
575
|
+
INPUT: element alpha in `L`
|
|
576
|
+
OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = \alpha`,
|
|
577
|
+
where we view alpha as living in `M`. (Note that `\zeta_m` generates
|
|
578
|
+
`M`, not `L`.)
|
|
579
|
+
|
|
580
|
+
EXAMPLES::
|
|
581
|
+
|
|
582
|
+
sage: L = CyclotomicField(12); N = CyclotomicField(33); M = CyclotomicField(132)
|
|
583
|
+
sage: z, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L, N)
|
|
584
|
+
sage: n
|
|
585
|
+
2
|
|
586
|
+
|
|
587
|
+
sage: z(L.0)
|
|
588
|
+
-zeta33^19*x
|
|
589
|
+
sage: z(L.0)(M.0)
|
|
590
|
+
zeta132^11
|
|
591
|
+
|
|
592
|
+
sage: z(L.0^3 - L.0 + 1)
|
|
593
|
+
(zeta33^19 + zeta33^8)*x + 1
|
|
594
|
+
sage: z(L.0^3 - L.0 + 1)(M.0)
|
|
595
|
+
zeta132^33 - zeta132^11 + 1
|
|
596
|
+
sage: z(L.0^3 - L.0 + 1)(M.0) - M(L.0^3 - L.0 + 1)
|
|
597
|
+
0
|
|
598
|
+
"""
|
|
599
|
+
if not L.has_coerce_map_from(K):
|
|
600
|
+
M = CyclotomicField(lcm(L.zeta_order(), K.zeta_order()))
|
|
601
|
+
f = cyclotomic_restriction_tower(M,K)
|
|
602
|
+
|
|
603
|
+
def g(x):
|
|
604
|
+
r"""
|
|
605
|
+
Function returned by cyclotomic restriction.
|
|
606
|
+
|
|
607
|
+
EXAMPLES::
|
|
608
|
+
|
|
609
|
+
sage: L = CyclotomicField(12)
|
|
610
|
+
sage: N = CyclotomicField(33)
|
|
611
|
+
sage: g, n = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction(L,N)
|
|
612
|
+
sage: g(L.0)
|
|
613
|
+
-zeta33^19*x
|
|
614
|
+
"""
|
|
615
|
+
return f(M(x))
|
|
616
|
+
return g, euler_phi(M.zeta_order())//euler_phi(K.zeta_order())
|
|
617
|
+
else:
|
|
618
|
+
return cyclotomic_restriction_tower(L,K), \
|
|
619
|
+
euler_phi(L.zeta_order())//euler_phi(K.zeta_order())
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def cyclotomic_restriction_tower(L, K):
|
|
623
|
+
r"""
|
|
624
|
+
Suppose `L/K` is an extension of cyclotomic fields and `L=Q(\zeta_m)`.
|
|
625
|
+
This function computes a map with the following property:
|
|
626
|
+
|
|
627
|
+
INPUT: element alpha in `L`
|
|
628
|
+
OUTPUT: a polynomial `f(x)` in `K[x]` such that `f(\zeta_m) = alpha`
|
|
629
|
+
|
|
630
|
+
EXAMPLES::
|
|
631
|
+
|
|
632
|
+
sage: L = CyclotomicField(12) ; K = CyclotomicField(6)
|
|
633
|
+
sage: z = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction_tower(L,K)
|
|
634
|
+
sage: z(L.0)
|
|
635
|
+
x
|
|
636
|
+
sage: z(L.0^2+L.0)
|
|
637
|
+
x + zeta6
|
|
638
|
+
"""
|
|
639
|
+
if not L.has_coerce_map_from(K):
|
|
640
|
+
raise ValueError("K must be contained in L")
|
|
641
|
+
f = L.defining_polynomial()
|
|
642
|
+
R = K['x']
|
|
643
|
+
g = R(f)
|
|
644
|
+
h_ls = [t[0] for t in g.factor() if t[0](L.gen(0)) == 0]
|
|
645
|
+
if not h_ls:
|
|
646
|
+
raise ValueError(r"K (= Q(\zeta_%s)) is not contained in L (= Q(\zeta_%s))" % (K._n(), L._n()))
|
|
647
|
+
h = h_ls[0]
|
|
648
|
+
|
|
649
|
+
def z(a):
|
|
650
|
+
"""
|
|
651
|
+
Function returned by cyclotomic_restriction_tower.
|
|
652
|
+
|
|
653
|
+
EXAMPLES::
|
|
654
|
+
|
|
655
|
+
sage: L = CyclotomicField(121); K = CyclotomicField(11)
|
|
656
|
+
sage: z = sage.modular.modform.eisenstein_submodule.cyclotomic_restriction_tower(L,K)
|
|
657
|
+
sage: z(L.0)
|
|
658
|
+
x
|
|
659
|
+
sage: z(L.0^11)
|
|
660
|
+
zeta11
|
|
661
|
+
"""
|
|
662
|
+
return R(a.polynomial()) % h
|
|
663
|
+
return z
|