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,14 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
#########################################################################
|
|
3
|
+
# Copyright (C) 2004--2006 William Stein <wstein@gmail.com>
|
|
4
|
+
#
|
|
5
|
+
# Distributed under the terms of the GNU General Public License (GPL)
|
|
6
|
+
#
|
|
7
|
+
# http://www.gnu.org/licenses/
|
|
8
|
+
#########################################################################
|
|
9
|
+
|
|
10
|
+
# The default precision for computation and display of q-expansions of
|
|
11
|
+
# modular forms.
|
|
12
|
+
from sage.rings.integer import Integer
|
|
13
|
+
DEFAULT_PRECISION = Integer(6)
|
|
14
|
+
DEFAULT_VARIABLE = 'q'
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint sage.libs.pari
|
|
3
|
+
"""
|
|
4
|
+
Eisenstein series
|
|
5
|
+
"""
|
|
6
|
+
# ****************************************************************************
|
|
7
|
+
# Copyright (C) 2004-2006 William Stein <wstein@gmail.com>
|
|
8
|
+
#
|
|
9
|
+
# This program is free software: you can redistribute it and/or modify
|
|
10
|
+
# it under the terms of the GNU General Public License as published by
|
|
11
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
12
|
+
# (at your option) any later version.
|
|
13
|
+
# https://www.gnu.org/licenses/
|
|
14
|
+
# ****************************************************************************
|
|
15
|
+
|
|
16
|
+
from sage.arith.functions import lcm
|
|
17
|
+
from sage.arith.misc import bernoulli, divisors, is_squarefree
|
|
18
|
+
from sage.misc.lazy_import import lazy_import
|
|
19
|
+
from sage.misc.timing import cputime
|
|
20
|
+
from sage.modular.arithgroup.congroup_gammaH import GammaH_class
|
|
21
|
+
from sage.modular.dirichlet import DirichletGroup
|
|
22
|
+
from sage.rings.integer import Integer
|
|
23
|
+
from sage.rings.integer_ring import ZZ
|
|
24
|
+
from sage.rings.power_series_ring import PowerSeriesRing
|
|
25
|
+
from sage.rings.rational_field import QQ
|
|
26
|
+
|
|
27
|
+
lazy_import('sage.modular.modform.eis_series_cython', ['eisenstein_series_poly', 'Ek_ZZ'])
|
|
28
|
+
lazy_import('sage.rings.number_field.number_field', 'CyclotomicField')
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def eisenstein_series_qexp(k, prec=10, K=QQ, var='q', normalization='linear'):
|
|
32
|
+
r"""
|
|
33
|
+
Return the `q`-expansion of the normalized weight `k` Eisenstein series on
|
|
34
|
+
`\SL_2(\ZZ)` to precision ``prec`` in the ring `K`. Three normalizations
|
|
35
|
+
are available, depending on the parameter ``normalization``; the default
|
|
36
|
+
normalization is the one for which the linear coefficient is 1.
|
|
37
|
+
|
|
38
|
+
INPUT:
|
|
39
|
+
|
|
40
|
+
- ``k`` -- an even positive integer
|
|
41
|
+
|
|
42
|
+
- ``prec`` -- (default: 10) a nonnegative integer
|
|
43
|
+
|
|
44
|
+
- ``K`` -- (default: `\QQ`) a ring
|
|
45
|
+
|
|
46
|
+
- ``var`` -- (default: ``'q'``) variable name to use for `q`-expansion
|
|
47
|
+
|
|
48
|
+
- ``normalization`` -- (default: ``'linear'``) normalization to use. If this
|
|
49
|
+
is ``'linear'``, then the series will be normalized so that the linear
|
|
50
|
+
term is 1. If it is ``'constant'``, the series will be normalized to have
|
|
51
|
+
constant term 1. If it is ``'integral'``, then the series will be
|
|
52
|
+
normalized to have integer coefficients and no common factor, and linear
|
|
53
|
+
term that is positive. Note that ``'integral'`` will work over arbitrary
|
|
54
|
+
base rings, while ``'linear'`` or ``'constant'`` will fail if the
|
|
55
|
+
denominator (resp. numerator) of `B_k / 2k` is invertible.
|
|
56
|
+
|
|
57
|
+
ALGORITHM:
|
|
58
|
+
|
|
59
|
+
We know `E_k = \text{constant} + \sum_n \sigma_{k-1}(n) q^n`. So we
|
|
60
|
+
compute all the `\sigma_{k-1}(n)` simultaneously, using the fact that
|
|
61
|
+
`\sigma` is multiplicative.
|
|
62
|
+
|
|
63
|
+
EXAMPLES::
|
|
64
|
+
|
|
65
|
+
sage: eisenstein_series_qexp(2,5)
|
|
66
|
+
-1/24 + q + 3*q^2 + 4*q^3 + 7*q^4 + O(q^5)
|
|
67
|
+
sage: eisenstein_series_qexp(2,0)
|
|
68
|
+
O(q^0)
|
|
69
|
+
sage: eisenstein_series_qexp(2,5,GF(7))
|
|
70
|
+
2 + q + 3*q^2 + 4*q^3 + O(q^5)
|
|
71
|
+
sage: eisenstein_series_qexp(2,5,GF(7),var='T')
|
|
72
|
+
2 + T + 3*T^2 + 4*T^3 + O(T^5)
|
|
73
|
+
|
|
74
|
+
We illustrate the use of the ``normalization`` parameter::
|
|
75
|
+
|
|
76
|
+
sage: eisenstein_series_qexp(12, 5, normalization='integral')
|
|
77
|
+
691 + 65520*q + 134250480*q^2 + 11606736960*q^3 + 274945048560*q^4 + O(q^5)
|
|
78
|
+
sage: eisenstein_series_qexp(12, 5, normalization='constant')
|
|
79
|
+
1 + 65520/691*q + 134250480/691*q^2 + 11606736960/691*q^3 + 274945048560/691*q^4 + O(q^5)
|
|
80
|
+
sage: eisenstein_series_qexp(12, 5, normalization='linear')
|
|
81
|
+
691/65520 + q + 2049*q^2 + 177148*q^3 + 4196353*q^4 + O(q^5)
|
|
82
|
+
sage: eisenstein_series_qexp(12, 50, K=GF(13), normalization='constant')
|
|
83
|
+
1 + O(q^50)
|
|
84
|
+
|
|
85
|
+
TESTS:
|
|
86
|
+
|
|
87
|
+
Test that :issue:`5102` is fixed::
|
|
88
|
+
|
|
89
|
+
sage: eisenstein_series_qexp(10, 30, GF(17))
|
|
90
|
+
15 + q + 3*q^2 + 15*q^3 + 7*q^4 + 13*q^5 + 11*q^6 + 11*q^7 + 15*q^8 + 7*q^9 + 5*q^10 + 7*q^11 + 3*q^12 + 14*q^13 + 16*q^14 + 8*q^15 + 14*q^16 + q^17 + 4*q^18 + 3*q^19 + 6*q^20 + 12*q^21 + 4*q^22 + 12*q^23 + 4*q^24 + 4*q^25 + 8*q^26 + 14*q^27 + 9*q^28 + 6*q^29 + O(q^30)
|
|
91
|
+
|
|
92
|
+
This shows that the bug reported at :issue:`8291` is fixed::
|
|
93
|
+
|
|
94
|
+
sage: eisenstein_series_qexp(26, 10, GF(13))
|
|
95
|
+
7 + q + 3*q^2 + 4*q^3 + 7*q^4 + 6*q^5 + 12*q^6 + 8*q^7 + 2*q^8 + O(q^10)
|
|
96
|
+
|
|
97
|
+
We check that the function behaves properly over finite-characteristic base rings::
|
|
98
|
+
|
|
99
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(691), normalization='integral')
|
|
100
|
+
566*q + 236*q^2 + 286*q^3 + 194*q^4 + O(q^5)
|
|
101
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(691), normalization='constant')
|
|
102
|
+
Traceback (most recent call last):
|
|
103
|
+
...
|
|
104
|
+
ValueError: The numerator of -B_k/(2*k) (=691) must be invertible in the ring Ring of integers modulo 691
|
|
105
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(691), normalization='linear')
|
|
106
|
+
q + 667*q^2 + 252*q^3 + 601*q^4 + O(q^5)
|
|
107
|
+
|
|
108
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(2), normalization='integral')
|
|
109
|
+
1 + O(q^5)
|
|
110
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(2), normalization='constant')
|
|
111
|
+
1 + O(q^5)
|
|
112
|
+
sage: eisenstein_series_qexp(12, 5, K = Zmod(2), normalization='linear')
|
|
113
|
+
Traceback (most recent call last):
|
|
114
|
+
...
|
|
115
|
+
ValueError: The denominator of -B_k/(2*k) (=65520) must be invertible in the ring Ring of integers modulo 2
|
|
116
|
+
|
|
117
|
+
AUTHORS:
|
|
118
|
+
|
|
119
|
+
- William Stein: original implementation
|
|
120
|
+
|
|
121
|
+
- Craig Citro (2007-06-01): rewrote for massive speedup
|
|
122
|
+
|
|
123
|
+
- Martin Raum (2009-08-02): port to cython for speedup
|
|
124
|
+
|
|
125
|
+
- David Loeffler (2010-04-07): work around an integer overflow when `k` is large
|
|
126
|
+
|
|
127
|
+
- David Loeffler (2012-03-15): add options for alternative normalizations
|
|
128
|
+
(motivated by :issue:`12043`)
|
|
129
|
+
"""
|
|
130
|
+
# we use this to prevent computation if it would fail anyway.
|
|
131
|
+
if k <= 0 or k % 2 == 1:
|
|
132
|
+
raise ValueError("k must be positive and even")
|
|
133
|
+
|
|
134
|
+
a0 = - bernoulli(k) / (2*k)
|
|
135
|
+
|
|
136
|
+
if normalization == 'linear':
|
|
137
|
+
a0den = a0.denominator()
|
|
138
|
+
try:
|
|
139
|
+
a0fac = K(1/a0den)
|
|
140
|
+
except ZeroDivisionError:
|
|
141
|
+
raise ValueError("The denominator of -B_k/(2*k) (=%s) must be invertible in the ring %s" % (a0den, K))
|
|
142
|
+
elif normalization == 'constant':
|
|
143
|
+
a0num = a0.numerator()
|
|
144
|
+
try:
|
|
145
|
+
a0fac = K(1/a0num)
|
|
146
|
+
except ZeroDivisionError:
|
|
147
|
+
raise ValueError("The numerator of -B_k/(2*k) (=%s) must be invertible in the ring %s" % (a0num, K))
|
|
148
|
+
elif normalization == 'integral':
|
|
149
|
+
a0fac = None
|
|
150
|
+
else:
|
|
151
|
+
raise ValueError("Normalization (=%s) must be one of 'linear', 'constant', 'integral'" % normalization)
|
|
152
|
+
|
|
153
|
+
R = PowerSeriesRing(K, var)
|
|
154
|
+
if K == QQ and normalization == 'linear':
|
|
155
|
+
ls = Ek_ZZ(k, prec)
|
|
156
|
+
# The following is *dramatically* faster than doing the more natural
|
|
157
|
+
# "R(ls)" would be:
|
|
158
|
+
E = ZZ[var](ls, prec=prec, check=False).change_ring(QQ)
|
|
159
|
+
if len(ls) > 0:
|
|
160
|
+
E._unsafe_mutate(0, a0)
|
|
161
|
+
return R(E, prec)
|
|
162
|
+
# The following is an older slower alternative to the above three lines:
|
|
163
|
+
# return a0fac*R(eisenstein_series_poly(k, prec).list(), prec=prec, check=False)
|
|
164
|
+
else:
|
|
165
|
+
# This used to work with check=False, but that can only be regarded as
|
|
166
|
+
# an improbable lucky miracle. Enabling checking is a noticeable speed
|
|
167
|
+
# regression; the morally right fix would be to expose FLINT's
|
|
168
|
+
# fmpz_poly_to_nmod_poly command (at least for word-sized N).
|
|
169
|
+
if a0fac is not None:
|
|
170
|
+
return a0fac*R(eisenstein_series_poly(k, prec).list(), prec=prec, check=True)
|
|
171
|
+
else:
|
|
172
|
+
return R(eisenstein_series_poly(k, prec).list(), prec=prec, check=True)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def __common_minimal_basering(chi, psi):
|
|
176
|
+
"""
|
|
177
|
+
Find the smallest basering over which chi and psi are valued, and
|
|
178
|
+
return new chi and psi valued in that ring.
|
|
179
|
+
|
|
180
|
+
EXAMPLES::
|
|
181
|
+
|
|
182
|
+
sage: # needs sage.rings.number_field
|
|
183
|
+
sage: sage.modular.modform.eis_series.__common_minimal_basering(DirichletGroup(1)[0], DirichletGroup(1)[0])
|
|
184
|
+
(Dirichlet character modulo 1 of conductor 1,
|
|
185
|
+
Dirichlet character modulo 1 of conductor 1)
|
|
186
|
+
sage: sage.modular.modform.eis_series.__common_minimal_basering(DirichletGroup(3).0, DirichletGroup(5).0)
|
|
187
|
+
(Dirichlet character modulo 3 of conductor 3 mapping 2 |--> -1,
|
|
188
|
+
Dirichlet character modulo 5 of conductor 5 mapping 2 |--> zeta4)
|
|
189
|
+
sage: sage.modular.modform.eis_series.__common_minimal_basering(DirichletGroup(12).0, DirichletGroup(36).0)
|
|
190
|
+
(Dirichlet character modulo 12 of conductor 4 mapping 7 |--> -1, 5 |--> 1,
|
|
191
|
+
Dirichlet character modulo 36 of conductor 4 mapping 19 |--> -1, 29 |--> 1)
|
|
192
|
+
"""
|
|
193
|
+
chi = chi.minimize_base_ring()
|
|
194
|
+
psi = psi.minimize_base_ring()
|
|
195
|
+
n = lcm(chi.base_ring().zeta().multiplicative_order(),
|
|
196
|
+
psi.base_ring().zeta().multiplicative_order())
|
|
197
|
+
if n <= 2:
|
|
198
|
+
K = QQ
|
|
199
|
+
else:
|
|
200
|
+
K = CyclotomicField(n)
|
|
201
|
+
chi = chi.change_ring(K)
|
|
202
|
+
psi = psi.change_ring(K)
|
|
203
|
+
return chi, psi
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def __find_eisen_chars(character, k):
|
|
207
|
+
r"""
|
|
208
|
+
Find all triples `(\psi_1, \psi_2, t)` that give rise to an Eisenstein series of the given weight and character.
|
|
209
|
+
|
|
210
|
+
EXAMPLES::
|
|
211
|
+
|
|
212
|
+
sage: sage.modular.modform.eis_series.__find_eisen_chars(DirichletGroup(36).0, 4)
|
|
213
|
+
[]
|
|
214
|
+
|
|
215
|
+
sage: pars = sage.modular.modform.eis_series.__find_eisen_chars(DirichletGroup(36).0, 5)
|
|
216
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
217
|
+
[((1, 1), (-1, 1), 1),
|
|
218
|
+
((1, 1), (-1, 1), 3),
|
|
219
|
+
((1, 1), (-1, 1), 9),
|
|
220
|
+
((1, -1), (-1, -1), 1),
|
|
221
|
+
((-1, 1), (1, 1), 1),
|
|
222
|
+
((-1, 1), (1, 1), 3),
|
|
223
|
+
((-1, 1), (1, 1), 9),
|
|
224
|
+
((-1, -1), (1, -1), 1)]
|
|
225
|
+
"""
|
|
226
|
+
from sage.misc.verbose import verbose
|
|
227
|
+
|
|
228
|
+
N = character.modulus()
|
|
229
|
+
if character.is_trivial():
|
|
230
|
+
if k % 2:
|
|
231
|
+
return []
|
|
232
|
+
char_inv = ~character
|
|
233
|
+
V = [(character, char_inv, t) for t in divisors(N) if t > 1]
|
|
234
|
+
if k != 2:
|
|
235
|
+
V.insert(0, (character, char_inv, 1))
|
|
236
|
+
if is_squarefree(N):
|
|
237
|
+
return V
|
|
238
|
+
# Now include all pairs (chi,chi^(-1)) such that cond(chi)^2 divides N:
|
|
239
|
+
# TODO: Optimize -- this is presumably way too hard work below.
|
|
240
|
+
G = DirichletGroup(N)
|
|
241
|
+
for chi in G:
|
|
242
|
+
if not chi.is_trivial():
|
|
243
|
+
f = chi.conductor()
|
|
244
|
+
if N % (f**2) == 0:
|
|
245
|
+
chi = chi.minimize_base_ring()
|
|
246
|
+
chi_inv = ~chi
|
|
247
|
+
for t in divisors(N//(f**2)):
|
|
248
|
+
V.insert(0, (chi, chi_inv, t))
|
|
249
|
+
return V
|
|
250
|
+
|
|
251
|
+
eps = character
|
|
252
|
+
if eps(-1) != (-1)**k:
|
|
253
|
+
return []
|
|
254
|
+
eps = eps.maximize_base_ring()
|
|
255
|
+
G = eps.parent()
|
|
256
|
+
|
|
257
|
+
# Find all pairs chi, psi such that:
|
|
258
|
+
#
|
|
259
|
+
# (1) cond(chi)*cond(psi) divides the level, and
|
|
260
|
+
#
|
|
261
|
+
# (2) chi*psi == eps, where eps is the nebentypus character of self.
|
|
262
|
+
#
|
|
263
|
+
# See [Miyake, Modular Forms] Lemma 7.1.1.
|
|
264
|
+
|
|
265
|
+
C = {}
|
|
266
|
+
|
|
267
|
+
t0 = cputime()
|
|
268
|
+
|
|
269
|
+
for e in G:
|
|
270
|
+
m = Integer(e.conductor())
|
|
271
|
+
if m in C:
|
|
272
|
+
C[m].append(e)
|
|
273
|
+
else:
|
|
274
|
+
C[m] = [e]
|
|
275
|
+
|
|
276
|
+
verbose("Enumeration with conductors.", t0)
|
|
277
|
+
|
|
278
|
+
params = []
|
|
279
|
+
for L in divisors(N):
|
|
280
|
+
verbose("divisor %s" % L)
|
|
281
|
+
if L not in C:
|
|
282
|
+
continue
|
|
283
|
+
GL = C[L]
|
|
284
|
+
for R in divisors(N // L):
|
|
285
|
+
if R not in C:
|
|
286
|
+
continue
|
|
287
|
+
GR = C[R]
|
|
288
|
+
for chi in GL:
|
|
289
|
+
for psi in GR:
|
|
290
|
+
if chi*psi == eps:
|
|
291
|
+
chi0, psi0 = __common_minimal_basering(chi, psi)
|
|
292
|
+
for t in divisors(N//(R*L)):
|
|
293
|
+
if k != 1 or (psi0, chi0, t) not in params:
|
|
294
|
+
params.append((chi0, psi0, t))
|
|
295
|
+
return params
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def __find_eisen_chars_gammaH(N, H, k):
|
|
299
|
+
r"""
|
|
300
|
+
Find all triples `(\psi_1, \psi_2, t)` that give rise to an Eisenstein series of weight `k` on
|
|
301
|
+
`\Gamma_H(N)`.
|
|
302
|
+
|
|
303
|
+
EXAMPLES::
|
|
304
|
+
|
|
305
|
+
sage: pars = sage.modular.modform.eis_series.__find_eisen_chars_gammaH(15, [2], 5)
|
|
306
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
307
|
+
[((1, 1), (-1, -1), 1), ((-1, 1), (1, -1), 1), ((1, -1), (-1, 1), 1), ((-1, -1), (1, 1), 1)]
|
|
308
|
+
"""
|
|
309
|
+
params = []
|
|
310
|
+
for chi in DirichletGroup(N):
|
|
311
|
+
if all(chi(h) == 1 for h in H):
|
|
312
|
+
params += __find_eisen_chars(chi, k)
|
|
313
|
+
return params
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def __find_eisen_chars_gamma1(N, k):
|
|
317
|
+
r"""
|
|
318
|
+
Find all triples `(\psi_1, \psi_2, t)` that give rise to an Eisenstein series of weight `k` on
|
|
319
|
+
`\Gamma_1(N)`.
|
|
320
|
+
|
|
321
|
+
EXAMPLES::
|
|
322
|
+
|
|
323
|
+
sage: pars = sage.modular.modform.eis_series.__find_eisen_chars_gamma1(12, 4)
|
|
324
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
325
|
+
[((1, 1), (1, 1), 1),
|
|
326
|
+
((1, 1), (1, 1), 2),
|
|
327
|
+
((1, 1), (1, 1), 3),
|
|
328
|
+
((1, 1), (1, 1), 4),
|
|
329
|
+
((1, 1), (1, 1), 6),
|
|
330
|
+
((1, 1), (1, 1), 12),
|
|
331
|
+
((1, 1), (-1, -1), 1),
|
|
332
|
+
((-1, -1), (1, 1), 1),
|
|
333
|
+
((-1, 1), (1, -1), 1),
|
|
334
|
+
((1, -1), (-1, 1), 1)]
|
|
335
|
+
|
|
336
|
+
sage: pars = sage.modular.modform.eis_series.__find_eisen_chars_gamma1(12, 5)
|
|
337
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
338
|
+
[((1, 1), (-1, 1), 1),
|
|
339
|
+
((1, 1), (-1, 1), 3),
|
|
340
|
+
((-1, 1), (1, 1), 1),
|
|
341
|
+
((-1, 1), (1, 1), 3),
|
|
342
|
+
((1, 1), (1, -1), 1),
|
|
343
|
+
((1, 1), (1, -1), 2),
|
|
344
|
+
((1, 1), (1, -1), 4),
|
|
345
|
+
((1, -1), (1, 1), 1),
|
|
346
|
+
((1, -1), (1, 1), 2),
|
|
347
|
+
((1, -1), (1, 1), 4)]
|
|
348
|
+
"""
|
|
349
|
+
pairs = []
|
|
350
|
+
s = (-1)**k
|
|
351
|
+
G = DirichletGroup(N)
|
|
352
|
+
E = list(G)
|
|
353
|
+
parity = [c(-1) for c in E]
|
|
354
|
+
for i in range(len(E)):
|
|
355
|
+
for j in range(i,len(E)):
|
|
356
|
+
if parity[i]*parity[j] == s and N % (E[i].conductor()*E[j].conductor()) == 0:
|
|
357
|
+
chi, psi = __common_minimal_basering(E[i], E[j])
|
|
358
|
+
if k != 1:
|
|
359
|
+
pairs.append((chi, psi))
|
|
360
|
+
if i != j:
|
|
361
|
+
pairs.append((psi, chi))
|
|
362
|
+
else:
|
|
363
|
+
# if weight is 1 then (chi, psi) and (chi, psi) are the
|
|
364
|
+
# same form
|
|
365
|
+
if psi.is_trivial() and not chi.is_trivial():
|
|
366
|
+
# need to put the trivial character first to get the L-value right
|
|
367
|
+
pairs.append((psi, chi))
|
|
368
|
+
else:
|
|
369
|
+
pairs.append((chi, psi))
|
|
370
|
+
|
|
371
|
+
triples = []
|
|
372
|
+
for chi, psi in pairs:
|
|
373
|
+
c_chi = chi.conductor()
|
|
374
|
+
c_psi = psi.conductor()
|
|
375
|
+
D = divisors(N // (c_chi * c_psi))
|
|
376
|
+
if k == 2 and chi.is_trivial() and psi.is_trivial():
|
|
377
|
+
D.remove(1)
|
|
378
|
+
chi, psi = __common_minimal_basering(chi, psi)
|
|
379
|
+
triples.extend((chi, psi, t) for t in D)
|
|
380
|
+
|
|
381
|
+
return triples
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def eisenstein_series_lseries(weight, prec=53,
|
|
385
|
+
max_imaginary_part=0,
|
|
386
|
+
max_asymp_coeffs=40):
|
|
387
|
+
r"""
|
|
388
|
+
Return the `L`-series of the weight `2k` Eisenstein series `E_{2k}`
|
|
389
|
+
on `\SL_2(\ZZ)`.
|
|
390
|
+
|
|
391
|
+
This actually returns an interface to Tim Dokchitser's program
|
|
392
|
+
for computing with the `L`-series of the Eisenstein series.
|
|
393
|
+
See :class:`~sage.lfunctions.dokchitser.Dokchitser`.
|
|
394
|
+
|
|
395
|
+
INPUT:
|
|
396
|
+
|
|
397
|
+
- ``weight`` -- even integer
|
|
398
|
+
|
|
399
|
+
- ``prec`` -- integer (bits precision)
|
|
400
|
+
|
|
401
|
+
- ``max_imaginary_part`` -- real number
|
|
402
|
+
|
|
403
|
+
- ``max_asymp_coeffs`` -- integer
|
|
404
|
+
|
|
405
|
+
OUTPUT: the `L`-series of the Eisenstein series. This can be
|
|
406
|
+
evaluated at argument `s`, or have
|
|
407
|
+
:meth:`~sage.lfunctions.dokchitser.Dokchitser.derivative` called, etc.
|
|
408
|
+
|
|
409
|
+
EXAMPLES:
|
|
410
|
+
|
|
411
|
+
We compute with the `L`-series of `E_{16}` and then `E_{20}`::
|
|
412
|
+
|
|
413
|
+
sage: L = eisenstein_series_lseries(16)
|
|
414
|
+
sage: L(1)
|
|
415
|
+
-0.291657724743874
|
|
416
|
+
sage: L.derivative(1)
|
|
417
|
+
0.0756072194360656
|
|
418
|
+
sage: L = eisenstein_series_lseries(20)
|
|
419
|
+
sage: L(2)
|
|
420
|
+
-5.02355351645998
|
|
421
|
+
|
|
422
|
+
Now with higher precision::
|
|
423
|
+
|
|
424
|
+
sage: L = eisenstein_series_lseries(20, prec=200)
|
|
425
|
+
sage: L(2)
|
|
426
|
+
-5.0235535164599797471968418348135050804419155747868718371029
|
|
427
|
+
"""
|
|
428
|
+
f = eisenstein_series_qexp(weight, prec)
|
|
429
|
+
from sage.lfunctions.dokchitser import Dokchitser
|
|
430
|
+
j = weight
|
|
431
|
+
L = Dokchitser(conductor=1,
|
|
432
|
+
gammaV=[0, 1],
|
|
433
|
+
weight=j,
|
|
434
|
+
eps=(-1)**Integer(j // 2),
|
|
435
|
+
poles=[j],
|
|
436
|
+
# Using a string for residues is a hack but it works well
|
|
437
|
+
# since this will make PARI/GP compute sqrt(pi) with the
|
|
438
|
+
# right precision.
|
|
439
|
+
residues='[sqrt(Pi)*(%s)]' % ((-1)**Integer(j // 2) * bernoulli(j) / j),
|
|
440
|
+
prec=prec)
|
|
441
|
+
|
|
442
|
+
s = 'coeff = %s;' % f.list()
|
|
443
|
+
L.init_coeffs('coeff[k+1]', pari_precode=s,
|
|
444
|
+
max_imaginary_part=max_imaginary_part,
|
|
445
|
+
max_asymp_coeffs=max_asymp_coeffs)
|
|
446
|
+
L.check_functional_equation()
|
|
447
|
+
L.rename('L-series associated to the weight %s Eisenstein series %s on SL_2(Z)' % (j, f))
|
|
448
|
+
return L
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
def compute_eisenstein_params(character, k):
|
|
452
|
+
r"""
|
|
453
|
+
Compute and return a list of all parameters `(\chi,\psi,t)` that
|
|
454
|
+
define the Eisenstein series with given character and weight `k`.
|
|
455
|
+
|
|
456
|
+
Only the parity of `k` is relevant (unless k = 1, which is a slightly different case).
|
|
457
|
+
|
|
458
|
+
If ``character`` is an integer `N`, then the parameters for
|
|
459
|
+
`\Gamma_1(N)` are computed instead. Then the condition is that
|
|
460
|
+
`\chi(-1)*\psi(-1) =(-1)^k`.
|
|
461
|
+
|
|
462
|
+
If ``character`` is a list of integers, the parameters for `\Gamma_H(N)` are
|
|
463
|
+
computed, where `H` is the subgroup of `(\ZZ/N\ZZ)^\times` generated by the
|
|
464
|
+
integers in the given list.
|
|
465
|
+
|
|
466
|
+
EXAMPLES::
|
|
467
|
+
|
|
468
|
+
sage: sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 3)
|
|
469
|
+
[]
|
|
470
|
+
|
|
471
|
+
sage: pars = sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(30)(1), 4)
|
|
472
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
473
|
+
[((1, 1), (1, 1), 1),
|
|
474
|
+
((1, 1), (1, 1), 2),
|
|
475
|
+
((1, 1), (1, 1), 3),
|
|
476
|
+
((1, 1), (1, 1), 5),
|
|
477
|
+
((1, 1), (1, 1), 6),
|
|
478
|
+
((1, 1), (1, 1), 10),
|
|
479
|
+
((1, 1), (1, 1), 15),
|
|
480
|
+
((1, 1), (1, 1), 30)]
|
|
481
|
+
|
|
482
|
+
sage: pars = sage.modular.modform.eis_series.compute_eisenstein_params(15, 1)
|
|
483
|
+
sage: [(x[0].values_on_gens(), x[1].values_on_gens(), x[2]) for x in pars]
|
|
484
|
+
[((1, 1), (-1, 1), 1),
|
|
485
|
+
((1, 1), (-1, 1), 5),
|
|
486
|
+
((1, 1), (1, zeta4), 1),
|
|
487
|
+
((1, 1), (1, zeta4), 3),
|
|
488
|
+
((1, 1), (-1, -1), 1),
|
|
489
|
+
((1, 1), (1, -zeta4), 1),
|
|
490
|
+
((1, 1), (1, -zeta4), 3),
|
|
491
|
+
((-1, 1), (1, -1), 1)]
|
|
492
|
+
|
|
493
|
+
sage: sage.modular.modform.eis_series.compute_eisenstein_params(DirichletGroup(15).0, 1)
|
|
494
|
+
[(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 1),
|
|
495
|
+
(Dirichlet character modulo 15 of conductor 1 mapping 11 |--> 1, 7 |--> 1, Dirichlet character modulo 15 of conductor 3 mapping 11 |--> -1, 7 |--> 1, 5)]
|
|
496
|
+
|
|
497
|
+
sage: len(sage.modular.modform.eis_series.compute_eisenstein_params(GammaH(15, [4]), 3))
|
|
498
|
+
8
|
|
499
|
+
"""
|
|
500
|
+
if isinstance(character, (int, Integer)):
|
|
501
|
+
return __find_eisen_chars_gamma1(character, k)
|
|
502
|
+
elif isinstance(character, GammaH_class):
|
|
503
|
+
return __find_eisen_chars_gammaH(character.level(), character._generators_for_H(), k)
|
|
504
|
+
else:
|
|
505
|
+
return __find_eisen_chars(character, k)
|