passagemath-schemes 10.8.1a4__cp314-cp314t-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 (312) 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.8.1a4.dist-info/METADATA +203 -0
  7. passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
  8. passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
  9. passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.8.1a4.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 +9556 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +727 -0
  29. sage/lfunctions/pari.py +971 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5132 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
  34. sage/modular/abvar/abvar_newform.py +246 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +187 -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 +721 -0
  40. sage/modular/abvar/homspace.py +989 -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 +741 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1406 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +361 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +659 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1491 -0
  57. sage/modular/arithgroup/congroup_generic.py +630 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +266 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1067 -0
  61. sage/modular/arithgroup/tests.py +425 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3736 -0
  64. sage/modular/btquotients/pautomorphicform.py +2564 -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 +1107 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +571 -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 +1076 -0
  77. sage/modular/hecke/algebra.py +725 -0
  78. sage/modular/hecke/all.py +19 -0
  79. sage/modular/hecke/ambient_module.py +994 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +302 -0
  82. sage/modular/hecke/hecke_operator.py +736 -0
  83. sage/modular/hecke/homspace.py +185 -0
  84. sage/modular/hecke/module.py +1744 -0
  85. sage/modular/hecke/morphism.py +139 -0
  86. sage/modular/hecke/submodule.py +970 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-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 +2020 -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 +1070 -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 +817 -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 +120 -0
  101. sage/modular/modform/ambient_g1.py +199 -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 +487 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4105 -0
  108. sage/modular/modform/half_integral.py +154 -0
  109. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  110. sage/modular/modform/j_invariant.py +47 -0
  111. sage/modular/modform/l_series_gross_zagier.py +127 -0
  112. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  114. sage/modular/modform/notes.py +45 -0
  115. sage/modular/modform/numerical.py +514 -0
  116. sage/modular/modform/periods.py +14 -0
  117. sage/modular/modform/ring.py +1257 -0
  118. sage/modular/modform/space.py +1859 -0
  119. sage/modular/modform/submodule.py +118 -0
  120. sage/modular/modform/tests.py +64 -0
  121. sage/modular/modform/theta.py +110 -0
  122. sage/modular/modform/vm_basis.py +380 -0
  123. sage/modular/modform/weight1.py +221 -0
  124. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  125. sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
  126. sage/modular/modform_hecketriangle/all.py +30 -0
  127. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  128. sage/modular/modform_hecketriangle/constructor.py +416 -0
  129. sage/modular/modform_hecketriangle/element.py +351 -0
  130. sage/modular/modform_hecketriangle/functors.py +752 -0
  131. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  132. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  133. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
  135. sage/modular/modform_hecketriangle/readme.py +1214 -0
  136. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  137. sage/modular/modform_hecketriangle/space.py +1037 -0
  138. sage/modular/modform_hecketriangle/subspace.py +423 -0
  139. sage/modular/modsym/all.py +17 -0
  140. sage/modular/modsym/ambient.py +3844 -0
  141. sage/modular/modsym/boundary.py +1420 -0
  142. sage/modular/modsym/element.py +336 -0
  143. sage/modular/modsym/g1list.py +178 -0
  144. sage/modular/modsym/ghlist.py +182 -0
  145. sage/modular/modsym/hecke_operator.py +73 -0
  146. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  147. sage/modular/modsym/manin_symbol.pxd +5 -0
  148. sage/modular/modsym/manin_symbol.pyx +497 -0
  149. sage/modular/modsym/manin_symbol_list.py +1291 -0
  150. sage/modular/modsym/modsym.py +400 -0
  151. sage/modular/modsym/modular_symbols.py +384 -0
  152. sage/modular/modsym/p1list_nf.py +1241 -0
  153. sage/modular/modsym/relation_matrix.py +591 -0
  154. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  155. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  156. sage/modular/modsym/space.py +2468 -0
  157. sage/modular/modsym/subspace.py +455 -0
  158. sage/modular/modsym/tests.py +376 -0
  159. sage/modular/multiple_zeta.py +2635 -0
  160. sage/modular/multiple_zeta_F_algebra.py +789 -0
  161. sage/modular/overconvergent/all.py +6 -0
  162. sage/modular/overconvergent/genus0.py +1879 -0
  163. sage/modular/overconvergent/hecke_series.py +1187 -0
  164. sage/modular/overconvergent/weightspace.py +776 -0
  165. sage/modular/pollack_stevens/all.py +4 -0
  166. sage/modular/pollack_stevens/distributions.py +874 -0
  167. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  168. sage/modular/pollack_stevens/manin_map.py +856 -0
  169. sage/modular/pollack_stevens/modsym.py +1590 -0
  170. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  171. sage/modular/pollack_stevens/sigma0.py +534 -0
  172. sage/modular/pollack_stevens/space.py +1078 -0
  173. sage/modular/quasimodform/all.py +3 -0
  174. sage/modular/quasimodform/element.py +846 -0
  175. sage/modular/quasimodform/ring.py +826 -0
  176. sage/modular/quatalg/all.py +3 -0
  177. sage/modular/quatalg/brandt.py +1642 -0
  178. sage/modular/ssmod/all.py +8 -0
  179. sage/modular/ssmod/ssmod.py +827 -0
  180. sage/rings/all__sagemath_schemes.py +1 -0
  181. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/binary_form_reduce.py +585 -0
  183. sage/schemes/all.py +41 -0
  184. sage/schemes/berkovich/all.py +6 -0
  185. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  186. sage/schemes/berkovich/berkovich_space.py +700 -0
  187. sage/schemes/curves/affine_curve.py +2924 -0
  188. sage/schemes/curves/all.py +33 -0
  189. sage/schemes/curves/closed_point.py +434 -0
  190. sage/schemes/curves/constructor.py +397 -0
  191. sage/schemes/curves/curve.py +542 -0
  192. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  193. sage/schemes/curves/point.py +463 -0
  194. sage/schemes/curves/projective_curve.py +3203 -0
  195. sage/schemes/curves/weighted_projective_curve.py +106 -0
  196. sage/schemes/curves/zariski_vankampen.py +1931 -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 +991 -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 +1103 -0
  208. sage/schemes/elliptic_curves/constructor.py +1530 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +457 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2837 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3249 -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 +4944 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7184 -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 +1663 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7328 -0
  229. sage/schemes/elliptic_curves/height.py +2108 -0
  230. sage/schemes/elliptic_curves/hom.py +1788 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +1084 -0
  232. sage/schemes/elliptic_curves/hom_fractional.py +544 -0
  233. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  234. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  235. sage/schemes/elliptic_curves/hom_sum.py +681 -0
  236. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  237. sage/schemes/elliptic_curves/homset.py +271 -0
  238. sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
  239. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  240. sage/schemes/elliptic_curves/jacobian.py +247 -0
  241. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  242. sage/schemes/elliptic_curves/kraus.py +1014 -0
  243. sage/schemes/elliptic_curves/lseries_ell.py +915 -0
  244. sage/schemes/elliptic_curves/mod5family.py +105 -0
  245. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  247. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  248. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  249. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  250. sage/schemes/elliptic_curves/padics.py +1816 -0
  251. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  253. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  254. sage/schemes/elliptic_curves/saturation.py +716 -0
  255. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  256. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  257. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  258. sage/schemes/hyperelliptic_curves/all.py +6 -0
  259. sage/schemes/hyperelliptic_curves/constructor.py +369 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  265. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
  271. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  272. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  273. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
  274. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  275. sage/schemes/jacobians/all.py +2 -0
  276. sage/schemes/overview.py +161 -0
  277. sage/schemes/plane_conics/all.py +22 -0
  278. sage/schemes/plane_conics/con_field.py +1296 -0
  279. sage/schemes/plane_conics/con_finite_field.py +158 -0
  280. sage/schemes/plane_conics/con_number_field.py +456 -0
  281. sage/schemes/plane_conics/con_rational_field.py +406 -0
  282. sage/schemes/plane_conics/con_rational_function_field.py +581 -0
  283. sage/schemes/plane_conics/constructor.py +249 -0
  284. sage/schemes/plane_quartics/all.py +2 -0
  285. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  286. sage/schemes/plane_quartics/quartic_generic.py +53 -0
  287. sage/schemes/riemann_surfaces/all.py +1 -0
  288. sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
  289. sage_wheels/share/cremona/cremona_mini.db +0 -0
  290. sage_wheels/share/ellcurves/rank0 +30427 -0
  291. sage_wheels/share/ellcurves/rank1 +31871 -0
  292. sage_wheels/share/ellcurves/rank10 +6 -0
  293. sage_wheels/share/ellcurves/rank11 +6 -0
  294. sage_wheels/share/ellcurves/rank12 +1 -0
  295. sage_wheels/share/ellcurves/rank14 +1 -0
  296. sage_wheels/share/ellcurves/rank15 +1 -0
  297. sage_wheels/share/ellcurves/rank17 +1 -0
  298. sage_wheels/share/ellcurves/rank19 +1 -0
  299. sage_wheels/share/ellcurves/rank2 +2388 -0
  300. sage_wheels/share/ellcurves/rank20 +1 -0
  301. sage_wheels/share/ellcurves/rank21 +1 -0
  302. sage_wheels/share/ellcurves/rank22 +1 -0
  303. sage_wheels/share/ellcurves/rank23 +1 -0
  304. sage_wheels/share/ellcurves/rank24 +1 -0
  305. sage_wheels/share/ellcurves/rank28 +1 -0
  306. sage_wheels/share/ellcurves/rank3 +836 -0
  307. sage_wheels/share/ellcurves/rank4 +10 -0
  308. sage_wheels/share/ellcurves/rank5 +5 -0
  309. sage_wheels/share/ellcurves/rank6 +5 -0
  310. sage_wheels/share/ellcurves/rank7 +5 -0
  311. sage_wheels/share/ellcurves/rank8 +6 -0
  312. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,514 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.libs.flint
