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