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,856 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.rings.padics
3
+ r"""
4
+ Manin map
5
+
6
+ Represents maps from a set of right coset representatives to a
7
+ coefficient module.
8
+
9
+ This is a basic building block for implementing modular symbols, and
10
+ provides basic arithmetic and right action of matrices.
11
+
12
+ EXAMPLES::
13
+
14
+ sage: # needs eclib
15
+ sage: E = EllipticCurve('11a')
16
+ sage: phi = E.pollack_stevens_modular_symbol()
17
+ sage: phi
18
+ Modular symbol of level 11 with values in Sym^0 Q^2
19
+ sage: phi.values()
20
+ [-1/5, 1, 0]
21
+
22
+ sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z
23
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
24
+ sage: D = OverconvergentDistributions(0, 11, 10)
25
+ sage: MR = ManinRelations(11)
26
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
27
+ sage: f = ManinMap(D, MR, data)
28
+ sage: f(M2Z([1,0,0,1]))
29
+ (1 + O(11^2), 2 + O(11))
30
+
31
+ sage: S = Symk(0,QQ)
32
+ sage: MR = ManinRelations(37)
33
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
34
+ sage: f = ManinMap(S,MR,data)
35
+ sage: f(M2Z([2,3,4,5]))
36
+ 1
37
+ """
38
+
39
+ # ****************************************************************************
40
+ # Copyright (C) 2012 Robert Pollack <rpollack@math.bu.edu>
41
+ #
42
+ # Distributed under the terms of the GNU General Public License (GPL)
43
+ # as published by the Free Software Foundation; either version 2 of
44
+ # the License, or (at your option) any later version.
45
+ # https://www.gnu.org/licenses/
46
+ # ****************************************************************************
47
+
48
+ from typing import Self
49
+
50
+ from sage.matrix.matrix_space import MatrixSpace
51
+ from sage.rings.continued_fraction import convergents
52
+ from sage.rings.integer_ring import ZZ
53
+ from sage.structure.element import coercion_model
54
+
55
+ from .fund_domain import M2Z, t00, t01, t10, t11
56
+ from .sigma0 import Sigma0
57
+
58
+
59
+ def unimod_matrices_to_infty(r, s):
60
+ r"""
61
+ Return a list of matrices whose associated unimodular paths connect `0` to ``r/s``.
62
+
63
+ INPUT:
64
+
65
+ - ``r``, ``s`` -- rational numbers
66
+
67
+ OUTPUT:
68
+
69
+ - a list of matrices in `SL_2(\ZZ)`
70
+
71
+ EXAMPLES::
72
+
73
+ sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(19,23); v
74
+ [
75
+ [1 0] [ 0 1] [1 4] [-4 5] [ 5 19]
76
+ [0 1], [-1 1], [1 5], [-5 6], [ 6 23]
77
+ ]
78
+ sage: [a.det() for a in v]
79
+ [1, 1, 1, 1, 1]
80
+
81
+ sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_to_infty(11,25)
82
+ [
83
+ [1 0] [ 0 1] [1 3] [-3 4] [ 4 11]
84
+ [0 1], [-1 2], [2 7], [-7 9], [ 9 25]
85
+ ]
86
+
87
+
88
+ ALGORITHM:
89
+
90
+ This is Manin's continued fraction trick, which gives an expression
91
+ `\{0,r/s\} = \{0,\infty\} + ... + \{a,b\} + ... + \{*,r/s\}`, where each `\{a,b\}` is
92
+ the image of `\{0,\infty\}` under a matrix in `SL_2(\ZZ)`.
93
+ """
94
+ if s == 0:
95
+ return []
96
+ # the function contfrac_q in
97
+ # https://github.com/williamstein/psage/blob/master/psage/modform/rational/modular_symbol_map.pyx
98
+ # is very, very relevant to massively optimizing this.
99
+ L = convergents(r / s)
100
+ # Computes the continued fraction convergents of r/s
101
+ v = [M2Z([1, L[0].numerator(), 0, L[0].denominator()])]
102
+ # Initializes the list of matrices
103
+ for j in range(len(L) - 1):
104
+ a = L[j].numerator()
105
+ c = L[j].denominator()
106
+ b = L[j + 1].numerator()
107
+ d = L[j + 1].denominator()
108
+ v.append(M2Z([(-1) ** (j + 1) * a, b, (-1) ** (j + 1) * c, d]))
109
+ # The matrix connecting two consecutive convergents is added on
110
+ return v
111
+
112
+
113
+ def unimod_matrices_from_infty(r, s):
114
+ r"""
115
+ Return a list of matrices whose associated unimodular paths connect `\infty` to ``r/s``.
116
+
117
+ INPUT:
118
+
119
+ - ``r``, ``s`` -- rational numbers
120
+
121
+ OUTPUT:
122
+
123
+ - a list of `SL_2(\ZZ)` matrices
124
+
125
+ EXAMPLES::
126
+
127
+ sage: v = sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(19,23); v
128
+ [
129
+ [ 0 1] [-1 0] [-4 1] [-5 -4] [-19 5]
130
+ [-1 0], [-1 -1], [-5 1], [-6 -5], [-23 6]
131
+ ]
132
+ sage: [a.det() for a in v]
133
+ [1, 1, 1, 1, 1]
134
+
135
+ sage: sage.modular.pollack_stevens.manin_map.unimod_matrices_from_infty(11,25)
136
+ [
137
+ [ 0 1] [-1 0] [-3 1] [-4 -3] [-11 4]
138
+ [-1 0], [-2 -1], [-7 2], [-9 -7], [-25 9]
139
+ ]
140
+
141
+
142
+ ALGORITHM:
143
+
144
+ This is Manin's continued fraction trick, which gives an expression
145
+ `\{\infty,r/s\} = \{\infty,0\} + ... + \{a,b\} + ... + \{*,r/s\}`, where each
146
+ `\{a,b\}` is the image of `\{0,\infty\}` under a matrix in `SL_2(\ZZ)`.
147
+ """
148
+ if s != 0:
149
+ L = convergents(r / s)
150
+ # Computes the continued fraction convergents of r/s
151
+ v = [M2Z([-L[0].numerator(), 1, -L[0].denominator(), 0])]
152
+ # Initializes the list of matrices
153
+ # the function contfrac_q in https://github.com/williamstein/psage/blob/master/psage/modform/rational/modular_symbol_map.pyx
154
+ # is very, very relevant to massively optimizing this.
155
+ for j in range(len(L) - 1):
156
+ a = L[j].numerator()
157
+ c = L[j].denominator()
158
+ b = L[j + 1].numerator()
159
+ d = L[j + 1].denominator()
160
+ v.append(M2Z([-b, (-1) ** (j + 1) * a, -d, (-1) ** (j + 1) * c]))
161
+ # The matrix connecting two consecutive convergents is added on
162
+ return v
163
+ else:
164
+ return []
165
+
166
+
167
+ class ManinMap:
168
+ r"""
169
+ Map from a set of right coset representatives of `\Gamma_0(N)` in
170
+ `SL_2(\ZZ)` to a coefficient module that satisfies the Manin
171
+ relations.
172
+
173
+ INPUT:
174
+
175
+ - ``codomain`` -- coefficient module
176
+ - ``manin_relations`` -- a :class:`sage.modular.pollack_stevens.fund_domain.ManinRelations`
177
+ object
178
+ - ``defining_data`` -- dictionary whose keys are a superset of
179
+ ``manin_relations.gens()`` and a subset of ``manin_relations.reps()``,
180
+ and whose values are in the codomain
181
+ - ``check`` -- do numerous (slow) checks and transformations to
182
+ ensure that the input data is perfect
183
+
184
+ EXAMPLES::
185
+
186
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
187
+ sage: D = OverconvergentDistributions(0, 11, 10)
188
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
189
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
190
+ sage: f = ManinMap(D, manin, data); f # indirect doctest
191
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
192
+ sage: f(M2Z([1,0,0,1]))
193
+ (1 + O(11^2), 2 + O(11))
194
+ """
195
+ def __init__(self, codomain, manin_relations, defining_data, check=True):
196
+ """
197
+ INPUT:
198
+
199
+ - ``codomain`` -- coefficient module
200
+ - ``manin_relations`` -- a :class:`ManinRelations` object
201
+ - ``defining_data`` -- dictionary whose keys are a superset of
202
+ :meth:`manin_relations.gens()` and a subset of manin_relations.reps(),
203
+ and whose values are in the codomain
204
+ - ``check`` -- do numerous (slow) checks and transformations to
205
+ ensure that the input data is perfect
206
+
207
+ TESTS:
208
+
209
+ Test that it fails gracefully on some bogus inputs::
210
+
211
+ sage: from sage.modular.pollack_stevens.manin_map import ManinMap
212
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
213
+ sage: rels = ManinRelations(37)
214
+ sage: ManinMap(ZZ, rels, {})
215
+ Traceback (most recent call last):
216
+ ...
217
+ ValueError: Codomain must have an action of Sigma0(N)
218
+ sage: ManinMap(Symk(0), rels, [])
219
+ Traceback (most recent call last):
220
+ ...
221
+ ValueError: length of defining data must be the same as number of Manin generators
222
+ """
223
+ self._codomain = codomain
224
+ self._manin = manin_relations
225
+ if check:
226
+ if coercion_model.get_action(codomain, Sigma0(manin_relations._N)) is None:
227
+ raise ValueError("Codomain must have an action of Sigma0(N)")
228
+ self._dict = {}
229
+ if isinstance(defining_data, (list, tuple)):
230
+ if len(defining_data) != manin_relations.ngens():
231
+ raise ValueError("length of defining data must be the same as number of Manin generators")
232
+ for i in range(len(defining_data)):
233
+ self._dict[manin_relations.gen(i)] = codomain(defining_data[i])
234
+ elif isinstance(defining_data, dict):
235
+ for g in manin_relations.gens():
236
+ self._dict[g] = codomain(defining_data[g])
237
+ else:
238
+ # constant function
239
+ try:
240
+ c = codomain(defining_data)
241
+ except TypeError:
242
+ raise TypeError("unrecognized type %s for defining_data" % type(defining_data))
243
+ g = manin_relations.gens()
244
+ self._dict = dict(zip(g, [c] * len(g)))
245
+ else:
246
+ self._dict = defining_data
247
+
248
+ def extend_codomain(self, new_codomain, check=True):
249
+ r"""
250
+ Extend the codomain of ``self`` to ``new_codomain``. There must be a
251
+ valid conversion operation from the old to the new codomain. This is
252
+ most often used for extension of scalars from `\QQ` to `\QQ_p`.
253
+
254
+ EXAMPLES::
255
+
256
+ sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z
257
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
258
+ sage: S = Symk(0,QQ)
259
+ sage: MR = ManinRelations(37)
260
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
261
+ sage: m = ManinMap(S, MR, data); m
262
+ Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q^2
263
+ sage: m.extend_codomain(Symk(0, Qp(11)))
264
+ Map from the set of right cosets of Gamma0(37) in SL_2(Z) to Sym^0 Q_11^2
265
+ """
266
+ new_dict = {}
267
+ for g in self._manin.gens():
268
+ new_dict[g] = new_codomain(self._dict[g])
269
+ return ManinMap(new_codomain, self._manin, new_dict, check)
270
+
271
+ def _compute_image_from_gens(self, B):
272
+ r"""
273
+ Compute the image of ``B`` under ``self``.
274
+
275
+ INPUT:
276
+
277
+ - ``B`` -- generator of Manin relations
278
+
279
+ OUTPUT:
280
+
281
+ An element in the codomain of ``self`` (e.g. a distribution), the image
282
+ of ``B`` under ``self``.
283
+
284
+ EXAMPLES::
285
+
286
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
287
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
288
+ sage: D = OverconvergentDistributions(0, 11, 10)
289
+ sage: MR = ManinRelations(11)
290
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
291
+ sage: f = ManinMap(D, MR, data)
292
+ sage: f._compute_image_from_gens(MR.reps()[1])
293
+ (10 + 10*11 + O(11^2), 8 + O(11))
294
+ """
295
+ L = self._manin.relations(B)
296
+ # could raise KeyError if B is not a generator
297
+ t = self._codomain(0)
298
+ for c, A, g in L:
299
+ g1 = self._dict[self._manin.reps(g)] * A
300
+ t += g1 * c
301
+ return t.normalize()
302
+
303
+ def __getitem__(self, B):
304
+ r"""
305
+
306
+ Compute the image of ``B`` under ``self``.
307
+
308
+ INPUT:
309
+
310
+ - ``B`` -- coset representative of Manin relations
311
+
312
+ OUTPUT:
313
+
314
+ An element in the codomain of ``self`` (e.g. a distribution), the image
315
+ of ``B`` under ``self``.
316
+
317
+ EXAMPLES::
318
+
319
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
320
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
321
+ sage: S = Symk(0,QQ)
322
+ sage: MR = ManinRelations(37); MR.gens()
323
+ (
324
+ [1 0] [ 0 -1] [-1 -1] [-1 -2] [-2 -3] [-3 -1] [-1 -4] [-4 -3]
325
+ [0 1], [ 1 4], [ 4 3], [ 3 5], [ 5 7], [ 7 2], [ 2 7], [ 7 5],
326
+ <BLANKLINE>
327
+ [-2 -3]
328
+ [ 3 4]
329
+ )
330
+
331
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
332
+ sage: D = OverconvergentDistributions(2, 37, 40)
333
+ sage: f = ManinMap(D, MR, data)
334
+ sage: f.__getitem__(MR.gens()[1])
335
+ 1 + O(37)
336
+ sage: f.__getitem__(MR.gens()[3])
337
+ O(37^40)
338
+ sage: f.__getitem__(MR.gens()[5])
339
+ 36 + O(37)
340
+ sage: f[MR.gens()[5]]
341
+ 36 + O(37)
342
+ """
343
+ try:
344
+ return self._dict[B]
345
+ except KeyError:
346
+ # To prevent memory overflow
347
+ return self._compute_image_from_gens(B)
348
+ # self._dict[B] = self._compute_image_from_gens(B)
349
+ # return self._dict[B]
350
+
351
+ def compute_full_data(self):
352
+ r"""
353
+ Compute the values of ``self`` on all coset reps from its values on our
354
+ generating set.
355
+
356
+ EXAMPLES::
357
+
358
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
359
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
360
+ sage: S = Symk(0,QQ)
361
+ sage: MR = ManinRelations(37); MR.gens()
362
+ (
363
+ [1 0] [ 0 -1] [-1 -1] [-1 -2] [-2 -3] [-3 -1] [-1 -4] [-4 -3]
364
+ [0 1], [ 1 4], [ 4 3], [ 3 5], [ 5 7], [ 7 2], [ 2 7], [ 7 5],
365
+ <BLANKLINE>
366
+ [-2 -3]
367
+ [ 3 4]
368
+ )
369
+
370
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
371
+ sage: f = ManinMap(S,MR,data)
372
+ sage: len(f._dict)
373
+ 9
374
+ sage: f.compute_full_data()
375
+ sage: len(f._dict)
376
+ 38
377
+ """
378
+ for B in self._manin.reps():
379
+ if B not in self._dict:
380
+ self._dict[B] = self._compute_image_from_gens(B)
381
+
382
+ def __add__(self, right):
383
+ r"""
384
+ Return sum ``self + right``, where ``self`` and ``right`` are
385
+ assumed to have identical codomains and Manin relations.
386
+
387
+ INPUT:
388
+
389
+ - ``self``, ``right`` -- two Manin maps with the same codomain and
390
+ Manin relations
391
+
392
+ OUTPUT: the sum of ``self`` and ``right`` -- a Manin map
393
+
394
+ EXAMPLES::
395
+
396
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
397
+ sage: D = OverconvergentDistributions(0, 11, 10); D
398
+ Space of 11-adic distributions with k=0 action and precision cap 10
399
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
400
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
401
+ sage: f = ManinMap(D, manin, data); f
402
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
403
+ sage: f(M2Z([1,0,0,1]))
404
+ (1 + O(11^2), 2 + O(11))
405
+ sage: f+f # indirect doctest
406
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
407
+ sage: (f+f)(M2Z([1,0,0,1]))
408
+ (2 + O(11^2), 4 + O(11))
409
+ """
410
+ D = {}
411
+ sd = self._dict
412
+ rd = right._dict
413
+ for ky, val in sd.items():
414
+ if ky in rd:
415
+ D[ky] = val + rd[ky]
416
+ return self.__class__(self._codomain, self._manin, D, check=False)
417
+
418
+ def __sub__(self, right):
419
+ """
420
+ Return difference ``self`` - right, where ``self`` and ``right`` are
421
+ assumed to have identical codomains and Manin relations.
422
+
423
+ INPUT:
424
+
425
+ - ``self``, ``right`` -- two Manin maps with the same codomain and
426
+ Manin relations
427
+
428
+ OUTPUT: the difference of ``self`` and ``right`` -- a Manin map
429
+
430
+ EXAMPLES::
431
+
432
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
433
+ sage: D = OverconvergentDistributions(0, 11, 10); D
434
+ Space of 11-adic distributions with k=0 action and precision cap 10
435
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
436
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
437
+ sage: f = ManinMap(D, manin, data); f
438
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
439
+ sage: f(M2Z([1,0,0,1]))
440
+ (1 + O(11^2), 2 + O(11))
441
+ sage: f-f
442
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
443
+ sage: (f-f)(M2Z([1,0,0,1]))
444
+ (O(11^2), O(11))
445
+ """
446
+ D = {}
447
+ sd = self._dict
448
+ rd = right._dict
449
+ for ky, val in sd.items():
450
+ if ky in rd:
451
+ D[ky] = val - rd[ky]
452
+ return self.__class__(self._codomain, self._manin, D, check=False)
453
+
454
+ def __mul__(self, right):
455
+ """
456
+ Return scalar multiplication ``self * right``, where ``right`` is in
457
+ the base ring of the codomain.
458
+
459
+ INPUT:
460
+
461
+ - ``self`` -- a Manin map
462
+ - ``right`` -- an element of the base ring of the codomain of self
463
+
464
+ OUTPUT: the sum ``self`` and ``right`` -- a Manin map
465
+
466
+ EXAMPLES::
467
+
468
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
469
+ sage: D = OverconvergentDistributions(0, 11, 10)
470
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
471
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
472
+ sage: f = ManinMap(D, manin, data)
473
+ sage: f(M2Z([1,0,0,1]))
474
+ (1 + O(11^2), 2 + O(11))
475
+ sage: f*2
476
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
477
+ sage: (f*2)(M2Z([1,0,0,1]))
478
+ (2 + O(11^2), 4 + O(11))
479
+ """
480
+ tp = Sigma0(self._manin.level())(MatrixSpace(ZZ, 2, 2)([1, 0, 0, 1]))
481
+ if isinstance(right, type(tp)):
482
+ return self._right_action(right)
483
+
484
+ D = {}
485
+ for ky, val in self._dict.items():
486
+ D[ky] = val * right
487
+ return self.__class__(self._codomain, self._manin, D, check=False)
488
+
489
+ def __repr__(self):
490
+ """
491
+ Return string representation of ``self``.
492
+
493
+ EXAMPLES::
494
+
495
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
496
+ sage: D = OverconvergentDistributions(0, 11, 10)
497
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
498
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
499
+ sage: f = ManinMap(D, manin, data)
500
+ sage: f.__repr__()
501
+ 'Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10'
502
+ """
503
+ return "Map from the set of right cosets of Gamma0(%s) in SL_2(Z) to %s" % (self._manin.level(), self._codomain)
504
+
505
+ def _eval_sl2(self, A):
506
+ r"""
507
+ Return the value of ``self`` on the unimodular divisor corresponding to `A`.
508
+
509
+ Note that `A` must be in `SL_2(Z)` for this to work.
510
+
511
+ INPUT:
512
+
513
+ - ``A`` -- an element of `SL_2(Z)`
514
+
515
+ OUTPUT:
516
+
517
+ The value of ``self`` on the divisor corresponding to `A` -- i.e. on
518
+ the divisor `\{A(0)\} - \{A(\infty)\}`.
519
+
520
+ EXAMPLES::
521
+
522
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
523
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
524
+ sage: D = OverconvergentDistributions(0, 11, 10)
525
+ sage: MR = ManinRelations(11)
526
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
527
+ sage: f = ManinMap(D, MR, data)
528
+ sage: A = MR.reps()[1]
529
+ sage: f._eval_sl2(A)
530
+ (10 + 10*11 + O(11^2), 8 + O(11))
531
+ """
532
+ SN = Sigma0(self._manin._N)
533
+ A = M2Z(A)
534
+ B = self._manin.equivalent_rep(A)
535
+ gaminv = SN(B * M2Z(A).adjugate())
536
+ return (self[B] * gaminv).normalize()
537
+
538
+ def __call__(self, A):
539
+ """
540
+ Evaluate ``self`` at A.
541
+
542
+ INPUT:
543
+
544
+ - ``A`` -- a `2 \times 2` matrix
545
+
546
+ OUTPUT: the value of ``self`` on the divisor corresponding to ``A`` --
547
+ an element of the codomain of self
548
+
549
+ EXAMPLES::
550
+
551
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
552
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
553
+ sage: D = OverconvergentDistributions(0, 11, 10); D
554
+ Space of 11-adic distributions with k=0 action and precision cap 10
555
+ sage: manin = ManinRelations(11)
556
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
557
+ sage: f = ManinMap(D, manin, data); f
558
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Space of 11-adic distributions with k=0 action and precision cap 10
559
+ sage: f(M2Z([1,0,0,1]))
560
+ (1 + O(11^2), 2 + O(11))
561
+
562
+ sage: S = Symk(0,QQ)
563
+ sage: MR = ManinRelations(37)
564
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
565
+ sage: f = ManinMap(S,MR,data)
566
+ sage: f(M2Z([2,3,4,5]))
567
+ 1
568
+ """
569
+ a = A[t00]
570
+ b = A[t01]
571
+ c = A[t10]
572
+ d = A[t11]
573
+ # v1: a list of unimodular matrices whose divisors add up to {b/d} - {infty}
574
+ v1 = unimod_matrices_to_infty(b, d)
575
+ # v2: a list of unimodular matrices whose divisors add up to {a/c} - {infty}
576
+ v2 = unimod_matrices_to_infty(a, c)
577
+ # ans: the value of self on A
578
+ ans = self._codomain(0)
579
+ # This loop computes self({b/d}-{infty}) by adding up the values of self on elements of v1
580
+ for B in v1:
581
+ ans = ans + self._eval_sl2(B)
582
+
583
+ # This loops subtracts away the value self({a/c}-{infty}) from ans by subtracting away the values of self on elements of v2
584
+ # and so in the end ans becomes self({b/d}-{a/c}) = self({A(0)} - {A(infty)}
585
+ for B in v2:
586
+ ans = ans - self._eval_sl2(B)
587
+ return ans.normalize()
588
+
589
+ def apply(self, f, codomain=None, to_moments=False):
590
+ r"""
591
+ Return Manin map given by `x \mapsto f(self(x))`, where `f` is
592
+ anything that can be called with elements of the coefficient
593
+ module.
594
+
595
+ This might be used to normalize, reduce modulo a prime, change
596
+ base ring, etc.
597
+
598
+ INPUT:
599
+
600
+ - ``f`` -- anything that can be called with elements of the coefficient
601
+ module
602
+ - ``codomain`` -- (default: ``None``) the codomain of the return map
603
+ - ``to_moments`` -- boolean (default: ``False``); if ``True``, will
604
+ apply ``f`` to each of the moments instead
605
+
606
+ EXAMPLES::
607
+
608
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
609
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
610
+ sage: S = Symk(0,QQ)
611
+ sage: MR = ManinRelations(37)
612
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
613
+ sage: f = ManinMap(S,MR,data)
614
+ sage: list(f.apply(lambda t:2*t))
615
+ [0, 2, 0, 0, 0, -2, 2, 0, 0]
616
+ """
617
+ D = {}
618
+ sd = self._dict
619
+ if codomain is None:
620
+ codomain = self._codomain
621
+ for ky, val in sd.items():
622
+ if to_moments:
623
+ D[ky] = codomain([f(val.moment(a))
624
+ for a in range(val.precision_absolute())])
625
+ else:
626
+ D[ky] = f(val)
627
+ return self.__class__(codomain, self._manin, D, check=False)
628
+
629
+ def __iter__(self):
630
+ r"""
631
+ Return iterator over the values of this map on the reduced
632
+ representatives.
633
+
634
+ This might be used to compute the valuation.
635
+
636
+ EXAMPLES::
637
+
638
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
639
+ sage: from sage.modular.pollack_stevens.fund_domain import ManinRelations
640
+ sage: S = Symk(0,QQ)
641
+ sage: MR = ManinRelations(37)
642
+ sage: data = {M2Z([-2,-3,5,7]): S(0), M2Z([1,0,0,1]): S(0), M2Z([-1,-2,3,5]): S(0), M2Z([-1,-4,2,7]): S(1), M2Z([0,-1,1,4]): S(1), M2Z([-3,-1,7,2]): S(-1), M2Z([-2,-3,3,4]): S(0), M2Z([-4,-3,7,5]): S(0), M2Z([-1,-1,4,3]): S(0)}
643
+ sage: f = ManinMap(S,MR,data)
644
+ sage: [a for a in f]
645
+ [0, 1, 0, 0, 0, -1, 1, 0, 0]
646
+ """
647
+ for A in self._manin.gens():
648
+ yield self._dict[A]
649
+
650
+ def _right_action(self, gamma):
651
+ r"""
652
+ Return `self | \gamma`, where `\gamma` is a `2 \times 2` integer matrix.
653
+
654
+ The action is defined by `(self | \gamma)(D) = self(\gamma D)|\gamma`
655
+
656
+ For the action by a single element `\gamma` to be a modular symbol, `\gamma`
657
+ must normalize `\Gamma_0(N)`. However, this right action
658
+ can also be used to define Hecke operators, in which case each
659
+ individual `self | \gamma` is not a modular symbol on `\Gamma_0(N)`, but
660
+ the sum over acting by the appropriate double coset representatives is.
661
+
662
+ INPUT:
663
+
664
+ - ``gamma`` -- `2 \times 2` integer matrix of nonzero determinant, with a
665
+ well-defined action on the coefficient module
666
+
667
+ OUTPUT: the image of ``self`` under the action of `\gamma` -- a Manin map
668
+
669
+ EXAMPLES::
670
+
671
+ sage: from sage.modular.pollack_stevens.manin_map import ManinMap, M2Z, Sigma0
672
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
673
+ sage: S01 = Sigma0(1)
674
+ sage: f = Newforms(7, 4)[0]
675
+ sage: f.modular_symbols(1)
676
+ Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 3 for Gamma_0(7) of weight 4 with sign 1 over Rational Field
677
+ sage: phi = ps_modsym_from_simple_modsym_space(f.modular_symbols(1))._map
678
+ sage: psi = phi._right_action(S01([2,3,4,5])); psi
679
+ Map from the set of right cosets of Gamma0(7) in SL_2(Z) to Sym^2 Q^2
680
+
681
+ sage: from sage.modular.pollack_stevens.space import ps_modsym_from_simple_modsym_space
682
+ sage: M = ModularSymbols(17,4,1).cuspidal_subspace()
683
+ sage: A = M.decomposition()
684
+ sage: f = ps_modsym_from_simple_modsym_space(A[0])._map
685
+ sage: g = f._right_action(S01([1,2,0,1]))
686
+ sage: g
687
+ Map from the set of right cosets of Gamma0(17) in SL_2(Z) to Sym^2 Q^2
688
+ sage: x = sage.modular.pollack_stevens.fund_domain.M2Z([2,3,1,0])
689
+ sage: g(x)
690
+ (17, -34, 69)
691
+ """
692
+ D = {}
693
+ # we should eventually replace the for loop with a call to apply_many
694
+ for ky in self._dict:
695
+ D[ky] = self(gamma * ky) * gamma
696
+ return self.__class__(self._codomain, self._manin, D, check=False)
697
+
698
+ def normalize(self) -> Self:
699
+ r"""
700
+ Normalize every value of ``self`` -- e.g., reduce each value's
701
+ `j`-th moment modulo `p^{N-j}`.
702
+
703
+ EXAMPLES::
704
+
705
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
706
+ sage: D = OverconvergentDistributions(0, 11, 10)
707
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
708
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
709
+ sage: f = ManinMap(D, manin, data)
710
+ sage: f._dict[M2Z([1,0,0,1])]
711
+ (1 + O(11^2), 2 + O(11))
712
+ sage: g = f.normalize()
713
+ sage: g._dict[M2Z([1,0,0,1])]
714
+ (1 + O(11^2), 2 + O(11))
715
+ """
716
+ sd = self._dict
717
+ for val in sd.values():
718
+ val.normalize()
719
+ return self
720
+
721
+ def reduce_precision(self, M):
722
+ r"""
723
+ Reduce the precision of all the values of the Manin map.
724
+
725
+ INPUT:
726
+
727
+ - ``M`` -- integer; the new precision
728
+
729
+ EXAMPLES::
730
+
731
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
732
+ sage: D = OverconvergentDistributions(0, 11, 10)
733
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
734
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
735
+ sage: f = ManinMap(D, manin, data)
736
+ sage: f._dict[M2Z([1,0,0,1])]
737
+ (1 + O(11^2), 2 + O(11))
738
+ sage: g = f.reduce_precision(1)
739
+ sage: g._dict[M2Z([1,0,0,1])]
740
+ 1 + O(11^2)
741
+ """
742
+ D = {}
743
+ for ky, val in self._dict.items():
744
+ D[ky] = val.reduce_precision(M)
745
+ return self.__class__(self._codomain, self._manin, D, check=False)
746
+
747
+ def specialize(self, *args):
748
+ r"""
749
+ Specialize all the values of the Manin map to a new coefficient
750
+ module. Assumes that the codomain has a ``specialize`` method, and
751
+ passes all its arguments to that method.
752
+
753
+ EXAMPLES::
754
+
755
+ sage: from sage.modular.pollack_stevens.manin_map import M2Z, ManinMap
756
+ sage: D = OverconvergentDistributions(0, 11, 10)
757
+ sage: manin = sage.modular.pollack_stevens.fund_domain.ManinRelations(11)
758
+ sage: data = {M2Z([1,0,0,1]):D([1,2]), M2Z([0,-1,1,3]):D([3,5]), M2Z([-1,-1,3,2]):D([1,1])}
759
+ sage: f = ManinMap(D, manin, data)
760
+ sage: g = f.specialize()
761
+ sage: g._codomain
762
+ Sym^0 Z_11^2
763
+ """
764
+ D = {}
765
+ for ky, val in self._dict.items():
766
+ D[ky] = val.specialize(*args)
767
+ return self.__class__(self._codomain.specialize(*args), self._manin,
768
+ D, check=False)
769
+
770
+ def hecke(self, ell, algorithm='prep'):
771
+ r"""
772
+ Return the image of this Manin map under the Hecke operator `T_{\ell}`.
773
+
774
+ INPUT:
775
+
776
+ - ``ell`` -- a prime
777
+
778
+ - ``algorithm`` -- string; either ``'prep'`` (default) or ``'naive'``
779
+
780
+ OUTPUT: the image of this ManinMap under the Hecke operator `T_{\ell}`
781
+
782
+ EXAMPLES::
783
+
784
+ sage: # needs eclib
785
+ sage: E = EllipticCurve('11a')
786
+ sage: phi = E.pollack_stevens_modular_symbol()
787
+ sage: phi.values()
788
+ [-1/5, 1, 0]
789
+ sage: phi.is_Tq_eigensymbol(7,7,10)
790
+ True
791
+ sage: phi.hecke(7).values()
792
+ [2/5, -2, 0]
793
+ sage: phi.Tq_eigenvalue(7,7,10)
794
+ -2
795
+ """
796
+ self.compute_full_data()
797
+ self.normalize()
798
+ M = self._manin
799
+
800
+ if algorithm == 'prep':
801
+ # psi will denote self | T_ell
802
+ psi = {}
803
+ for g in M.gens():
804
+ psi_g = sum((self[h] * A for h, A in M.prep_hecke_on_gen_list(ell, g)), self._codomain(0))
805
+ psi_g.normalize()
806
+ psi[g] = psi_g
807
+ return self.__class__(self._codomain, self._manin,
808
+ psi, check=False).normalize()
809
+ elif algorithm == 'naive':
810
+ S0N = Sigma0(self._manin.level())
811
+ psi = self._right_action(S0N([1, 0, 0, ell]))
812
+ for a in range(1, ell):
813
+ psi += self._right_action(S0N([1, a, 0, ell]))
814
+ if self._manin.level() % ell != 0:
815
+ psi += self._right_action(S0N([ell, 0, 0, 1]))
816
+ return psi.normalize()
817
+ else:
818
+ raise ValueError('Algorithm must be either "naive" or "prep"')
819
+
820
+ def p_stabilize(self, p, alpha, V):
821
+ r"""
822
+ Return the `p`-stabilization of ``self`` to level `N*p` on which
823
+ `U_p` acts by `\alpha`.
824
+
825
+ INPUT:
826
+
827
+ - ``p`` -- a prime
828
+
829
+ - ``alpha`` -- a `U_p`-eigenvalue
830
+
831
+ - ``V`` -- a space of modular symbols
832
+
833
+ OUTPUT: the image of this ManinMap under the Hecke operator `T_{\ell}`
834
+
835
+ EXAMPLES::
836
+
837
+ sage: # needs eclib
838
+ sage: E = EllipticCurve('11a')
839
+ sage: phi = E.pollack_stevens_modular_symbol()
840
+ sage: f = phi._map
841
+ sage: V = phi.parent()
842
+ sage: f.p_stabilize(5,1,V)
843
+ Map from the set of right cosets of Gamma0(11) in SL_2(Z) to Sym^0 Q^2
844
+ """
845
+ manin = V.source()
846
+ S0 = Sigma0(self._codomain._act._Np)
847
+ pmat = S0([p, 0, 0, 1])
848
+ D = {}
849
+ scalar = 1 / alpha
850
+ W = self._codomain.change_ring(scalar.parent())
851
+ for g in map(M2Z, manin.gens()):
852
+ # we use scale here so that we do not need to define a
853
+ # construction functor in order to scale by something
854
+ # outside the base ring.
855
+ D[g] = W(self._eval_sl2(g) - (self(pmat * g) * pmat).scale(scalar))
856
+ return self.__class__(W, manin, D, check=False)