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,514 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.flint
|
|
3
|
+
"""
|
|
4
|
+
Numerical computation of newforms
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# ****************************************************************************
|
|
8
|
+
# Copyright (C) 2004-2006 William Stein <wstein@gmail.com>
|
|
9
|
+
#
|
|
10
|
+
# This program is free software: you can redistribute it and/or modify
|
|
11
|
+
# it under the terms of the GNU General Public License as published by
|
|
12
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
13
|
+
# (at your option) any later version.
|
|
14
|
+
# https://www.gnu.org/licenses/
|
|
15
|
+
# ****************************************************************************
|
|
16
|
+
|
|
17
|
+
from sage.rings.fast_arith import prime_range
|
|
18
|
+
from sage.matrix.constructor import matrix
|
|
19
|
+
from sage.misc.verbose import verbose
|
|
20
|
+
from sage.misc.cachefunc import cached_method
|
|
21
|
+
from sage.misc.prandom import randint
|
|
22
|
+
from sage.modular.arithgroup.all import Gamma0
|
|
23
|
+
from sage.modular.modsym.all import ModularSymbols
|
|
24
|
+
from sage.modules.free_module_element import free_module_element as vector
|
|
25
|
+
from sage.rings.complex_double import CDF
|
|
26
|
+
from sage.rings.integer import Integer
|
|
27
|
+
from sage.rings.rational_field import QQ
|
|
28
|
+
from sage.structure.richcmp import richcmp_method, richcmp
|
|
29
|
+
from sage.structure.sage_object import SageObject
|
|
30
|
+
from sage.structure.sequence import Sequence
|
|
31
|
+
|
|
32
|
+
# This variable controls importing the SciPy library sparingly
|
|
33
|
+
scipy = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@richcmp_method
|
|
37
|
+
class NumericalEigenforms(SageObject):
|
|
38
|
+
"""
|
|
39
|
+
numerical_eigenforms(group, weight=2, eps=1e-20, delta=1e-2, tp=[2,3,5]).
|
|
40
|
+
|
|
41
|
+
INPUT:
|
|
42
|
+
|
|
43
|
+
- ``group`` -- a congruence subgroup of a Dirichlet character of
|
|
44
|
+
order 1 or 2
|
|
45
|
+
|
|
46
|
+
- ``weight`` -- integer >= 2
|
|
47
|
+
|
|
48
|
+
- ``eps`` -- a small float; abs( ) < eps is what "equal to zero" is
|
|
49
|
+
interpreted as for floating point numbers
|
|
50
|
+
|
|
51
|
+
- ``delta`` -- a small-ish float; eigenvalues are considered distinct
|
|
52
|
+
if their difference has absolute value at least delta
|
|
53
|
+
|
|
54
|
+
- ``tp`` -- use the Hecke operators T_p for p in tp when searching
|
|
55
|
+
for a random Hecke operator with distinct Hecke eigenvalues
|
|
56
|
+
|
|
57
|
+
OUTPUT: a numerical eigenforms object, with the following useful methods:
|
|
58
|
+
|
|
59
|
+
- :meth:`ap` -- return all eigenvalues of `T_p`
|
|
60
|
+
|
|
61
|
+
- :meth:`eigenvalues` -- list of eigenvalues corresponding
|
|
62
|
+
to the given list of primes, e.g.,::
|
|
63
|
+
|
|
64
|
+
[[eigenvalues of T_2],
|
|
65
|
+
[eigenvalues of T_3],
|
|
66
|
+
[eigenvalues of T_5], ...]
|
|
67
|
+
|
|
68
|
+
- :meth:`systems_of_eigenvalues` -- list of the systems of
|
|
69
|
+
eigenvalues of eigenforms such that the chosen random linear
|
|
70
|
+
combination of Hecke operators has multiplicity 1 eigenvalues.
|
|
71
|
+
|
|
72
|
+
EXAMPLES::
|
|
73
|
+
|
|
74
|
+
sage: n = numerical_eigenforms(23)
|
|
75
|
+
sage: n == loads(dumps(n))
|
|
76
|
+
True
|
|
77
|
+
sage: n.ap(2) # abs tol 1e-12
|
|
78
|
+
[3.0, -1.6180339887498947, 0.6180339887498968]
|
|
79
|
+
sage: n.systems_of_eigenvalues(7) # abs tol 2e-12
|
|
80
|
+
[[-1.6180339887498947, 2.23606797749979, -3.2360679774997894],
|
|
81
|
+
[0.618033988749895, -2.236067977499788, 1.23606797749979],
|
|
82
|
+
[3.0, 4.0, 6.0]]
|
|
83
|
+
sage: n.systems_of_abs(7) # abs tol 2e-12
|
|
84
|
+
[[0.618033988749895, 2.236067977499788, 1.23606797749979],
|
|
85
|
+
[1.6180339887498947, 2.23606797749979, 3.2360679774997894],
|
|
86
|
+
[3.0, 4.0, 6.0]]
|
|
87
|
+
sage: n.eigenvalues([2,3,5]) # rel tol 2e-12
|
|
88
|
+
[[3.0, -1.6180339887498947, 0.6180339887498968],
|
|
89
|
+
[4.0, 2.2360679774997894, -2.236067977499788],
|
|
90
|
+
[6.0, -3.2360679774997894, 1.2360679774997936]]
|
|
91
|
+
"""
|
|
92
|
+
def __init__(self, group, weight=2, eps=1e-20,
|
|
93
|
+
delta=1e-2, tp=[2,3,5]):
|
|
94
|
+
"""
|
|
95
|
+
Create a new space of numerical eigenforms.
|
|
96
|
+
|
|
97
|
+
EXAMPLES::
|
|
98
|
+
|
|
99
|
+
sage: numerical_eigenforms(61) # indirect doctest
|
|
100
|
+
Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2
|
|
101
|
+
"""
|
|
102
|
+
if isinstance(group, (int, Integer)):
|
|
103
|
+
group = Gamma0(Integer(group))
|
|
104
|
+
self._group = group
|
|
105
|
+
self._weight = Integer(weight)
|
|
106
|
+
self._tp = tp
|
|
107
|
+
if self._weight < 2:
|
|
108
|
+
raise ValueError("weight must be at least 2")
|
|
109
|
+
self._eps = eps
|
|
110
|
+
self._delta = delta
|
|
111
|
+
|
|
112
|
+
def __richcmp__(self, other, op):
|
|
113
|
+
"""
|
|
114
|
+
Compare two spaces of numerical eigenforms.
|
|
115
|
+
|
|
116
|
+
They are considered equal if and only if they come from the
|
|
117
|
+
same space of modular symbols.
|
|
118
|
+
|
|
119
|
+
EXAMPLES::
|
|
120
|
+
|
|
121
|
+
sage: n = numerical_eigenforms(23)
|
|
122
|
+
sage: n == loads(dumps(n))
|
|
123
|
+
True
|
|
124
|
+
"""
|
|
125
|
+
if not isinstance(other, NumericalEigenforms):
|
|
126
|
+
return NotImplemented
|
|
127
|
+
return richcmp(self.modular_symbols(), other.modular_symbols(), op)
|
|
128
|
+
|
|
129
|
+
def level(self):
|
|
130
|
+
"""
|
|
131
|
+
Return the level of this set of modular eigenforms.
|
|
132
|
+
|
|
133
|
+
EXAMPLES::
|
|
134
|
+
|
|
135
|
+
sage: n = numerical_eigenforms(61) ; n.level()
|
|
136
|
+
61
|
|
137
|
+
"""
|
|
138
|
+
return self._group.level()
|
|
139
|
+
|
|
140
|
+
def weight(self):
|
|
141
|
+
"""
|
|
142
|
+
Return the weight of this set of modular eigenforms.
|
|
143
|
+
|
|
144
|
+
EXAMPLES::
|
|
145
|
+
|
|
146
|
+
sage: n = numerical_eigenforms(61) ; n.weight()
|
|
147
|
+
2
|
|
148
|
+
"""
|
|
149
|
+
return self._weight
|
|
150
|
+
|
|
151
|
+
def _repr_(self):
|
|
152
|
+
"""
|
|
153
|
+
Print string representation of ``self``.
|
|
154
|
+
|
|
155
|
+
EXAMPLES::
|
|
156
|
+
|
|
157
|
+
sage: n = numerical_eigenforms(61) ; n
|
|
158
|
+
Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2
|
|
159
|
+
|
|
160
|
+
sage: n._repr_()
|
|
161
|
+
'Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2'
|
|
162
|
+
"""
|
|
163
|
+
return "Numerical Hecke eigenvalues for %s of weight %s" % (
|
|
164
|
+
self._group, self._weight)
|
|
165
|
+
|
|
166
|
+
@cached_method
|
|
167
|
+
def modular_symbols(self):
|
|
168
|
+
"""
|
|
169
|
+
Return the space of modular symbols used for computing this
|
|
170
|
+
set of modular eigenforms.
|
|
171
|
+
|
|
172
|
+
EXAMPLES::
|
|
173
|
+
|
|
174
|
+
sage: n = numerical_eigenforms(61) ; n.modular_symbols()
|
|
175
|
+
Modular Symbols space of dimension 5 for Gamma_0(61) of weight 2 with sign 1 over Rational Field
|
|
176
|
+
"""
|
|
177
|
+
M = ModularSymbols(self._group,
|
|
178
|
+
self._weight, sign=1)
|
|
179
|
+
if M.base_ring() != QQ:
|
|
180
|
+
raise ValueError("modular forms space must be defined over QQ")
|
|
181
|
+
return M
|
|
182
|
+
|
|
183
|
+
@cached_method
|
|
184
|
+
def _eigenvectors(self):
|
|
185
|
+
r"""
|
|
186
|
+
Find numerical approximations to simultaneous eigenvectors in
|
|
187
|
+
self.modular_symbols() for all T_p in self._tp.
|
|
188
|
+
|
|
189
|
+
EXAMPLES::
|
|
190
|
+
|
|
191
|
+
sage: n = numerical_eigenforms(61)
|
|
192
|
+
sage: n._eigenvectors() # random order
|
|
193
|
+
[ 1.0 0.289473640239 0.176788851952 0.336707726757 2.4182243084e-16]
|
|
194
|
+
[ 0 -0.0702748344418 0.491416161212 0.155925712173 0.707106781187]
|
|
195
|
+
[ 0 0.413171180356 0.141163094698 0.0923242547901 0.707106781187]
|
|
196
|
+
[ 0 0.826342360711 0.282326189397 0.18464850958 6.79812569682e-16]
|
|
197
|
+
[ 0 0.2402380858 0.792225196393 0.905370774276 4.70805946682e-16]
|
|
198
|
+
|
|
199
|
+
TESTS:
|
|
200
|
+
|
|
201
|
+
This tests if this routine selects only eigenvectors with
|
|
202
|
+
multiplicity one. Two of the eigenvalues are
|
|
203
|
+
(roughly) -92.21 and -90.30 so if we set ``eps = 2.0``
|
|
204
|
+
then they should compare as equal, causing both eigenvectors
|
|
205
|
+
to be absent from the matrix returned. The remaining eigenvalues
|
|
206
|
+
(ostensibly unique) are visible in the test, which should be
|
|
207
|
+
independent of which eigenvectors are returned, but it does presume
|
|
208
|
+
an ordering of these eigenvectors for the test to succeed.
|
|
209
|
+
This exercises a correction in :issue:`8018`. ::
|
|
210
|
+
|
|
211
|
+
sage: n = numerical_eigenforms(61, eps=2.0)
|
|
212
|
+
sage: evectors = n._eigenvectors()
|
|
213
|
+
sage: evalues = [(matrix((n._hecke_matrix*evectors).column(i))/matrix(evectors.column(i)))[0, 0]
|
|
214
|
+
....: for i in range(evectors.ncols())]
|
|
215
|
+
sage: diff = n._hecke_matrix*evectors - evectors*diagonal_matrix(evalues)
|
|
216
|
+
sage: sum(abs(a) for a in diff.list()) < 1.0e-9
|
|
217
|
+
True
|
|
218
|
+
"""
|
|
219
|
+
verbose('Finding eigenvector basis')
|
|
220
|
+
M = self.modular_symbols()
|
|
221
|
+
|
|
222
|
+
tp = self._tp
|
|
223
|
+
p = tp[0]
|
|
224
|
+
t = M.T(p).matrix()
|
|
225
|
+
for p in tp[1:]:
|
|
226
|
+
t += randint(-50,50)*M.T(p).matrix()
|
|
227
|
+
|
|
228
|
+
self._hecke_matrix = t
|
|
229
|
+
|
|
230
|
+
global scipy
|
|
231
|
+
if scipy is None:
|
|
232
|
+
import scipy
|
|
233
|
+
import scipy.linalg
|
|
234
|
+
evals,eig = scipy.linalg.eig(self._hecke_matrix.numpy(), right=True, left=False)
|
|
235
|
+
B = matrix(eig)
|
|
236
|
+
v = [CDF(evals[i]) for i in range(len(evals))]
|
|
237
|
+
|
|
238
|
+
# Determine the eigenvectors with eigenvalues of multiplicity
|
|
239
|
+
# one, with equality controlled by the value of eps
|
|
240
|
+
# Keep just these eigenvectors
|
|
241
|
+
eps = self._eps
|
|
242
|
+
w = []
|
|
243
|
+
for i in range(len(v)):
|
|
244
|
+
e = v[i]
|
|
245
|
+
uniq = True
|
|
246
|
+
for j in range(len(v)):
|
|
247
|
+
if uniq and i != j and abs(e-v[j]) < eps:
|
|
248
|
+
uniq = False
|
|
249
|
+
if uniq:
|
|
250
|
+
w.append(i)
|
|
251
|
+
return B.matrix_from_columns(w)
|
|
252
|
+
|
|
253
|
+
@cached_method
|
|
254
|
+
def _easy_vector(self):
|
|
255
|
+
"""
|
|
256
|
+
Return a very sparse vector v such that v times the eigenvector matrix
|
|
257
|
+
has all entries nonzero.
|
|
258
|
+
|
|
259
|
+
ALGORITHM:
|
|
260
|
+
|
|
261
|
+
1. Choose row with the most nonzero entries. (put 1 there)
|
|
262
|
+
|
|
263
|
+
2. Consider submatrix of columns corresponding to zero entries
|
|
264
|
+
in row chosen in 1.
|
|
265
|
+
|
|
266
|
+
3. Find row of submatrix with most nonzero entries, and add
|
|
267
|
+
appropriate multiple. Repeat.
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: n = numerical_eigenforms(37)
|
|
272
|
+
sage: n._easy_vector() # slightly random output
|
|
273
|
+
(1.0, 1.0, 0)
|
|
274
|
+
sage: n = numerical_eigenforms(43)
|
|
275
|
+
sage: n._easy_vector() # slightly random output
|
|
276
|
+
(1.0, 0, 1.0, 0)
|
|
277
|
+
sage: n = numerical_eigenforms(125)
|
|
278
|
+
sage: n._easy_vector() # slightly random output
|
|
279
|
+
(0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
280
|
+
"""
|
|
281
|
+
E = self._eigenvectors()
|
|
282
|
+
delta = self._delta
|
|
283
|
+
x = (CDF**E.nrows()).zero_vector()
|
|
284
|
+
if E.nrows() == 0:
|
|
285
|
+
return x
|
|
286
|
+
|
|
287
|
+
def best_row(M):
|
|
288
|
+
"""
|
|
289
|
+
Find the best row among rows of M, i.e. the row
|
|
290
|
+
with the most entries supported outside [-delta, delta].
|
|
291
|
+
|
|
292
|
+
EXAMPLES::
|
|
293
|
+
|
|
294
|
+
sage: numerical_eigenforms(61)._easy_vector() # indirect doctest
|
|
295
|
+
(1.0, 0.0, 0.0, 0.0, 1.0)
|
|
296
|
+
"""
|
|
297
|
+
R = M.rows()
|
|
298
|
+
v = [len(support(r, delta)) for r in R]
|
|
299
|
+
m = max(v)
|
|
300
|
+
i = v.index(m)
|
|
301
|
+
return i, R[i]
|
|
302
|
+
|
|
303
|
+
i, e = best_row(E)
|
|
304
|
+
|
|
305
|
+
x[i] = 1
|
|
306
|
+
|
|
307
|
+
while True:
|
|
308
|
+
s = set(support(e, delta))
|
|
309
|
+
zp = [j for j in range(e.degree()) if j not in s]
|
|
310
|
+
if not zp:
|
|
311
|
+
break
|
|
312
|
+
C = E.matrix_from_columns(zp)
|
|
313
|
+
# best row
|
|
314
|
+
i, f = best_row(C)
|
|
315
|
+
x[i] += 1 # simplistic
|
|
316
|
+
e = x * E
|
|
317
|
+
|
|
318
|
+
self.__easy_vector = x
|
|
319
|
+
return x
|
|
320
|
+
|
|
321
|
+
@cached_method
|
|
322
|
+
def _eigendata(self):
|
|
323
|
+
"""
|
|
324
|
+
Return all eigendata for self._easy_vector().
|
|
325
|
+
|
|
326
|
+
EXAMPLES::
|
|
327
|
+
|
|
328
|
+
sage: numerical_eigenforms(61)._eigendata() # random order
|
|
329
|
+
((1.0, 0.668205013164, 0.219198805797, 0.49263343893, 0.707106781187), (1.0, 1.49654668896, 4.5620686498, 2.02990686579, 1.41421356237), [0, 1], (1.0, 1.0))
|
|
330
|
+
"""
|
|
331
|
+
x = self._easy_vector()
|
|
332
|
+
|
|
333
|
+
B = self._eigenvectors()
|
|
334
|
+
|
|
335
|
+
def phi(y):
|
|
336
|
+
"""
|
|
337
|
+
Take coefficients and a basis, and return that
|
|
338
|
+
linear combination of basis vectors.
|
|
339
|
+
|
|
340
|
+
EXAMPLES::
|
|
341
|
+
|
|
342
|
+
sage: n = numerical_eigenforms(61) # indirect doctest
|
|
343
|
+
sage: n._eigendata() # random order
|
|
344
|
+
((1.0, 0.668205013164, 0.219198805797, 0.49263343893, 0.707106781187), (1.0, 1.49654668896, 4.5620686498, 2.02990686579, 1.41421356237), [0, 1], (1.0, 1.0))
|
|
345
|
+
"""
|
|
346
|
+
return y.element() * B
|
|
347
|
+
|
|
348
|
+
phi_x = phi(x)
|
|
349
|
+
V = phi_x.parent()
|
|
350
|
+
phi_x_inv = V([a**(-1) for a in phi_x])
|
|
351
|
+
eps = self._eps
|
|
352
|
+
nzp = support(x, eps)
|
|
353
|
+
x_nzp = vector(CDF, x.list_from_positions(nzp))
|
|
354
|
+
self.__eigendata = (phi_x, phi_x_inv, nzp, x_nzp)
|
|
355
|
+
return self.__eigendata
|
|
356
|
+
|
|
357
|
+
@cached_method
|
|
358
|
+
def ap(self, p):
|
|
359
|
+
"""
|
|
360
|
+
Return a list of the eigenvalues of the Hecke operator `T_p`
|
|
361
|
+
on all the computed eigenforms. The eigenvalues match up
|
|
362
|
+
between one prime and the next.
|
|
363
|
+
|
|
364
|
+
INPUT:
|
|
365
|
+
|
|
366
|
+
- ``p`` -- integer; a prime number
|
|
367
|
+
|
|
368
|
+
OUTPUT: list of double precision complex numbers
|
|
369
|
+
|
|
370
|
+
EXAMPLES::
|
|
371
|
+
|
|
372
|
+
sage: n = numerical_eigenforms(11,4)
|
|
373
|
+
sage: n.ap(2) # random order
|
|
374
|
+
[9.0, 9.0, 2.73205080757, -0.732050807569]
|
|
375
|
+
sage: n.ap(3) # random order
|
|
376
|
+
[28.0, 28.0, -7.92820323028, 5.92820323028]
|
|
377
|
+
sage: m = n.modular_symbols()
|
|
378
|
+
sage: x = polygen(QQ, 'x')
|
|
379
|
+
sage: m.T(2).charpoly('x').factor()
|
|
380
|
+
(x - 9)^2 * (x^2 - 2*x - 2)
|
|
381
|
+
sage: m.T(3).charpoly('x').factor()
|
|
382
|
+
(x - 28)^2 * (x^2 + 2*x - 47)
|
|
383
|
+
"""
|
|
384
|
+
p = Integer(p)
|
|
385
|
+
if not p.is_prime():
|
|
386
|
+
raise ValueError("p must be a prime")
|
|
387
|
+
return Sequence(self.eigenvalues([p])[0], immutable=True)
|
|
388
|
+
|
|
389
|
+
def eigenvalues(self, primes):
|
|
390
|
+
"""
|
|
391
|
+
Return the eigenvalues of the Hecke operators corresponding
|
|
392
|
+
to the primes in the input list of primes. The eigenvalues
|
|
393
|
+
match up between one prime and the next.
|
|
394
|
+
|
|
395
|
+
INPUT:
|
|
396
|
+
|
|
397
|
+
- ``primes`` -- list of primes
|
|
398
|
+
|
|
399
|
+
OUTPUT: list of lists of eigenvalues
|
|
400
|
+
|
|
401
|
+
EXAMPLES::
|
|
402
|
+
|
|
403
|
+
sage: n = numerical_eigenforms(1,12)
|
|
404
|
+
sage: n.eigenvalues([3,5,13]) # rel tol 2.4e-10
|
|
405
|
+
[[177148.0, 252.00000000001896], [48828126.0, 4830.000000001376], [1792160394038.0, -577737.9999898539]]
|
|
406
|
+
"""
|
|
407
|
+
primes = [Integer(p) for p in primes]
|
|
408
|
+
for p in primes:
|
|
409
|
+
if not p.is_prime():
|
|
410
|
+
raise ValueError('each element of primes must be prime.')
|
|
411
|
+
phi_x, phi_x_inv, nzp, x_nzp = self._eigendata()
|
|
412
|
+
B = self._eigenvectors()
|
|
413
|
+
|
|
414
|
+
def phi(y):
|
|
415
|
+
"""
|
|
416
|
+
Take coefficients and a basis, and return that
|
|
417
|
+
linear combination of basis vectors.
|
|
418
|
+
|
|
419
|
+
EXAMPLES::
|
|
420
|
+
|
|
421
|
+
sage: n = numerical_eigenforms(1,12) # indirect doctest
|
|
422
|
+
sage: n.eigenvalues([3,5,13]) # rel tol 2.4e-10
|
|
423
|
+
[[177148.0, 252.00000000001896], [48828126.0, 4830.000000001376], [1792160394038.0, -577737.9999898539]]
|
|
424
|
+
"""
|
|
425
|
+
return y.element() * B
|
|
426
|
+
|
|
427
|
+
ans = []
|
|
428
|
+
m = self.modular_symbols().ambient_module()
|
|
429
|
+
for p in primes:
|
|
430
|
+
t = m._compute_hecke_matrix_prime(p, nzp)
|
|
431
|
+
w = phi(x_nzp*t)
|
|
432
|
+
ans.append([w[i]*phi_x_inv[i] for i in range(w.degree())])
|
|
433
|
+
return ans
|
|
434
|
+
|
|
435
|
+
def systems_of_eigenvalues(self, bound):
|
|
436
|
+
"""
|
|
437
|
+
Return all systems of eigenvalues for ``self`` for primes
|
|
438
|
+
up to bound.
|
|
439
|
+
|
|
440
|
+
EXAMPLES::
|
|
441
|
+
|
|
442
|
+
sage: numerical_eigenforms(61).systems_of_eigenvalues(10) # rel tol 1e-9
|
|
443
|
+
[[-1.481194304092014,
|
|
444
|
+
0.8060634335253706,
|
|
445
|
+
3.156325174658664,
|
|
446
|
+
0.6751308705666462],
|
|
447
|
+
[-1.0, -2.0, -3.0, 1.0],
|
|
448
|
+
[0.311107817465981,
|
|
449
|
+
2.903211925911551,
|
|
450
|
+
-2.5254275608435184,
|
|
451
|
+
-3.214319743377534],
|
|
452
|
+
[2.1700864866260323,
|
|
453
|
+
-1.7092753594369237,
|
|
454
|
+
-1.6308976138151459,
|
|
455
|
+
-0.460811127189112],
|
|
456
|
+
[3.0, 4.0, 6.0, 8.0]]
|
|
457
|
+
"""
|
|
458
|
+
P = prime_range(bound)
|
|
459
|
+
e = self.eigenvalues(P)
|
|
460
|
+
v = Sequence([], cr=True)
|
|
461
|
+
if len(e) == 0:
|
|
462
|
+
return v
|
|
463
|
+
for i in range(len(e[0])):
|
|
464
|
+
v.append([e[j][i] for j in range(len(e))])
|
|
465
|
+
v.sort()
|
|
466
|
+
v.set_immutable()
|
|
467
|
+
return v
|
|
468
|
+
|
|
469
|
+
def systems_of_abs(self, bound):
|
|
470
|
+
"""
|
|
471
|
+
Return the absolute values of all systems of eigenvalues for
|
|
472
|
+
``self`` for primes up to bound.
|
|
473
|
+
|
|
474
|
+
EXAMPLES::
|
|
475
|
+
|
|
476
|
+
sage: numerical_eigenforms(61).systems_of_abs(10) # rel tol 1e-9
|
|
477
|
+
[[0.311107817465981, 2.903211925911551, 2.5254275608435184, 3.214319743377534],
|
|
478
|
+
[1.0, 2.0, 3.0, 1.0],
|
|
479
|
+
[1.481194304092014,
|
|
480
|
+
0.8060634335253706,
|
|
481
|
+
3.156325174658664,
|
|
482
|
+
0.6751308705666462],
|
|
483
|
+
[2.1700864866260323,
|
|
484
|
+
1.7092753594369237,
|
|
485
|
+
1.6308976138151459,
|
|
486
|
+
0.460811127189112],
|
|
487
|
+
[3.0, 4.0, 6.0, 8.0]]
|
|
488
|
+
"""
|
|
489
|
+
P = prime_range(bound)
|
|
490
|
+
e = self.eigenvalues(P)
|
|
491
|
+
v = Sequence([], cr=True)
|
|
492
|
+
if len(e) == 0:
|
|
493
|
+
return v
|
|
494
|
+
for i in range(len(e[0])):
|
|
495
|
+
v.append([abs(e[j][i]) for j in range(len(e))])
|
|
496
|
+
v.sort()
|
|
497
|
+
v.set_immutable()
|
|
498
|
+
return v
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def support(v, eps):
|
|
502
|
+
"""
|
|
503
|
+
Given a vector `v` and a threshold eps, return all
|
|
504
|
+
indices where `|v|` is larger than eps.
|
|
505
|
+
|
|
506
|
+
EXAMPLES::
|
|
507
|
+
|
|
508
|
+
sage: sage.modular.modform.numerical.support( numerical_eigenforms(61)._easy_vector(), 1.0 )
|
|
509
|
+
[]
|
|
510
|
+
|
|
511
|
+
sage: sage.modular.modform.numerical.support( numerical_eigenforms(61)._easy_vector(), 0.5 )
|
|
512
|
+
[0, 4]
|
|
513
|
+
"""
|
|
514
|
+
return [i for i in range(v.degree()) if abs(v[i]) > eps]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
"""
|
|
3
|
+
Periods of modular forms
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# The following idea just occurred to me.
|
|
7
|
+
# We could use that $\langle T_n(g), x\rangle = \langle g, T_n(x)\rangle$
|
|
8
|
+
# for any Hecke operator $T_n$, so that we only need to compute
|
|
9
|
+
# the period integrals $\langle g, x_i\rangle$. Then we obtain all pairings
|
|
10
|
+
# $\langle T_n(g), x_i \rangle = \langle g , T_n(x_i) \rangle$.
|
|
11
|
+
# Since the $T_n(g)$ span the simple $\T$-module $S_k(\Gamma;\Q)[I]$,
|
|
12
|
+
# this must give all pairings. However, it requires computing
|
|
13
|
+
# only $2d$ pairings instead of $2d^2$ pairings, which is potentially
|
|
14
|
+
# a huge savings when $d$ is large.
|