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,531 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Scalar-multiplication morphisms of elliptic curves
4
+
5
+ This class provides an :class:`EllipticCurveHom` instantiation for
6
+ multiplication-by-`m` maps on elliptic curves.
7
+
8
+ EXAMPLES:
9
+
10
+ We can construct and evaluate scalar multiplications::
11
+
12
+ sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
13
+ sage: E = EllipticCurve('77a1')
14
+ sage: phi = E.scalar_multiplication(5); phi
15
+ Scalar-multiplication endomorphism [5] of Elliptic Curve defined by y^2 + y = x^3 + 2*x over Rational Field
16
+ sage: P = E(2,3)
17
+ sage: phi(P)
18
+ (30 : 164 : 1)
19
+
20
+ The usual :class:`EllipticCurveHom` methods are supported::
21
+
22
+ sage: phi.degree()
23
+ 25
24
+ sage: phi.kernel_polynomial()
25
+ x^12 + 124/5*x^10 + 19*x^9 - 84*x^8 + 24*x^7 - 483*x^6 - 696/5*x^5 - 448*x^4 - 37*x^3 - 332*x^2 - 84*x + 47/5
26
+ sage: phi.rational_maps()
27
+ ((x^25 - 200*x^23 - 520*x^22 + 9000*x^21 + ... + 1377010*x^3 + 20360*x^2 - 39480*x + 2209),
28
+ (10*x^36*y - 620*x^36 + 3240*x^34*y - 44880*x^34 + ... + 424927560*x*y + 226380480*x + 42986410*y + 20974090)/(1250*x^36 + 93000*x^34 + 71250*x^33 + 1991400*x^32 + ... + 1212964050*x^3 + 138715800*x^2 - 27833400*x + 1038230))
29
+ sage: phi.dual()
30
+ Scalar-multiplication endomorphism [5] of Elliptic Curve defined by y^2 + y = x^3 + 2*x over Rational Field
31
+ sage: phi.dual() is phi
32
+ True
33
+ sage: phi.formal()
34
+ 5*t - 310*t^4 - 2496*t^5 + 10540*t^7 + ... - 38140146674516*t^20 - 46800256902400*t^21 + 522178541079910*t^22 + O(t^23)
35
+ sage: phi.is_normalized()
36
+ False
37
+ sage: phi.is_separable()
38
+ True
39
+ sage: phi.is_injective()
40
+ False
41
+ sage: phi.is_surjective()
42
+ True
43
+
44
+ Contrary to constructing an :class:`EllipticCurveIsogeny` from
45
+ the division polynomial, :class:`EllipticCurveHom_scalar` can
46
+ deal with huge scalars very quickly::
47
+
48
+ sage: E = EllipticCurve(GF(2^127-1), [1,2,3,4,5])
49
+ sage: phi = E.scalar_multiplication(9^99); phi
50
+ Scalar-multiplication endomorphism [29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889] of Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over Finite Field of size 170141183460469231731687303715884105727
51
+ sage: phi(E(1,2))
52
+ (82124533143060719620799539030695848450 : 17016022038624814655722682134021402379 : 1)
53
+
54
+ Composition of scalar multiplications results in another scalar
55
+ multiplication::
56
+
57
+ sage: E = EllipticCurve(GF(19), [4,4])
58
+ sage: phi = E.scalar_multiplication(-3); phi
59
+ Scalar-multiplication endomorphism [-3] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
60
+ sage: psi = E.scalar_multiplication(7); psi
61
+ Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
62
+ sage: phi * psi
63
+ Scalar-multiplication endomorphism [-21] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
64
+ sage: psi * phi
65
+ Scalar-multiplication endomorphism [-21] of Elliptic Curve defined by y^2 = x^3 + 4*x + 4 over Finite Field of size 19
66
+ sage: phi * psi == psi * phi
67
+ True
68
+ sage: -phi == E.scalar_multiplication(-1) * phi
69
+ True
70
+
71
+ The zero endomorphism `[0]` is supported::
72
+
73
+ sage: E = EllipticCurve(GF(71), [1,1])
74
+ sage: zero = E.scalar_multiplication(0); zero
75
+ Scalar-multiplication endomorphism [0] of Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 71
76
+ sage: zero.is_zero()
77
+ True
78
+ sage: zero.is_injective()
79
+ False
80
+ sage: zero.is_surjective()
81
+ False
82
+ sage: zero(E.random_point())
83
+ (0 : 1 : 0)
84
+
85
+ Retrieving multiplication-by-`m` maps when `m` is divisible by the
86
+ characteristic also works (since :issue:`37096`)::
87
+
88
+ sage: E = EllipticCurve(GF(7), [1,0])
89
+ sage: phi = E.scalar_multiplication(7); phi
90
+ Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
91
+ sage: phi.rational_maps()
92
+ (x^49, -y^49)
93
+ sage: phi.x_rational_map()
94
+ x^49
95
+ sage: psi = E.scalar_multiplication(-2); psi
96
+ Scalar-multiplication endomorphism [-2] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
97
+ sage: chi = E.scalar_multiplication(-14); chi
98
+ Scalar-multiplication endomorphism [-14] of Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 7
99
+ sage: chi == psi * phi
100
+ True
101
+ sage: chi.rational_maps()
102
+ ((x^196 - 2*x^98 + 1)/(-3*x^147 - 3*x^49),
103
+ (-x^294*y^49 + 2*x^196*y^49 - 2*x^98*y^49 + y^49)/(-x^294 - 2*x^196 - x^98))
104
+ sage: chi.x_rational_map()
105
+ (2*x^196 + 3*x^98 + 2)/(x^147 + x^49)
106
+ sage: chi.rational_maps() == tuple(f(*phi.rational_maps()) for f in psi.rational_maps())
107
+ True
108
+ sage: chi.x_rational_map() == psi.x_rational_map()(phi.x_rational_map())
109
+ True
110
+
111
+ ::
112
+
113
+ sage: E = EllipticCurve(GF(7), [0,1])
114
+ sage: phi = E.scalar_multiplication(7); phi
115
+ Scalar-multiplication endomorphism [7] of Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 7
116
+ sage: phi.rational_maps() # known bug -- #6413
117
+ ((-3*x^49 - x^28 - x^7)/(x^42 - x^21 + 2),
118
+ (-x^72*y - 3*x^69*y - 3*x^66*y - x^63*y + 3*x^51*y + 2*x^48*y + 2*x^45*y + 3*x^42*y - x^9*y - 3*x^6*y - 3*x^3*y - y)/(x^63 + 2*x^42 - x^21 - 1))
119
+ sage: phi.x_rational_map()
120
+ (4*x^49 + 6*x^28 + 6*x^7)/(x^42 + 6*x^21 + 2)
121
+
122
+ TESTS::
123
+
124
+ sage: E = EllipticCurve(j = GF(65537^3).random_element())
125
+ sage: m = randrange(-2^99, +2^99)
126
+ sage: phi = E.scalar_multiplication(m)
127
+ sage: phi.degree() == m**2
128
+ True
129
+ sage: P = E.random_point()
130
+ sage: phi(P) == m*P
131
+ True
132
+
133
+ AUTHORS:
134
+
135
+ - Lorenz Panny (2021): implement :class:`EllipticCurveHom_scalar`
136
+ """
137
+
138
+ from sage.misc.cachefunc import cached_method
139
+ from sage.structure.richcmp import richcmp
140
+
141
+ from sage.rings.integer_ring import ZZ
142
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
143
+
144
+ from sage.schemes.elliptic_curves.ell_generic import EllipticCurve_generic
145
+ from sage.schemes.elliptic_curves.weierstrass_morphism import negation_morphism
146
+ from sage.schemes.elliptic_curves.hom import EllipticCurveHom
147
+
148
+
149
+ class EllipticCurveHom_scalar(EllipticCurveHom):
150
+
151
+ def __init__(self, E, m):
152
+ """
153
+ Construct a scalar-multiplication map on an elliptic curve.
154
+
155
+ TESTS::
156
+
157
+ sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
158
+ sage: E = EllipticCurve([1,1])
159
+ sage: EllipticCurveHom_scalar(E, 123)
160
+ Scalar-multiplication endomorphism [123] of Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
161
+ """
162
+ if not isinstance(E, EllipticCurve_generic):
163
+ raise ValueError(f'not an elliptic curve: {E}')
164
+
165
+ self._m = ZZ(m)
166
+
167
+ self._degree = self._m**2
168
+ self._domain = self._codomain = E
169
+
170
+ EllipticCurveHom.__init__(self, self._domain, self._codomain)
171
+
172
+ # TODO: should probably be in EllipticCurveHom?
173
+ self._base_ring = self._domain.base_ring()
174
+ self._poly_ring = PolynomialRing(self._base_ring, ['x'])
175
+ self._mpoly_ring = PolynomialRing(self._base_ring, ['x','y'])
176
+
177
+ self._rational_maps = None
178
+
179
+ def _call_(self, P):
180
+ """
181
+ Evaluate this scalar-multiplication map `[m]` at a point `P`,
182
+ i.e., return `[m]P`.
183
+
184
+ TESTS::
185
+
186
+ sage: p = random_prime(2^22)
187
+ sage: q = p^randrange(1,5)
188
+ sage: E = EllipticCurve_from_j(GF(q).random_element())
189
+ sage: m = randrange(-9^99, 9^99)
190
+ sage: phi = E.scalar_multiplication(m)
191
+ sage: P = E.random_point()
192
+ sage: phi(P) == m*P
193
+ True
194
+ """
195
+ if P not in self._domain:
196
+ raise ValueError(f'{P} is not a point on {self._domain}')
197
+ return self._m * P
198
+
199
+ def _eval(self, P):
200
+ """
201
+ Less strict evaluation method for internal use.
202
+
203
+ In particular, this can be used to evaluate ``self`` at a
204
+ point defined over an extension field.
205
+
206
+ INPUT: a sequence of 3 coordinates defining a point on ``self``
207
+
208
+ OUTPUT: the result of evaluating ``self`` at the given point
209
+
210
+ EXAMPLES::
211
+
212
+ sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
213
+ sage: E = EllipticCurve(j=GF(419)(1728))
214
+ sage: psi = EllipticCurveHom_scalar(E, 13)
215
+ sage: P = E.change_ring(GF(419**2)).lift_x(5)
216
+ sage: P = min({P, -P}) # fix choice of y
217
+ sage: Q = psi._eval(P); Q
218
+ (134 : 210*z2 + 314 : 1)
219
+ sage: Q.curve()
220
+ Elliptic Curve defined by y^2 = x^3 + x over Finite Field in z2 of size 419^2
221
+ """
222
+ if self._domain.defining_polynomial()(*P):
223
+ raise ValueError(f'{P} not on {self._domain}')
224
+ return self._m * P
225
+
226
+ def _repr_(self):
227
+ """
228
+ Return basic facts about this scalar multiplication as a string.
229
+
230
+ TESTS::
231
+
232
+ sage: E = EllipticCurve([i,i])
233
+ sage: E.scalar_multiplication(777)
234
+ Scalar-multiplication endomorphism [777] of Elliptic Curve defined by y^2 = x^3 + I*x + I over Number Field in I with defining polynomial x^2 + 1 with I = 1*I
235
+ """
236
+ return f'Scalar-multiplication endomorphism [{self._m}] of {self._domain}'
237
+
238
+ # EllipticCurveHom methods
239
+
240
+ @staticmethod
241
+ def _composition_impl(self, other):
242
+ """
243
+ Helper method to compose other elliptic-curve morphisms with
244
+ :class:`EllipticCurveHom_scalar` objects. Called by
245
+ :meth:`EllipticCurveHom._composition_`.
246
+
247
+ This method only handles composing two scalar multiplications;
248
+ all other cases are dealt with elsewhere.
249
+
250
+ TESTS::
251
+
252
+ sage: E = EllipticCurve([1,2,3,4,5])
253
+ sage: phi = E.scalar_multiplication(5)
254
+ sage: psi = E.scalar_multiplication(-7)
255
+ sage: phi * psi # implicit doctest
256
+ Scalar-multiplication endomorphism [-35] of Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over Rational Field
257
+
258
+ ::
259
+
260
+ sage: phi._composition_impl(phi, E.automorphisms()[0])
261
+ NotImplemented
262
+ """
263
+ if isinstance(self, EllipticCurveHom_scalar) and isinstance(other, EllipticCurveHom_scalar):
264
+ assert self._domain == other._domain
265
+ return EllipticCurveHom_scalar(self._domain, self._m * other._m)
266
+ return NotImplemented
267
+
268
+ def degree(self):
269
+ """
270
+ Return the degree of this scalar-multiplication morphism.
271
+
272
+ The map `[m]` has degree `m^2`.
273
+
274
+ EXAMPLES::
275
+
276
+ sage: E = EllipticCurve(GF(23), [0,1])
277
+ sage: phi = E.scalar_multiplication(1111111)
278
+ sage: phi.degree()
279
+ 1234567654321
280
+
281
+ TESTS:
282
+
283
+ The degree is still `m^2` even in the inseparable case::
284
+
285
+ sage: E = EllipticCurve(GF(23), [1,1])
286
+ sage: E.scalar_multiplication(23).degree()
287
+ 529
288
+ sage: E = EllipticCurve(GF(23), [0,1])
289
+ sage: E.scalar_multiplication(23).degree()
290
+ 529
291
+ """
292
+ return self._degree
293
+
294
+ def _richcmp_(self, other, op):
295
+ """
296
+ Compare this scalar multiplication to another elliptic-curve morphism.
297
+
298
+ .. WARNING::
299
+
300
+ This method sometimes calls :meth:`EllipticCurveHom._richcmp_`,
301
+ which sometimes compares :meth:`rational_maps`. Therefore, the
302
+ complexity is at least quadratic in `m` in the worst case.
303
+
304
+ EXAMPLES::
305
+
306
+ sage: E = EllipticCurve([i,i])
307
+ sage: phi = E.scalar_multiplication(-5)
308
+ sage: psi = E.scalar_multiplication(5)
309
+ sage: phi == -psi
310
+ True
311
+
312
+ TESTS::
313
+
314
+ sage: from sage.schemes.elliptic_curves.weierstrass_morphism import negation_morphism
315
+ sage: neg = negation_morphism(E)
316
+ sage: phi == neg*psi == psi*neg == -psi
317
+ True
318
+ """
319
+ if isinstance(other, EllipticCurveHom_scalar):
320
+ return richcmp((self._domain, self._m), (other._domain, other._m), op)
321
+ return EllipticCurveHom._richcmp_(self, other, op)
322
+
323
+ def rational_maps(self):
324
+ """
325
+ Return the pair of explicit rational maps defining this scalar
326
+ multiplication.
327
+
328
+ ALGORITHM: :meth:`EllipticCurve_generic.multiplication_by_m`
329
+
330
+ EXAMPLES::
331
+
332
+ sage: E = EllipticCurve('77a1')
333
+ sage: phi = E.scalar_multiplication(5)
334
+ sage: phi.rational_maps()
335
+ ((x^25 - 200*x^23 - 520*x^22 + ... + 368660*x^2 + 163195*x + 16456)/(25*x^24 + 1240*x^22 + 950*x^21 + ... + 20360*x^2 - 39480*x + 2209),
336
+ (10*x^36*y - 620*x^36 + 3240*x^34*y - ... + 226380480*x + 42986410*y + 20974090)/(1250*x^36 + 93000*x^34 + 71250*x^33 + ... + 138715800*x^2 - 27833400*x + 1038230))
337
+ sage: P = (2,3)
338
+ sage: Q = tuple(r(P) for r in phi.rational_maps()); Q
339
+ (30, 164)
340
+ sage: E(Q) == 5*E(P)
341
+ True
342
+
343
+ TESTS::
344
+
345
+ sage: {r.parent() for r in phi.rational_maps()}
346
+ {Fraction Field of Multivariate Polynomial Ring in x, y over Rational Field}
347
+ """
348
+ if not self._rational_maps or None in self._rational_maps:
349
+ if not self._m:
350
+ raise ValueError('[0] is not expressible in (x,y) coordinates')
351
+ self._rational_maps = self._domain.multiplication_by_m(self._m)
352
+ return self._rational_maps
353
+
354
+ def x_rational_map(self):
355
+ """
356
+ Return the `x`-coordinate rational map of this scalar
357
+ multiplication.
358
+
359
+ ALGORITHM: :meth:`EllipticCurve_generic.multiplication_by_m`
360
+
361
+ EXAMPLES::
362
+
363
+ sage: E = EllipticCurve(GF(65537), [1,2,3,4,5])
364
+ sage: phi = E.scalar_multiplication(7)
365
+ sage: phi.x_rational_map() == phi.rational_maps()[0]
366
+ True
367
+
368
+ TESTS::
369
+
370
+ sage: phi.x_rational_map().parent()
371
+ Fraction Field of Univariate Polynomial Ring in x over Finite Field of size 65537
372
+ """
373
+ if not self._rational_maps:
374
+ if not self._m:
375
+ raise ValueError('[0] is not expressible in (x,y) coordinates')
376
+ h = self._domain.multiplication_by_m(self._m, x_only=True)
377
+ self._rational_maps = (self._mpoly_ring.fraction_field()(h), None)
378
+ f,g = map(self._poly_ring, (self._rational_maps[0].numerator(),
379
+ self._rational_maps[0].denominator()))
380
+ return f / g
381
+
382
+ def scaling_factor(self):
383
+ r"""
384
+ Return the Weierstrass scaling factor associated to this
385
+ scalar multiplication.
386
+
387
+ The scaling factor is the constant `u` (in the base field)
388
+ such that `\varphi^* \omega_2 = u \omega_1`, where
389
+ `\varphi: E_1\to E_2` is this morphism and `\omega_i` are
390
+ the standard Weierstrass differentials on `E_i` defined by
391
+ `\mathrm dx/(2y+a_1x+a_3)`.
392
+
393
+ EXAMPLES::
394
+
395
+ sage: E = EllipticCurve('11a1')
396
+ sage: phi = E.scalar_multiplication(5)
397
+ sage: u = phi.scaling_factor()
398
+ sage: u == phi.formal()[1]
399
+ True
400
+ sage: u == 5
401
+ True
402
+
403
+ The scaling factor lives in the base ring::
404
+
405
+ sage: E = EllipticCurve(GF(101^2), [5,5])
406
+ sage: phi = E.scalar_multiplication(123)
407
+ sage: phi.scaling_factor()
408
+ 22
409
+ sage: phi.scaling_factor().parent()
410
+ Finite Field in z2 of size 101^2
411
+
412
+ ALGORITHM: The scaling factor equals the scalar that is being
413
+ multiplied by.
414
+ """
415
+ return self._base_ring(self._m)
416
+
417
+ @cached_method
418
+ def kernel_polynomial(self):
419
+ r"""
420
+ Return the kernel polynomial of this scalar-multiplication map.
421
+ (When `m=0`, return `0`.)
422
+
423
+ EXAMPLES::
424
+
425
+ sage: E = EllipticCurve(GF(997), [7,7,7,7,7])
426
+ sage: phi = E.scalar_multiplication(5)
427
+ sage: phi.kernel_polynomial()
428
+ x^12 + 77*x^11 + 380*x^10 + 198*x^9 + 840*x^8 + 376*x^7 + 946*x^6 + 848*x^5 + 246*x^4 + 778*x^3 + 77*x^2 + 518*x + 28
429
+
430
+ ::
431
+
432
+ sage: E = EllipticCurve(GF(997), [5,6,7,8,9])
433
+ sage: phi = E.scalar_multiplication(11)
434
+ sage: phi.kernel_polynomial()
435
+ x^60 + 245*x^59 + 353*x^58 + 693*x^57 + 499*x^56 + 462*x^55 + 820*x^54 + 962*x^53 + ... + 736*x^7 + 939*x^6 + 429*x^5 + 267*x^4 + 116*x^3 + 770*x^2 + 491*x + 519
436
+
437
+ TESTS::
438
+
439
+ sage: E = EllipticCurve(j = GF(997^6).random_element())
440
+ sage: m = choice([+1,-1]) * randrange(1,8)
441
+ sage: phi = E.scalar_multiplication(m)
442
+ sage: phi.kernel_polynomial() == phi.x_rational_map().denominator().monic().radical()
443
+ True
444
+
445
+ ::
446
+
447
+ sage: E.scalar_multiplication(randint(-10,+10)).kernel_polynomial().parent()
448
+ Univariate Polynomial Ring in x over Finite Field in z6 of size 997^6
449
+ """
450
+ if not self._m:
451
+ return self._poly_ring(0)
452
+ # TODO: inseparable case should be consistent with Frobenius' .kernel_polynomial()
453
+ return self._domain.division_polynomial(self._m.abs()).monic().radical()
454
+
455
+ def dual(self):
456
+ """
457
+ Return the dual isogeny of this scalar-multiplication map.
458
+
459
+ This method simply returns ``self`` as scalars are self-dual.
460
+
461
+ EXAMPLES::
462
+
463
+ sage: E = EllipticCurve([5,5])
464
+ sage: phi = E.scalar_multiplication(5)
465
+ sage: phi.dual() is phi
466
+ True
467
+ """
468
+ return self
469
+
470
+ def inseparable_degree(self):
471
+ r"""
472
+ Return the inseparable degree of this scalar-multiplication map.
473
+
474
+ EXAMPLES::
475
+
476
+ sage: E = EllipticCurve(GF(7), [0,1])
477
+ sage: E.is_supersingular()
478
+ False
479
+ sage: E.scalar_multiplication(4).inseparable_degree()
480
+ 1
481
+ sage: E.scalar_multiplication(-7).inseparable_degree()
482
+ 7
483
+
484
+ ::
485
+
486
+ sage: E = EllipticCurve(GF(7), [1,0])
487
+ sage: E.is_supersingular()
488
+ True
489
+ sage: E.scalar_multiplication(4).inseparable_degree()
490
+ 1
491
+ sage: E.scalar_multiplication(-7).inseparable_degree()
492
+ 49
493
+ """
494
+ p = self.base_ring().characteristic()
495
+ if not p:
496
+ return ZZ.one()
497
+ v = self._m.valuation(p)
498
+ if not v:
499
+ return ZZ.one()
500
+ rk = 1 + self._domain.is_supersingular()
501
+ return p**(rk*v)
502
+
503
+ def __neg__(self):
504
+ """
505
+ Negate this scalar-multiplication map, i.e., return `[-m]`
506
+ when this morphism equals `[m]`.
507
+
508
+ If rational maps have been computed already, they will be
509
+ reused for the negated morphism.
510
+
511
+ EXAMPLES::
512
+
513
+ sage: E = EllipticCurve(GF(2^8), [1,0,1,0,1])
514
+ sage: phi = E.scalar_multiplication(23)
515
+ sage: -phi
516
+ Scalar-multiplication endomorphism [-23] of Elliptic Curve defined by y^2 + x*y + y = x^3 + 1 over Finite Field in z8 of size 2^8
517
+
518
+ TESTS::
519
+
520
+ sage: E = EllipticCurve(GF(79), [7,7])
521
+ sage: phi = E.scalar_multiplication(5)
522
+ sage: _ = phi.rational_maps()
523
+ sage: (-phi)._rational_maps
524
+ ((x^25 + 11*x^23 - 24*x^22 - ... - 7*x^2 + 34*x + 21)/(25*x^24 - 5*x^22 - 23*x^21 - ... - 11*x^2 + 36*x + 21),
525
+ (29*x^36*y + 22*x^34*y - 27*x^33*y - ... + 14*x^2*y - 33*x*y + 37*y)/(9*x^36 + 21*x^34 - 14*x^33 + ... - 26*x^2 + 18*x + 7))
526
+ """
527
+ result = EllipticCurveHom_scalar(self._domain, -self._m)
528
+ if self._rational_maps is not None:
529
+ w = negation_morphism(self._domain).rational_maps()
530
+ result._rational_maps = tuple(f(*w) if f is not None else None for f in self._rational_maps)
531
+ return result