passagemath-schemes 10.6.47__cp312-cp312-macosx_13_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.6.47.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
  9. passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +745 -0
  29. sage/lfunctions/pari.py +818 -0
  30. sage/lfunctions/zero_sums.cpython-312-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5135 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
  34. sage/modular/abvar/abvar_newform.py +244 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +186 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +720 -0
  40. sage/modular/abvar/homspace.py +998 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +740 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-312-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1402 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-312-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +363 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +653 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1469 -0
  57. sage/modular/arithgroup/congroup_generic.py +628 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +267 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-312-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1066 -0
  61. sage/modular/arithgroup/tests.py +418 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3753 -0
  64. sage/modular/btquotients/pautomorphicform.py +2570 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1109 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +569 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1065 -0
  77. sage/modular/hecke/algebra.py +746 -0
  78. sage/modular/hecke/all.py +20 -0
  79. sage/modular/hecke/ambient_module.py +1019 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +325 -0
  82. sage/modular/hecke/hecke_operator.py +780 -0
  83. sage/modular/hecke/homspace.py +206 -0
  84. sage/modular/hecke/module.py +1767 -0
  85. sage/modular/hecke/morphism.py +174 -0
  86. sage/modular/hecke/submodule.py +989 -0
  87. sage/modular/hypergeometric_misc.cpython-312-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2017 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1071 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +815 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +124 -0
  101. sage/modular/modform/ambient_g1.py +204 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +505 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4131 -0
  108. sage/modular/modform/find_generators.py +59 -0
  109. sage/modular/modform/half_integral.py +154 -0
  110. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  111. sage/modular/modform/j_invariant.py +47 -0
  112. sage/modular/modform/l_series_gross_zagier.py +133 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-darwin.so +0 -0
  114. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  115. sage/modular/modform/notes.py +45 -0
  116. sage/modular/modform/numerical.py +514 -0
  117. sage/modular/modform/periods.py +14 -0
  118. sage/modular/modform/ring.py +1257 -0
  119. sage/modular/modform/space.py +1860 -0
  120. sage/modular/modform/submodule.py +118 -0
  121. sage/modular/modform/tests.py +64 -0
  122. sage/modular/modform/theta.py +110 -0
  123. sage/modular/modform/vm_basis.py +381 -0
  124. sage/modular/modform/weight1.py +220 -0
  125. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  126. sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
  127. sage/modular/modform_hecketriangle/all.py +30 -0
  128. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  129. sage/modular/modform_hecketriangle/constructor.py +416 -0
  130. sage/modular/modform_hecketriangle/element.py +351 -0
  131. sage/modular/modform_hecketriangle/functors.py +752 -0
  132. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  133. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
  135. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
  136. sage/modular/modform_hecketriangle/readme.py +1214 -0
  137. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  138. sage/modular/modform_hecketriangle/space.py +1037 -0
  139. sage/modular/modform_hecketriangle/subspace.py +423 -0
  140. sage/modular/modsym/all.py +17 -0
  141. sage/modular/modsym/ambient.py +3846 -0
  142. sage/modular/modsym/boundary.py +1420 -0
  143. sage/modular/modsym/element.py +336 -0
  144. sage/modular/modsym/g1list.py +178 -0
  145. sage/modular/modsym/ghlist.py +182 -0
  146. sage/modular/modsym/hecke_operator.py +73 -0
  147. sage/modular/modsym/manin_symbol.cpython-312-darwin.so +0 -0
  148. sage/modular/modsym/manin_symbol.pxd +5 -0
  149. sage/modular/modsym/manin_symbol.pyx +497 -0
  150. sage/modular/modsym/manin_symbol_list.py +1295 -0
  151. sage/modular/modsym/modsym.py +400 -0
  152. sage/modular/modsym/modular_symbols.py +384 -0
  153. sage/modular/modsym/p1list_nf.py +1241 -0
  154. sage/modular/modsym/relation_matrix.py +591 -0
  155. sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
  156. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  157. sage/modular/modsym/space.py +2468 -0
  158. sage/modular/modsym/subspace.py +455 -0
  159. sage/modular/modsym/tests.py +375 -0
  160. sage/modular/multiple_zeta.py +2632 -0
  161. sage/modular/multiple_zeta_F_algebra.py +786 -0
  162. sage/modular/overconvergent/all.py +6 -0
  163. sage/modular/overconvergent/genus0.py +1878 -0
  164. sage/modular/overconvergent/hecke_series.py +1187 -0
  165. sage/modular/overconvergent/weightspace.py +778 -0
  166. sage/modular/pollack_stevens/all.py +4 -0
  167. sage/modular/pollack_stevens/distributions.py +874 -0
  168. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  169. sage/modular/pollack_stevens/manin_map.py +859 -0
  170. sage/modular/pollack_stevens/modsym.py +1593 -0
  171. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  172. sage/modular/pollack_stevens/sigma0.py +534 -0
  173. sage/modular/pollack_stevens/space.py +1076 -0
  174. sage/modular/quasimodform/all.py +3 -0
  175. sage/modular/quasimodform/element.py +845 -0
  176. sage/modular/quasimodform/ring.py +828 -0
  177. sage/modular/quatalg/all.py +3 -0
  178. sage/modular/quatalg/brandt.py +1642 -0
  179. sage/modular/ssmod/all.py +8 -0
  180. sage/modular/ssmod/ssmod.py +827 -0
  181. sage/rings/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  183. sage/rings/polynomial/binary_form_reduce.py +585 -0
  184. sage/schemes/all.py +41 -0
  185. sage/schemes/berkovich/all.py +6 -0
  186. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  187. sage/schemes/berkovich/berkovich_space.py +748 -0
  188. sage/schemes/curves/affine_curve.py +2928 -0
  189. sage/schemes/curves/all.py +33 -0
  190. sage/schemes/curves/closed_point.py +434 -0
  191. sage/schemes/curves/constructor.py +381 -0
  192. sage/schemes/curves/curve.py +542 -0
  193. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  194. sage/schemes/curves/point.py +463 -0
  195. sage/schemes/curves/projective_curve.py +3026 -0
  196. sage/schemes/curves/zariski_vankampen.py +1932 -0
  197. sage/schemes/cyclic_covers/all.py +2 -0
  198. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  199. sage/schemes/cyclic_covers/constructor.py +137 -0
  200. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  201. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  202. sage/schemes/elliptic_curves/BSD.py +1036 -0
  203. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  204. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  205. sage/schemes/elliptic_curves/all.py +49 -0
  206. sage/schemes/elliptic_curves/cardinality.py +609 -0
  207. sage/schemes/elliptic_curves/cm.py +1102 -0
  208. sage/schemes/elliptic_curves/constructor.py +1552 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  214. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  215. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  216. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  217. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  218. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  219. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  221. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  222. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  223. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  224. sage/schemes/elliptic_curves/formal_group.py +760 -0
  225. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  226. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7335 -0
  229. sage/schemes/elliptic_curves/height.py +2109 -0
  230. sage/schemes/elliptic_curves/hom.py +1406 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  232. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  233. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  234. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  235. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  236. sage/schemes/elliptic_curves/homset.py +271 -0
  237. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  238. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  239. sage/schemes/elliptic_curves/jacobian.py +237 -0
  240. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  241. sage/schemes/elliptic_curves/kraus.py +1014 -0
  242. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  243. sage/schemes/elliptic_curves/mod5family.py +105 -0
  244. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  245. sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  247. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  248. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  249. sage/schemes/elliptic_curves/padics.py +1816 -0
  250. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  251. sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  253. sage/schemes/elliptic_curves/saturation.py +715 -0
  254. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  255. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  256. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  257. sage/schemes/hyperelliptic_curves/all.py +6 -0
  258. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  259. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  264. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  265. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  270. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  271. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  272. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  273. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  274. sage/schemes/jacobians/all.py +2 -0
  275. sage/schemes/overview.py +161 -0
  276. sage/schemes/plane_conics/all.py +22 -0
  277. sage/schemes/plane_conics/con_field.py +1296 -0
  278. sage/schemes/plane_conics/con_finite_field.py +158 -0
  279. sage/schemes/plane_conics/con_number_field.py +456 -0
  280. sage/schemes/plane_conics/con_rational_field.py +406 -0
  281. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  282. sage/schemes/plane_conics/constructor.py +249 -0
  283. sage/schemes/plane_quartics/all.py +2 -0
  284. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  285. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  286. sage/schemes/riemann_surfaces/all.py +1 -0
  287. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  288. sage_wheels/share/cremona/cremona_mini.db +0 -0
  289. sage_wheels/share/ellcurves/rank0 +30427 -0
  290. sage_wheels/share/ellcurves/rank1 +31871 -0
  291. sage_wheels/share/ellcurves/rank10 +6 -0
  292. sage_wheels/share/ellcurves/rank11 +6 -0
  293. sage_wheels/share/ellcurves/rank12 +1 -0
  294. sage_wheels/share/ellcurves/rank14 +1 -0
  295. sage_wheels/share/ellcurves/rank15 +1 -0
  296. sage_wheels/share/ellcurves/rank17 +1 -0
  297. sage_wheels/share/ellcurves/rank19 +1 -0
  298. sage_wheels/share/ellcurves/rank2 +2388 -0
  299. sage_wheels/share/ellcurves/rank20 +1 -0
  300. sage_wheels/share/ellcurves/rank21 +1 -0
  301. sage_wheels/share/ellcurves/rank22 +1 -0
  302. sage_wheels/share/ellcurves/rank23 +1 -0
  303. sage_wheels/share/ellcurves/rank24 +1 -0
  304. sage_wheels/share/ellcurves/rank28 +1 -0
  305. sage_wheels/share/ellcurves/rank3 +836 -0
  306. sage_wheels/share/ellcurves/rank4 +10 -0
  307. sage_wheels/share/ellcurves/rank5 +5 -0
  308. sage_wheels/share/ellcurves/rank6 +5 -0
  309. sage_wheels/share/ellcurves/rank7 +5 -0
  310. sage_wheels/share/ellcurves/rank8 +6 -0
  311. 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()