passagemath-schemes 10.6.47__cp312-cp312-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.6.47.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
- passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.47.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-312-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-312-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-312-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-312-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-312-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-312-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-312-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-312-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_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-312-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-312-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-312-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,118 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Submodules of spaces of modular forms
|
|
5
|
+
|
|
6
|
+
EXAMPLES::
|
|
7
|
+
|
|
8
|
+
sage: M = ModularForms(Gamma1(13),2); M
|
|
9
|
+
Modular Forms space of dimension 13 for
|
|
10
|
+
Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
11
|
+
sage: M.eisenstein_subspace()
|
|
12
|
+
Eisenstein subspace of dimension 11 of Modular Forms space of dimension 13 for
|
|
13
|
+
Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
14
|
+
sage: M == loads(dumps(M))
|
|
15
|
+
True
|
|
16
|
+
sage: M.cuspidal_subspace()
|
|
17
|
+
Cuspidal subspace of dimension 2 of Modular Forms space of dimension 13 for
|
|
18
|
+
Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
#########################################################################
|
|
22
|
+
# Copyright (C) 2004--2006 William Stein <wstein@gmail.com>
|
|
23
|
+
#
|
|
24
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
25
|
+
#
|
|
26
|
+
# http://www.gnu.org/licenses/
|
|
27
|
+
#########################################################################
|
|
28
|
+
|
|
29
|
+
from .space import ModularFormsSpace
|
|
30
|
+
|
|
31
|
+
import sage.modular.hecke.submodule
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class ModularFormsSubmodule(ModularFormsSpace,
|
|
35
|
+
sage.modular.hecke.submodule.HeckeSubmodule):
|
|
36
|
+
"""
|
|
37
|
+
A submodule of an ambient space of modular forms.
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self, ambient_module, submodule, dual=None, check=False):
|
|
40
|
+
"""
|
|
41
|
+
INPUT:
|
|
42
|
+
|
|
43
|
+
- ``ambient_module`` -- ModularFormsSpace
|
|
44
|
+
- ``submodule`` -- a submodule of the ambient space
|
|
45
|
+
- ``dual_module`` -- (default: ``None``) ignored
|
|
46
|
+
- ``check`` -- boolean (default: ``False``); whether to check that the
|
|
47
|
+
submodule is Hecke equivariant
|
|
48
|
+
|
|
49
|
+
EXAMPLES::
|
|
50
|
+
|
|
51
|
+
sage: M = ModularForms(Gamma1(13),2); M
|
|
52
|
+
Modular Forms space of dimension 13 for Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
53
|
+
sage: M.eisenstein_subspace()
|
|
54
|
+
Eisenstein subspace of dimension 11 of Modular Forms space of dimension 13 for Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
55
|
+
"""
|
|
56
|
+
A = ambient_module
|
|
57
|
+
sage.modular.hecke.submodule.HeckeSubmodule.__init__(self, A, submodule, check=check)
|
|
58
|
+
ModularFormsSpace.__init__(self, A.group(), A.weight(),
|
|
59
|
+
A.character(), A.base_ring())
|
|
60
|
+
|
|
61
|
+
def _repr_(self):
|
|
62
|
+
"""
|
|
63
|
+
EXAMPLES::
|
|
64
|
+
|
|
65
|
+
sage: ModularForms(Gamma1(13),2).eisenstein_subspace()._repr_()
|
|
66
|
+
'Eisenstein subspace of dimension 11 of Modular Forms space of dimension 13 for Congruence Subgroup Gamma1(13) of weight 2 over Rational Field'
|
|
67
|
+
"""
|
|
68
|
+
return "Modular Forms subspace of dimension %s of %s" % (self.dimension(), self.ambient_module())
|
|
69
|
+
|
|
70
|
+
def _compute_coefficients(self, element, X):
|
|
71
|
+
"""
|
|
72
|
+
Compute all coefficients of the modular form element in ``self`` for
|
|
73
|
+
indices in X.
|
|
74
|
+
|
|
75
|
+
TODO: Implement this function.
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: M = ModularForms(6,4).cuspidal_subspace()
|
|
80
|
+
sage: M._compute_coefficients( M.basis()[0], range(1,100) )
|
|
81
|
+
Traceback (most recent call last):
|
|
82
|
+
...
|
|
83
|
+
NotImplementedError
|
|
84
|
+
"""
|
|
85
|
+
raise NotImplementedError
|
|
86
|
+
|
|
87
|
+
def _compute_q_expansion_basis(self, prec):
|
|
88
|
+
"""
|
|
89
|
+
Compute ``q_expansions`` to precision ``prec`` for each element in
|
|
90
|
+
``self.basis()``.
|
|
91
|
+
|
|
92
|
+
EXAMPLES::
|
|
93
|
+
|
|
94
|
+
sage: M = ModularForms(Gamma1(13),2); M
|
|
95
|
+
Modular Forms space of dimension 13 for Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
96
|
+
sage: S = M.eisenstein_subspace(); S
|
|
97
|
+
Eisenstein subspace of dimension 11 of Modular Forms space of dimension 13 for Congruence Subgroup Gamma1(13) of weight 2 over Rational Field
|
|
98
|
+
sage: S._compute_q_expansion_basis(5)
|
|
99
|
+
[1 + O(q^5),
|
|
100
|
+
q + O(q^5),
|
|
101
|
+
q^2 + O(q^5),
|
|
102
|
+
q^3 + O(q^5),
|
|
103
|
+
q^4 + O(q^5),
|
|
104
|
+
O(q^5),
|
|
105
|
+
O(q^5),
|
|
106
|
+
O(q^5),
|
|
107
|
+
O(q^5),
|
|
108
|
+
O(q^5),
|
|
109
|
+
O(q^5)]
|
|
110
|
+
"""
|
|
111
|
+
A = self.ambient_module()
|
|
112
|
+
return [A._q_expansion(element=f.element(), prec=prec)
|
|
113
|
+
for f in self.basis()]
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# TODO
|
|
117
|
+
class ModularFormsSubmoduleWithBasis(ModularFormsSubmodule):
|
|
118
|
+
pass
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
TESTS:
|
|
5
|
+
|
|
6
|
+
Test consistency between modular forms and modular symbols Eisenstein
|
|
7
|
+
series charpolys, which are computed in completely separate ways. ::
|
|
8
|
+
|
|
9
|
+
sage: for N in range(25,33):
|
|
10
|
+
....: m = ModularForms(N)
|
|
11
|
+
....: e = m.eisenstein_subspace()
|
|
12
|
+
....: f = e.hecke_polynomial(2)
|
|
13
|
+
....: g = ModularSymbols(N).eisenstein_submodule().hecke_polynomial(2)
|
|
14
|
+
....: print("{} {}".format(N, f == g))
|
|
15
|
+
25 True
|
|
16
|
+
26 True
|
|
17
|
+
27 True
|
|
18
|
+
28 True
|
|
19
|
+
29 True
|
|
20
|
+
30 True
|
|
21
|
+
31 True
|
|
22
|
+
32 True
|
|
23
|
+
|
|
24
|
+
Another similar consistency check::
|
|
25
|
+
|
|
26
|
+
sage: for N in range(1,26):
|
|
27
|
+
....: eps = (N > 2 and DirichletGroup(N,QQ).0) or N
|
|
28
|
+
....: m = ModularForms(eps)
|
|
29
|
+
....: e = m.eisenstein_subspace()
|
|
30
|
+
....: f = e.hecke_polynomial(2)
|
|
31
|
+
....: g = ModularSymbols(eps).eisenstein_submodule().hecke_polynomial(2)
|
|
32
|
+
....: print("{} {}".format(N, f == g))
|
|
33
|
+
1 True
|
|
34
|
+
2 True
|
|
35
|
+
3 True
|
|
36
|
+
4 True
|
|
37
|
+
5 True
|
|
38
|
+
6 True
|
|
39
|
+
7 True
|
|
40
|
+
8 True
|
|
41
|
+
9 True
|
|
42
|
+
10 True
|
|
43
|
+
11 True
|
|
44
|
+
12 True
|
|
45
|
+
13 True
|
|
46
|
+
14 True
|
|
47
|
+
15 True
|
|
48
|
+
16 True
|
|
49
|
+
17 True
|
|
50
|
+
18 True
|
|
51
|
+
19 True
|
|
52
|
+
20 True
|
|
53
|
+
21 True
|
|
54
|
+
22 True
|
|
55
|
+
23 True
|
|
56
|
+
24 True
|
|
57
|
+
25 True
|
|
58
|
+
|
|
59
|
+
We check that bug :issue:`8541` (traced to a linear algebra problem) is fixed::
|
|
60
|
+
|
|
61
|
+
sage: f = CuspForms(DirichletGroup(5).0,5).0
|
|
62
|
+
sage: f[15]
|
|
63
|
+
30*zeta4 - 210
|
|
64
|
+
"""
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
`q`-expansions of theta series
|
|
4
|
+
|
|
5
|
+
AUTHOR:
|
|
6
|
+
|
|
7
|
+
- William Stein
|
|
8
|
+
"""
|
|
9
|
+
from sage.rings.integer import Integer
|
|
10
|
+
from sage.rings.integer_ring import ZZ
|
|
11
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
12
|
+
|
|
13
|
+
from math import sqrt
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def theta2_qexp(prec=10, var='q', K=ZZ, sparse=False):
|
|
17
|
+
r"""
|
|
18
|
+
Return the `q`-expansion of the series `\theta_2 = \sum_{n \text{ odd}} q^{n^2}`.
|
|
19
|
+
|
|
20
|
+
INPUT:
|
|
21
|
+
|
|
22
|
+
- ``prec`` -- integer; the absolute precision of the output
|
|
23
|
+
- ``var`` -- (default: ``'q'``) variable name
|
|
24
|
+
- ``K`` -- (default: ZZ) base ring of answer
|
|
25
|
+
|
|
26
|
+
OUTPUT: a power series over K
|
|
27
|
+
|
|
28
|
+
EXAMPLES::
|
|
29
|
+
|
|
30
|
+
sage: theta2_qexp(18)
|
|
31
|
+
q + q^9 + O(q^18)
|
|
32
|
+
sage: theta2_qexp(49)
|
|
33
|
+
q + q^9 + q^25 + O(q^49)
|
|
34
|
+
sage: theta2_qexp(100, 'q', QQ)
|
|
35
|
+
q + q^9 + q^25 + q^49 + q^81 + O(q^100)
|
|
36
|
+
sage: f = theta2_qexp(100, 't', GF(3)); f
|
|
37
|
+
t + t^9 + t^25 + t^49 + t^81 + O(t^100)
|
|
38
|
+
sage: parent(f)
|
|
39
|
+
Power Series Ring in t over Finite Field of size 3
|
|
40
|
+
sage: theta2_qexp(200)
|
|
41
|
+
q + q^9 + q^25 + q^49 + q^81 + q^121 + q^169 + O(q^200)
|
|
42
|
+
sage: f = theta2_qexp(20,sparse=True); f
|
|
43
|
+
q + q^9 + O(q^20)
|
|
44
|
+
sage: parent(f)
|
|
45
|
+
Sparse Power Series Ring in q over Integer Ring
|
|
46
|
+
"""
|
|
47
|
+
prec = Integer(prec)
|
|
48
|
+
if prec <= 0:
|
|
49
|
+
raise ValueError("prec must be positive")
|
|
50
|
+
if sparse:
|
|
51
|
+
v = {}
|
|
52
|
+
else:
|
|
53
|
+
v = [Integer(0)] * prec
|
|
54
|
+
one = Integer(1)
|
|
55
|
+
n = int(sqrt(prec))
|
|
56
|
+
if n*n < prec:
|
|
57
|
+
n += 1
|
|
58
|
+
for m in range(1, n, 2):
|
|
59
|
+
v[m*m] = one
|
|
60
|
+
R = PowerSeriesRing(K, sparse=sparse, names=var)
|
|
61
|
+
return R(v, prec=prec)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def theta_qexp(prec=10, var='q', K=ZZ, sparse=False):
|
|
65
|
+
r"""
|
|
66
|
+
Return the `q`-expansion of the standard `\theta` series
|
|
67
|
+
`\theta = 1 + 2\sum_{n=1}^{\infty} q^{n^2}`.
|
|
68
|
+
|
|
69
|
+
INPUT:
|
|
70
|
+
|
|
71
|
+
- ``prec`` -- integer; the absolute precision of the output
|
|
72
|
+
- ``var`` -- (default: ``'q'``) variable name
|
|
73
|
+
- ``K`` -- (default: ZZ) base ring of answer
|
|
74
|
+
|
|
75
|
+
OUTPUT: a power series over K
|
|
76
|
+
|
|
77
|
+
EXAMPLES::
|
|
78
|
+
|
|
79
|
+
sage: theta_qexp(25)
|
|
80
|
+
1 + 2*q + 2*q^4 + 2*q^9 + 2*q^16 + O(q^25)
|
|
81
|
+
sage: theta_qexp(10)
|
|
82
|
+
1 + 2*q + 2*q^4 + 2*q^9 + O(q^10)
|
|
83
|
+
sage: theta_qexp(100)
|
|
84
|
+
1 + 2*q + 2*q^4 + 2*q^9 + 2*q^16 + 2*q^25 + 2*q^36 + 2*q^49 + 2*q^64 + 2*q^81 + O(q^100)
|
|
85
|
+
sage: theta_qexp(100, 't')
|
|
86
|
+
1 + 2*t + 2*t^4 + 2*t^9 + 2*t^16 + 2*t^25 + 2*t^36 + 2*t^49 + 2*t^64 + 2*t^81 + O(t^100)
|
|
87
|
+
sage: theta_qexp(100, 't', GF(2))
|
|
88
|
+
1 + O(t^100)
|
|
89
|
+
sage: f = theta_qexp(20,sparse=True); f
|
|
90
|
+
1 + 2*q + 2*q^4 + 2*q^9 + 2*q^16 + O(q^20)
|
|
91
|
+
sage: parent(f)
|
|
92
|
+
Sparse Power Series Ring in q over Integer Ring
|
|
93
|
+
"""
|
|
94
|
+
prec = Integer(prec)
|
|
95
|
+
if prec <= 0:
|
|
96
|
+
raise ValueError("prec must be positive")
|
|
97
|
+
if sparse:
|
|
98
|
+
v = {}
|
|
99
|
+
else:
|
|
100
|
+
v = [Integer(0)] * prec
|
|
101
|
+
v[0] = Integer(1)
|
|
102
|
+
two = Integer(2)
|
|
103
|
+
n = int(sqrt(prec))
|
|
104
|
+
if n*n != prec:
|
|
105
|
+
n += 1
|
|
106
|
+
for m in range(1, n):
|
|
107
|
+
v[m*m] = two
|
|
108
|
+
|
|
109
|
+
R = PowerSeriesRing(K, sparse=sparse, names=var)
|
|
110
|
+
return R(v, prec=prec)
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint
|
|
3
|
+
r"""
|
|
4
|
+
The Victor Miller basis
|
|
5
|
+
|
|
6
|
+
This module contains functions for quick calculation of a basis of
|
|
7
|
+
`q`-expansions for the space of modular forms of level 1 and any weight. The
|
|
8
|
+
basis returned is the Victor Miller basis, which is the unique basis of
|
|
9
|
+
elliptic modular forms `f_1, \dots, f_d` for which `a_i(f_j) = \delta_{ij}`
|
|
10
|
+
for `1 \le i, j \le d` (where `d` is the dimension of the space).
|
|
11
|
+
|
|
12
|
+
This basis is calculated using a standard set of generators for the ring of
|
|
13
|
+
modular forms, using the fast multiplication algorithms for polynomials and
|
|
14
|
+
power series provided by the FLINT library. (This is far quicker than using
|
|
15
|
+
modular symbols).
|
|
16
|
+
|
|
17
|
+
TESTS::
|
|
18
|
+
|
|
19
|
+
sage: ModularSymbols(1, 36, 1).cuspidal_submodule().q_expansion_basis(30) == victor_miller_basis(36, 30, cusp_only=True)
|
|
20
|
+
True
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
# ****************************************************************************
|
|
24
|
+
# Copyright (C) 2006 William Stein <wstein@gmail.com>
|
|
25
|
+
#
|
|
26
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
27
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
28
|
+
# the License, or (at your option) any later version.
|
|
29
|
+
# https://www.gnu.org/licenses/
|
|
30
|
+
# ****************************************************************************
|
|
31
|
+
|
|
32
|
+
import math
|
|
33
|
+
|
|
34
|
+
from sage.libs.flint.fmpz_poly_sage import Fmpz_poly
|
|
35
|
+
from sage.misc.verbose import verbose
|
|
36
|
+
from sage.rings.big_oh import O as bigO
|
|
37
|
+
from sage.rings.finite_rings.integer_mod_ring import Integers
|
|
38
|
+
from sage.rings.integer import Integer
|
|
39
|
+
from sage.rings.integer_ring import ZZ
|
|
40
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
41
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
42
|
+
from sage.rings.rational_field import QQ
|
|
43
|
+
from sage.structure.all import Sequence
|
|
44
|
+
|
|
45
|
+
from .eis_series_cython import eisenstein_series_poly
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def victor_miller_basis(k, prec=10, cusp_only=False, var='q'):
|
|
49
|
+
r"""
|
|
50
|
+
Compute and return the Victor Miller basis for modular forms of
|
|
51
|
+
weight `k` and level 1 to precision `O(q^{prec})`. If
|
|
52
|
+
``cusp_only`` is True, return only a basis for the cuspidal
|
|
53
|
+
subspace.
|
|
54
|
+
|
|
55
|
+
INPUT:
|
|
56
|
+
|
|
57
|
+
- ``k`` -- integer
|
|
58
|
+
|
|
59
|
+
- ``prec`` -- (default: 10) a positive integer
|
|
60
|
+
|
|
61
|
+
- ``cusp_only`` -- boolean (default: ``False``)
|
|
62
|
+
|
|
63
|
+
- ``var`` -- string (default: ``'q'``)
|
|
64
|
+
|
|
65
|
+
OUTPUT: a sequence whose entries are power series in ``ZZ[[var]]``
|
|
66
|
+
|
|
67
|
+
EXAMPLES::
|
|
68
|
+
|
|
69
|
+
sage: victor_miller_basis(1, 6)
|
|
70
|
+
[]
|
|
71
|
+
sage: victor_miller_basis(0, 6)
|
|
72
|
+
[1 + O(q^6)]
|
|
73
|
+
sage: victor_miller_basis(2, 6)
|
|
74
|
+
[]
|
|
75
|
+
sage: victor_miller_basis(4, 6)
|
|
76
|
+
[1 + 240*q + 2160*q^2 + 6720*q^3 + 17520*q^4 + 30240*q^5 + O(q^6)]
|
|
77
|
+
|
|
78
|
+
sage: victor_miller_basis(6, 6, var='w')
|
|
79
|
+
[1 - 504*w - 16632*w^2 - 122976*w^3 - 532728*w^4 - 1575504*w^5 + O(w^6)]
|
|
80
|
+
|
|
81
|
+
sage: victor_miller_basis(6, 6)
|
|
82
|
+
[1 - 504*q - 16632*q^2 - 122976*q^3 - 532728*q^4 - 1575504*q^5 + O(q^6)]
|
|
83
|
+
sage: victor_miller_basis(12, 6)
|
|
84
|
+
[1 + 196560*q^2 + 16773120*q^3 + 398034000*q^4 + 4629381120*q^5 + O(q^6),
|
|
85
|
+
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6)]
|
|
86
|
+
|
|
87
|
+
sage: victor_miller_basis(12, 6, cusp_only=True)
|
|
88
|
+
[q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 + O(q^6)]
|
|
89
|
+
sage: victor_miller_basis(24, 6, cusp_only=True)
|
|
90
|
+
[q + 195660*q^3 + 12080128*q^4 + 44656110*q^5 + O(q^6),
|
|
91
|
+
q^2 - 48*q^3 + 1080*q^4 - 15040*q^5 + O(q^6)]
|
|
92
|
+
sage: victor_miller_basis(24, 6)
|
|
93
|
+
[1 + 52416000*q^3 + 39007332000*q^4 + 6609020221440*q^5 + O(q^6),
|
|
94
|
+
q + 195660*q^3 + 12080128*q^4 + 44656110*q^5 + O(q^6),
|
|
95
|
+
q^2 - 48*q^3 + 1080*q^4 - 15040*q^5 + O(q^6)]
|
|
96
|
+
sage: victor_miller_basis(32, 6)
|
|
97
|
+
[1 + 2611200*q^3 + 19524758400*q^4 + 19715347537920*q^5 + O(q^6),
|
|
98
|
+
q + 50220*q^3 + 87866368*q^4 + 18647219790*q^5 + O(q^6),
|
|
99
|
+
q^2 + 432*q^3 + 39960*q^4 - 1418560*q^5 + O(q^6)]
|
|
100
|
+
|
|
101
|
+
sage: victor_miller_basis(40,200)[1:] == victor_miller_basis(40,200,cusp_only=True)
|
|
102
|
+
True
|
|
103
|
+
sage: victor_miller_basis(200,40)[1:] == victor_miller_basis(200,40,cusp_only=True)
|
|
104
|
+
True
|
|
105
|
+
|
|
106
|
+
AUTHORS:
|
|
107
|
+
|
|
108
|
+
- William Stein, Craig Citro: original code
|
|
109
|
+
|
|
110
|
+
- Martin Raum (2009-08-02): use FLINT for polynomial arithmetic (instead of NTL)
|
|
111
|
+
"""
|
|
112
|
+
k = Integer(k)
|
|
113
|
+
if k % 2 == 1 or k == 2:
|
|
114
|
+
return Sequence([])
|
|
115
|
+
elif k < 0:
|
|
116
|
+
raise ValueError("k must be nonnegative")
|
|
117
|
+
elif k == 0:
|
|
118
|
+
return Sequence([PowerSeriesRing(ZZ,var)(1).add_bigoh(prec)], cr=True)
|
|
119
|
+
e = k.mod(12)
|
|
120
|
+
if e == 2:
|
|
121
|
+
e += 12
|
|
122
|
+
n = (k-e) // 12
|
|
123
|
+
|
|
124
|
+
if n == 0 and cusp_only:
|
|
125
|
+
return Sequence([])
|
|
126
|
+
|
|
127
|
+
# If prec is less than or equal to the dimension of the space of
|
|
128
|
+
# cusp forms, which is just n, then we know the answer, and we
|
|
129
|
+
# simply return it.
|
|
130
|
+
if prec <= n:
|
|
131
|
+
q = PowerSeriesRing(ZZ,var).gen(0)
|
|
132
|
+
err = bigO(q**prec)
|
|
133
|
+
ls = [0] * (n+1)
|
|
134
|
+
if not cusp_only:
|
|
135
|
+
ls[0] = 1 + err
|
|
136
|
+
for i in range(1,prec):
|
|
137
|
+
ls[i] = q**i + err
|
|
138
|
+
for i in range(prec,n+1):
|
|
139
|
+
ls[i] = err
|
|
140
|
+
return Sequence(ls, cr=True)
|
|
141
|
+
|
|
142
|
+
F6 = eisenstein_series_poly(6, prec)
|
|
143
|
+
|
|
144
|
+
if e == 0:
|
|
145
|
+
A = Fmpz_poly(1)
|
|
146
|
+
elif e == 4:
|
|
147
|
+
A = eisenstein_series_poly(4, prec)
|
|
148
|
+
elif e == 6:
|
|
149
|
+
A = F6
|
|
150
|
+
elif e == 8:
|
|
151
|
+
A = eisenstein_series_poly(8, prec)
|
|
152
|
+
elif e == 10:
|
|
153
|
+
A = eisenstein_series_poly(10, prec)
|
|
154
|
+
else: # e == 14
|
|
155
|
+
A = eisenstein_series_poly(14, prec)
|
|
156
|
+
|
|
157
|
+
if A[0] == -1:
|
|
158
|
+
A = -A
|
|
159
|
+
|
|
160
|
+
if n == 0:
|
|
161
|
+
return Sequence([PowerSeriesRing(ZZ,var)(A.list()).add_bigoh(prec)],cr=True)
|
|
162
|
+
|
|
163
|
+
F6_squared = F6**2
|
|
164
|
+
F6_squared._unsafe_mutate_truncate(prec)
|
|
165
|
+
D = _delta_poly(prec)
|
|
166
|
+
Fprod = F6_squared
|
|
167
|
+
Dprod = D
|
|
168
|
+
|
|
169
|
+
if cusp_only:
|
|
170
|
+
ls = [Fmpz_poly(0)] + [A] * n
|
|
171
|
+
else:
|
|
172
|
+
ls = [A] * (n + 1)
|
|
173
|
+
|
|
174
|
+
for i in range(1, n + 1):
|
|
175
|
+
ls[n-i] *= Fprod
|
|
176
|
+
ls[i] *= Dprod
|
|
177
|
+
ls[n-i]._unsafe_mutate_truncate(prec)
|
|
178
|
+
ls[i]._unsafe_mutate_truncate(prec)
|
|
179
|
+
|
|
180
|
+
Fprod *= F6_squared
|
|
181
|
+
Dprod *= D
|
|
182
|
+
Fprod._unsafe_mutate_truncate(prec)
|
|
183
|
+
Dprod._unsafe_mutate_truncate(prec)
|
|
184
|
+
|
|
185
|
+
P = PowerSeriesRing(ZZ, var)
|
|
186
|
+
if cusp_only:
|
|
187
|
+
for i in range(1, n + 1):
|
|
188
|
+
for j in range(1, i):
|
|
189
|
+
ls[j] = ls[j] - ls[j][i]*ls[i]
|
|
190
|
+
|
|
191
|
+
return Sequence([P(l.list()).add_bigoh(prec) for l in ls[1:]], cr=True)
|
|
192
|
+
|
|
193
|
+
for i in range(1, n + 1):
|
|
194
|
+
for j in range(i):
|
|
195
|
+
ls[j] = ls[j] - ls[j][i] * ls[i]
|
|
196
|
+
|
|
197
|
+
return Sequence([P(l.list()).add_bigoh(prec) for l in ls], cr=True)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _delta_poly(prec=10):
|
|
201
|
+
"""
|
|
202
|
+
Return the `q`-expansion of Delta as a FLINT polynomial. Used internally by
|
|
203
|
+
the :func:`~delta_qexp` function. See the docstring of :func:`~delta_qexp`
|
|
204
|
+
for more information.
|
|
205
|
+
|
|
206
|
+
INPUT:
|
|
207
|
+
|
|
208
|
+
- ``prec`` -- integer; the absolute precision of the output
|
|
209
|
+
|
|
210
|
+
OUTPUT:
|
|
211
|
+
|
|
212
|
+
the `q`-expansion of Delta to precision ``prec``, as a FLINT
|
|
213
|
+
:class:`~sage.libs.flint.fmpz_poly.Fmpz_poly` object.
|
|
214
|
+
|
|
215
|
+
EXAMPLES::
|
|
216
|
+
|
|
217
|
+
sage: from sage.modular.modform.vm_basis import _delta_poly
|
|
218
|
+
sage: _delta_poly(7)
|
|
219
|
+
7 0 1 -24 252 -1472 4830 -6048
|
|
220
|
+
"""
|
|
221
|
+
if prec <= 0:
|
|
222
|
+
raise ValueError("prec must be positive")
|
|
223
|
+
v = [0] * prec
|
|
224
|
+
|
|
225
|
+
# Let F = \sum_{n >= 0} (-1)^n (2n+1) q^(floor(n(n+1)/2)).
|
|
226
|
+
# Then delta is F^8.
|
|
227
|
+
|
|
228
|
+
# First compute F^2 directly by naive polynomial multiplication,
|
|
229
|
+
# since F is very sparse.
|
|
230
|
+
|
|
231
|
+
stop = int((-1+math.sqrt(1+8*prec))/2.0)
|
|
232
|
+
# make list of index/value pairs for the sparse poly
|
|
233
|
+
values = [(n*(n+1)//2, ((-2*n-1) if (n & 1) else (2*n+1)))
|
|
234
|
+
for n in range(stop + 1)]
|
|
235
|
+
|
|
236
|
+
for (i1, v1) in values:
|
|
237
|
+
for (i2, v2) in values:
|
|
238
|
+
try:
|
|
239
|
+
v[i1 + i2] += v1 * v2
|
|
240
|
+
except IndexError:
|
|
241
|
+
break
|
|
242
|
+
|
|
243
|
+
f = Fmpz_poly(v)
|
|
244
|
+
t = verbose('made series')
|
|
245
|
+
f = f * f
|
|
246
|
+
f._unsafe_mutate_truncate(prec)
|
|
247
|
+
t = verbose('squared (2 of 3)', t)
|
|
248
|
+
f = f * f
|
|
249
|
+
f._unsafe_mutate_truncate(prec - 1)
|
|
250
|
+
t = verbose('squared (3 of 3)', t)
|
|
251
|
+
f = f.left_shift(1)
|
|
252
|
+
t = verbose('shifted', t)
|
|
253
|
+
return f
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _delta_poly_modulo(N, prec=10):
|
|
257
|
+
r"""
|
|
258
|
+
Return the `q`-expansion of `\Delta` modulo `N`. Used internally by
|
|
259
|
+
the :func:`~delta_qexp` function. See the docstring of :func:`~delta_qexp`
|
|
260
|
+
for more information.
|
|
261
|
+
|
|
262
|
+
INPUT:
|
|
263
|
+
|
|
264
|
+
- ``N`` -- positive integer modulo which we want to compute `\Delta`
|
|
265
|
+
|
|
266
|
+
- ``prec`` -- integer; the absolute precision of the output
|
|
267
|
+
|
|
268
|
+
OUTPUT:
|
|
269
|
+
|
|
270
|
+
the polynomial of degree ``prec``-1 which is the truncation
|
|
271
|
+
of `\Delta` modulo `N`, as an element of the polynomial
|
|
272
|
+
ring in `q` over the integers modulo `N`.
|
|
273
|
+
|
|
274
|
+
EXAMPLES::
|
|
275
|
+
|
|
276
|
+
sage: from sage.modular.modform.vm_basis import _delta_poly_modulo
|
|
277
|
+
sage: _delta_poly_modulo(5, 7)
|
|
278
|
+
2*q^6 + 3*q^4 + 2*q^3 + q^2 + q
|
|
279
|
+
sage: _delta_poly_modulo(10, 12)
|
|
280
|
+
2*q^11 + 7*q^9 + 6*q^7 + 2*q^6 + 8*q^4 + 2*q^3 + 6*q^2 + q
|
|
281
|
+
"""
|
|
282
|
+
if prec <= 0:
|
|
283
|
+
raise ValueError("prec must be positive")
|
|
284
|
+
v = [0] * prec
|
|
285
|
+
|
|
286
|
+
# Let F = \sum_{n >= 0} (-1)^n (2n+1) q^(floor(n(n+1)/2)).
|
|
287
|
+
# Then delta is F^8.
|
|
288
|
+
|
|
289
|
+
stop = int((-1+math.sqrt(8*prec))/2.0)
|
|
290
|
+
|
|
291
|
+
for n in range(stop+1):
|
|
292
|
+
v[n*(n+1)//2] = ((N-1)*(2*n+1) if (n & 1) else (2*n+1))
|
|
293
|
+
|
|
294
|
+
P = PolynomialRing(Integers(N), 'q')
|
|
295
|
+
f = P(v)
|
|
296
|
+
t = verbose('made series')
|
|
297
|
+
# fast way of computing f*f truncated at prec
|
|
298
|
+
f = f._mul_trunc_(f, prec)
|
|
299
|
+
t = verbose('squared (1 of 3)', t)
|
|
300
|
+
f = f._mul_trunc_(f, prec)
|
|
301
|
+
t = verbose('squared (2 of 3)', t)
|
|
302
|
+
f = f._mul_trunc_(f, prec - 1)
|
|
303
|
+
t = verbose('squared (3 of 3)', t)
|
|
304
|
+
f = f.shift(1)
|
|
305
|
+
t = verbose('shifted', t)
|
|
306
|
+
|
|
307
|
+
return f
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def delta_qexp(prec=10, var='q', K=ZZ):
|
|
311
|
+
r"""
|
|
312
|
+
Return the `q`-expansion of the weight 12 cusp form `\Delta` as a power
|
|
313
|
+
series with coefficients in the ring K (`= \ZZ` by default).
|
|
314
|
+
|
|
315
|
+
INPUT:
|
|
316
|
+
|
|
317
|
+
- ``prec`` -- integer (default: 10); the absolute precision of the output
|
|
318
|
+
(must be positive)
|
|
319
|
+
|
|
320
|
+
- ``var`` -- string (default: ``'q'``); variable name
|
|
321
|
+
|
|
322
|
+
- ``K`` -- ring (default: `\ZZ`); base ring of answer
|
|
323
|
+
|
|
324
|
+
OUTPUT: a power series over K in the variable ``var``
|
|
325
|
+
|
|
326
|
+
ALGORITHM:
|
|
327
|
+
|
|
328
|
+
Compute the theta series
|
|
329
|
+
|
|
330
|
+
.. MATH::
|
|
331
|
+
|
|
332
|
+
\sum_{n \ge 0} (-1)^n (2n+1) q^{n(n+1)/2},
|
|
333
|
+
|
|
334
|
+
a very simple explicit modular form whose 8th power is `\Delta`. Then
|
|
335
|
+
compute the 8th power. All computations are done over `\ZZ` or `\ZZ`
|
|
336
|
+
modulo `N` depending on the characteristic of the given coefficient
|
|
337
|
+
ring `K`, and coerced into `K` afterwards.
|
|
338
|
+
|
|
339
|
+
EXAMPLES::
|
|
340
|
+
|
|
341
|
+
sage: delta_qexp(7)
|
|
342
|
+
q - 24*q^2 + 252*q^3 - 1472*q^4 + 4830*q^5 - 6048*q^6 + O(q^7)
|
|
343
|
+
sage: delta_qexp(7,'z')
|
|
344
|
+
z - 24*z^2 + 252*z^3 - 1472*z^4 + 4830*z^5 - 6048*z^6 + O(z^7)
|
|
345
|
+
sage: delta_qexp(-3)
|
|
346
|
+
Traceback (most recent call last):
|
|
347
|
+
...
|
|
348
|
+
ValueError: prec must be positive
|
|
349
|
+
sage: delta_qexp(20, K = GF(3))
|
|
350
|
+
q + q^4 + 2*q^7 + 2*q^13 + q^16 + 2*q^19 + O(q^20)
|
|
351
|
+
sage: delta_qexp(20, K = GF(3^5, 'a'))
|
|
352
|
+
q + q^4 + 2*q^7 + 2*q^13 + q^16 + 2*q^19 + O(q^20)
|
|
353
|
+
sage: delta_qexp(10, K = IntegerModRing(60))
|
|
354
|
+
q + 36*q^2 + 12*q^3 + 28*q^4 + 30*q^5 + 12*q^6 + 56*q^7 + 57*q^9 + O(q^10)
|
|
355
|
+
|
|
356
|
+
TESTS:
|
|
357
|
+
|
|
358
|
+
Test algorithm with modular arithmetic (see also :issue:`11804`)::
|
|
359
|
+
|
|
360
|
+
sage: delta_qexp(10^4).change_ring(GF(13)) == delta_qexp(10^4, K=GF(13))
|
|
361
|
+
True
|
|
362
|
+
sage: delta_qexp(1000).change_ring(IntegerModRing(5^100)) == delta_qexp(1000, K=IntegerModRing(5^100))
|
|
363
|
+
True
|
|
364
|
+
|
|
365
|
+
AUTHORS:
|
|
366
|
+
|
|
367
|
+
- William Stein: original code
|
|
368
|
+
|
|
369
|
+
- David Harvey (2007-05): sped up first squaring step
|
|
370
|
+
|
|
371
|
+
- Martin Raum (2009-08-02): use FLINT for polynomial arithmetic (instead of NTL)
|
|
372
|
+
"""
|
|
373
|
+
R = PowerSeriesRing(K, var)
|
|
374
|
+
if K in (ZZ, QQ):
|
|
375
|
+
return R(_delta_poly(prec).list(), prec, check=False)
|
|
376
|
+
ch = K.characteristic()
|
|
377
|
+
if ch > 0 and prec > 150:
|
|
378
|
+
return R(_delta_poly_modulo(ch, prec), prec, check=False)
|
|
379
|
+
else:
|
|
380
|
+
# compute over ZZ and coerce
|
|
381
|
+
return R(_delta_poly(prec).list(), prec, check=True)
|