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,775 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: neeeds database_cremona_mini_ellcurve
3
+ r"""
4
+ Modular symbols attached to elliptic curves over `\QQ`
5
+
6
+ To an elliptic curve `E` over the rational numbers with conductor `N`,
7
+ one can associate a space of modular symbols of level `N`, because `E`
8
+ is known to be modular. The space is two-dimensional and contains a
9
+ subspace on which complex conjugation acts as multiplication by `+1`
10
+ and one on which it acts by `-1`.
11
+
12
+ There are three implementations of modular symbols, two within
13
+ ``Sage`` and one in Cremona's ``eclib`` library.
14
+ One can choose here which one is used.
15
+
16
+ Associated to `E` there is a canonical generator in each space. They are maps
17
+ `[.]^+` and `[.]^{-}`, both `\QQ \to\QQ`. They are normalized such that
18
+
19
+ .. MATH::
20
+
21
+ [r]^{+} \Omega^{+} + [r]^{-}\Omega^{-} = \int_{\infty}^r 2\pi i f(z) dz
22
+
23
+ where `f` is the newform associated to the isogeny class of `E` and
24
+ `\Omega^{+}` is the smallest positive period of the Néron differential
25
+ of `E` and `\Omega^{-}` is the smallest positive purely imaginary
26
+ period. Note that it depends on `E` rather than on its isogeny class.
27
+
28
+ From ``eclib`` version v20161230, both plus and minus symbols are
29
+ available and are correctly normalized. In the ``Sage``
30
+ implementation, the computation of the space provides initial
31
+ generators which are not necessarily correctly normalized; here we
32
+ implement two methods that try to find the correct scaling factor.
33
+
34
+ Modular symbols are used to compute `p`-adic `L`-functions.
35
+
36
+ EXAMPLES::
37
+
38
+ sage: # needs eclib
39
+ sage: E = EllipticCurve("19a1")
40
+ sage: m = E.modular_symbol()
41
+ sage: m(0)
42
+ 1/3
43
+ sage: m(1/17)
44
+ -2/3
45
+
46
+ sage: # needs eclib sage.graphs
47
+ sage: m2 = E.modular_symbol(-1, implementation='sage')
48
+ sage: m2(0)
49
+ 0
50
+ sage: m2(1/5)
51
+ 1/2
52
+
53
+ sage: # needs eclib
54
+ sage: V = E.modular_symbol_space(); V
55
+ Modular Symbols subspace of dimension 1 of Modular Symbols space of dimension 2
56
+ for Gamma_0(19) of weight 2 with sign 1 over Rational Field
57
+ sage: V.q_eigenform(30)
58
+ q - 2*q^3 - 2*q^4 + 3*q^5 - q^7 + q^9 + 3*q^11 + 4*q^12 - 4*q^13 - 6*q^15 + 4*q^16
59
+ - 3*q^17 + q^19 - 6*q^20 + 2*q^21 + 4*q^25 + 4*q^27 + 2*q^28 + 6*q^29 + O(q^30)
60
+
61
+ For more details on modular symbols consult the following
62
+
63
+ REFERENCES:
64
+
65
+ - [MTT1986]_
66
+
67
+ - [Cre1997]_
68
+
69
+ - [SW2013]_
70
+
71
+ AUTHORS:
72
+
73
+ - William Stein (2007): first version
74
+
75
+ - Chris Wuthrich (2008): add scaling and reference to eclib
76
+
77
+ - John Cremona (2016): reworked eclib interface
78
+ """
79
+
80
+ #*****************************************************************************
81
+ # Copyright (C) 2007 William Stein <wstein@gmail.com>
82
+ #
83
+ # Distributed under the terms of the GNU General Public License (GPL)
84
+ #
85
+ # This code is distributed in the hope that it will be useful,
86
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
87
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
88
+ # General Public License for more details.
89
+ #
90
+ # The full text of the GPL is available at:
91
+ #
92
+ # http://www.gnu.org/licenses/
93
+ #*****************************************************************************
94
+
95
+ from sage.arith.misc import (kronecker as kronecker_symbol,
96
+ next_prime,
97
+ prime_divisors,
98
+ valuation)
99
+ from sage.databases.cremona import parse_cremona_label
100
+ from sage.misc.verbose import verbose
101
+ from sage.modular.cusps import Cusps
102
+ from sage.modular.modsym.all import ModularSymbols
103
+ from sage.rings.infinity import unsigned_infinity as infinity
104
+ from sage.rings.integer import Integer
105
+ from sage.rings.integer_ring import ZZ
106
+ from sage.rings.rational_field import QQ
107
+ from sage.structure.sage_object import SageObject
108
+
109
+ from .constructor import EllipticCurve
110
+
111
+
112
+ oo = Cusps(infinity)
113
+ zero = Integer(0)
114
+
115
+
116
+ def modular_symbol_space(E, sign, base_ring, bound=None):
117
+ r"""
118
+ Create the space of modular symbols of a given sign over a give base_ring,
119
+ attached to the isogeny class of the elliptic curve ``E``.
120
+
121
+ INPUT:
122
+
123
+ - ``E`` -- an elliptic curve over `\QQ`
124
+ - ``sign`` -- integer; -1, 0, or 1
125
+ - ``base_ring`` -- ring
126
+ - ``bound`` -- (default: ``None``) maximum number of Hecke operators to
127
+ use to cut out modular symbols factor. If ``None``, use
128
+ enough to provably get the correct answer.
129
+
130
+ OUTPUT: a space of modular symbols
131
+
132
+ EXAMPLES::
133
+
134
+ sage: from sage.schemes.elliptic_curves.ell_modular_symbols import modular_symbol_space
135
+ sage: E = EllipticCurve('11a1')
136
+ sage: M = modular_symbol_space(E, -1, GF(37))
137
+ sage: M
138
+ Modular Symbols space of dimension 1 for Gamma_0(11) of weight 2 with sign -1
139
+ over Finite Field of size 37
140
+ """
141
+ if sign not in [-1, 0, 1]:
142
+ raise TypeError('sign must -1, 0 or 1')
143
+ N = E.conductor()
144
+ M = ModularSymbols(N, sign=sign, base_ring=base_ring)
145
+ if bound is None:
146
+ bound = M.hecke_bound() + 10
147
+ V = M
148
+ p = 2
149
+ target_dim = 1 if sign else 2
150
+ while p <= bound and V.dimension() > target_dim:
151
+ t = V.T(p)
152
+ ap = E.ap(p)
153
+ V = (t - ap).kernel()
154
+ p = next_prime(p)
155
+
156
+ return V
157
+
158
+
159
+ class ModularSymbol(SageObject):
160
+ r"""
161
+ A modular symbol attached to an elliptic curve, which is the map
162
+ `\QQ\to \QQ` obtained by sending `r` to the normalized
163
+ symmetrized (or anti-symmetrized) integral `\infty` to `r`.
164
+
165
+ This is as defined in [MTT1986]_, but normalized to depend on the curve
166
+ and not only its isogeny class as in [SW2013]_.
167
+
168
+ See the documentation of ``E.modular_symbol()`` in elliptic curves
169
+ over the rational numbers for help.
170
+ """
171
+
172
+ def sign(self):
173
+ r"""
174
+ Return the sign of this elliptic curve modular symbol.
175
+
176
+ EXAMPLES::
177
+
178
+ sage: m = EllipticCurve('11a1').modular_symbol() # needs eclib
179
+ sage: m.sign() # needs eclib
180
+ 1
181
+
182
+ sage: # needs sage.graphs
183
+ sage: m = EllipticCurve('11a1').modular_symbol(sign=-1, implementation='sage')
184
+ sage: m.sign()
185
+ -1
186
+ """
187
+ return self._sign
188
+
189
+ def elliptic_curve(self):
190
+ r"""
191
+ Return the elliptic curve of this modular symbol.
192
+
193
+ EXAMPLES::
194
+
195
+ sage: m = EllipticCurve('11a1').modular_symbol() # needs eclib
196
+ sage: m.elliptic_curve() # needs eclib
197
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
198
+ """
199
+ return self._E
200
+
201
+ def base_ring(self):
202
+ r"""
203
+ Return the base ring for this modular symbol.
204
+
205
+ EXAMPLES::
206
+
207
+ sage: m = EllipticCurve('11a1').modular_symbol() # needs eclib
208
+ sage: m.base_ring() # needs eclib
209
+ Rational Field
210
+ """
211
+ return self._base_ring
212
+
213
+ def _repr_(self):
214
+ r"""
215
+ String representation of modular symbols.
216
+
217
+ EXAMPLES::
218
+
219
+ sage: m = EllipticCurve('11a1').modular_symbol() # needs eclib
220
+ sage: m # needs eclib
221
+ Modular symbol with sign 1 over Rational Field attached to
222
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
223
+
224
+ sage: # needs sage.graphs
225
+ sage: m = EllipticCurve('43a1').modular_symbol(sign=-1, implementation='sage')
226
+ sage: m
227
+ Modular symbol with sign -1 over Rational Field attached to
228
+ Elliptic Curve defined by y^2 + y = x^3 + x^2 over Rational Field
229
+ """
230
+ return "Modular symbol with sign %s over %s attached to %s" % (
231
+ self._sign, self._base_ring, self._E)
232
+
233
+
234
+ class ModularSymbolECLIB(ModularSymbol):
235
+ def __init__(self, E, sign, nap=1000):
236
+ r"""Modular symbols attached to `E` using ``eclib``.
237
+
238
+ Note that the normalization used within ``eclib`` differs from the
239
+ normalization chosen here by a factor of 2 in the case of elliptic
240
+ curves with negative discriminant (with one real component) since
241
+ the convention there is to write the above integral as
242
+ `[r]^{+}x+[r]^{-}yi`, where the lattice is `\left<2x,x+yi\right>`,
243
+ so that `\Omega^{+}=2x` and `\Omega^{-}=2yi`. We
244
+ allow for this below.
245
+
246
+ INPUT:
247
+
248
+ - ``E`` -- an elliptic curve
249
+
250
+ - ``sign`` -- integer; -1 or 1
251
+
252
+ - ``nap`` -- integer (default: 1000); the number of ap of E to use
253
+ in determining the normalisation of the modular symbols
254
+
255
+ EXAMPLES::
256
+
257
+ sage: # needs eclib
258
+ sage: from sage.schemes.elliptic_curves.ell_modular_symbols import ModularSymbolECLIB
259
+ sage: E = EllipticCurve('11a1')
260
+ sage: M = ModularSymbolECLIB(E,+1)
261
+ sage: M
262
+ Modular symbol with sign 1 over Rational Field attached to
263
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
264
+ sage: M(0)
265
+ 1/5
266
+ sage: E = EllipticCurve('11a2')
267
+ sage: M = ModularSymbolECLIB(E,+1)
268
+ sage: M(0)
269
+ 1
270
+
271
+ This is a rank 1 case with vanishing positive twists::
272
+
273
+ sage: # needs eclib
274
+ sage: E = EllipticCurve('121b1')
275
+ sage: M = ModularSymbolECLIB(E,+1)
276
+ sage: M(0)
277
+ 0
278
+ sage: M(1/7)
279
+ 1/2
280
+
281
+ sage: M = EllipticCurve('121d1').modular_symbol(implementation='eclib') # needs eclib
282
+ sage: M(0) # needs eclib
283
+ 2
284
+
285
+ sage: E = EllipticCurve('15a1') # needs eclib
286
+ sage: [C.modular_symbol(implementation='eclib')(0) for C in E.isogeny_class()] # needs eclib
287
+ [1/4, 1/8, 1/4, 1/2, 1/8, 1/16, 1/2, 1]
288
+
289
+ Since :issue:`10256`, the interface for negative modular symbols in eclib is available::
290
+
291
+ sage: # needs eclib
292
+ sage: E = EllipticCurve('11a1')
293
+ sage: Mplus = E.modular_symbol(+1); Mplus
294
+ Modular symbol with sign 1 over Rational Field attached to
295
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
296
+ sage: [Mplus(1/i) for i in [1..11]]
297
+ [1/5, -4/5, -3/10, 7/10, 6/5, 6/5, 7/10, -3/10, -4/5, 1/5, 0]
298
+ sage: Mminus = E.modular_symbol(-1); Mminus
299
+ Modular symbol with sign -1 over Rational Field attached to
300
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
301
+ sage: [Mminus(1/i) for i in [1..11]]
302
+ [0, 0, 1/2, 1/2, 0, 0, -1/2, -1/2, 0, 0, 0]
303
+
304
+ The scaling factor relative to eclib's normalization is 1/2 for curves of negative discriminant::
305
+
306
+ sage: [E.discriminant() for E in cremona_curves([14])] # needs eclib
307
+ [-21952, 941192, -1835008, -28, 25088, 98]
308
+ sage: [E.modular_symbol()._scaling for E in cremona_curves([14])] # needs eclib
309
+ [1/2, 1, 1/2, 1/2, 1, 1]
310
+
311
+ TESTS (for :issue:`10236`)::
312
+
313
+ sage: # needs eclib
314
+ sage: E = EllipticCurve('11a1')
315
+ sage: m = E.modular_symbol(implementation='eclib')
316
+ sage: m(1/7)
317
+ 7/10
318
+ sage: m(0)
319
+ 1/5
320
+
321
+ If ``nap`` is too small, the normalization in eclib used to be
322
+ incorrect (see :issue:`31317`), but since ``eclib`` version
323
+ v20210310 the value of ``nap`` is increased automatically by
324
+ ``eclib``::
325
+
326
+ sage: # needs eclib
327
+ sage: from sage.schemes.elliptic_curves.ell_modular_symbols import ModularSymbolECLIB
328
+ sage: E = EllipticCurve('1590g1')
329
+ sage: m = ModularSymbolECLIB(E, sign=+1, nap=300)
330
+ sage: [m(a/5) for a in [1..4]]
331
+ [13/2, -13/2, -13/2, 13/2]
332
+
333
+ These values are correct, and increasing ``nap`` has no
334
+ effect. The correct values may verified by the numerical
335
+ implementation::
336
+
337
+ sage: # needs eclib
338
+ sage: m = ModularSymbolECLIB(E, sign=+1, nap=400)
339
+ sage: [m(a/5) for a in [1..4]]
340
+ [13/2, -13/2, -13/2, 13/2]
341
+ sage: m = E.modular_symbol(implementation='num')
342
+ sage: [m(a/5) for a in [1..4]]
343
+ [13/2, -13/2, -13/2, 13/2]
344
+ """
345
+ from sage.libs.eclib.newforms import ECModularSymbol
346
+
347
+ if sign not in [-1, 1]:
348
+ raise TypeError('sign must -1 or 1')
349
+ self._sign = ZZ(sign)
350
+ self._E = E
351
+ self._scaling = 1 if E.discriminant() > 0 else ZZ(1)/2
352
+ self._implementation = "eclib"
353
+ self._base_ring = QQ
354
+ # The ECModularSymbol class must be initialized with sign=0 to compute minus symbols
355
+ self._modsym = ECModularSymbol(E, int(sign == 1), nap)
356
+ self.cache = {True: {}, False: {}}
357
+
358
+ def _call_with_caching(self, r, base_at_infinity=True):
359
+ r"""
360
+ Evaluates the modular symbol at {0,`r`} or {oo,`r`}, caching the computed value.
361
+
362
+ EXAMPLES::
363
+
364
+ sage: m = EllipticCurve('11a1').modular_symbol(implementation='eclib') # needs eclib
365
+ sage: m._call_with_caching(0) # needs eclib
366
+ 1/5
367
+ """
368
+ cache = self.cache[base_at_infinity]
369
+ try:
370
+ return cache[r]
371
+ except KeyError:
372
+ pass
373
+ c = self._modsym(r, sign=self._sign, base_at_infinity=base_at_infinity) * self._scaling
374
+ cache[r] = c
375
+ return c
376
+
377
+ def __call__(self, r, base_at_infinity=True):
378
+ r"""
379
+ Evaluates the modular symbol at {0,`r`} or {oo,`r`}.
380
+
381
+ EXAMPLES::
382
+
383
+ sage: m = EllipticCurve('11a1').modular_symbol(implementation='eclib') # needs eclib
384
+ sage: m(0) # needs eclib
385
+ 1/5
386
+ """
387
+ from sage.rings.rational import Rational
388
+ if r != oo:
389
+ r = Rational(r)
390
+ r = r.numer() % r.denom() / r.denom()
391
+ return self._modsym(r, sign=self._sign, base_at_infinity=base_at_infinity) * self._scaling
392
+
393
+
394
+ class ModularSymbolSage(ModularSymbol):
395
+ def __init__(self, E, sign, normalize='L_ratio'):
396
+ """Modular symbols attached to `E` using ``sage``.
397
+
398
+ INPUT:
399
+
400
+ - ``E`` -- an elliptic curve
401
+ - ``sign`` -- integer; -1 or 1
402
+ - ``normalize`` -- either ``'L_ratio'`` (default), ``'period'``, or
403
+ ``'none'``; For ``'L_ratio'``, the modular symbol is correctly
404
+ normalized by comparing it to the quotient of `L(E,1)` by
405
+ the least positive period for the curve and some small
406
+ twists. The normalization ``'period'`` uses the
407
+ integral_period_map for modular symbols and is known to be
408
+ equal to the above normalization up to the sign and a
409
+ possible power of 2. For ``'none'``, the modular symbol is
410
+ almost certainly not correctly normalized, i.e. all values
411
+ will be a fixed scalar multiple of what they should be. But
412
+ the initial computation of the modular symbol is much
413
+ faster, though evaluation of it after computing it won't be
414
+ any faster.
415
+
416
+ EXAMPLES::
417
+
418
+ sage: # needs sage.graphs
419
+ sage: E = EllipticCurve('11a1')
420
+ sage: from sage.schemes.elliptic_curves.ell_modular_symbols import ModularSymbolSage
421
+ sage: M = ModularSymbolSage(E, +1)
422
+ sage: M
423
+ Modular symbol with sign 1 over Rational Field attached to
424
+ Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field
425
+ sage: M(0)
426
+ 1/5
427
+ sage: E = EllipticCurve('11a2')
428
+ sage: M = ModularSymbolSage(E, +1)
429
+ sage: M(0)
430
+ 1
431
+ sage: M = ModularSymbolSage(E, -1)
432
+ sage: M(1/3)
433
+ 1/2
434
+
435
+ This is a rank 1 case with vanishing positive twists.
436
+ The modular symbol is adjusted by -2::
437
+
438
+ sage: # needs sage.graphs
439
+ sage: E = EllipticCurve('121b1')
440
+ sage: M = ModularSymbolSage(E, -1, normalize='L_ratio')
441
+ sage: M(1/3)
442
+ 1
443
+ sage: M._scaling
444
+ 1
445
+
446
+ sage: # needs sage.graphs
447
+ sage: M = EllipticCurve('121d1').modular_symbol(implementation='sage')
448
+ sage: M(0)
449
+ 2
450
+ sage: M = EllipticCurve('121d1').modular_symbol(implementation='sage',
451
+ ....: normalize='none')
452
+ sage: M(0)
453
+ 1
454
+
455
+ sage: # needs sage.graphs
456
+ sage: E = EllipticCurve('15a1')
457
+ sage: [C.modular_symbol(implementation='sage', normalize='L_ratio')(0)
458
+ ....: for C in E.isogeny_class()]
459
+ [1/4, 1/8, 1/4, 1/2, 1/8, 1/16, 1/2, 1]
460
+ sage: [C.modular_symbol(implementation='sage', normalize='period')(0)
461
+ ....: for C in E.isogeny_class()]
462
+ [1/8, 1/16, 1/8, 1/4, 1/16, 1/32, 1/4, 1/2]
463
+ sage: [C.modular_symbol(implementation='sage', normalize='none')(0)
464
+ ....: for C in E.isogeny_class()]
465
+ [1, 1, 1, 1, 1, 1, 1, 1]
466
+ """
467
+ if sign not in [-1, 1]:
468
+ raise TypeError('sign must -1 or 1')
469
+ self._sign = ZZ(sign)
470
+ self._E = E
471
+ self._implementation = "sage"
472
+ self._normalize = normalize
473
+ self._modsym = E.modular_symbol_space(sign=self._sign)
474
+ self._base_ring = self._modsym.base_ring()
475
+ self._ambient_modsym = self._modsym.ambient_module()
476
+
477
+ if normalize == "L_ratio":
478
+ self._e = self._modsym.dual_eigenvector()
479
+ self._find_scaling_L_ratio()
480
+ if self._failed_to_scale:
481
+ self._find_scaling_period() # will reset _e and _scaling
482
+ else:
483
+ self._e *= self._scaling
484
+ elif normalize == "period" :
485
+ self._find_scaling_period() # this will set _e and _scaling
486
+ elif normalize == "none":
487
+ self._scaling = 1
488
+ self._e = self._modsym.dual_eigenvector()
489
+ else :
490
+ raise ValueError("no normalization %s known for modular symbols" % normalize)
491
+
492
+ def _find_scaling_L_ratio(self):
493
+ r"""
494
+ This function is use to set ``_scaling``, the factor used to adjust the
495
+ scalar multiple of the modular symbol.
496
+ If `[0]`, the modular symbol evaluated at 0, is nonzero, we can just scale
497
+ it with respect to the approximation of the L-value. It is known that
498
+ the quotient is a rational number with small denominator.
499
+ Otherwise we try to scale using quadratic twists.
500
+
501
+ ``_scaling`` will be set to a rational nonzero multiple if we succeed and to 1 otherwise.
502
+ Even if we fail we scale at least to make up the difference between the periods
503
+ of the `X_0`-optimal curve and our given curve `E` in the isogeny class.
504
+
505
+ EXAMPLES::
506
+
507
+ sage: # needs sage.graphs
508
+ sage: m = EllipticCurve('11a1').modular_symbol(implementation='sage')
509
+ sage: m._scaling
510
+ 1/5
511
+ sage: m = EllipticCurve('11a2').modular_symbol(implementation='sage')
512
+ sage: m._scaling
513
+ 1
514
+ sage: m = EllipticCurve('11a3').modular_symbol(implementation='sage')
515
+ sage: m._scaling
516
+ 1/25
517
+ sage: m = EllipticCurve('37a1').modular_symbol(implementation='sage')
518
+ sage: m._scaling
519
+ -1
520
+ sage: m = EllipticCurve('37a1').modular_symbol()
521
+ sage: m._scaling
522
+ 1
523
+ sage: m = EllipticCurve('389a1').modular_symbol()
524
+ sage: m._scaling
525
+ 1
526
+ sage: m = EllipticCurve('389a1').modular_symbol(implementation='sage')
527
+ sage: m._scaling
528
+ 1
529
+ sage: m = EllipticCurve('196a1').modular_symbol(implementation='sage')
530
+ sage: m._scaling
531
+ 1
532
+
533
+ Some harder cases fail::
534
+
535
+ sage: # needs sage.graphs
536
+ sage: m = EllipticCurve('121b1').modular_symbol(implementation='sage')
537
+ Warning : Could not normalize the modular symbols, maybe all further results will be multiplied by -1 and a power of 2
538
+ sage: m._scaling
539
+ 1
540
+
541
+ TESTS::
542
+
543
+ sage: # needs sage.graphs
544
+ sage: rk0 = ['11a1', '11a2', '15a1', '27a1', '37b1']
545
+ sage: for la in rk0: # long time (3s on sage.math, 2011)
546
+ ....: E = EllipticCurve(la)
547
+ ....: me = E.modular_symbol(implementation='eclib')
548
+ ....: ms = E.modular_symbol(implementation='sage')
549
+ ....: print("{} {} {}".format(E.lseries().L_ratio()*E.real_components(), me(0), ms(0)))
550
+ 1/5 1/5 1/5
551
+ 1 1 1
552
+ 1/4 1/4 1/4
553
+ 1/3 1/3 1/3
554
+ 2/3 2/3 2/3
555
+
556
+ sage: # needs sage.graphs
557
+ sage: rk1 = ['37a1','43a1','53a1', '91b1','91b2','91b3']
558
+ sage: [EllipticCurve(la).modular_symbol()(0) for la in rk1] # long time (1s on sage.math, 2011)
559
+ [0, 0, 0, 0, 0, 0]
560
+ sage: for la in rk1: # long time (8s on sage.math, 2011)
561
+ ....: E = EllipticCurve(la)
562
+ ....: m = E.modular_symbol()
563
+ ....: lp = E.padic_lseries(5)
564
+ ....: for D in [5,17,12,8]:
565
+ ....: ED = E.quadratic_twist(D)
566
+ ....: md = sum([kronecker(D,u)*m(ZZ(u)/D) for u in range(D)])
567
+ ....: etaD = lp._quotient_of_periods_to_twist(D)
568
+ ....: assert ED.lseries().L_ratio()*ED.real_components() * etaD == md
569
+ """
570
+ E = self._E
571
+ self._scaling = 1 # initial value, may be changed later.
572
+ self._failed_to_scale = False
573
+
574
+ if self._sign == 1 :
575
+ at0 = self(0)
576
+ if at0 != 0 :
577
+ l1 = self.__lalg__(1)
578
+ if at0 != l1:
579
+ verbose('scale modular symbols by %s' % (l1/at0))
580
+ self._scaling = l1/at0
581
+ else :
582
+ # if [0] = 0, we can still hope to scale it correctly by considering twists of E
583
+ Dlist = [5,8,12,13,17,21,24,28,29, 33, 37, 40, 41, 44, 53, 56, 57, 60, 61, 65, 69, 73, 76, 77, 85, 88, 89, 92, 93, 97] # a list of positive fundamental discriminants
584
+ j = 0
585
+ at0 = 0
586
+ # computes [0]+ for the twist of E by D until one value is nonzero
587
+ while j < 30 and at0 == 0 :
588
+ D = Dlist[j]
589
+ # the following line checks if the twist of the newform of E by D is a newform
590
+ # this is to avoid that we 'twist back'
591
+ if all( valuation(E.conductor(),ell) <= valuation(D,ell) for ell in prime_divisors(D) ) :
592
+ at0 = sum([kronecker_symbol(D,u) * self(ZZ(u)/D) for u in range(1,abs(D))])
593
+ j += 1
594
+ if j == 30 and at0 == 0: # curves like "121b1", "225a1", "225e1", "256a1", "256b1", "289a1", "361a1", "400a1", "400c1", "400h1", "441b1", "441c1", "441d1", "441f1 .. will arrive here
595
+ print("Warning : Could not normalize the modular symbols, maybe all further results will be multiplied by -1 and a power of 2")
596
+ self._failed_to_scale = True
597
+ else :
598
+ l1 = self.__lalg__(D)
599
+ if at0 != l1:
600
+ verbose('scale modular symbols by %s found at D=%s ' % (l1/at0,D), level=2)
601
+ self._scaling = l1/at0
602
+
603
+ else : # that is when sign = -1
604
+ Dlist = [-3,-4,-7,-8,-11,-15,-19,-20,-23,-24, -31, -35, -39, -40, -43, -47, -51, -52, -55, -56, -59, -67, -68, -71, -79, -83, -84, -87, -88, -91] # a list of negative fundamental discriminants
605
+ j = 0
606
+ at0 = 0
607
+ while j < 30 and at0 == 0 :
608
+ # computes [0]+ for the twist of E by D until one value is nonzero
609
+ D = Dlist[j]
610
+ if all( valuation(E.conductor(),ell) <= valuation(D,ell) for ell in prime_divisors(D) ) :
611
+ at0 = - sum([kronecker_symbol(D,u) * self(ZZ(u)/D) for u in range(1,abs(D))])
612
+ j += 1
613
+ if j == 30 and at0 == 0: # no more hope for a normalization
614
+ print("Warning : Could not normalize the modular symbols, maybe all further results will be multiplied by -1 and a power of 2")
615
+ self._failed_to_scale = True
616
+ else :
617
+ l1 = self.__lalg__(D)
618
+ if at0 != l1:
619
+ verbose('scale modular symbols by %s' % (l1/at0))
620
+ self._scaling = l1/at0
621
+
622
+ def __lalg__(self, D):
623
+ r"""
624
+ For positive `D`, this function evaluates the quotient
625
+ `L(E_D,1)\cdot \sqrt(D)/\Omega_E` where `E_D` is the twist of
626
+ `E` by `D`, `\Omega_E` is the least positive period of `E`.
627
+
628
+ For negative `E`, it is the quotient
629
+ `L(E_D,1)\cdot \sqrt(-D)/\Omega^{-}_E`
630
+ where `\Omega^{-}_E` is the least positive imaginary part of a
631
+ non-real period of `E`.
632
+
633
+ EXAMPLES::
634
+
635
+ sage: # needs sage.graphs
636
+ sage: E = EllipticCurve('11a1')
637
+ sage: m = E.modular_symbol(sign=+1, implementation='sage')
638
+ sage: m.__lalg__(1)
639
+ 1/5
640
+ sage: m.__lalg__(3)
641
+ 5/2
642
+ """
643
+ from sage.misc.functional import sqrt
644
+ # the computation of the L-value could take a lot of time,
645
+ # but then the conductor is so large
646
+ # that the computation of modular symbols for E took even longer
647
+
648
+ E = self._E
649
+ ED = E.quadratic_twist(D)
650
+ lv = ED.lseries().L_ratio() # this is L(ED,1) divided by the Néron period omD of ED
651
+ lv *= ED.real_components() # now it is by the least positive period
652
+ omD = ED.period_lattice().basis()[0]
653
+ if D > 0 :
654
+ om = E.period_lattice().basis()[0]
655
+ q = sqrt(D) * omD / om * 8
656
+ else :
657
+ om = E.period_lattice().basis()[1].imag()
658
+ if E.real_components() == 1:
659
+ om *= 2
660
+ q = sqrt(-D) * omD / om * 8
661
+
662
+ # see padic_lseries.pAdicLeries._quotient_of_periods_to_twist
663
+ # for the explanation of the second factor
664
+ verbose('real approximation is %s' % q)
665
+ return lv / 8 * QQ(q.round())
666
+
667
+ def _find_scaling_period(self):
668
+ r"""
669
+ Uses the integral period map of the modular symbol implementation in sage
670
+ in order to determine the scaling. The resulting modular symbol is correct
671
+ only for the `X_0`-optimal curve, at least up to a possible factor +- a
672
+ power of 2.
673
+
674
+ EXAMPLES::
675
+
676
+ sage: E = EllipticCurve('11a1')
677
+ sage: m = sage.schemes.elliptic_curves.ell_modular_symbols.ModularSymbolSage(E,+1,normalize='period')
678
+ sage: m._e
679
+ (1/5, 1/2)
680
+ sage: E = EllipticCurve('11a2')
681
+ sage: m = sage.schemes.elliptic_curves.ell_modular_symbols.ModularSymbolSage(E,+1,normalize='period')
682
+ sage: m._e
683
+ (1, 5/2)
684
+ sage: E = EllipticCurve('121b2')
685
+ sage: m = sage.schemes.elliptic_curves.ell_modular_symbols.ModularSymbolSage(E,+1,normalize='period')
686
+ sage: m._e
687
+ (0, 0, 0, 11/2, 11/2, 11/2, 11/2, -3, 3/2, 1/2, -1, 2)
688
+
689
+ TESTS::
690
+
691
+ sage: E = EllipticCurve('19a1')
692
+ sage: m = E.modular_symbol(sign=+1, implementation='sage', normalize='none')
693
+ sage: m._find_scaling_period()
694
+ sage: m._scaling
695
+ 1
696
+
697
+ sage: E = EllipticCurve('19a2')
698
+ sage: m = E.modular_symbol(sign=+1, implementation='sage', normalize='none')
699
+ sage: m._scaling
700
+ 1
701
+ sage: m._find_scaling_period()
702
+ sage: m._scaling
703
+ 3
704
+ """
705
+ P = self._modsym.integral_period_mapping()
706
+ self._e = P.matrix().transpose().row(0)
707
+ self._e /= 2
708
+ E = self._E
709
+ try :
710
+ crla = parse_cremona_label(E.label())
711
+ except RuntimeError: # raised when curve is outside of the table
712
+ print("Warning : Could not normalize the modular symbols, maybe all further results will be multiplied by a rational number.")
713
+ self._scaling = 1
714
+ else :
715
+ cr0 = Integer(crla[0]).str() + crla[1] + '1'
716
+ E0 = EllipticCurve(cr0)
717
+ if self._sign == 1:
718
+ q = E0.period_lattice().basis()[0]/E.period_lattice().basis()[0]
719
+ else:
720
+ q = E0.period_lattice().basis()[1].imag()/E.period_lattice().basis()[1].imag()
721
+ if E0.real_components() == 1:
722
+ q *= 2
723
+ if E.real_components() == 1:
724
+ q /= 2
725
+ q = QQ((q * 200).round()) / 200
726
+ verbose('scale modular symbols by %s' % q)
727
+ self._scaling = q
728
+ c = self(0) # required, to change base point from oo to 0
729
+ if c < 0:
730
+ c *= -1
731
+ self._scaling *= -1
732
+ self._at_zero = c
733
+ self._e *= self._scaling
734
+
735
+ def _call_with_caching(self, r):
736
+ r"""
737
+ Evaluates the modular symbol at `r`, caching the computed value.
738
+
739
+ EXAMPLES::
740
+
741
+ sage: # needs sage.graphs
742
+ sage: m = EllipticCurve('11a1').modular_symbol(implementation='sage')
743
+ sage: m._call_with_caching(0)
744
+ 1/5
745
+ """
746
+ try:
747
+ return self.__cache[r]
748
+ except AttributeError:
749
+ self.__cache = {}
750
+ except KeyError:
751
+ pass
752
+ w = self._ambient_modsym([oo,r]).element()
753
+ c = (self._e).dot_product(w)
754
+ self.__cache[r] = c
755
+ return c
756
+
757
+ def __call__(self, r, base_at_infinity=True):
758
+ r"""
759
+ Evaluates the modular symbol at {0,`r`} or {oo,`r`}.
760
+
761
+ EXAMPLES::
762
+
763
+ sage: # needs sage.graphs
764
+ sage: m = EllipticCurve('11a1').modular_symbol(implementation='sage')
765
+ sage: m(0)
766
+ 1/5
767
+ """
768
+ # this next line takes most of the time # zero = weight-2
769
+ w = self._ambient_modsym.modular_symbol([zero, oo, Cusps(r)], check=False)
770
+ c = (self._e).dot_product(w.element())
771
+ if not base_at_infinity:
772
+ if self._at_zero is None:
773
+ self._at_zero = self(0)
774
+ c -= self._at_zero
775
+ return c