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,580 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.gap
|
|
3
|
+
r"""
|
|
4
|
+
Series constructor for modular forms for Hecke triangle groups
|
|
5
|
+
|
|
6
|
+
AUTHORS:
|
|
7
|
+
|
|
8
|
+
- Based on the thesis of John Garrett Leo (2008)
|
|
9
|
+
- Jonas Jermann (2013): initial version
|
|
10
|
+
|
|
11
|
+
.. NOTE::
|
|
12
|
+
|
|
13
|
+
``J_inv_ZZ`` is the main function used to determine all Fourier expansions.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# ****************************************************************************
|
|
17
|
+
# Copyright (C) 2013-2014 Jonas Jermann <jjermann2@gmail.com>
|
|
18
|
+
#
|
|
19
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
20
|
+
# as published by the Free Software Foundation; either version 2 of
|
|
21
|
+
# the License, or (at your option) any later version.
|
|
22
|
+
# https://www.gnu.org/licenses/
|
|
23
|
+
# ****************************************************************************
|
|
24
|
+
|
|
25
|
+
from sage.arith.misc import bernoulli, sigma, rising_factorial
|
|
26
|
+
from sage.misc.cachefunc import cached_method
|
|
27
|
+
from sage.rings.big_oh import O
|
|
28
|
+
from sage.rings.infinity import infinity
|
|
29
|
+
from sage.rings.integer_ring import ZZ
|
|
30
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
31
|
+
from sage.rings.rational_field import QQ
|
|
32
|
+
from sage.structure.sage_object import SageObject
|
|
33
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
34
|
+
|
|
35
|
+
from .hecke_triangle_groups import HeckeTriangleGroup
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MFSeriesConstructor(SageObject, UniqueRepresentation):
|
|
39
|
+
r"""
|
|
40
|
+
Constructor for the Fourier expansion of some
|
|
41
|
+
(specific, basic) modular forms.
|
|
42
|
+
|
|
43
|
+
The constructor is used by forms elements in case
|
|
44
|
+
their Fourier expansion is needed or requested.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
def __classcall__(cls, group=HeckeTriangleGroup(3), prec=ZZ(10)):
|
|
49
|
+
r"""
|
|
50
|
+
Return a (cached) instance with canonical parameters.
|
|
51
|
+
|
|
52
|
+
.. NOTE::
|
|
53
|
+
|
|
54
|
+
For each choice of group and precision the constructor is
|
|
55
|
+
cached (only) once. Further calculations with different
|
|
56
|
+
base rings and possibly numerical parameters are based on
|
|
57
|
+
the same cached instance.
|
|
58
|
+
|
|
59
|
+
EXAMPLES::
|
|
60
|
+
|
|
61
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
62
|
+
sage: MFSeriesConstructor() == MFSeriesConstructor(3, 10)
|
|
63
|
+
True
|
|
64
|
+
sage: MFSeriesConstructor(group=4).hecke_n()
|
|
65
|
+
4
|
|
66
|
+
sage: MFSeriesConstructor(group=5, prec=12).prec()
|
|
67
|
+
12
|
|
68
|
+
"""
|
|
69
|
+
if (group == infinity):
|
|
70
|
+
group = HeckeTriangleGroup(infinity)
|
|
71
|
+
else:
|
|
72
|
+
try:
|
|
73
|
+
group = HeckeTriangleGroup(ZZ(group))
|
|
74
|
+
except TypeError:
|
|
75
|
+
group = HeckeTriangleGroup(group.n())
|
|
76
|
+
prec = ZZ(prec)
|
|
77
|
+
# We don't need this assumption the precision may in principle also be negative.
|
|
78
|
+
# if (prec<1):
|
|
79
|
+
# raise Exception("prec must be an Integer >=1")
|
|
80
|
+
|
|
81
|
+
return super().__classcall__(cls, group, prec)
|
|
82
|
+
|
|
83
|
+
def __init__(self, group, prec):
|
|
84
|
+
r"""
|
|
85
|
+
Constructor for the Fourier expansion of some
|
|
86
|
+
(specific, basic) modular forms.
|
|
87
|
+
|
|
88
|
+
INPUT:
|
|
89
|
+
|
|
90
|
+
- ``group`` -- a Hecke triangle group (default: HeckeTriangleGroup(3))
|
|
91
|
+
|
|
92
|
+
- ``prec`` -- integer (default: 10), the default precision used in
|
|
93
|
+
calculations in the LaurentSeriesRing or PowerSeriesRing
|
|
94
|
+
|
|
95
|
+
OUTPUT: the constructor for Fourier expansion with the specified settings
|
|
96
|
+
|
|
97
|
+
EXAMPLES::
|
|
98
|
+
|
|
99
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
100
|
+
sage: MFC = MFSeriesConstructor()
|
|
101
|
+
sage: MFC
|
|
102
|
+
Power series constructor for Hecke modular forms for n=3 with (basic series) precision 10
|
|
103
|
+
sage: MFC.group()
|
|
104
|
+
Hecke triangle group for n = 3
|
|
105
|
+
sage: MFC.prec()
|
|
106
|
+
10
|
|
107
|
+
sage: MFC._series_ring
|
|
108
|
+
Power Series Ring in q over Rational Field
|
|
109
|
+
|
|
110
|
+
sage: MFSeriesConstructor(group=4)
|
|
111
|
+
Power series constructor for Hecke modular forms for n=4 with (basic series) precision 10
|
|
112
|
+
sage: MFSeriesConstructor(group=5, prec=12)
|
|
113
|
+
Power series constructor for Hecke modular forms for n=5 with (basic series) precision 12
|
|
114
|
+
sage: MFSeriesConstructor(group=infinity)
|
|
115
|
+
Power series constructor for Hecke modular forms for n=+Infinity with (basic series) precision 10
|
|
116
|
+
"""
|
|
117
|
+
self._group = group
|
|
118
|
+
self._prec = prec
|
|
119
|
+
self._series_ring = PowerSeriesRing(QQ, 'q', default_prec=self._prec)
|
|
120
|
+
|
|
121
|
+
def _repr_(self):
|
|
122
|
+
r"""
|
|
123
|
+
Return the string representation of ``self``.
|
|
124
|
+
|
|
125
|
+
EXAMPLES::
|
|
126
|
+
|
|
127
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
128
|
+
sage: MFSeriesConstructor(group=4)
|
|
129
|
+
Power series constructor for Hecke modular forms for n=4 with (basic series) precision 10
|
|
130
|
+
|
|
131
|
+
sage: MFSeriesConstructor(group=5, prec=12)
|
|
132
|
+
Power series constructor for Hecke modular forms for n=5 with (basic series) precision 12
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
return "Power series constructor for Hecke modular forms for n={} with (basic series) precision {}".\
|
|
136
|
+
format(self._group.n(), self._prec)
|
|
137
|
+
|
|
138
|
+
def group(self):
|
|
139
|
+
r"""
|
|
140
|
+
Return the (Hecke triangle) group of ``self``.
|
|
141
|
+
|
|
142
|
+
EXAMPLES::
|
|
143
|
+
|
|
144
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
145
|
+
sage: MFSeriesConstructor(group=4).group()
|
|
146
|
+
Hecke triangle group for n = 4
|
|
147
|
+
"""
|
|
148
|
+
return self._group
|
|
149
|
+
|
|
150
|
+
def hecke_n(self):
|
|
151
|
+
r"""
|
|
152
|
+
Return the parameter ``n`` of the (Hecke triangle) group of ``self``.
|
|
153
|
+
|
|
154
|
+
EXAMPLES::
|
|
155
|
+
|
|
156
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
157
|
+
sage: MFSeriesConstructor(group=4).hecke_n()
|
|
158
|
+
4
|
|
159
|
+
"""
|
|
160
|
+
return self._group.n()
|
|
161
|
+
|
|
162
|
+
def prec(self):
|
|
163
|
+
r"""
|
|
164
|
+
Return the used default precision for the PowerSeriesRing or LaurentSeriesRing.
|
|
165
|
+
|
|
166
|
+
EXAMPLES::
|
|
167
|
+
|
|
168
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
169
|
+
sage: MFSeriesConstructor(group=5).prec()
|
|
170
|
+
10
|
|
171
|
+
sage: MFSeriesConstructor(group=5, prec=20).prec()
|
|
172
|
+
20
|
|
173
|
+
"""
|
|
174
|
+
return self._prec
|
|
175
|
+
|
|
176
|
+
@cached_method
|
|
177
|
+
def J_inv_ZZ(self):
|
|
178
|
+
r"""
|
|
179
|
+
Return the rational Fourier expansion of ``J_inv``,
|
|
180
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
181
|
+
|
|
182
|
+
This is the main function used to determine all Fourier expansions!
|
|
183
|
+
|
|
184
|
+
.. NOTE::
|
|
185
|
+
|
|
186
|
+
The Fourier expansion of ``J_inv`` for ``d!=1``
|
|
187
|
+
is given by ``J_inv_ZZ(q/d)``.
|
|
188
|
+
|
|
189
|
+
.. TODO::
|
|
190
|
+
|
|
191
|
+
The functions that are used in this implementation are
|
|
192
|
+
products of hypergeometric series with other, elementary,
|
|
193
|
+
functions. Implement them and clean up this representation.
|
|
194
|
+
|
|
195
|
+
EXAMPLES::
|
|
196
|
+
|
|
197
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
198
|
+
sage: MFSeriesConstructor(prec=3).J_inv_ZZ()
|
|
199
|
+
q^-1 + 31/72 + 1823/27648*q + O(q^2)
|
|
200
|
+
sage: MFSeriesConstructor(group=5, prec=3).J_inv_ZZ()
|
|
201
|
+
q^-1 + 79/200 + 42877/640000*q + O(q^2)
|
|
202
|
+
sage: MFSeriesConstructor(group=5, prec=3).J_inv_ZZ().parent()
|
|
203
|
+
Laurent Series Ring in q over Rational Field
|
|
204
|
+
|
|
205
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).J_inv_ZZ()
|
|
206
|
+
q^-1 + 3/8 + 69/1024*q + O(q^2)
|
|
207
|
+
"""
|
|
208
|
+
def F1(a, b):
|
|
209
|
+
return self._series_ring(
|
|
210
|
+
[ZZ.zero()]
|
|
211
|
+
+ [rising_factorial(a, k) * rising_factorial(b, k) / (ZZ(k).factorial())**2
|
|
212
|
+
* sum(ZZ.one()/(a+j) + ZZ.one()/(b+j) - ZZ(2)/ZZ(1+j)
|
|
213
|
+
for j in range(k))
|
|
214
|
+
for k in range(1, self._prec + 1)
|
|
215
|
+
],
|
|
216
|
+
ZZ(self._prec + 1)
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
def F(a, b, c):
|
|
220
|
+
return self._series_ring(
|
|
221
|
+
[rising_factorial(a, k) * rising_factorial(b, k) / rising_factorial(c, k) / ZZ(k).factorial()
|
|
222
|
+
for k in range(self._prec + 1)],
|
|
223
|
+
ZZ(self._prec + 1)
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
a = self._group.alpha()
|
|
227
|
+
b = self._group.beta()
|
|
228
|
+
Phi = F1(a, b) / F(a, b, ZZ.one())
|
|
229
|
+
q = self._series_ring.gen()
|
|
230
|
+
|
|
231
|
+
# the current implementation of power series reversion is slow
|
|
232
|
+
# J_inv_ZZ = ZZ(1) / ((q*Phi.exp()).reverse())
|
|
233
|
+
|
|
234
|
+
temp_f = (q * Phi.exp()).polynomial()
|
|
235
|
+
new_f = temp_f.revert_series(temp_f.degree() + 1)
|
|
236
|
+
return ZZ.one() / (new_f + O(q**(temp_f.degree() + 1)))
|
|
237
|
+
|
|
238
|
+
@cached_method
|
|
239
|
+
def f_rho_ZZ(self):
|
|
240
|
+
r"""
|
|
241
|
+
Return the rational Fourier expansion of ``f_rho``,
|
|
242
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
243
|
+
|
|
244
|
+
.. NOTE::
|
|
245
|
+
|
|
246
|
+
The Fourier expansion of ``f_rho`` for ``d!=1``
|
|
247
|
+
is given by ``f_rho_ZZ(q/d)``.
|
|
248
|
+
|
|
249
|
+
EXAMPLES::
|
|
250
|
+
|
|
251
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
252
|
+
sage: MFSeriesConstructor(prec=3).f_rho_ZZ()
|
|
253
|
+
1 + 5/36*q + 5/6912*q^2 + O(q^3)
|
|
254
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_rho_ZZ()
|
|
255
|
+
1 + 7/100*q + 21/160000*q^2 + O(q^3)
|
|
256
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_rho_ZZ().parent()
|
|
257
|
+
Power Series Ring in q over Rational Field
|
|
258
|
+
|
|
259
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).f_rho_ZZ()
|
|
260
|
+
1
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
q = self._series_ring.gen()
|
|
264
|
+
n = self.hecke_n()
|
|
265
|
+
if (n == infinity):
|
|
266
|
+
f_rho_ZZ = self._series_ring(1)
|
|
267
|
+
else:
|
|
268
|
+
temp_expr = ((-q*self.J_inv_ZZ().derivative())**2/(self.J_inv_ZZ()*(self.J_inv_ZZ()-1))).power_series()
|
|
269
|
+
f_rho_ZZ = (temp_expr.log()/(n-2)).exp()
|
|
270
|
+
return f_rho_ZZ
|
|
271
|
+
|
|
272
|
+
@cached_method
|
|
273
|
+
def f_i_ZZ(self):
|
|
274
|
+
r"""
|
|
275
|
+
Return the rational Fourier expansion of ``f_i``,
|
|
276
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
277
|
+
|
|
278
|
+
.. NOTE::
|
|
279
|
+
|
|
280
|
+
The Fourier expansion of ``f_i`` for ``d!=1``
|
|
281
|
+
is given by ``f_i_ZZ(q/d)``.
|
|
282
|
+
|
|
283
|
+
EXAMPLES::
|
|
284
|
+
|
|
285
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
286
|
+
sage: MFSeriesConstructor(prec=3).f_i_ZZ()
|
|
287
|
+
1 - 7/24*q - 77/13824*q^2 + O(q^3)
|
|
288
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_i_ZZ()
|
|
289
|
+
1 - 13/40*q - 351/64000*q^2 + O(q^3)
|
|
290
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_i_ZZ().parent()
|
|
291
|
+
Power Series Ring in q over Rational Field
|
|
292
|
+
|
|
293
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).f_i_ZZ()
|
|
294
|
+
1 - 3/8*q + 3/512*q^2 + O(q^3)
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
q = self._series_ring.gen()
|
|
298
|
+
n = self.hecke_n()
|
|
299
|
+
if (n == infinity):
|
|
300
|
+
f_i_ZZ = (-q*self.J_inv_ZZ().derivative()/self.J_inv_ZZ()).power_series()
|
|
301
|
+
else:
|
|
302
|
+
temp_expr = ((-q*self.J_inv_ZZ().derivative())**n/(self.J_inv_ZZ()**(n-1)*(self.J_inv_ZZ()-1))).power_series()
|
|
303
|
+
f_i_ZZ = (temp_expr.log()/(n-2)).exp()
|
|
304
|
+
return f_i_ZZ
|
|
305
|
+
|
|
306
|
+
@cached_method
|
|
307
|
+
def f_inf_ZZ(self):
|
|
308
|
+
r"""
|
|
309
|
+
Return the rational Fourier expansion of ``f_inf``,
|
|
310
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
311
|
+
|
|
312
|
+
.. NOTE::
|
|
313
|
+
|
|
314
|
+
The Fourier expansion of ``f_inf`` for ``d!=1``
|
|
315
|
+
is given by ``d*f_inf_ZZ(q/d)``.
|
|
316
|
+
|
|
317
|
+
EXAMPLES::
|
|
318
|
+
|
|
319
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
320
|
+
sage: MFSeriesConstructor(prec=3).f_inf_ZZ()
|
|
321
|
+
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
|
|
322
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_inf_ZZ()
|
|
323
|
+
q - 9/200*q^2 + 279/640000*q^3 + O(q^4)
|
|
324
|
+
sage: MFSeriesConstructor(group=5, prec=3).f_inf_ZZ().parent()
|
|
325
|
+
Power Series Ring in q over Rational Field
|
|
326
|
+
|
|
327
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).f_inf_ZZ()
|
|
328
|
+
q - 1/8*q^2 + 7/1024*q^3 + O(q^4)
|
|
329
|
+
"""
|
|
330
|
+
|
|
331
|
+
q = self._series_ring.gen()
|
|
332
|
+
n = self.hecke_n()
|
|
333
|
+
if (n == infinity):
|
|
334
|
+
f_inf_ZZ = ((-q*self.J_inv_ZZ().derivative())**2/(self.J_inv_ZZ()**2*(self.J_inv_ZZ()-1))).power_series()
|
|
335
|
+
else:
|
|
336
|
+
temp_expr = ((-q*self.J_inv_ZZ().derivative())**(2*n)/(self.J_inv_ZZ()**(2*n-2)*(self.J_inv_ZZ()-1)**n)/q**(n-2)).power_series()
|
|
337
|
+
f_inf_ZZ = (temp_expr.log()/(n-2)).exp()*q
|
|
338
|
+
return f_inf_ZZ
|
|
339
|
+
|
|
340
|
+
@cached_method
|
|
341
|
+
def G_inv_ZZ(self):
|
|
342
|
+
r"""
|
|
343
|
+
Return the rational Fourier expansion of ``G_inv``,
|
|
344
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
345
|
+
|
|
346
|
+
.. NOTE::
|
|
347
|
+
|
|
348
|
+
The Fourier expansion of ``G_inv`` for ``d!=1``
|
|
349
|
+
is given by ``d*G_inv_ZZ(q/d)``.
|
|
350
|
+
|
|
351
|
+
EXAMPLES::
|
|
352
|
+
|
|
353
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
354
|
+
sage: MFSeriesConstructor(group=4, prec=3).G_inv_ZZ()
|
|
355
|
+
q^-1 - 3/32 - 955/16384*q + O(q^2)
|
|
356
|
+
sage: MFSeriesConstructor(group=8, prec=3).G_inv_ZZ()
|
|
357
|
+
q^-1 - 15/128 - 15139/262144*q + O(q^2)
|
|
358
|
+
sage: MFSeriesConstructor(group=8, prec=3).G_inv_ZZ().parent()
|
|
359
|
+
Laurent Series Ring in q over Rational Field
|
|
360
|
+
|
|
361
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).G_inv_ZZ()
|
|
362
|
+
q^-1 - 1/8 - 59/1024*q + O(q^2)
|
|
363
|
+
"""
|
|
364
|
+
n = self.hecke_n()
|
|
365
|
+
# Note that G_inv is not a weakly holomorphic form (because of
|
|
366
|
+
# the behavior at -1)
|
|
367
|
+
if n == infinity:
|
|
368
|
+
q = self._series_ring.gen()
|
|
369
|
+
temp_expr = (self.J_inv_ZZ()/self.f_inf_ZZ()*q**2).power_series()
|
|
370
|
+
return 1/q*self.f_i_ZZ()*(temp_expr.log()/2).exp()
|
|
371
|
+
if (ZZ(2).divides(n)):
|
|
372
|
+
return self.f_i_ZZ()*(self.f_rho_ZZ()**(ZZ(n/ZZ(2))))/self.f_inf_ZZ()
|
|
373
|
+
raise ValueError("G_inv doesn't exist for n={}.".format(self.hecke_n()))
|
|
374
|
+
|
|
375
|
+
@cached_method
|
|
376
|
+
def E4_ZZ(self):
|
|
377
|
+
r"""
|
|
378
|
+
Return the rational Fourier expansion of ``E_4``,
|
|
379
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
380
|
+
|
|
381
|
+
.. NOTE::
|
|
382
|
+
|
|
383
|
+
The Fourier expansion of ``E4`` for ``d!=1``
|
|
384
|
+
is given by ``E4_ZZ(q/d)``.
|
|
385
|
+
|
|
386
|
+
EXAMPLES::
|
|
387
|
+
|
|
388
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
389
|
+
sage: MFSeriesConstructor(prec=3).E4_ZZ()
|
|
390
|
+
1 + 5/36*q + 5/6912*q^2 + O(q^3)
|
|
391
|
+
sage: MFSeriesConstructor(group=5, prec=3).E4_ZZ()
|
|
392
|
+
1 + 21/100*q + 483/32000*q^2 + O(q^3)
|
|
393
|
+
sage: MFSeriesConstructor(group=5, prec=3).E4_ZZ().parent()
|
|
394
|
+
Power Series Ring in q over Rational Field
|
|
395
|
+
|
|
396
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).E4_ZZ()
|
|
397
|
+
1 + 1/4*q + 7/256*q^2 + O(q^3)
|
|
398
|
+
"""
|
|
399
|
+
q = self._series_ring.gen()
|
|
400
|
+
return ((-q*self.J_inv_ZZ().derivative())**2 / (self.J_inv_ZZ()*(self.J_inv_ZZ()-1))).power_series()
|
|
401
|
+
|
|
402
|
+
@cached_method
|
|
403
|
+
def E6_ZZ(self):
|
|
404
|
+
r"""
|
|
405
|
+
Return the rational Fourier expansion of ``E_6``,
|
|
406
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
407
|
+
|
|
408
|
+
.. NOTE::
|
|
409
|
+
|
|
410
|
+
The Fourier expansion of ``E6`` for ``d!=1``
|
|
411
|
+
is given by ``E6_ZZ(q/d)``.
|
|
412
|
+
|
|
413
|
+
EXAMPLES::
|
|
414
|
+
|
|
415
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
416
|
+
sage: MFSeriesConstructor(prec=3).E6_ZZ()
|
|
417
|
+
1 - 7/24*q - 77/13824*q^2 + O(q^3)
|
|
418
|
+
sage: MFSeriesConstructor(group=5, prec=3).E6_ZZ()
|
|
419
|
+
1 - 37/200*q - 14663/320000*q^2 + O(q^3)
|
|
420
|
+
sage: MFSeriesConstructor(group=5, prec=3).E6_ZZ().parent()
|
|
421
|
+
Power Series Ring in q over Rational Field
|
|
422
|
+
|
|
423
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).E6_ZZ()
|
|
424
|
+
1 - 1/8*q - 31/512*q^2 + O(q^3)
|
|
425
|
+
"""
|
|
426
|
+
q = self._series_ring.gen()
|
|
427
|
+
return ((-q*self.J_inv_ZZ().derivative())**3 / (self.J_inv_ZZ()**2*(self.J_inv_ZZ()-1))).power_series()
|
|
428
|
+
|
|
429
|
+
@cached_method
|
|
430
|
+
def Delta_ZZ(self):
|
|
431
|
+
r"""
|
|
432
|
+
Return the rational Fourier expansion of ``Delta``,
|
|
433
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
434
|
+
|
|
435
|
+
.. NOTE::
|
|
436
|
+
|
|
437
|
+
The Fourier expansion of ``Delta`` for ``d!=1``
|
|
438
|
+
is given by ``d*Delta_ZZ(q/d)``.
|
|
439
|
+
|
|
440
|
+
EXAMPLES::
|
|
441
|
+
|
|
442
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
443
|
+
sage: MFSeriesConstructor(prec=3).Delta_ZZ()
|
|
444
|
+
q - 1/72*q^2 + 7/82944*q^3 + O(q^4)
|
|
445
|
+
sage: MFSeriesConstructor(group=5, prec=3).Delta_ZZ()
|
|
446
|
+
q + 47/200*q^2 + 11367/640000*q^3 + O(q^4)
|
|
447
|
+
sage: MFSeriesConstructor(group=5, prec=3).Delta_ZZ().parent()
|
|
448
|
+
Power Series Ring in q over Rational Field
|
|
449
|
+
|
|
450
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).Delta_ZZ()
|
|
451
|
+
q + 3/8*q^2 + 63/1024*q^3 + O(q^4)
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
return (self.f_inf_ZZ()**3*self.J_inv_ZZ()**2/(self.f_rho_ZZ()**6)).power_series()
|
|
455
|
+
|
|
456
|
+
@cached_method
|
|
457
|
+
def E2_ZZ(self):
|
|
458
|
+
r"""
|
|
459
|
+
Return the rational Fourier expansion of ``E2``,
|
|
460
|
+
where the parameter ``d`` is replaced by ``1``.
|
|
461
|
+
|
|
462
|
+
.. NOTE::
|
|
463
|
+
|
|
464
|
+
The Fourier expansion of ``E2`` for ``d!=1``
|
|
465
|
+
is given by ``E2_ZZ(q/d)``.
|
|
466
|
+
|
|
467
|
+
EXAMPLES::
|
|
468
|
+
|
|
469
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
470
|
+
sage: MFSeriesConstructor(prec=3).E2_ZZ()
|
|
471
|
+
1 - 1/72*q - 1/41472*q^2 + O(q^3)
|
|
472
|
+
sage: MFSeriesConstructor(group=5, prec=3).E2_ZZ()
|
|
473
|
+
1 - 9/200*q - 369/320000*q^2 + O(q^3)
|
|
474
|
+
sage: MFSeriesConstructor(group=5, prec=3).E2_ZZ().parent()
|
|
475
|
+
Power Series Ring in q over Rational Field
|
|
476
|
+
|
|
477
|
+
sage: MFSeriesConstructor(group=infinity, prec=3).E2_ZZ()
|
|
478
|
+
1 - 1/8*q - 1/512*q^2 + O(q^3)
|
|
479
|
+
"""
|
|
480
|
+
q = self._series_ring.gen()
|
|
481
|
+
return (q * self.f_inf_ZZ().derivative()) / self.f_inf_ZZ()
|
|
482
|
+
|
|
483
|
+
@cached_method
|
|
484
|
+
def EisensteinSeries_ZZ(self, k):
|
|
485
|
+
r"""
|
|
486
|
+
Return the rational Fourier expansion of the normalized Eisenstein series
|
|
487
|
+
of weight ``k``, where the parameter ``d`` is replaced by ``1``.
|
|
488
|
+
|
|
489
|
+
Only arithmetic groups with ``n < infinity`` are supported!
|
|
490
|
+
|
|
491
|
+
.. NOTE::
|
|
492
|
+
|
|
493
|
+
THe Fourier expansion of the series is given by ``EisensteinSeries_ZZ(q/d)``.
|
|
494
|
+
|
|
495
|
+
INPUT:
|
|
496
|
+
|
|
497
|
+
- ``k`` -- a nonnegative even integer, namely the weight
|
|
498
|
+
|
|
499
|
+
EXAMPLES::
|
|
500
|
+
|
|
501
|
+
sage: from sage.modular.modform_hecketriangle.series_constructor import MFSeriesConstructor
|
|
502
|
+
sage: MFC = MFSeriesConstructor(prec=6)
|
|
503
|
+
sage: MFC.EisensteinSeries_ZZ(k=0)
|
|
504
|
+
1
|
|
505
|
+
sage: MFC.EisensteinSeries_ZZ(k=2)
|
|
506
|
+
1 - 1/72*q - 1/41472*q^2 - 1/53747712*q^3 - 7/371504185344*q^4 - 1/106993205379072*q^5 + O(q^6)
|
|
507
|
+
sage: MFC.EisensteinSeries_ZZ(k=6)
|
|
508
|
+
1 - 7/24*q - 77/13824*q^2 - 427/17915904*q^3 - 7399/123834728448*q^4 - 3647/35664401793024*q^5 + O(q^6)
|
|
509
|
+
sage: MFC.EisensteinSeries_ZZ(k=12)
|
|
510
|
+
1 + 455/8292*q + 310765/4776192*q^2 + 20150585/6189944832*q^3 + 1909340615/42784898678784*q^4 + 3702799555/12322050819489792*q^5 + O(q^6)
|
|
511
|
+
sage: MFC.EisensteinSeries_ZZ(k=12).parent()
|
|
512
|
+
Power Series Ring in q over Rational Field
|
|
513
|
+
|
|
514
|
+
sage: MFC = MFSeriesConstructor(group=4, prec=5)
|
|
515
|
+
sage: MFC.EisensteinSeries_ZZ(k=2)
|
|
516
|
+
1 - 1/32*q - 5/8192*q^2 - 1/524288*q^3 - 13/536870912*q^4 + O(q^5)
|
|
517
|
+
sage: MFC.EisensteinSeries_ZZ(k=4)
|
|
518
|
+
1 + 3/16*q + 39/4096*q^2 + 21/262144*q^3 + 327/268435456*q^4 + O(q^5)
|
|
519
|
+
sage: MFC.EisensteinSeries_ZZ(k=6)
|
|
520
|
+
1 - 7/32*q - 287/8192*q^2 - 427/524288*q^3 - 9247/536870912*q^4 + O(q^5)
|
|
521
|
+
sage: MFC.EisensteinSeries_ZZ(k=12)
|
|
522
|
+
1 + 63/11056*q + 133119/2830336*q^2 + 2790081/181141504*q^3 + 272631807/185488900096*q^4 + O(q^5)
|
|
523
|
+
|
|
524
|
+
sage: MFC = MFSeriesConstructor(group=6, prec=5)
|
|
525
|
+
sage: MFC.EisensteinSeries_ZZ(k=2)
|
|
526
|
+
1 - 1/18*q - 1/648*q^2 - 7/209952*q^3 - 7/22674816*q^4 + O(q^5)
|
|
527
|
+
sage: MFC.EisensteinSeries_ZZ(k=4)
|
|
528
|
+
1 + 2/9*q + 1/54*q^2 + 37/52488*q^3 + 73/5668704*q^4 + O(q^5)
|
|
529
|
+
sage: MFC.EisensteinSeries_ZZ(k=6)
|
|
530
|
+
1 - 1/6*q - 11/216*q^2 - 271/69984*q^3 - 1057/7558272*q^4 + O(q^5)
|
|
531
|
+
sage: MFC.EisensteinSeries_ZZ(k=12)
|
|
532
|
+
1 + 182/151329*q + 62153/2723922*q^2 + 16186807/882550728*q^3 + 381868123/95315478624*q^4 + O(q^5)
|
|
533
|
+
"""
|
|
534
|
+
|
|
535
|
+
try:
|
|
536
|
+
if k < 0:
|
|
537
|
+
raise TypeError(None)
|
|
538
|
+
k = 2*ZZ(k/2)
|
|
539
|
+
except TypeError:
|
|
540
|
+
raise TypeError("k={} has to be a nonnegative even integer!".format(k))
|
|
541
|
+
|
|
542
|
+
if (not self.group().is_arithmetic() or self.group().n() == infinity):
|
|
543
|
+
# Exceptional cases should be called manually (see in FormsRing_abstract)
|
|
544
|
+
raise NotImplementedError("Eisenstein series are only supported in the finite arithmetic cases!")
|
|
545
|
+
|
|
546
|
+
# Trivial case
|
|
547
|
+
if k == 0:
|
|
548
|
+
return self._series_ring(1)
|
|
549
|
+
|
|
550
|
+
M = ZZ(self.group().lam()**2)
|
|
551
|
+
lamk = M**(ZZ(k/2))
|
|
552
|
+
dval = self.group().dvalue()
|
|
553
|
+
|
|
554
|
+
def coeff(m):
|
|
555
|
+
m = ZZ(m)
|
|
556
|
+
if m < 0:
|
|
557
|
+
return ZZ(0)
|
|
558
|
+
elif m == 0:
|
|
559
|
+
return ZZ(1)
|
|
560
|
+
|
|
561
|
+
factor = -2*k / QQ(bernoulli(k)) / lamk
|
|
562
|
+
sum1 = sigma(m, k-1)
|
|
563
|
+
if M.divides(m):
|
|
564
|
+
sum2 = (lamk-1) * sigma(ZZ(m/M), k-1)
|
|
565
|
+
else:
|
|
566
|
+
sum2 = ZZ(0)
|
|
567
|
+
if (M == 1):
|
|
568
|
+
sum3 = ZZ(0)
|
|
569
|
+
else:
|
|
570
|
+
if (m == 1):
|
|
571
|
+
N = ZZ(1)
|
|
572
|
+
else:
|
|
573
|
+
N = ZZ(m / M**ZZ(m.valuation(M)))
|
|
574
|
+
sum3 = -sigma(ZZ(N), k-1) * ZZ(m/N)**(k-1) / (lamk + 1)
|
|
575
|
+
|
|
576
|
+
return factor * (sum1 + sum2 + sum3) * dval**m
|
|
577
|
+
|
|
578
|
+
q = self._series_ring.gen()
|
|
579
|
+
|
|
580
|
+
return sum([coeff(m)*q**m for m in range(self.prec())]).add_bigoh(self.prec())
|