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,1071 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.libs.pari
|
|
3
|
+
r"""
|
|
4
|
+
Local components of modular forms
|
|
5
|
+
|
|
6
|
+
If `f` is a (new, cuspidal, normalised) modular eigenform, then one can
|
|
7
|
+
associate to `f` an *automorphic representation* `\pi_f` of the group
|
|
8
|
+
`\operatorname{GL}_2(\mathbf{A})` (where `\mathbf{A}` is the adele ring of
|
|
9
|
+
`\QQ`). This object factors as a restricted tensor product of components
|
|
10
|
+
`\pi_{f, v}` for each place of `\QQ`. These are infinite-dimensional
|
|
11
|
+
representations, but they are specified by a finite amount of data, and this
|
|
12
|
+
module provides functions which determine a description of the local factor
|
|
13
|
+
`\pi_{f, p}` at a finite prime `p`.
|
|
14
|
+
|
|
15
|
+
The functions in this module are based on the algorithms described in
|
|
16
|
+
[LW2012]_.
|
|
17
|
+
|
|
18
|
+
AUTHORS:
|
|
19
|
+
|
|
20
|
+
- David Loeffler
|
|
21
|
+
- Jared Weinstein
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
from typing import Self # type: ignore (Python >= 3.11)
|
|
26
|
+
except ImportError:
|
|
27
|
+
from typing_extensions import Self # type: ignore (Python 3.10)
|
|
28
|
+
|
|
29
|
+
from sage.misc.abstract_method import abstract_method
|
|
30
|
+
from sage.misc.cachefunc import cached_method
|
|
31
|
+
from sage.misc.flatten import flatten
|
|
32
|
+
from sage.misc.lazy_import import lazy_import
|
|
33
|
+
from sage.misc.verbose import verbose
|
|
34
|
+
from sage.modular.modform.element import Newform
|
|
35
|
+
from sage.rings.integer_ring import ZZ
|
|
36
|
+
from sage.rings.polynomial.polynomial_ring import polygen
|
|
37
|
+
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
|
|
38
|
+
from sage.structure.sage_object import SageObject
|
|
39
|
+
from sage.structure.sequence import Sequence
|
|
40
|
+
|
|
41
|
+
lazy_import('sage.rings.qqbar', 'QQbar')
|
|
42
|
+
|
|
43
|
+
from .smoothchar import (
|
|
44
|
+
SmoothCharacterGroupQp,
|
|
45
|
+
SmoothCharacterGroupRamifiedQuadratic,
|
|
46
|
+
SmoothCharacterGroupUnramifiedQuadratic,
|
|
47
|
+
)
|
|
48
|
+
from .type_space import TypeSpace
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def LocalComponent(f, p, twist_factor=None):
|
|
52
|
+
r"""
|
|
53
|
+
Calculate the local component at the prime `p` of the automorphic
|
|
54
|
+
representation attached to the newform `f`.
|
|
55
|
+
|
|
56
|
+
INPUT:
|
|
57
|
+
|
|
58
|
+
- ``f`` -- (:class:`~sage.modular.modform.element.Newform`) a newform of weight `k \ge 2`
|
|
59
|
+
- ``p`` -- integer; prime
|
|
60
|
+
- ``twist_factor`` -- integer congruent to `k` modulo 2 (default: `k - 2`)
|
|
61
|
+
|
|
62
|
+
.. NOTE::
|
|
63
|
+
|
|
64
|
+
The argument ``twist_factor`` determines the choice of normalisation: if it is
|
|
65
|
+
set to `j \in \ZZ`, then the central character of `\pi_{f, \ell}` maps `\ell`
|
|
66
|
+
to `\ell^j \varepsilon(\ell)` for almost all `\ell`, where `\varepsilon` is the
|
|
67
|
+
Nebentypus character of `f`.
|
|
68
|
+
|
|
69
|
+
In the analytic theory it is conventional to take `j = 0` (the "Langlands
|
|
70
|
+
normalisation"), so the representation `\pi_f` is unitary; however, this is
|
|
71
|
+
inconvenient for `k` odd, since in this case one needs to choose a square root of `p`
|
|
72
|
+
and thus the map `f \to \pi_{f}` is not Galois-equivariant. Hence we use, by default, the
|
|
73
|
+
"Hecke normalisation" given by `j = k - 2`. This is also the most natural normalisation
|
|
74
|
+
from the perspective of modular symbols.
|
|
75
|
+
|
|
76
|
+
We also adopt a slightly unusual definition of the principal series: we
|
|
77
|
+
define `\pi(\chi_1, \chi_2)` to be the induction from the Borel subgroup of
|
|
78
|
+
the character of the maximal torus `\begin{pmatrix} x & \\ & y
|
|
79
|
+
\end{pmatrix} \mapsto \chi_1(a) \chi_2(b) |a|`, so its central character is
|
|
80
|
+
`z \mapsto \chi_1(z) \chi_2(z) |z|`. Thus `\chi_1 \chi_2` is the
|
|
81
|
+
restriction to `\QQ_p^\times` of the unique character of the id\'ele class
|
|
82
|
+
group mapping `\ell` to `\ell^{k-1} \varepsilon(\ell)` for almost all `\ell`.
|
|
83
|
+
This has the property that the *set* `\{\chi_1, \chi_2\}` also depends
|
|
84
|
+
Galois-equivariantly on `f`.
|
|
85
|
+
|
|
86
|
+
EXAMPLES::
|
|
87
|
+
|
|
88
|
+
sage: Pi = LocalComponent(Newform('49a'), 7); Pi
|
|
89
|
+
Smooth representation of GL_2(Q_7) with conductor 7^2
|
|
90
|
+
sage: Pi.central_character()
|
|
91
|
+
Character of Q_7*, of level 0, mapping 7 |--> 1
|
|
92
|
+
sage: Pi.species()
|
|
93
|
+
'Supercuspidal'
|
|
94
|
+
sage: Pi.characters()
|
|
95
|
+
[Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> -d, 7 |--> 1,
|
|
96
|
+
Character of unramified extension Q_7(s)* (s^2 + 6*s + 3 = 0), of level 1, mapping s |--> d, 7 |--> 1]
|
|
97
|
+
"""
|
|
98
|
+
p = ZZ(p)
|
|
99
|
+
if not p.is_prime():
|
|
100
|
+
raise ValueError( "p must be prime" )
|
|
101
|
+
if not isinstance(f, Newform):
|
|
102
|
+
raise TypeError( "f (=%s of type %s) should be a Newform object" % (f, type(f)) )
|
|
103
|
+
|
|
104
|
+
r = f.level().valuation(p)
|
|
105
|
+
if twist_factor is None:
|
|
106
|
+
twist_factor = ZZ(f.weight() - 2)
|
|
107
|
+
else:
|
|
108
|
+
twist_factor = ZZ(twist_factor)
|
|
109
|
+
if r == 0:
|
|
110
|
+
return UnramifiedPrincipalSeries(f, p, twist_factor)
|
|
111
|
+
c = ZZ(f.character().conductor()).valuation(p)
|
|
112
|
+
if f[p] != 0:
|
|
113
|
+
if c == r:
|
|
114
|
+
return PrimitivePrincipalSeries(f, p, twist_factor)
|
|
115
|
+
if c == 0 and r == 1:
|
|
116
|
+
return PrimitiveSpecial(f, p, twist_factor)
|
|
117
|
+
|
|
118
|
+
g, chi = f.minimal_twist(p)
|
|
119
|
+
if g == f:
|
|
120
|
+
return PrimitiveSupercuspidal(f, p, twist_factor)
|
|
121
|
+
|
|
122
|
+
mintwist = LocalComponent(g, p, twist_factor)
|
|
123
|
+
return ImprimitiveLocalComponent(f, p, twist_factor, mintwist, chi)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class LocalComponentBase(SageObject):
|
|
127
|
+
r"""
|
|
128
|
+
Base class for local components of newforms. Not to be directly instantiated; use the :func:`~LocalComponent` constructor function.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
def __init__(self, newform, prime, twist_factor):
|
|
132
|
+
r"""
|
|
133
|
+
Standard initialisation function.
|
|
134
|
+
|
|
135
|
+
EXAMPLES::
|
|
136
|
+
|
|
137
|
+
sage: LocalComponent(Newform('49a'), 7) # indirect doctest
|
|
138
|
+
Smooth representation of GL_2(Q_7) with conductor 7^2
|
|
139
|
+
"""
|
|
140
|
+
self._p = prime
|
|
141
|
+
self._f = newform
|
|
142
|
+
self._twist_factor = twist_factor
|
|
143
|
+
|
|
144
|
+
@abstract_method
|
|
145
|
+
def species(self):
|
|
146
|
+
r"""
|
|
147
|
+
The species of this local component, which is either 'Principal
|
|
148
|
+
Series', 'Special' or 'Supercuspidal'.
|
|
149
|
+
|
|
150
|
+
EXAMPLES::
|
|
151
|
+
|
|
152
|
+
sage: from sage.modular.local_comp.local_comp import LocalComponentBase
|
|
153
|
+
sage: LocalComponentBase(Newform('50a'), 3, 0).species()
|
|
154
|
+
Traceback (most recent call last):
|
|
155
|
+
...
|
|
156
|
+
NotImplementedError: <abstract method species at ...>
|
|
157
|
+
"""
|
|
158
|
+
pass
|
|
159
|
+
|
|
160
|
+
@abstract_method
|
|
161
|
+
def check_tempered(self):
|
|
162
|
+
r"""
|
|
163
|
+
Check that this representation is quasi-tempered, i.e. `\pi \otimes
|
|
164
|
+
|\det|^{j/2}` is tempered. It is well known that local components of
|
|
165
|
+
modular forms are *always* tempered, so this serves as a useful check
|
|
166
|
+
on our computations.
|
|
167
|
+
|
|
168
|
+
EXAMPLES::
|
|
169
|
+
|
|
170
|
+
sage: from sage.modular.local_comp.local_comp import LocalComponentBase
|
|
171
|
+
sage: LocalComponentBase(Newform('50a'), 3, 0).check_tempered()
|
|
172
|
+
Traceback (most recent call last):
|
|
173
|
+
...
|
|
174
|
+
NotImplementedError: <abstract method check_tempered at ...>
|
|
175
|
+
"""
|
|
176
|
+
pass
|
|
177
|
+
|
|
178
|
+
def _repr_(self):
|
|
179
|
+
r"""
|
|
180
|
+
String representation of ``self``.
|
|
181
|
+
|
|
182
|
+
EXAMPLES::
|
|
183
|
+
|
|
184
|
+
sage: LocalComponent(Newform('50a'), 5)._repr_()
|
|
185
|
+
'Smooth representation of GL_2(Q_5) with conductor 5^2'
|
|
186
|
+
"""
|
|
187
|
+
return "Smooth representation of GL_2(Q_%s) with conductor %s^%s" % (self.prime(), self.prime(), self.conductor())
|
|
188
|
+
|
|
189
|
+
def newform(self):
|
|
190
|
+
r"""
|
|
191
|
+
The newform of which this is a local component.
|
|
192
|
+
|
|
193
|
+
EXAMPLES::
|
|
194
|
+
|
|
195
|
+
sage: LocalComponent(Newform('50a'), 5).newform()
|
|
196
|
+
q - q^2 + q^3 + q^4 + O(q^6)
|
|
197
|
+
"""
|
|
198
|
+
return self._f
|
|
199
|
+
|
|
200
|
+
def prime(self):
|
|
201
|
+
r"""
|
|
202
|
+
The prime at which this is a local component.
|
|
203
|
+
|
|
204
|
+
EXAMPLES::
|
|
205
|
+
|
|
206
|
+
sage: LocalComponent(Newform('50a'), 5).prime()
|
|
207
|
+
5
|
|
208
|
+
"""
|
|
209
|
+
return self._p
|
|
210
|
+
|
|
211
|
+
def conductor(self):
|
|
212
|
+
r"""
|
|
213
|
+
The smallest `r` such that this representation has a nonzero vector fixed by the subgroup
|
|
214
|
+
`\begin{pmatrix} * & * \\ 0 & 1\end{pmatrix} \pmod{p^r}`. This is equal to the power of `p` dividing the level of the corresponding newform.
|
|
215
|
+
|
|
216
|
+
EXAMPLES::
|
|
217
|
+
|
|
218
|
+
sage: LocalComponent(Newform('50a'), 5).conductor()
|
|
219
|
+
2
|
|
220
|
+
"""
|
|
221
|
+
return self.newform().level().valuation(self.prime())
|
|
222
|
+
|
|
223
|
+
def coefficient_field(self):
|
|
224
|
+
r"""
|
|
225
|
+
The field `K` over which this representation is defined. This is the field generated by the Hecke eigenvalues of the corresponding newform (over whatever base ring the newform is created).
|
|
226
|
+
|
|
227
|
+
EXAMPLES::
|
|
228
|
+
|
|
229
|
+
sage: LocalComponent(Newforms(50)[0], 3).coefficient_field()
|
|
230
|
+
Rational Field
|
|
231
|
+
sage: LocalComponent(Newforms(Gamma1(10), 3, base_ring=QQbar)[0], 5).coefficient_field()
|
|
232
|
+
Algebraic Field
|
|
233
|
+
sage: LocalComponent(Newforms(DirichletGroup(5).0, 7,names='c')[0], 5).coefficient_field()
|
|
234
|
+
Number Field in c0 with defining polynomial x^2 + (5*zeta4 + 5)*x - 88*zeta4 over its base field
|
|
235
|
+
"""
|
|
236
|
+
return self.newform().hecke_eigenvalue_field()
|
|
237
|
+
|
|
238
|
+
def twist_factor(self):
|
|
239
|
+
r"""
|
|
240
|
+
The unique `j` such that `\begin{pmatrix} p & 0 \\ 0 & p\end{pmatrix}`
|
|
241
|
+
acts as multiplication by `p^j` times a root of unity.
|
|
242
|
+
|
|
243
|
+
There are various conventions for this; see the documentation of the
|
|
244
|
+
:func:`~LocalComponent` constructor function for more information.
|
|
245
|
+
|
|
246
|
+
The twist factor should have the same parity as the weight of the form,
|
|
247
|
+
since otherwise the map sending `f` to its local component won't be
|
|
248
|
+
Galois equivariant.
|
|
249
|
+
|
|
250
|
+
EXAMPLES::
|
|
251
|
+
|
|
252
|
+
sage: LocalComponent(Newforms(50)[0], 3).twist_factor()
|
|
253
|
+
0
|
|
254
|
+
sage: LocalComponent(Newforms(50)[0], 3, twist_factor=173).twist_factor()
|
|
255
|
+
173
|
|
256
|
+
"""
|
|
257
|
+
return self._twist_factor
|
|
258
|
+
|
|
259
|
+
def central_character(self):
|
|
260
|
+
r"""
|
|
261
|
+
Return the central character of this representation. This is the
|
|
262
|
+
restriction to `\QQ_p^\times` of the unique smooth character `\omega`
|
|
263
|
+
of `\mathbf{A}^\times / \QQ^\times` such that `\omega(\varpi_\ell) =
|
|
264
|
+
\ell^j \varepsilon(\ell)` for all primes `\ell \nmid Np`, where
|
|
265
|
+
`\varpi_\ell` is a uniformiser at `\ell`, `\varepsilon` is the
|
|
266
|
+
Nebentypus character of the newform `f`, and `j` is the twist factor
|
|
267
|
+
(see the documentation for :func:`~LocalComponent`).
|
|
268
|
+
|
|
269
|
+
EXAMPLES::
|
|
270
|
+
|
|
271
|
+
sage: LocalComponent(Newform('27a'), 3).central_character()
|
|
272
|
+
Character of Q_3*, of level 0, mapping 3 |--> 1
|
|
273
|
+
|
|
274
|
+
sage: LocalComponent(Newforms(Gamma1(5), 5, names='c')[0], 5).central_character()
|
|
275
|
+
Character of Q_5*, of level 1, mapping 2 |--> c0 + 1, 5 |--> 125
|
|
276
|
+
|
|
277
|
+
sage: LocalComponent(Newforms(DirichletGroup(24)([1, -1,-1]), 3, names='a')[0], 2).central_character()
|
|
278
|
+
Character of Q_2*, of level 3, mapping 7 |--> 1, 5 |--> -1, 2 |--> -2
|
|
279
|
+
"""
|
|
280
|
+
G = SmoothCharacterGroupQp(self.prime(), self.coefficient_field())
|
|
281
|
+
eps = G.from_dirichlet(self.newform().character())
|
|
282
|
+
return eps / G.norm_character()**self.twist_factor()
|
|
283
|
+
|
|
284
|
+
def __eq__(self, other):
|
|
285
|
+
r"""
|
|
286
|
+
Comparison function.
|
|
287
|
+
|
|
288
|
+
EXAMPLES::
|
|
289
|
+
|
|
290
|
+
sage: Pi = LocalComponent(Newform("50a"), 5)
|
|
291
|
+
sage: Pi == LocalComponent(Newform("50a"), 3)
|
|
292
|
+
False
|
|
293
|
+
sage: Pi == LocalComponent(Newform("50b"), 5)
|
|
294
|
+
False
|
|
295
|
+
sage: Pi == QQ
|
|
296
|
+
False
|
|
297
|
+
sage: Pi == None
|
|
298
|
+
False
|
|
299
|
+
sage: Pi == loads(dumps(Pi))
|
|
300
|
+
True
|
|
301
|
+
"""
|
|
302
|
+
return (isinstance(other, LocalComponentBase)
|
|
303
|
+
and self.prime() == other.prime()
|
|
304
|
+
and self.newform() == other.newform()
|
|
305
|
+
and self.twist_factor() == other.twist_factor())
|
|
306
|
+
|
|
307
|
+
def __ne__(self, other):
|
|
308
|
+
"""
|
|
309
|
+
Return ``True`` if ``self != other``.
|
|
310
|
+
|
|
311
|
+
EXAMPLES::
|
|
312
|
+
|
|
313
|
+
sage: Pi = LocalComponent(Newform("50a"), 5)
|
|
314
|
+
sage: Pi != LocalComponent(Newform("50a"), 3)
|
|
315
|
+
True
|
|
316
|
+
sage: Pi != LocalComponent(Newform("50b"), 5)
|
|
317
|
+
True
|
|
318
|
+
sage: Pi != QQ
|
|
319
|
+
True
|
|
320
|
+
sage: Pi != None
|
|
321
|
+
True
|
|
322
|
+
sage: Pi != loads(dumps(Pi))
|
|
323
|
+
False
|
|
324
|
+
"""
|
|
325
|
+
return not (self == other)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
class PrimitiveLocalComponent(LocalComponentBase):
|
|
329
|
+
r"""
|
|
330
|
+
Base class for primitive (twist-minimal) local components.
|
|
331
|
+
"""
|
|
332
|
+
|
|
333
|
+
def is_primitive(self) -> bool:
|
|
334
|
+
r"""
|
|
335
|
+
Return ``True`` if this local component is primitive (has minimal level
|
|
336
|
+
among its character twists).
|
|
337
|
+
|
|
338
|
+
EXAMPLES::
|
|
339
|
+
|
|
340
|
+
sage: Newform("50a").local_component(5).is_primitive()
|
|
341
|
+
True
|
|
342
|
+
"""
|
|
343
|
+
return True
|
|
344
|
+
|
|
345
|
+
def minimal_twist(self) -> Self:
|
|
346
|
+
r"""
|
|
347
|
+
Return a twist of this local component which has the minimal possible
|
|
348
|
+
conductor.
|
|
349
|
+
|
|
350
|
+
EXAMPLES::
|
|
351
|
+
|
|
352
|
+
sage: Pi = Newform("50a").local_component(5)
|
|
353
|
+
sage: Pi.minimal_twist() == Pi
|
|
354
|
+
True
|
|
355
|
+
"""
|
|
356
|
+
return self
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class PrincipalSeries(PrimitiveLocalComponent):
|
|
360
|
+
r"""
|
|
361
|
+
A principal series representation. This is an abstract base class, not to
|
|
362
|
+
be instantiated directly; see the subclasses
|
|
363
|
+
:class:`~UnramifiedPrincipalSeries` and :class:`~PrimitivePrincipalSeries`.
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
def species(self):
|
|
367
|
+
r"""
|
|
368
|
+
The species of this local component, which is either 'Principal
|
|
369
|
+
Series', 'Special' or 'Supercuspidal'.
|
|
370
|
+
|
|
371
|
+
EXAMPLES::
|
|
372
|
+
|
|
373
|
+
sage: LocalComponent(Newform('50a'), 3).species()
|
|
374
|
+
'Principal Series'
|
|
375
|
+
"""
|
|
376
|
+
return "Principal Series"
|
|
377
|
+
|
|
378
|
+
def check_tempered(self):
|
|
379
|
+
r"""
|
|
380
|
+
Check that this representation is tempered (after twisting by
|
|
381
|
+
`|\det|^{j/2}`), i.e. that `|\chi_1(p)| = |\chi_2(p)| = p^{(j + 1)/2}`.
|
|
382
|
+
This follows from the Ramanujan--Petersson conjecture, as proved by
|
|
383
|
+
Deligne.
|
|
384
|
+
|
|
385
|
+
EXAMPLES::
|
|
386
|
+
|
|
387
|
+
sage: LocalComponent(Newform('49a'), 3).check_tempered()
|
|
388
|
+
"""
|
|
389
|
+
c1, c2 = self.characters()
|
|
390
|
+
K = c1.base_ring()
|
|
391
|
+
p = self.prime()
|
|
392
|
+
w = QQbar(p)**((1 + self.twist_factor()) / 2)
|
|
393
|
+
for sigma in K.embeddings(QQbar):
|
|
394
|
+
assert sigma(c1(p)).abs() == sigma(c2(p)).abs() == w
|
|
395
|
+
|
|
396
|
+
@abstract_method
|
|
397
|
+
def characters(self):
|
|
398
|
+
r"""
|
|
399
|
+
Return the two characters `(\chi_1, \chi_2)` such this representation
|
|
400
|
+
`\pi_{f, p}` is equal to the principal series `\pi(\chi_1, \chi_2)`.
|
|
401
|
+
|
|
402
|
+
EXAMPLES::
|
|
403
|
+
|
|
404
|
+
sage: from sage.modular.local_comp.local_comp import PrincipalSeries
|
|
405
|
+
sage: PrincipalSeries(Newform('50a'), 3, 0).characters()
|
|
406
|
+
Traceback (most recent call last):
|
|
407
|
+
...
|
|
408
|
+
NotImplementedError: <abstract method characters at ...>
|
|
409
|
+
"""
|
|
410
|
+
pass
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
class UnramifiedPrincipalSeries(PrincipalSeries):
|
|
414
|
+
r"""
|
|
415
|
+
An unramified principal series representation of `{\rm GL}_2(\QQ_p)`
|
|
416
|
+
(corresponding to a form whose level is not divisible by `p`).
|
|
417
|
+
|
|
418
|
+
EXAMPLES::
|
|
419
|
+
|
|
420
|
+
sage: Pi = LocalComponent(Newform('50a'), 3)
|
|
421
|
+
sage: Pi.conductor()
|
|
422
|
+
0
|
|
423
|
+
sage: type(Pi)
|
|
424
|
+
<class 'sage.modular.local_comp.local_comp.UnramifiedPrincipalSeries'>
|
|
425
|
+
sage: TestSuite(Pi).run()
|
|
426
|
+
"""
|
|
427
|
+
|
|
428
|
+
def satake_polynomial(self):
|
|
429
|
+
r"""
|
|
430
|
+
Return the Satake polynomial of this representation, i.e.~the polynomial whose roots are `\chi_1(p), \chi_2(p)`
|
|
431
|
+
where this representation is `\pi(\chi_1, \chi_2)`. Concretely, this is the polynomial
|
|
432
|
+
|
|
433
|
+
.. MATH::
|
|
434
|
+
|
|
435
|
+
X^2 - p^{(j - k + 2)/2} a_p(f) X + p^{j + 1} \varepsilon(p)`.
|
|
436
|
+
|
|
437
|
+
An error will be raised if `j \ne k \bmod 2`.
|
|
438
|
+
|
|
439
|
+
EXAMPLES::
|
|
440
|
+
|
|
441
|
+
sage: LocalComponent(Newform('11a'), 17).satake_polynomial()
|
|
442
|
+
X^2 + 2*X + 17
|
|
443
|
+
sage: LocalComponent(Newform('11a'), 17, twist_factor = -2).satake_polynomial()
|
|
444
|
+
X^2 + 2/17*X + 1/17
|
|
445
|
+
"""
|
|
446
|
+
p = self.prime()
|
|
447
|
+
return PolynomialRing(self.coefficient_field(), 'X')([
|
|
448
|
+
self.central_character()(p)*p,
|
|
449
|
+
-self.newform()[p] * p**((self.twist_factor() - self.newform().weight() + 2)/2),
|
|
450
|
+
1
|
|
451
|
+
])
|
|
452
|
+
|
|
453
|
+
def characters(self):
|
|
454
|
+
r"""
|
|
455
|
+
Return the two characters `(\chi_1, \chi_2)` such this representation
|
|
456
|
+
`\pi_{f, p}` is equal to the principal series `\pi(\chi_1, \chi_2)`.
|
|
457
|
+
These are the unramified characters mapping `p` to the roots of the Satake polynomial,
|
|
458
|
+
so in most cases (but not always) they will be defined over an
|
|
459
|
+
extension of the coefficient field of ``self``.
|
|
460
|
+
|
|
461
|
+
EXAMPLES::
|
|
462
|
+
|
|
463
|
+
sage: LocalComponent(Newform('11a'), 17).characters()
|
|
464
|
+
[Character of Q_17*, of level 0, mapping 17 |--> d,
|
|
465
|
+
Character of Q_17*, of level 0, mapping 17 |--> -d - 2]
|
|
466
|
+
sage: LocalComponent(Newforms(Gamma1(5), 6, names='a')[1], 3).characters()
|
|
467
|
+
[Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 + 12,
|
|
468
|
+
Character of Q_3*, of level 0, mapping 3 |--> -3/2*a1 - 12]
|
|
469
|
+
"""
|
|
470
|
+
f = self.satake_polynomial()
|
|
471
|
+
if not f.is_irreducible():
|
|
472
|
+
# This can happen; see the second example above
|
|
473
|
+
d = f.roots()[0][0]
|
|
474
|
+
else:
|
|
475
|
+
d = self.coefficient_field().extension(f, 'd').gen()
|
|
476
|
+
G = SmoothCharacterGroupQp(self.prime(), d.parent())
|
|
477
|
+
return Sequence([G.character(0, [d]), G.character(0, [self.newform()[self.prime()] - d])], cr=True, universe=G)
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
class PrimitivePrincipalSeries(PrincipalSeries):
|
|
481
|
+
r"""
|
|
482
|
+
A ramified principal series of the form `\pi(\chi_1, \chi_2)`
|
|
483
|
+
where `\chi_1` is unramified but `\chi_2` is not.
|
|
484
|
+
|
|
485
|
+
EXAMPLES::
|
|
486
|
+
|
|
487
|
+
sage: Pi = LocalComponent(Newforms(Gamma1(13), 2, names='a')[0], 13)
|
|
488
|
+
sage: type(Pi)
|
|
489
|
+
<class 'sage.modular.local_comp.local_comp.PrimitivePrincipalSeries'>
|
|
490
|
+
sage: TestSuite(Pi).run()
|
|
491
|
+
"""
|
|
492
|
+
|
|
493
|
+
def characters(self):
|
|
494
|
+
r"""
|
|
495
|
+
Return the two characters `(\chi_1, \chi_2)` such that the local component `\pi_{f, p}` is the induction of the character `\chi_1 \times \chi_2` of the Borel subgroup.
|
|
496
|
+
|
|
497
|
+
EXAMPLES::
|
|
498
|
+
|
|
499
|
+
sage: LocalComponent(Newforms(Gamma1(13), 2, names='a')[0], 13).characters()
|
|
500
|
+
[Character of Q_13*, of level 0, mapping 13 |--> 3*a0 + 2,
|
|
501
|
+
Character of Q_13*, of level 1, mapping 2 |--> a0 + 2, 13 |--> -3*a0 - 7]
|
|
502
|
+
"""
|
|
503
|
+
G = SmoothCharacterGroupQp(self.prime(), self.coefficient_field())
|
|
504
|
+
t = ZZ((self.newform().weight() - 2 - self.twist_factor()) / 2)
|
|
505
|
+
chi1 = G.character(0, [self.newform()[self.prime()]]) * G.norm_character()**t
|
|
506
|
+
chi2 = G.character(0, [self.prime()]) * self.central_character() / chi1
|
|
507
|
+
return Sequence([chi1, chi2], cr=True, universe=G)
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
class PrimitiveSpecial(PrimitiveLocalComponent):
|
|
511
|
+
r"""
|
|
512
|
+
A primitive special representation: that is, the Steinberg representation
|
|
513
|
+
twisted by an unramified character. All such representations have conductor
|
|
514
|
+
1.
|
|
515
|
+
|
|
516
|
+
EXAMPLES::
|
|
517
|
+
|
|
518
|
+
sage: Pi = LocalComponent(Newform('37a'), 37)
|
|
519
|
+
sage: Pi.species()
|
|
520
|
+
'Special'
|
|
521
|
+
sage: Pi.conductor()
|
|
522
|
+
1
|
|
523
|
+
sage: type(Pi)
|
|
524
|
+
<class 'sage.modular.local_comp.local_comp.PrimitiveSpecial'>
|
|
525
|
+
sage: TestSuite(Pi).run()
|
|
526
|
+
"""
|
|
527
|
+
|
|
528
|
+
def species(self):
|
|
529
|
+
r"""
|
|
530
|
+
The species of this local component, which is either 'Principal
|
|
531
|
+
Series', 'Special' or 'Supercuspidal'.
|
|
532
|
+
|
|
533
|
+
EXAMPLES::
|
|
534
|
+
|
|
535
|
+
sage: LocalComponent(Newform('37a'), 37).species()
|
|
536
|
+
'Special'
|
|
537
|
+
"""
|
|
538
|
+
return "Special"
|
|
539
|
+
|
|
540
|
+
def characters(self):
|
|
541
|
+
r"""
|
|
542
|
+
Return the defining characters of this representation. In this case, it
|
|
543
|
+
will return the unique unramified character `\chi` of `\QQ_p^\times`
|
|
544
|
+
such that this representation is equal to `\mathrm{St} \otimes \chi`,
|
|
545
|
+
where `\mathrm{St}` is the Steinberg representation (defined as the
|
|
546
|
+
quotient of the parabolic induction of the trivial character by its
|
|
547
|
+
trivial subrepresentation).
|
|
548
|
+
|
|
549
|
+
EXAMPLES:
|
|
550
|
+
|
|
551
|
+
Our first example is the newform corresponding to an elliptic curve of
|
|
552
|
+
conductor `37`. This is the nontrivial quadratic twist of Steinberg,
|
|
553
|
+
corresponding to the fact that the elliptic curve has non-split
|
|
554
|
+
multiplicative reduction at 37::
|
|
555
|
+
|
|
556
|
+
sage: LocalComponent(Newform('37a'), 37).characters()
|
|
557
|
+
[Character of Q_37*, of level 0, mapping 37 |--> -1]
|
|
558
|
+
|
|
559
|
+
We try an example in odd weight, where the central character isn't
|
|
560
|
+
trivial::
|
|
561
|
+
|
|
562
|
+
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7); Pi.characters()
|
|
563
|
+
[Character of Q_7*, of level 0, mapping 7 |--> -1/2*j0^2 - 7/2]
|
|
564
|
+
sage: Pi.characters()[0] ^2 == Pi.central_character()
|
|
565
|
+
True
|
|
566
|
+
|
|
567
|
+
An example using a non-standard twist factor::
|
|
568
|
+
|
|
569
|
+
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7, twist_factor=3); Pi.characters()
|
|
570
|
+
[Character of Q_7*, of level 0, mapping 7 |--> -7/2*j0^2 - 49/2]
|
|
571
|
+
sage: Pi.characters()[0]^2 == Pi.central_character()
|
|
572
|
+
True
|
|
573
|
+
"""
|
|
574
|
+
|
|
575
|
+
return [SmoothCharacterGroupQp(self.prime(), self.coefficient_field()).character(0, [self.newform()[self.prime()] * self.prime() ** ((self.twist_factor() - self.newform().weight() + 2)/2)])]
|
|
576
|
+
|
|
577
|
+
def check_tempered(self):
|
|
578
|
+
r"""
|
|
579
|
+
Check that this representation is tempered (after twisting by
|
|
580
|
+
`|\det|^{j/2}` where `j` is the twist factor). Since local components
|
|
581
|
+
of modular forms are always tempered, this is a useful check on our
|
|
582
|
+
calculations.
|
|
583
|
+
|
|
584
|
+
EXAMPLES::
|
|
585
|
+
|
|
586
|
+
sage: Pi = LocalComponent(Newforms(DirichletGroup(21)([-1, 1]), 3, names='j')[0], 7)
|
|
587
|
+
sage: Pi.check_tempered()
|
|
588
|
+
"""
|
|
589
|
+
c1 = self.characters()[0]
|
|
590
|
+
K = c1.base_ring()
|
|
591
|
+
p = self.prime()
|
|
592
|
+
w = QQbar(p)**(self.twist_factor() / ZZ(2))
|
|
593
|
+
for sigma in K.embeddings(QQbar):
|
|
594
|
+
assert sigma(c1(p)).abs() == w
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
class PrimitiveSupercuspidal(PrimitiveLocalComponent):
|
|
598
|
+
r"""
|
|
599
|
+
A primitive supercuspidal representation.
|
|
600
|
+
|
|
601
|
+
Except for some exceptional cases when `p = 2` which we do not implement
|
|
602
|
+
here, such representations are parametrized by smooth characters of tamely
|
|
603
|
+
ramified quadratic extensions of `\QQ_p`.
|
|
604
|
+
|
|
605
|
+
EXAMPLES::
|
|
606
|
+
|
|
607
|
+
sage: f = Newform("50a")
|
|
608
|
+
sage: Pi = LocalComponent(f, 5)
|
|
609
|
+
sage: type(Pi)
|
|
610
|
+
<class 'sage.modular.local_comp.local_comp.PrimitiveSupercuspidal'>
|
|
611
|
+
sage: Pi.species()
|
|
612
|
+
'Supercuspidal'
|
|
613
|
+
sage: TestSuite(Pi).run()
|
|
614
|
+
"""
|
|
615
|
+
|
|
616
|
+
def species(self):
|
|
617
|
+
r"""
|
|
618
|
+
The species of this local component, which is either 'Principal
|
|
619
|
+
Series', 'Special' or 'Supercuspidal'.
|
|
620
|
+
|
|
621
|
+
EXAMPLES::
|
|
622
|
+
|
|
623
|
+
sage: LocalComponent(Newform('49a'), 7).species()
|
|
624
|
+
'Supercuspidal'
|
|
625
|
+
"""
|
|
626
|
+
return "Supercuspidal"
|
|
627
|
+
|
|
628
|
+
@cached_method
|
|
629
|
+
def type_space(self):
|
|
630
|
+
r"""
|
|
631
|
+
Return a :class:`~sage.modular.local_comp.type_space.TypeSpace` object
|
|
632
|
+
describing the (homological) type space of this newform, which we know
|
|
633
|
+
is dual to the type space of the local component.
|
|
634
|
+
|
|
635
|
+
EXAMPLES::
|
|
636
|
+
|
|
637
|
+
sage: LocalComponent(Newform('49a'), 7).type_space()
|
|
638
|
+
6-dimensional type space at prime 7 of form q + q^2 - q^4 + O(q^6)
|
|
639
|
+
"""
|
|
640
|
+
return TypeSpace(self.newform(), self.prime())
|
|
641
|
+
|
|
642
|
+
def characters(self):
|
|
643
|
+
r"""
|
|
644
|
+
Return the two conjugate characters of `K^\times`, where `K` is some
|
|
645
|
+
quadratic extension of `\QQ_p`, defining this representation. An error
|
|
646
|
+
will be raised in some 2-adic cases, since not all 2-adic supercuspidal
|
|
647
|
+
representations arise in this way.
|
|
648
|
+
|
|
649
|
+
EXAMPLES:
|
|
650
|
+
|
|
651
|
+
The first example from [LW2012]_::
|
|
652
|
+
|
|
653
|
+
sage: f = Newform('50a')
|
|
654
|
+
sage: Pi = LocalComponent(f, 5)
|
|
655
|
+
sage: chars = Pi.characters(); chars
|
|
656
|
+
[Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -d - 1, 5 |--> 1,
|
|
657
|
+
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> d, 5 |--> 1]
|
|
658
|
+
sage: chars[0].base_ring()
|
|
659
|
+
Number Field in d with defining polynomial x^2 + x + 1
|
|
660
|
+
|
|
661
|
+
These characters are interchanged by the Frobenius automorphism of `\GF{25}`::
|
|
662
|
+
|
|
663
|
+
sage: chars[0] == chars[1]**5
|
|
664
|
+
True
|
|
665
|
+
|
|
666
|
+
A more complicated example (higher weight and nontrivial central character)::
|
|
667
|
+
|
|
668
|
+
sage: f = Newforms(GammaH(25, [6]), 3, names='j')[0]; f
|
|
669
|
+
q + j0*q^2 + 1/3*j0^3*q^3 - 1/3*j0^2*q^4 + O(q^6)
|
|
670
|
+
sage: Pi = LocalComponent(f, 5)
|
|
671
|
+
sage: Pi.characters()
|
|
672
|
+
[Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> 1/3*j0^2*d - 1/3*j0^3, 5 |--> 5,
|
|
673
|
+
Character of unramified extension Q_5(s)* (s^2 + 4*s + 2 = 0), of level 1, mapping s |--> -1/3*j0^2*d, 5 |--> 5]
|
|
674
|
+
sage: Pi.characters()[0].base_ring()
|
|
675
|
+
Number Field in d with defining polynomial x^2 - j0*x + 1/3*j0^2 over its base field
|
|
676
|
+
|
|
677
|
+
.. warning::
|
|
678
|
+
|
|
679
|
+
The above output isn't actually the same as in Example 2 of
|
|
680
|
+
[LW2012]_, due to an error in the published paper (correction
|
|
681
|
+
pending) -- the published paper has the inverses of the above
|
|
682
|
+
characters.
|
|
683
|
+
|
|
684
|
+
A higher level example::
|
|
685
|
+
|
|
686
|
+
sage: f = Newform('81a', names='j'); f
|
|
687
|
+
q + j0*q^2 + q^4 - j0*q^5 + O(q^6)
|
|
688
|
+
sage: LocalComponent(f, 3).characters() # long time (12s on sage.math, 2012)
|
|
689
|
+
[Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> -2*d + j0, 4 |--> 1, 3*s + 1 |--> -j0*d + 1, 3 |--> 1,
|
|
690
|
+
Character of unramified extension Q_3(s)* (s^2 + 2*s + 2 = 0), of level 2, mapping -2*s |--> 2*d - j0, 4 |--> 1, 3*s + 1 |--> j0*d - 2, 3 |--> 1]
|
|
691
|
+
|
|
692
|
+
Some ramified examples::
|
|
693
|
+
|
|
694
|
+
sage: Newform('27a').local_component(3).characters()
|
|
695
|
+
[Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -d, s |--> -1,
|
|
696
|
+
Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> d - 1, s |--> -1]
|
|
697
|
+
sage: LocalComponent(Newform('54a'), 3, twist_factor=4).characters()
|
|
698
|
+
[Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> -1/9*d, s |--> -9,
|
|
699
|
+
Character of ramified extension Q_3(s)* (s^2 - 3 = 0), of level 2, mapping 2 |--> 1, s + 1 |--> 1/9*d - 1, s |--> -9]
|
|
700
|
+
|
|
701
|
+
A 2-adic non-example::
|
|
702
|
+
|
|
703
|
+
sage: Newform('24a').local_component(2).characters()
|
|
704
|
+
Traceback (most recent call last):
|
|
705
|
+
...
|
|
706
|
+
ValueError: Totally ramified 2-adic representations are not classified by characters
|
|
707
|
+
|
|
708
|
+
Examples where `K^\times / \QQ_p^\times` is not topologically cyclic
|
|
709
|
+
(which complicates the computations greatly)::
|
|
710
|
+
|
|
711
|
+
sage: Newforms(DirichletGroup(64, QQ).1, 2, names='a')[0].local_component(2).characters() # long time, random
|
|
712
|
+
[
|
|
713
|
+
Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
|
|
714
|
+
mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> 1, -1 |--> 1, 2 |--> 1,
|
|
715
|
+
Character of unramified extension Q_2(s)* (s^2 + s + 1 = 0), of level 3,
|
|
716
|
+
mapping s |--> 1, 2*s + 1 |--> 1/2*a0, 4*s + 1 |--> -1, -1 |--> 1, 2 |--> 1
|
|
717
|
+
]
|
|
718
|
+
sage: Newform('243a',names='a').local_component(3).characters() # long time
|
|
719
|
+
[Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> -d - 1, 4 |--> 1, 3*s + 1 |--> -d - 1, s |--> 1,
|
|
720
|
+
Character of ramified extension Q_3(s)* (s^2 - 6 = 0), of level 4, mapping -2*s - 1 |--> d, 4 |--> 1, 3*s + 1 |--> d, s |--> 1]
|
|
721
|
+
"""
|
|
722
|
+
T = self.type_space()
|
|
723
|
+
p = self.prime()
|
|
724
|
+
if self.conductor() % 2 == 0:
|
|
725
|
+
|
|
726
|
+
G = SmoothCharacterGroupUnramifiedQuadratic(self.prime(), self.coefficient_field())
|
|
727
|
+
n = self.conductor() // 2
|
|
728
|
+
|
|
729
|
+
gs = G.quotient_gens(n)
|
|
730
|
+
g = gs[-1]
|
|
731
|
+
|
|
732
|
+
assert g.valuation(G.ideal(1)) == 0
|
|
733
|
+
m = g.matrix().change_ring(ZZ).list()
|
|
734
|
+
tr = (~T.rho(m)).trace()
|
|
735
|
+
|
|
736
|
+
# The inverse is needed here because T is the *homological* type space,
|
|
737
|
+
# which is dual to the cohomological one that defines the local component.
|
|
738
|
+
|
|
739
|
+
X = polygen(self.coefficient_field())
|
|
740
|
+
theta_poly = X**2 - (-1)**n*tr*X + self.central_character()(g.norm())
|
|
741
|
+
verbose("theta_poly for %s is %s" % (g, theta_poly), level=1)
|
|
742
|
+
if theta_poly.is_irreducible():
|
|
743
|
+
F = self.coefficient_field().extension(theta_poly, "d")
|
|
744
|
+
G = G.base_extend(F)
|
|
745
|
+
|
|
746
|
+
# roots with repetitions allowed
|
|
747
|
+
gvals = flatten([[y[0]]*y[1] for y in theta_poly.roots(G.base_ring())])
|
|
748
|
+
|
|
749
|
+
if len(gs) == 1:
|
|
750
|
+
# This is always the case if p != 2
|
|
751
|
+
chi1, chi2 = (G.extend_character(n, self.central_character(), [x]) for x in gvals)
|
|
752
|
+
else:
|
|
753
|
+
# 2-adic cases, conductor >= 64. Here life is complicated
|
|
754
|
+
# because the quotient (O_K* / p^n)^* / (image of Z_2^*) is not
|
|
755
|
+
# cyclic.
|
|
756
|
+
g0 = gs[0]
|
|
757
|
+
try:
|
|
758
|
+
G._reduce_Qp(1, g0)
|
|
759
|
+
raise ArithmeticError("Bad generators returned")
|
|
760
|
+
except ValueError:
|
|
761
|
+
pass
|
|
762
|
+
|
|
763
|
+
tr = (~T.rho(g0.matrix().list())).trace()
|
|
764
|
+
X = polygen(G.base_ring())
|
|
765
|
+
theta0_poly = X**2 - (-1)**n*tr*X + self.central_character()(g0.norm())
|
|
766
|
+
verbose("theta_poly for %s is %s" % (g0, theta_poly), level=1)
|
|
767
|
+
if theta0_poly.is_irreducible():
|
|
768
|
+
F = theta0_poly.base_ring().extension(theta_poly, "e")
|
|
769
|
+
G = G.base_extend(F)
|
|
770
|
+
g0vals = flatten([[y[0]]*y[1] for y in theta0_poly.roots(G.base_ring())])
|
|
771
|
+
|
|
772
|
+
pairA = [ [g0vals[0], gvals[0]], [g0vals[1], gvals[1]] ]
|
|
773
|
+
pairB = [ [g0vals[0], gvals[1]], [g0vals[1], gvals[0]] ]
|
|
774
|
+
|
|
775
|
+
A_fail = 0
|
|
776
|
+
B_fail = 0
|
|
777
|
+
try:
|
|
778
|
+
chisA = [G.extend_character(n, self.central_character(), [y, x]) for (y, x) in pairA]
|
|
779
|
+
except ValueError:
|
|
780
|
+
A_fail = 1
|
|
781
|
+
try:
|
|
782
|
+
chisB = [G.extend_character(n, self.central_character(), [y, x]) for (y, x) in pairB]
|
|
783
|
+
except ValueError:
|
|
784
|
+
B_fail = 1
|
|
785
|
+
|
|
786
|
+
if chisA == chisB or chisA == reversed(chisB):
|
|
787
|
+
# repeated roots -- break symmetry arbitrarily
|
|
788
|
+
B_fail = 1
|
|
789
|
+
|
|
790
|
+
# check the character relation from LW12
|
|
791
|
+
if (not A_fail and not B_fail):
|
|
792
|
+
for x in G.ideal(n).invertible_residues():
|
|
793
|
+
try:
|
|
794
|
+
# test if G mod p is in Fp
|
|
795
|
+
flag = G._reduce_Qp(1, x)
|
|
796
|
+
except ValueError:
|
|
797
|
+
flag = None
|
|
798
|
+
if flag is not None:
|
|
799
|
+
verbose("skipping x=%s as congruent to %s mod p" % (x, flag))
|
|
800
|
+
continue
|
|
801
|
+
|
|
802
|
+
verbose("testing x = %s" % x, level=1)
|
|
803
|
+
ti = (-1)**n * (~T.rho(x.matrix().list())).trace()
|
|
804
|
+
verbose(" trace of matrix is %s" % ti, level=1)
|
|
805
|
+
if ti != chisA[0](x) + chisA[1](x):
|
|
806
|
+
verbose(" chisA FAILED", level=1)
|
|
807
|
+
A_fail = 1
|
|
808
|
+
break
|
|
809
|
+
if ti != chisB[0](x) + chisB[1](x):
|
|
810
|
+
verbose(" chisB FAILED", level=1)
|
|
811
|
+
B_fail = 1
|
|
812
|
+
break
|
|
813
|
+
verbose(" Trace identity check works for both", level=1)
|
|
814
|
+
|
|
815
|
+
if B_fail and not A_fail:
|
|
816
|
+
chi1, chi2 = chisA
|
|
817
|
+
elif A_fail and not B_fail:
|
|
818
|
+
chi1, chi2 = chisB
|
|
819
|
+
else:
|
|
820
|
+
raise ValueError("Something went wrong: can't identify the characters")
|
|
821
|
+
|
|
822
|
+
# Consistency checks
|
|
823
|
+
assert chi1.restrict_to_Qp() == chi2.restrict_to_Qp() == self.central_character()
|
|
824
|
+
assert chi1*chi2 == chi1.parent().compose_with_norm(self.central_character())
|
|
825
|
+
|
|
826
|
+
return Sequence([chi1, chi2], check=False, cr=True)
|
|
827
|
+
|
|
828
|
+
else:
|
|
829
|
+
# The ramified case.
|
|
830
|
+
|
|
831
|
+
n = self.conductor() - 1
|
|
832
|
+
if p == 2:
|
|
833
|
+
# The ramified 2-adic representations aren't classified by admissible pairs. Die.
|
|
834
|
+
raise ValueError("Totally ramified 2-adic representations are not classified by characters")
|
|
835
|
+
|
|
836
|
+
G0 = SmoothCharacterGroupRamifiedQuadratic(p, 0, self.coefficient_field())
|
|
837
|
+
G1 = SmoothCharacterGroupRamifiedQuadratic(p, 1, self.coefficient_field())
|
|
838
|
+
q0 = G0.quotient_gens(n)
|
|
839
|
+
assert all(x.valuation(G0.ideal(1)) == 1 for x in q0)
|
|
840
|
+
q1 = G1.quotient_gens(n)
|
|
841
|
+
assert all(x.valuation(G1.ideal(1)) == 1 for x in q1)
|
|
842
|
+
|
|
843
|
+
t0 = [(~T.rho(q.matrix().list())).trace() for q in q0]
|
|
844
|
+
t1 = [(~T.rho(q.matrix().list())).trace() for q in q1]
|
|
845
|
+
|
|
846
|
+
if all(x == 0 for x in t0 + t1):
|
|
847
|
+
# Can't happen?
|
|
848
|
+
raise NotImplementedError( "Can't identify ramified quadratic extension -- all traces zero" )
|
|
849
|
+
elif all(x == 0 for x in t1):
|
|
850
|
+
G, qs, ts = G0, q0, t0
|
|
851
|
+
elif all(x == 0 for x in t0):
|
|
852
|
+
G, qs, ts = G1, q1, t1
|
|
853
|
+
else:
|
|
854
|
+
# At least one of the traces is *always* 0, since the type
|
|
855
|
+
# space has to be isomorphic to its twist by the (ramified
|
|
856
|
+
# quadratic) character corresponding to the quadratic
|
|
857
|
+
# extension.
|
|
858
|
+
raise RuntimeError( "Can't get here!" )
|
|
859
|
+
|
|
860
|
+
q = qs[0]
|
|
861
|
+
t = ts[0]
|
|
862
|
+
k = self.newform().weight()
|
|
863
|
+
t *= p**ZZ( (k - 2 + self.twist_factor() ) / 2)
|
|
864
|
+
|
|
865
|
+
X = polygen(self.coefficient_field())
|
|
866
|
+
theta_poly = X**2 - X * t + self.central_character()(q.norm())
|
|
867
|
+
verbose("theta_poly is %s" % theta_poly, level=1)
|
|
868
|
+
if theta_poly.is_irreducible():
|
|
869
|
+
F = self.coefficient_field().extension(theta_poly, "d")
|
|
870
|
+
G = G.base_extend(F)
|
|
871
|
+
c1q, c2q = flatten([[x]*e for x,e in theta_poly.roots(G.base_ring())])
|
|
872
|
+
|
|
873
|
+
if len(qs) == 1:
|
|
874
|
+
chi1, chi2 = (G.extend_character(n, self.central_character(), [x]) for x in [c1q, c2q])
|
|
875
|
+
|
|
876
|
+
else:
|
|
877
|
+
assert p == 3
|
|
878
|
+
q = qs[1]
|
|
879
|
+
t = ts[1]
|
|
880
|
+
t *= p**ZZ( (k - 2 + self.twist_factor() ) / 2)
|
|
881
|
+
|
|
882
|
+
X = polygen(G.base_ring())
|
|
883
|
+
theta_poly = X**2 - X * t + self.central_character()(q.norm())
|
|
884
|
+
verbose("theta_poly is %s" % theta_poly, level=1)
|
|
885
|
+
if theta_poly.is_irreducible():
|
|
886
|
+
F = G.base_ring().extension(theta_poly, "e")
|
|
887
|
+
G = G.base_extend(F)
|
|
888
|
+
c1q2, c2q2 = flatten([[x]*e for x,e in theta_poly.roots(G.base_ring())])
|
|
889
|
+
|
|
890
|
+
pairA = [[c1q, c1q2], [c2q, c2q2]]
|
|
891
|
+
pairB = [[c1q, c2q2], [c2q, c1q2]]
|
|
892
|
+
|
|
893
|
+
A_fail = 0
|
|
894
|
+
B_fail = 0
|
|
895
|
+
try:
|
|
896
|
+
chisA = [G.extend_character(n, self.central_character(), [x, y]) for (x, y) in pairA]
|
|
897
|
+
except ValueError:
|
|
898
|
+
verbose('A failed to create', level=1)
|
|
899
|
+
A_fail = 1
|
|
900
|
+
try:
|
|
901
|
+
chisB = [G.extend_character(n, self.central_character(), [x, y]) for (x, y) in pairB]
|
|
902
|
+
except ValueError:
|
|
903
|
+
verbose('A failed to create', level=1)
|
|
904
|
+
B_fail = 1
|
|
905
|
+
|
|
906
|
+
if c1q == c2q or c1q2 == c2q2:
|
|
907
|
+
B_fail = 1
|
|
908
|
+
|
|
909
|
+
for u in G.ideal(n).invertible_residues():
|
|
910
|
+
if A_fail or B_fail:
|
|
911
|
+
break
|
|
912
|
+
x = q*u
|
|
913
|
+
verbose("testing x = %s" % x, level=1)
|
|
914
|
+
ti = (~T.rho(x.matrix().list())).trace() * p**ZZ((k-2+self.twist_factor())/2)
|
|
915
|
+
verbose("trace of matrix is %s" % ti, level=1)
|
|
916
|
+
if chisA[0](x) + chisA[1](x) != ti:
|
|
917
|
+
A_fail = 1
|
|
918
|
+
if chisB[0](x) + chisB[1](x) != ti:
|
|
919
|
+
B_fail = 1
|
|
920
|
+
|
|
921
|
+
if B_fail and not A_fail:
|
|
922
|
+
chi1, chi2 = chisA
|
|
923
|
+
elif A_fail and not B_fail:
|
|
924
|
+
chi1, chi2 = chisB
|
|
925
|
+
else:
|
|
926
|
+
raise ValueError("Something went wrong: can't identify the characters")
|
|
927
|
+
|
|
928
|
+
# Consistency checks
|
|
929
|
+
assert chi1.restrict_to_Qp() == chi2.restrict_to_Qp() == self.central_character()
|
|
930
|
+
assert chi1*chi2 == chi1.parent().compose_with_norm(self.central_character())
|
|
931
|
+
|
|
932
|
+
return Sequence([chi1, chi2], check=False, cr=True)
|
|
933
|
+
|
|
934
|
+
def check_tempered(self):
|
|
935
|
+
r"""
|
|
936
|
+
Check that this representation is tempered (after twisting by
|
|
937
|
+
`|\det|^{j/2}` where `j` is the twist factor). Since local components
|
|
938
|
+
of modular forms are always tempered, this is a useful check on our
|
|
939
|
+
calculations.
|
|
940
|
+
|
|
941
|
+
Since the computation of the characters attached to this representation
|
|
942
|
+
is not implemented in the odd-conductor case, a NotImplementedError
|
|
943
|
+
will be raised for such representations.
|
|
944
|
+
|
|
945
|
+
EXAMPLES::
|
|
946
|
+
|
|
947
|
+
sage: LocalComponent(Newform("50a"), 5).check_tempered()
|
|
948
|
+
sage: LocalComponent(Newform("27a"), 3).check_tempered()
|
|
949
|
+
"""
|
|
950
|
+
c1, c2 = self.characters()
|
|
951
|
+
K = c1.base_ring()
|
|
952
|
+
p = self.prime()
|
|
953
|
+
w = QQbar(p)**self.twist_factor()
|
|
954
|
+
for sigma in K.embeddings(QQbar):
|
|
955
|
+
assert sigma(c1(p)).abs() == sigma(c2(p)).abs() == w
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
class ImprimitiveLocalComponent(LocalComponentBase):
|
|
959
|
+
r"""
|
|
960
|
+
A smooth representation which is not of minimal level among its character
|
|
961
|
+
twists. Internally, this is stored as a pair consisting of a minimal local
|
|
962
|
+
component and a character to twist by.
|
|
963
|
+
"""
|
|
964
|
+
|
|
965
|
+
def __init__(self, newform, prime, twist_factor, min_twist, chi):
|
|
966
|
+
r"""
|
|
967
|
+
EXAMPLES::
|
|
968
|
+
|
|
969
|
+
sage: Newform("45a").local_component(3) # indirect doctest
|
|
970
|
+
Smooth representation of GL_2(Q_3) with conductor 3^2, twist of representation of conductor 3^1
|
|
971
|
+
"""
|
|
972
|
+
LocalComponentBase.__init__(self, newform, prime, twist_factor)
|
|
973
|
+
self._min_twist = min_twist
|
|
974
|
+
self._chi = chi
|
|
975
|
+
|
|
976
|
+
def is_primitive(self) -> bool:
|
|
977
|
+
r"""
|
|
978
|
+
Return ``True`` if this local component is primitive (has minimal level
|
|
979
|
+
among its character twists).
|
|
980
|
+
|
|
981
|
+
EXAMPLES::
|
|
982
|
+
|
|
983
|
+
sage: Newform("45a").local_component(3).is_primitive()
|
|
984
|
+
False
|
|
985
|
+
"""
|
|
986
|
+
return False
|
|
987
|
+
|
|
988
|
+
def minimal_twist(self):
|
|
989
|
+
r"""
|
|
990
|
+
Return a twist of this local component which has the minimal possible
|
|
991
|
+
conductor.
|
|
992
|
+
|
|
993
|
+
EXAMPLES::
|
|
994
|
+
|
|
995
|
+
sage: Pi = Newform("75b").local_component(5)
|
|
996
|
+
sage: Pi.minimal_twist()
|
|
997
|
+
Smooth representation of GL_2(Q_5) with conductor 5^1
|
|
998
|
+
"""
|
|
999
|
+
return self._min_twist
|
|
1000
|
+
|
|
1001
|
+
def twisting_character(self):
|
|
1002
|
+
r"""
|
|
1003
|
+
Return the character giving the minimal twist of this representation.
|
|
1004
|
+
|
|
1005
|
+
EXAMPLES::
|
|
1006
|
+
|
|
1007
|
+
sage: Pi = Newform("45a").local_component(3)
|
|
1008
|
+
sage: Pi.twisting_character()
|
|
1009
|
+
Dirichlet character modulo 3 of conductor 3 mapping 2 |--> -1
|
|
1010
|
+
"""
|
|
1011
|
+
return self._chi
|
|
1012
|
+
|
|
1013
|
+
def species(self):
|
|
1014
|
+
r"""
|
|
1015
|
+
The species of this local component, which is either 'Principal
|
|
1016
|
+
Series', 'Special' or 'Supercuspidal'.
|
|
1017
|
+
|
|
1018
|
+
EXAMPLES::
|
|
1019
|
+
|
|
1020
|
+
sage: Pi = Newform("45a").local_component(3)
|
|
1021
|
+
sage: Pi.species()
|
|
1022
|
+
'Special'
|
|
1023
|
+
"""
|
|
1024
|
+
return self._min_twist.species()
|
|
1025
|
+
|
|
1026
|
+
def _repr_(self):
|
|
1027
|
+
r"""
|
|
1028
|
+
EXAMPLES::
|
|
1029
|
+
|
|
1030
|
+
sage: Pi = Newform("45a").local_component(3)
|
|
1031
|
+
sage: Pi # indirect doctest
|
|
1032
|
+
Smooth representation of GL_2(Q_3) with conductor 3^2, twist of representation of conductor 3^1
|
|
1033
|
+
"""
|
|
1034
|
+
return LocalComponentBase._repr_(self) + ', twist of representation of conductor %s^%s' % (self.prime(), self._min_twist.conductor())
|
|
1035
|
+
|
|
1036
|
+
def characters(self):
|
|
1037
|
+
r"""
|
|
1038
|
+
Return the pair of characters (either of `\QQ_p^*` or of some quadratic
|
|
1039
|
+
extension) corresponding to this representation.
|
|
1040
|
+
|
|
1041
|
+
EXAMPLES::
|
|
1042
|
+
|
|
1043
|
+
sage: f = [f for f in Newforms(63, 4, names='a') if f[2] == 1][0]
|
|
1044
|
+
sage: f.local_component(3).characters()
|
|
1045
|
+
[Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> d,
|
|
1046
|
+
Character of Q_3*, of level 1, mapping 2 |--> -1, 3 |--> -d - 2]
|
|
1047
|
+
"""
|
|
1048
|
+
minchars = self._min_twist.characters()
|
|
1049
|
+
G = minchars[0].parent()
|
|
1050
|
+
chi = self._chi
|
|
1051
|
+
if self.species() == "Supercuspidal":
|
|
1052
|
+
H = SmoothCharacterGroupQp(self.prime(), chi.base_ring())
|
|
1053
|
+
Hchi = H.from_dirichlet(~chi)
|
|
1054
|
+
Gchi = G.compose_with_norm(Hchi)
|
|
1055
|
+
else:
|
|
1056
|
+
Gchi = G.from_dirichlet(~chi)
|
|
1057
|
+
return Sequence([c*Gchi for c in minchars], cr=True, universe=G)
|
|
1058
|
+
|
|
1059
|
+
def check_tempered(self):
|
|
1060
|
+
r"""
|
|
1061
|
+
Check that this representation is quasi-tempered, i.e. `\pi \otimes
|
|
1062
|
+
|\det|^{j/2}` is tempered. It is well known that local components of
|
|
1063
|
+
modular forms are *always* tempered, so this serves as a useful check
|
|
1064
|
+
on our computations.
|
|
1065
|
+
|
|
1066
|
+
EXAMPLES::
|
|
1067
|
+
|
|
1068
|
+
sage: f = [f for f in Newforms(63, 4, names='a') if f[2] == 1][0]
|
|
1069
|
+
sage: f.local_component(3).check_tempered()
|
|
1070
|
+
"""
|
|
1071
|
+
self.minimal_twist().check_tempered()
|