3
+ """
4
+ Numerical computation of newforms
5
+ """
6
+
7
+ # ****************************************************************************
8
+ # Copyright (C) 2004-2006 William Stein <wstein@gmail.com>
9
+ #
10
+ # This program is free software: you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation, either version 2 of the License, or
13
+ # (at your option) any later version.
14
+ # https://www.gnu.org/licenses/
15
+ # ****************************************************************************
16
+
17
+ from sage.rings.fast_arith import prime_range
18
+ from sage.matrix.constructor import matrix
19
+ from sage.misc.verbose import verbose
20
+ from sage.misc.cachefunc import cached_method
21
+ from sage.misc.prandom import randint
22
+ from sage.modular.arithgroup.congroup_gamma0 import Gamma0_constructor as Gamma0
23
+ from sage.modular.modsym.all import ModularSymbols
24
+ from sage.modules.free_module_element import free_module_element as vector
25
+ from sage.rings.complex_double import CDF
26
+ from sage.rings.integer import Integer
27
+ from sage.rings.rational_field import QQ
28
+ from sage.structure.richcmp import richcmp_method, richcmp
29
+ from sage.structure.sage_object import SageObject
30
+ from sage.structure.sequence import Sequence
31
+
32
+ # This variable controls importing the SciPy library sparingly
33
+ scipy = None
34
+
35
+
36
+ @richcmp_method
37
+ class NumericalEigenforms(SageObject):
38
+ """
39
+ numerical_eigenforms(group, weight=2, eps=1e-20, delta=1e-2, tp=[2,3,5]).
40
+
41
+ INPUT:
42
+
43
+ - ``group`` -- a congruence subgroup of a Dirichlet character of
44
+ order 1 or 2
45
+
46
+ - ``weight`` -- integer >= 2
47
+
48
+ - ``eps`` -- a small float; abs( ) < eps is what "equal to zero" is
49
+ interpreted as for floating point numbers
50
+
51
+ - ``delta`` -- a small-ish float; eigenvalues are considered distinct
52
+ if their difference has absolute value at least delta
53
+
54
+ - ``tp`` -- use the Hecke operators T_p for p in tp when searching
55
+ for a random Hecke operator with distinct Hecke eigenvalues
56
+
57
+ OUTPUT: a numerical eigenforms object, with the following useful methods:
58
+
59
+ - :meth:`ap` -- return all eigenvalues of `T_p`
60
+
61
+ - :meth:`eigenvalues` -- list of eigenvalues corresponding
62
+ to the given list of primes, e.g.,::
63
+
64
+ [[eigenvalues of T_2],
65
+ [eigenvalues of T_3],
66
+ [eigenvalues of T_5], ...]
67
+
68
+ - :meth:`systems_of_eigenvalues` -- list of the systems of
69
+ eigenvalues of eigenforms such that the chosen random linear
70
+ combination of Hecke operators has multiplicity 1 eigenvalues.
71
+
72
+ EXAMPLES::
73
+
74
+ sage: n = numerical_eigenforms(23)
75
+ sage: n == loads(dumps(n))
76
+ True
77
+ sage: n.ap(2) # abs tol 1e-11
78
+ [3.0, -1.6180339887498947, 0.6180339887498968]
79
+ sage: n.systems_of_eigenvalues(7) # abs tol 1e-11
80
+ [[-1.6180339887498947, 2.23606797749979, -3.2360679774997894],
81
+ [0.618033988749895, -2.236067977499788, 1.23606797749979],
82
+ [3.0, 4.0, 6.0]]
83
+ sage: n.systems_of_abs(7) # abs tol 1e-11
84
+ [[0.618033988749895, 2.236067977499788, 1.23606797749979],
85
+ [1.6180339887498947, 2.23606797749979, 3.2360679774997894],
86
+ [3.0, 4.0, 6.0]]
87
+ sage: n.eigenvalues([2,3,5]) # abs tol 1e-11
88
+ [[3.0, -1.6180339887498947, 0.6180339887498968],
89
+ [4.0, 2.2360679774997894, -2.236067977499788],
90
+ [6.0, -3.2360679774997894, 1.2360679774997936]]
91
+ """
92
+ def __init__(self, group, weight=2, eps=1e-20,
93
+ delta=1e-2, tp=[2, 3, 5]):
94
+ """
95
+ Create a new space of numerical eigenforms.
96
+
97
+ EXAMPLES::
98
+
99
+ sage: numerical_eigenforms(61) # indirect doctest
100
+ Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2
101
+ """
102
+ if isinstance(group, (int, Integer)):
103
+ group = Gamma0(Integer(group))
104
+ self._group = group
105
+ self._weight = Integer(weight)
106
+ self._tp = tp
107
+ if self._weight < 2:
108
+ raise ValueError("weight must be at least 2")
109
+ self._eps = eps
110
+ self._delta = delta
111
+
112
+ def __richcmp__(self, other, op):
113
+ """
114
+ Compare two spaces of numerical eigenforms.
115
+
116
+ They are considered equal if and only if they come from the
117
+ same space of modular symbols.
118
+
119
+ EXAMPLES::
120
+
121
+ sage: n = numerical_eigenforms(23)
122
+ sage: n == loads(dumps(n))
123
+ True
124
+ """
125
+ if not isinstance(other, NumericalEigenforms):
126
+ return NotImplemented
127
+ return richcmp(self.modular_symbols(), other.modular_symbols(), op)
128
+
129
+ def level(self):
130
+ """
131
+ Return the level of this set of modular eigenforms.
132
+
133
+ EXAMPLES::
134
+
135
+ sage: n = numerical_eigenforms(61) ; n.level()
136
+ 61
137
+ """
138
+ return self._group.level()
139
+
140
+ def weight(self):
141
+ """
142
+ Return the weight of this set of modular eigenforms.
143
+
144
+ EXAMPLES::
145
+
146
+ sage: n = numerical_eigenforms(61) ; n.weight()
147
+ 2
148
+ """
149
+ return self._weight
150
+
151
+ def _repr_(self):
152
+ """
153
+ Print string representation of ``self``.
154
+
155
+ EXAMPLES::
156
+
157
+ sage: n = numerical_eigenforms(61) ; n
158
+ Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2
159
+
160
+ sage: n._repr_()
161
+ 'Numerical Hecke eigenvalues for Congruence Subgroup Gamma0(61) of weight 2'
162
+ """
163
+ return "Numerical Hecke eigenvalues for %s of weight %s" % (
164
+ self._group, self._weight)
165
+
166
+ @cached_method
167
+ def modular_symbols(self):
168
+ """
169
+ Return the space of modular symbols used for computing this
170
+ set of modular eigenforms.
171
+
172
+ EXAMPLES::
173
+
174
+ sage: n = numerical_eigenforms(61) ; n.modular_symbols()
175
+ Modular Symbols space of dimension 5 for Gamma_0(61) of weight 2 with sign 1 over Rational Field
176
+ """
177
+ M = ModularSymbols(self._group,
178
+ self._weight, sign=1)
179
+ if M.base_ring() != QQ:
180
+ raise ValueError("modular forms space must be defined over QQ")
181
+ return M
182
+
183
+ @cached_method
184
+ def _eigenvectors(self):
185
+ r"""
186
+ Find numerical approximations to simultaneous eigenvectors in
187
+ self.modular_symbols() for all T_p in self._tp.
188
+
189
+ EXAMPLES::
190
+
191
+ sage: n = numerical_eigenforms(61)
192
+ sage: n._eigenvectors() # random order
193
+ [ 1.0 0.289473640239 0.176788851952 0.336707726757 2.4182243084e-16]
194
+ [ 0 -0.0702748344418 0.491416161212 0.155925712173 0.707106781187]
195
+ [ 0 0.413171180356 0.141163094698 0.0923242547901 0.707106781187]
196
+ [ 0 0.826342360711 0.282326189397 0.18464850958 6.79812569682e-16]
197
+ [ 0 0.2402380858 0.792225196393 0.905370774276 4.70805946682e-16]
198
+
199
+ TESTS:
200
+
201
+ This tests if this routine selects only eigenvectors with
202
+ multiplicity one. Two of the eigenvalues are
203
+ (roughly) -92.21 and -90.30 so if we set ``eps = 2.0``
204
+ then they should compare as equal, causing both eigenvectors
205
+ to be absent from the matrix returned. The remaining eigenvalues
206
+ (ostensibly unique) are visible in the test, which should be
207
+ independent of which eigenvectors are returned, but it does presume
208
+ an ordering of these eigenvectors for the test to succeed.
209
+ This exercises a correction in :issue:`8018`. ::
210
+
211
+ sage: n = numerical_eigenforms(61, eps=2.0)
212
+ sage: evectors = n._eigenvectors()
213
+ sage: evalues = [(matrix((n._hecke_matrix*evectors).column(i))/matrix(evectors.column(i)))[0, 0]
214
+ ....: for i in range(evectors.ncols())]
215
+ sage: diff = n._hecke_matrix*evectors - evectors*diagonal_matrix(evalues)
216
+ sage: sum(abs(a) for a in diff.list()) < 1.0e-9
217
+ True
218
+ """
219
+ verbose('Finding eigenvector basis')
220
+ M = self.modular_symbols()
221
+
222
+ tp = self._tp
223
+ p = tp[0]
224
+ t = M.T(p).matrix()
225
+ for p in tp[1:]:
226
+ t += randint(-50, 50) * M.T(p).matrix()
227
+
228
+ self._hecke_matrix = t
229
+
230
+ global scipy
231
+ if scipy is None:
232
+ import scipy
233
+ import scipy.linalg
234
+ evals, eig = scipy.linalg.eig(self._hecke_matrix.numpy(), right=True, left=False)
235
+ B = matrix(eig)
236
+ v = [CDF(evals[i]) for i in range(len(evals))]
237
+
238
+ # Determine the eigenvectors with eigenvalues of multiplicity
239
+ # one, with equality controlled by the value of eps
240
+ # Keep just these eigenvectors
241
+ eps = self._eps
242
+ w = []
243
+ for i in range(len(v)):
244
+ e = v[i]
245
+ uniq = True
246
+ for j in range(len(v)):
247
+ if uniq and i != j and abs(e-v[j]) < eps:
248
+ uniq = False
249
+ if uniq:
250
+ w.append(i)
251
+ return B.matrix_from_columns(w)
252
+
253
+ @cached_method
254
+ def _easy_vector(self):
255
+ """
256
+ Return a very sparse vector v such that v times the eigenvector matrix
257
+ has all entries nonzero.
258
+
259
+ ALGORITHM:
260
+
261
+ 1. Choose row with the most nonzero entries. (put 1 there)
262
+
263
+ 2. Consider submatrix of columns corresponding to zero entries
264
+ in row chosen in 1.
265
+
266
+ 3. Find row of submatrix with most nonzero entries, and add
267
+ appropriate multiple. Repeat.
268
+
269
+ EXAMPLES::
270
+
271
+ sage: n = numerical_eigenforms(37)
272
+ sage: n._easy_vector() # slightly random output
273
+ (1.0, 1.0, 0)
274
+ sage: n = numerical_eigenforms(43)
275
+ sage: n._easy_vector() # slightly random output
276
+ (1.0, 0, 1.0, 0)
277
+ sage: n = numerical_eigenforms(125)
278
+ sage: n._easy_vector() # slightly random output
279
+ (0, 0, 0, 1.0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
280
+ """
281
+ E = self._eigenvectors()
282
+ delta = self._delta
283
+ x = (CDF**E.nrows()).zero_vector()
284
+ if E.nrows() == 0:
285
+ return x
286
+
287
+ def best_row(M):
288
+ """
289
+ Find the best row among rows of M, i.e. the row
290
+ with the most entries supported outside [-delta, delta].
291
+
292
+ EXAMPLES::
293
+
294
+ sage: numerical_eigenforms(61)._easy_vector() # indirect doctest
295
+ (1.0, 0.0, 0.0, 0.0, 1.0)
296
+ """
297
+ R = M.rows()
298
+ v = [len(support(r, delta)) for r in R]
299
+ m = max(v)
300
+ i = v.index(m)
301
+ return i, R[i]
302
+
303
+ i, e = best_row(E)
304
+
305
+ x[i] = 1
306
+
307
+ while True:
308
+ s = set(support(e, delta))
309
+ zp = [j for j in range(e.degree()) if j not in s]
310
+ if not zp:
311
+ break
312
+ C = E.matrix_from_columns(zp)
313
+ # best row
314
+ i, f = best_row(C)
315
+ x[i] += 1 # simplistic
316
+ e = x * E
317
+
318
+ self.__easy_vector = x
319
+ return x
320
+
321
+ @cached_method
322
+ def _eigendata(self):
323
+ """
324
+ Return all eigendata for self._easy_vector().
325
+
326
+ EXAMPLES::
327
+
328
+ sage: numerical_eigenforms(61)._eigendata() # random order
329
+ ((1.0, 0.668205013164, 0.219198805797, 0.49263343893, 0.707106781187), (1.0, 1.49654668896, 4.5620686498, 2.02990686579, 1.41421356237), [0, 1], (1.0, 1.0))
330
+ """
331
+ x = self._easy_vector()
332
+
333
+ B = self._eigenvectors()
334
+
335
+ def phi(y):
336
+ """
337
+ Take coefficients and a basis, and return that
338
+ linear combination of basis vectors.
339
+
340
+ EXAMPLES::
341
+
342
+ sage: n = numerical_eigenforms(61) # indirect doctest
343
+ sage: n._eigendata() # random order
344
+ ((1.0, 0.668205013164, 0.219198805797, 0.49263343893, 0.707106781187), (1.0, 1.49654668896, 4.5620686498, 2.02990686579, 1.41421356237), [0, 1], (1.0, 1.0))
345
+ """
346
+ return y.element() * B
347
+
348
+ phi_x = phi(x)
349
+ V = phi_x.parent()
350
+ phi_x_inv = V([a**(-1) for a in phi_x])
351
+ eps = self._eps
352
+ nzp = support(x, eps)
353
+ x_nzp = vector(CDF, x.list_from_positions(nzp))
354
+ self.__eigendata = (phi_x, phi_x_inv, nzp, x_nzp)
355
+ return self.__eigendata
356
+
357
+ @cached_method
358
+ def ap(self, p):
359
+ """
360
+ Return a list of the eigenvalues of the Hecke operator `T_p`
361
+ on all the computed eigenforms. The eigenvalues match up
362
+ between one prime and the next.
363
+
364
+ INPUT:
365
+
366
+ - ``p`` -- integer; a prime number
367
+
368
+ OUTPUT: list of double precision complex numbers
369
+
370
+ EXAMPLES::
371
+
372
+ sage: n = numerical_eigenforms(11,4)
373
+ sage: n.ap(2) # random order
374
+ [9.0, 9.0, 2.73205080757, -0.732050807569]
375
+ sage: n.ap(3) # random order
376
+ [28.0, 28.0, -7.92820323028, 5.92820323028]
377
+ sage: m = n.modular_symbols()
378
+ sage: x = polygen(QQ, 'x')
379
+ sage: m.T(2).charpoly('x').factor()
380
+ (x - 9)^2 * (x^2 - 2*x - 2)
381
+ sage: m.T(3).charpoly('x').factor()
382
+ (x - 28)^2 * (x^2 + 2*x - 47)
383
+ """
384
+ p = Integer(p)
385
+ if not p.is_prime():
386
+ raise ValueError("p must be a prime")
387
+ return Sequence(self.eigenvalues([p])[0], immutable=True)
388
+
389
+ def eigenvalues(self, primes):
390
+ """
391
+ Return the eigenvalues of the Hecke operators corresponding
392
+ to the primes in the input list of primes. The eigenvalues
393
+ match up between one prime and the next.
394
+
395
+ INPUT:
396
+
397
+ - ``primes`` -- list of primes
398
+
399
+ OUTPUT: list of lists of eigenvalues
400
+
401
+ EXAMPLES::
402
+
403
+ sage: n = numerical_eigenforms(1,12)
404
+ sage: n.eigenvalues([3,5,13]) # rel tol 2.4e-10
405
+ [[177148.0, 252.00000000001896], [48828126.0, 4830.000000001376], [1792160394038.0, -577737.9999898539]]
406
+ """
407
+ primes = [Integer(p) for p in primes]
408
+ for p in primes:
409
+ if not p.is_prime():
410
+ raise ValueError('each element of primes must be prime.')
411
+ phi_x, phi_x_inv, nzp, x_nzp = self._eigendata()
412
+ B = self._eigenvectors()
413
+
414
+ def phi(y):
415
+ """
416
+ Take coefficients and a basis, and return that
417
+ linear combination of basis vectors.
418
+
419
+ EXAMPLES::
420
+
421
+ sage: n = numerical_eigenforms(1,12) # indirect doctest
422
+ sage: n.eigenvalues([3,5,13]) # rel tol 2.4e-10
423
+ [[177148.0, 252.00000000001896], [48828126.0, 4830.000000001376], [1792160394038.0, -577737.9999898539]]
424
+ """
425
+ return y.element() * B
426
+
427
+ ans = []
428
+ m = self.modular_symbols().ambient_module()
429
+ for p in primes:
430
+ t = m._compute_hecke_matrix_prime(p, nzp)
431
+ w = phi(x_nzp*t)
432
+ ans.append([w[i]*phi_x_inv[i] for i in range(w.degree())])
433
+ return ans
434
+
435
+ def systems_of_eigenvalues(self, bound):
436
+ """
437
+ Return all systems of eigenvalues for ``self`` for primes
438
+ up to bound.
439
+
440
+ EXAMPLES::
441
+
442
+ sage: numerical_eigenforms(61).systems_of_eigenvalues(10) # rel tol 1e-9
443
+ [[-1.481194304092014,
444
+ 0.8060634335253706,
445
+ 3.156325174658664,
446
+ 0.6751308705666462],
447
+ [-1.0, -2.0, -3.0, 1.0],
448
+ [0.311107817465981,
449
+ 2.903211925911551,
450
+ -2.5254275608435184,
451
+ -3.214319743377534],
452
+ [2.1700864866260323,
453
+ -1.7092753594369237,
454
+ -1.6308976138151459,
455
+ -0.460811127189112],
456
+ [3.0, 4.0, 6.0, 8.0]]
457
+ """
458
+ P = prime_range(bound)
459
+ e = self.eigenvalues(P)
460
+ v = Sequence([], cr=True)
461
+ if len(e) == 0:
462
+ return v
463
+ for i in range(len(e[0])):
464
+ v.append([e[j][i] for j in range(len(e))])
465
+ v.sort()
466
+ v.set_immutable()
467
+ return v
468
+
469
+ def systems_of_abs(self, bound):
470
+ """
471
+ Return the absolute values of all systems of eigenvalues for
472
+ ``self`` for primes up to bound.
473
+
474
+ EXAMPLES::
475
+
476
+ sage: numerical_eigenforms(61).systems_of_abs(10) # rel tol 1e-9
477
+ [[0.311107817465981, 2.903211925911551, 2.5254275608435184, 3.214319743377534],
478
+ [1.0, 2.0, 3.0, 1.0],
479
+ [1.481194304092014,
480
+ 0.8060634335253706,
481
+ 3.156325174658664,
482
+ 0.6751308705666462],
483
+ [2.1700864866260323,
484
+ 1.7092753594369237,
485
+ 1.6308976138151459,
486
+ 0.460811127189112],
487
+ [3.0, 4.0, 6.0, 8.0]]
488
+ """
489
+ P = prime_range(bound)
490
+ e = self.eigenvalues(P)
491
+ v = Sequence([], cr=True)
492
+ if len(e) == 0:
493
+ return v
494
+ for i in range(len(e[0])):
495
+ v.append([abs(e[j][i]) for j in range(len(e))])
496
+ v.sort()
497
+ v.set_immutable()
498
+ return v
499
+
500
+
501
+ def support(v, eps):
502
+ """
503
+ Given a vector `v` and a threshold eps, return all
504
+ indices where `|v|` is larger than eps.
505
+
506
+ EXAMPLES::
507
+
508
+ sage: sage.modular.modform.numerical.support( numerical_eigenforms(61)._easy_vector(), 1.0 )
509
+ []
510
+
511
+ sage: sage.modular.modform.numerical.support( numerical_eigenforms(61)._easy_vector(), 0.5 )
512
+ [0, 4]
513
+ """
514
+ return [i for i in range(v.degree()) if abs(v[i]) > eps]
@@ -0,0 +1,14 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ """
3
+ Periods of modular forms
4
+ """
5
+
6
+ # The following idea just occurred to me.
7
+ # We could use that $\langle T_n(g), x\rangle = \langle g, T_n(x)\rangle$
8
+ # for any Hecke operator $T_n$, so that we only need to compute
9
+ # the period integrals $\langle g, x_i\rangle$. Then we obtain all pairings
10
+ # $\langle T_n(g), x_i \rangle = \langle g , T_n(x_i) \rangle$.
11
+ # Since the $T_n(g)$ span the simple $\T$-module $S_k(\Gamma;\Q)[I]$,
12
+ # this must give all pairings. However, it requires computing
13
+ # only $2d$ pairings instead of $2d^2$ pairings, which is potentially
14
+ # a huge savings when $d$ is large.