passagemath-schemes 10.8.1a4__cp314-cp314t-macosx_13_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
  2. passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
  3. passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
  4. passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
  5. passagemath_schemes/__init__.py +3 -0
  6. passagemath_schemes-10.8.1a4.dist-info/METADATA +203 -0
  7. passagemath_schemes-10.8.1a4.dist-info/METADATA.bak +204 -0
  8. passagemath_schemes-10.8.1a4.dist-info/RECORD +312 -0
  9. passagemath_schemes-10.8.1a4.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.8.1a4.dist-info/top_level.txt +3 -0
  11. sage/all__sagemath_schemes.py +23 -0
  12. sage/databases/all__sagemath_schemes.py +7 -0
  13. sage/databases/cremona.py +1723 -0
  14. sage/dynamics/all__sagemath_schemes.py +2 -0
  15. sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
  16. sage/dynamics/arithmetic_dynamics/all.py +14 -0
  17. sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
  18. sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
  19. sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
  20. sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
  21. sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
  22. sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
  23. sage/dynamics/arithmetic_dynamics/projective_ds.py +9556 -0
  24. sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-314t-darwin.so +0 -0
  25. sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
  26. sage/dynamics/arithmetic_dynamics/wehlerK3.py +2578 -0
  27. sage/lfunctions/all.py +18 -0
  28. sage/lfunctions/dokchitser.py +727 -0
  29. sage/lfunctions/pari.py +971 -0
  30. sage/lfunctions/zero_sums.cpython-314t-darwin.so +0 -0
  31. sage/lfunctions/zero_sums.pyx +1847 -0
  32. sage/modular/abvar/abvar.py +5132 -0
  33. sage/modular/abvar/abvar_ambient_jacobian.py +414 -0
  34. sage/modular/abvar/abvar_newform.py +246 -0
  35. sage/modular/abvar/all.py +8 -0
  36. sage/modular/abvar/constructor.py +187 -0
  37. sage/modular/abvar/cuspidal_subgroup.py +371 -0
  38. sage/modular/abvar/finite_subgroup.py +896 -0
  39. sage/modular/abvar/homology.py +721 -0
  40. sage/modular/abvar/homspace.py +989 -0
  41. sage/modular/abvar/lseries.py +415 -0
  42. sage/modular/abvar/morphism.py +935 -0
  43. sage/modular/abvar/torsion_point.py +274 -0
  44. sage/modular/abvar/torsion_subgroup.py +741 -0
  45. sage/modular/all.py +43 -0
  46. sage/modular/arithgroup/all.py +20 -0
  47. sage/modular/arithgroup/arithgroup_element.cpython-314t-darwin.so +0 -0
  48. sage/modular/arithgroup/arithgroup_element.pyx +474 -0
  49. sage/modular/arithgroup/arithgroup_generic.py +1406 -0
  50. sage/modular/arithgroup/arithgroup_perm.py +2692 -0
  51. sage/modular/arithgroup/congroup.cpython-314t-darwin.so +0 -0
  52. sage/modular/arithgroup/congroup.pyx +334 -0
  53. sage/modular/arithgroup/congroup_gamma.py +361 -0
  54. sage/modular/arithgroup/congroup_gamma0.py +692 -0
  55. sage/modular/arithgroup/congroup_gamma1.py +659 -0
  56. sage/modular/arithgroup/congroup_gammaH.py +1491 -0
  57. sage/modular/arithgroup/congroup_generic.py +630 -0
  58. sage/modular/arithgroup/congroup_sl2z.py +266 -0
  59. sage/modular/arithgroup/farey_symbol.cpython-314t-darwin.so +0 -0
  60. sage/modular/arithgroup/farey_symbol.pyx +1067 -0
  61. sage/modular/arithgroup/tests.py +425 -0
  62. sage/modular/btquotients/all.py +4 -0
  63. sage/modular/btquotients/btquotient.py +3736 -0
  64. sage/modular/btquotients/pautomorphicform.py +2564 -0
  65. sage/modular/buzzard.py +100 -0
  66. sage/modular/congroup.py +29 -0
  67. sage/modular/congroup_element.py +13 -0
  68. sage/modular/cusps.py +1107 -0
  69. sage/modular/cusps_nf.py +1270 -0
  70. sage/modular/dims.py +571 -0
  71. sage/modular/dirichlet.py +3310 -0
  72. sage/modular/drinfeld_modform/all.py +2 -0
  73. sage/modular/drinfeld_modform/element.py +446 -0
  74. sage/modular/drinfeld_modform/ring.py +773 -0
  75. sage/modular/drinfeld_modform/tutorial.py +236 -0
  76. sage/modular/etaproducts.py +1076 -0
  77. sage/modular/hecke/algebra.py +725 -0
  78. sage/modular/hecke/all.py +19 -0
  79. sage/modular/hecke/ambient_module.py +994 -0
  80. sage/modular/hecke/degenmap.py +119 -0
  81. sage/modular/hecke/element.py +302 -0
  82. sage/modular/hecke/hecke_operator.py +736 -0
  83. sage/modular/hecke/homspace.py +185 -0
  84. sage/modular/hecke/module.py +1744 -0
  85. sage/modular/hecke/morphism.py +139 -0
  86. sage/modular/hecke/submodule.py +970 -0
  87. sage/modular/hypergeometric_misc.cpython-314t-darwin.so +0 -0
  88. sage/modular/hypergeometric_misc.pxd +4 -0
  89. sage/modular/hypergeometric_misc.pyx +166 -0
  90. sage/modular/hypergeometric_motive.py +2020 -0
  91. sage/modular/local_comp/all.py +2 -0
  92. sage/modular/local_comp/liftings.py +292 -0
  93. sage/modular/local_comp/local_comp.py +1070 -0
  94. sage/modular/local_comp/smoothchar.py +1825 -0
  95. sage/modular/local_comp/type_space.py +748 -0
  96. sage/modular/modform/all.py +30 -0
  97. sage/modular/modform/ambient.py +817 -0
  98. sage/modular/modform/ambient_R.py +177 -0
  99. sage/modular/modform/ambient_eps.py +306 -0
  100. sage/modular/modform/ambient_g0.py +120 -0
  101. sage/modular/modform/ambient_g1.py +199 -0
  102. sage/modular/modform/constructor.py +545 -0
  103. sage/modular/modform/cuspidal_submodule.py +708 -0
  104. sage/modular/modform/defaults.py +14 -0
  105. sage/modular/modform/eis_series.py +487 -0
  106. sage/modular/modform/eisenstein_submodule.py +663 -0
  107. sage/modular/modform/element.py +4105 -0
  108. sage/modular/modform/half_integral.py +154 -0
  109. sage/modular/modform/hecke_operator_on_qexp.py +247 -0
  110. sage/modular/modform/j_invariant.py +47 -0
  111. sage/modular/modform/l_series_gross_zagier.py +127 -0
  112. sage/modular/modform/l_series_gross_zagier_coeffs.cpython-314t-darwin.so +0 -0
  113. sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
  114. sage/modular/modform/notes.py +45 -0
  115. sage/modular/modform/numerical.py +514 -0
  116. sage/modular/modform/periods.py +14 -0
  117. sage/modular/modform/ring.py +1257 -0
  118. sage/modular/modform/space.py +1859 -0
  119. sage/modular/modform/submodule.py +118 -0
  120. sage/modular/modform/tests.py +64 -0
  121. sage/modular/modform/theta.py +110 -0
  122. sage/modular/modform/vm_basis.py +380 -0
  123. sage/modular/modform/weight1.py +221 -0
  124. sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
  125. sage/modular/modform_hecketriangle/abstract_space.py +2527 -0
  126. sage/modular/modform_hecketriangle/all.py +30 -0
  127. sage/modular/modform_hecketriangle/analytic_type.py +590 -0
  128. sage/modular/modform_hecketriangle/constructor.py +416 -0
  129. sage/modular/modform_hecketriangle/element.py +351 -0
  130. sage/modular/modform_hecketriangle/functors.py +752 -0
  131. sage/modular/modform_hecketriangle/graded_ring.py +541 -0
  132. sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
  133. sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3349 -0
  134. sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1426 -0
  135. sage/modular/modform_hecketriangle/readme.py +1214 -0
  136. sage/modular/modform_hecketriangle/series_constructor.py +580 -0
  137. sage/modular/modform_hecketriangle/space.py +1037 -0
  138. sage/modular/modform_hecketriangle/subspace.py +423 -0
  139. sage/modular/modsym/all.py +17 -0
  140. sage/modular/modsym/ambient.py +3844 -0
  141. sage/modular/modsym/boundary.py +1420 -0
  142. sage/modular/modsym/element.py +336 -0
  143. sage/modular/modsym/g1list.py +178 -0
  144. sage/modular/modsym/ghlist.py +182 -0
  145. sage/modular/modsym/hecke_operator.py +73 -0
  146. sage/modular/modsym/manin_symbol.cpython-314t-darwin.so +0 -0
  147. sage/modular/modsym/manin_symbol.pxd +5 -0
  148. sage/modular/modsym/manin_symbol.pyx +497 -0
  149. sage/modular/modsym/manin_symbol_list.py +1291 -0
  150. sage/modular/modsym/modsym.py +400 -0
  151. sage/modular/modsym/modular_symbols.py +384 -0
  152. sage/modular/modsym/p1list_nf.py +1241 -0
  153. sage/modular/modsym/relation_matrix.py +591 -0
  154. sage/modular/modsym/relation_matrix_pyx.cpython-314t-darwin.so +0 -0
  155. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  156. sage/modular/modsym/space.py +2468 -0
  157. sage/modular/modsym/subspace.py +455 -0
  158. sage/modular/modsym/tests.py +376 -0
  159. sage/modular/multiple_zeta.py +2635 -0
  160. sage/modular/multiple_zeta_F_algebra.py +789 -0
  161. sage/modular/overconvergent/all.py +6 -0
  162. sage/modular/overconvergent/genus0.py +1879 -0
  163. sage/modular/overconvergent/hecke_series.py +1187 -0
  164. sage/modular/overconvergent/weightspace.py +776 -0
  165. sage/modular/pollack_stevens/all.py +4 -0
  166. sage/modular/pollack_stevens/distributions.py +874 -0
  167. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  168. sage/modular/pollack_stevens/manin_map.py +856 -0
  169. sage/modular/pollack_stevens/modsym.py +1590 -0
  170. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  171. sage/modular/pollack_stevens/sigma0.py +534 -0
  172. sage/modular/pollack_stevens/space.py +1078 -0
  173. sage/modular/quasimodform/all.py +3 -0
  174. sage/modular/quasimodform/element.py +846 -0
  175. sage/modular/quasimodform/ring.py +826 -0
  176. sage/modular/quatalg/all.py +3 -0
  177. sage/modular/quatalg/brandt.py +1642 -0
  178. sage/modular/ssmod/all.py +8 -0
  179. sage/modular/ssmod/ssmod.py +827 -0
  180. sage/rings/all__sagemath_schemes.py +1 -0
  181. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  182. sage/rings/polynomial/binary_form_reduce.py +585 -0
  183. sage/schemes/all.py +41 -0
  184. sage/schemes/berkovich/all.py +6 -0
  185. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  186. sage/schemes/berkovich/berkovich_space.py +700 -0
  187. sage/schemes/curves/affine_curve.py +2924 -0
  188. sage/schemes/curves/all.py +33 -0
  189. sage/schemes/curves/closed_point.py +434 -0
  190. sage/schemes/curves/constructor.py +397 -0
  191. sage/schemes/curves/curve.py +542 -0
  192. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  193. sage/schemes/curves/point.py +463 -0
  194. sage/schemes/curves/projective_curve.py +3203 -0
  195. sage/schemes/curves/weighted_projective_curve.py +106 -0
  196. sage/schemes/curves/zariski_vankampen.py +1931 -0
  197. sage/schemes/cyclic_covers/all.py +2 -0
  198. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  199. sage/schemes/cyclic_covers/constructor.py +137 -0
  200. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  201. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  202. sage/schemes/elliptic_curves/BSD.py +991 -0
  203. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  204. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  205. sage/schemes/elliptic_curves/all.py +49 -0
  206. sage/schemes/elliptic_curves/cardinality.py +609 -0
  207. sage/schemes/elliptic_curves/cm.py +1103 -0
  208. sage/schemes/elliptic_curves/constructor.py +1530 -0
  209. sage/schemes/elliptic_curves/ec_database.py +175 -0
  210. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3971 -0
  211. sage/schemes/elliptic_curves/ell_egros.py +457 -0
  212. sage/schemes/elliptic_curves/ell_field.py +2837 -0
  213. sage/schemes/elliptic_curves/ell_finite_field.py +3249 -0
  214. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  215. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  216. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  217. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  218. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  219. sage/schemes/elliptic_curves/ell_point.py +4944 -0
  220. sage/schemes/elliptic_curves/ell_rational_field.py +7184 -0
  221. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  222. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  223. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  224. sage/schemes/elliptic_curves/formal_group.py +760 -0
  225. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  226. sage/schemes/elliptic_curves/gal_reps_number_field.py +1663 -0
  227. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  228. sage/schemes/elliptic_curves/heegner.py +7328 -0
  229. sage/schemes/elliptic_curves/height.py +2108 -0
  230. sage/schemes/elliptic_curves/hom.py +1788 -0
  231. sage/schemes/elliptic_curves/hom_composite.py +1084 -0
  232. sage/schemes/elliptic_curves/hom_fractional.py +544 -0
  233. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  234. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  235. sage/schemes/elliptic_curves/hom_sum.py +681 -0
  236. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  237. sage/schemes/elliptic_curves/homset.py +271 -0
  238. sage/schemes/elliptic_curves/isogeny_class.py +1523 -0
  239. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  240. sage/schemes/elliptic_curves/jacobian.py +247 -0
  241. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  242. sage/schemes/elliptic_curves/kraus.py +1014 -0
  243. sage/schemes/elliptic_curves/lseries_ell.py +915 -0
  244. sage/schemes/elliptic_curves/mod5family.py +105 -0
  245. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  246. sage/schemes/elliptic_curves/mod_sym_num.cpython-314t-darwin.so +0 -0
  247. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  248. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  249. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  250. sage/schemes/elliptic_curves/padics.py +1816 -0
  251. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  252. sage/schemes/elliptic_curves/period_lattice_region.cpython-314t-darwin.so +0 -0
  253. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  254. sage/schemes/elliptic_curves/saturation.py +716 -0
  255. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  256. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  257. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  258. sage/schemes/hyperelliptic_curves/all.py +6 -0
  259. sage/schemes/hyperelliptic_curves/constructor.py +369 -0
  260. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1948 -0
  261. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +936 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  265. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  266. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +312 -0
  267. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_generic.py +437 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +878 -0
  271. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  272. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  273. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3863 -0
  274. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  275. sage/schemes/jacobians/all.py +2 -0
  276. sage/schemes/overview.py +161 -0
  277. sage/schemes/plane_conics/all.py +22 -0
  278. sage/schemes/plane_conics/con_field.py +1296 -0
  279. sage/schemes/plane_conics/con_finite_field.py +158 -0
  280. sage/schemes/plane_conics/con_number_field.py +456 -0
  281. sage/schemes/plane_conics/con_rational_field.py +406 -0
  282. sage/schemes/plane_conics/con_rational_function_field.py +581 -0
  283. sage/schemes/plane_conics/constructor.py +249 -0
  284. sage/schemes/plane_quartics/all.py +2 -0
  285. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  286. sage/schemes/plane_quartics/quartic_generic.py +53 -0
  287. sage/schemes/riemann_surfaces/all.py +1 -0
  288. sage/schemes/riemann_surfaces/riemann_surface.py +4177 -0
  289. sage_wheels/share/cremona/cremona_mini.db +0 -0
  290. sage_wheels/share/ellcurves/rank0 +30427 -0
  291. sage_wheels/share/ellcurves/rank1 +31871 -0
  292. sage_wheels/share/ellcurves/rank10 +6 -0
  293. sage_wheels/share/ellcurves/rank11 +6 -0
  294. sage_wheels/share/ellcurves/rank12 +1 -0
  295. sage_wheels/share/ellcurves/rank14 +1 -0
  296. sage_wheels/share/ellcurves/rank15 +1 -0
  297. sage_wheels/share/ellcurves/rank17 +1 -0
  298. sage_wheels/share/ellcurves/rank19 +1 -0
  299. sage_wheels/share/ellcurves/rank2 +2388 -0
  300. sage_wheels/share/ellcurves/rank20 +1 -0
  301. sage_wheels/share/ellcurves/rank21 +1 -0
  302. sage_wheels/share/ellcurves/rank22 +1 -0
  303. sage_wheels/share/ellcurves/rank23 +1 -0
  304. sage_wheels/share/ellcurves/rank24 +1 -0
  305. sage_wheels/share/ellcurves/rank28 +1 -0
  306. sage_wheels/share/ellcurves/rank3 +836 -0
  307. sage_wheels/share/ellcurves/rank4 +10 -0
  308. sage_wheels/share/ellcurves/rank5 +5 -0
  309. sage_wheels/share/ellcurves/rank6 +5 -0
  310. sage_wheels/share/ellcurves/rank7 +5 -0
  311. sage_wheels/share/ellcurves/rank8 +6 -0
  312. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,522 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.rings.finite_rings
3
+ r"""
4
+ Frobenius isogenies of elliptic curves
5
+
6
+ Frobenius isogenies only exist in positive characteristic `p`. They
7
+ are given by `\pi_n:(x,y)\mapsto (x^{p^n},y^{p^n})`.
8
+
9
+ This class implements `\pi_n` for `n \geq 0`. Together with existing
10
+ tools for composing isogenies (see :class:`EllipticCurveHom_composite`),
11
+ we can therefore represent arbitrary inseparable isogenies in Sage.
12
+
13
+ EXAMPLES:
14
+
15
+ Constructing a Frobenius isogeny is straightforward::
16
+
17
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
18
+ sage: z5, = GF(17^5).gens()
19
+ sage: E = EllipticCurve([z5,1])
20
+ sage: pi = EllipticCurveHom_frobenius(E); pi
21
+ Frobenius isogeny of degree 17:
22
+ From: Elliptic Curve defined by y^2 = x^3 + z5*x + 1
23
+ over Finite Field in z5 of size 17^5
24
+ To: Elliptic Curve defined by y^2 = x^3 + (9*z5^4+7*z5^3+10*z5^2+z5+14)*x + 1
25
+ over Finite Field in z5 of size 17^5
26
+
27
+ By passing `n`, we can also construct higher-power Frobenius maps,
28
+ such as the Frobenius *endo*\morphism::
29
+
30
+ sage: z5, = GF(7^5).gens()
31
+ sage: E = EllipticCurve([z5,1])
32
+ sage: pi = EllipticCurveHom_frobenius(E, 5); pi
33
+ Frobenius endomorphism of degree 16807 = 7^5:
34
+ From: Elliptic Curve defined by y^2 = x^3 + z5*x + 1
35
+ over Finite Field in z5 of size 7^5
36
+ To: Elliptic Curve defined by y^2 = x^3 + z5*x + 1
37
+ over Finite Field in z5 of size 7^5
38
+
39
+ The usual :class:`EllipticCurveHom` methods are supported::
40
+
41
+ sage: z5, = GF(7^5).gens()
42
+ sage: E = EllipticCurve([z5,1])
43
+ sage: pi = EllipticCurveHom_frobenius(E,5)
44
+ sage: pi.degree()
45
+ 16807
46
+ sage: pi.rational_maps()
47
+ (x^16807, y^16807)
48
+ sage: pi.formal() # known bug
49
+ ...
50
+ sage: pi.is_normalized() # known bug
51
+ ...
52
+ sage: pi.is_separable()
53
+ False
54
+ sage: pi.is_injective()
55
+ True
56
+ sage: pi.is_surjective()
57
+ True
58
+
59
+ Computing the dual of Frobenius is supported as well::
60
+
61
+ sage: E = EllipticCurve([GF(17^6).gen(), 0])
62
+ sage: pi = EllipticCurveHom_frobenius(E)
63
+ sage: pihat = pi.dual(); pihat
64
+ Isogeny of degree 17
65
+ from Elliptic Curve defined by y^2 = x^3 + (15*z6^5+5*z6^4+8*z6^3+12*z6^2+11*z6+7)*x
66
+ over Finite Field in z6 of size 17^6
67
+ to Elliptic Curve defined by y^2 = x^3 + z6*x
68
+ over Finite Field in z6 of size 17^6
69
+ sage: pihat.is_separable()
70
+ True
71
+ sage: pihat * pi == EllipticCurveHom_scalar(E,17) # known bug -- #6413
72
+ True
73
+
74
+ A supersingular example (with purely inseparable dual)::
75
+
76
+ sage: E = EllipticCurve([0, GF(17^6).gen()])
77
+ sage: E.is_supersingular()
78
+ True
79
+ sage: pi1 = EllipticCurveHom_frobenius(E)
80
+ sage: pi1hat = pi1.dual(); pi1hat
81
+ Composite morphism of degree 17 = 17*1:
82
+ From: Elliptic Curve defined by y^2 = x^3 + (15*z6^5+5*z6^4+8*z6^3+12*z6^2+11*z6+7)
83
+ over Finite Field in z6 of size 17^6
84
+ To: Elliptic Curve defined by y^2 = x^3 + z6
85
+ over Finite Field in z6 of size 17^6
86
+ sage: pi6 = EllipticCurveHom_frobenius(E,6)
87
+ sage: pi6hat = pi6.dual(); pi6hat
88
+ Composite morphism of degree 24137569 = 24137569*1:
89
+ From: Elliptic Curve defined by y^2 = x^3 + z6
90
+ over Finite Field in z6 of size 17^6
91
+ To: Elliptic Curve defined by y^2 = x^3 + z6
92
+ over Finite Field in z6 of size 17^6
93
+ sage: pi6hat.factors()
94
+ (Frobenius endomorphism of degree 24137569 = 17^6:
95
+ From: Elliptic Curve defined by y^2 = x^3 + z6
96
+ over Finite Field in z6 of size 17^6
97
+ To: Elliptic Curve defined by y^2 = x^3 + z6
98
+ over Finite Field in z6 of size 17^6,
99
+ Elliptic-curve endomorphism of
100
+ Elliptic Curve defined by y^2 = x^3 + z6 over Finite Field in z6 of size 17^6
101
+ Via: (u,r,s,t) = (2*z6^5 + 10*z6^3 + z6^2 + 8, 0, 0, 0))
102
+
103
+
104
+ TESTS::
105
+
106
+ sage: z5, = GF(17^5).gens()
107
+ sage: E = EllipticCurve([z5,1])
108
+ sage: fs = [EllipticCurveHom_frobenius(E)]
109
+ sage: while fs[-1].codomain() != E:
110
+ ....: fs.append(EllipticCurveHom_frobenius(fs[-1].codomain()))
111
+ sage: fs
112
+ [Frobenius isogeny of degree 17:
113
+ From: Elliptic Curve defined by y^2 = x^3 + z5*x + 1 over Finite Field in z5 of size 17^5
114
+ To: Elliptic Curve defined by y^2 = x^3 + (9*z5^4+7*z5^3+10*z5^2+z5+14)*x + 1 over Finite Field in z5 of size 17^5,
115
+ Frobenius isogeny of degree 17:
116
+ From: Elliptic Curve defined by y^2 = x^3 + (9*z5^4+7*z5^3+10*z5^2+z5+14)*x + 1 over Finite Field in z5 of size 17^5
117
+ To: Elliptic Curve defined by y^2 = x^3 + (14*z5^4+7*z5^3+16*z5^2+14*z5+1)*x + 1 over Finite Field in z5 of size 17^5,
118
+ Frobenius isogeny of degree 17:
119
+ From: Elliptic Curve defined by y^2 = x^3 + (14*z5^4+7*z5^3+16*z5^2+14*z5+1)*x + 1 over Finite Field in z5 of size 17^5
120
+ To: Elliptic Curve defined by y^2 = x^3 + (16*z5^4+6*z5^3+7*z5^2+14*z5+6)*x + 1 over Finite Field in z5 of size 17^5,
121
+ Frobenius isogeny of degree 17:
122
+ From: Elliptic Curve defined by y^2 = x^3 + (16*z5^4+6*z5^3+7*z5^2+14*z5+6)*x + 1 over Finite Field in z5 of size 17^5
123
+ To: Elliptic Curve defined by y^2 = x^3 + (12*z5^4+14*z5^3+z5^2+4*z5+13)*x + 1 over Finite Field in z5 of size 17^5,
124
+ Frobenius isogeny of degree 17:
125
+ From: Elliptic Curve defined by y^2 = x^3 + (12*z5^4+14*z5^3+z5^2+4*z5+13)*x + 1 over Finite Field in z5 of size 17^5
126
+ To: Elliptic Curve defined by y^2 = x^3 + z5*x + 1 over Finite Field in z5 of size 17^5]
127
+ sage: prod(fs[::-1])
128
+ Composite morphism of degree 1419857 = 17^5:
129
+ From: Elliptic Curve defined by y^2 = x^3 + z5*x + 1 over Finite Field in z5 of size 17^5
130
+ To: Elliptic Curve defined by y^2 = x^3 + z5*x + 1 over Finite Field in z5 of size 17^5
131
+
132
+ ::
133
+
134
+ sage: EllipticCurveHom_frobenius(EllipticCurve(GF(5),[1,1]), -1)
135
+ Traceback (most recent call last):
136
+ ...
137
+ ValueError: negative powers of Frobenius are not isogenies
138
+
139
+ ::
140
+
141
+ sage: EllipticCurveHom_frobenius(EllipticCurve('11a1'))
142
+ Traceback (most recent call last):
143
+ ...
144
+ ValueError: Frobenius isogenies do not exist in characteristic zero
145
+
146
+ AUTHORS:
147
+
148
+ - Lorenz Panny (2021): implement :class:`EllipticCurveHom_frobenius`
149
+ - Mickaël Montessinos (2021): computing the dual of a Frobenius isogeny
150
+ """
151
+
152
+ from sage.misc.cachefunc import cached_method
153
+ from sage.structure.sequence import Sequence
154
+
155
+ from sage.rings.integer_ring import ZZ
156
+ from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
157
+
158
+ from sage.rings.finite_rings.finite_field_base import FiniteField
159
+
160
+ from sage.schemes.elliptic_curves.ell_generic import EllipticCurve_generic
161
+ from sage.schemes.elliptic_curves.constructor import EllipticCurve
162
+
163
+ from sage.schemes.elliptic_curves.hom import EllipticCurveHom, find_post_isomorphism
164
+ from sage.schemes.elliptic_curves.ell_curve_isogeny import EllipticCurveIsogeny
165
+ from sage.schemes.elliptic_curves.hom_composite import EllipticCurveHom_composite
166
+ from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
167
+
168
+
169
+ class EllipticCurveHom_frobenius(EllipticCurveHom):
170
+
171
+ _degree = None
172
+
173
+ def __init__(self, E, power=1):
174
+ r"""
175
+ Construct a Frobenius isogeny on a given curve with a given
176
+ power of the base-ring characteristic.
177
+
178
+ Writing `n` for the parameter ``power`` (default: `1`), the
179
+ isogeny is defined by `(x,y) \to (x^{p^n}, y^{p^n})` where
180
+ `p` is the characteristic of the base ring.
181
+
182
+ EXAMPLES::
183
+
184
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
185
+ sage: E = EllipticCurve(j=GF(11^2).gen())
186
+ sage: EllipticCurveHom_frobenius(E)
187
+ Frobenius isogeny of degree 11:
188
+ From: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
189
+ To: Elliptic Curve defined by y^2 = x^3 + (9*z2+3)*x + (3*z2+7) over Finite Field in z2 of size 11^2
190
+ sage: EllipticCurveHom_frobenius(E, 2)
191
+ Frobenius endomorphism of degree 121 = 11^2:
192
+ From: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
193
+ To: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
194
+
195
+ TESTS::
196
+
197
+ sage: EllipticCurveHom_frobenius(EllipticCurve('11a1'))
198
+ Traceback (most recent call last):
199
+ ...
200
+ ValueError: Frobenius isogenies do not exist in characteristic zero
201
+
202
+ ::
203
+
204
+ sage: EllipticCurveHom_frobenius(E, -1)
205
+ Traceback (most recent call last):
206
+ ...
207
+ ValueError: negative powers of Frobenius are not isogenies
208
+ """
209
+ if not isinstance(E, EllipticCurve_generic):
210
+ raise ValueError(f'not an elliptic curve: {E}')
211
+
212
+ self._base_ring = E.base_ring()
213
+
214
+ self._p = self._base_ring.characteristic()
215
+ if self._p == 0:
216
+ raise ValueError('Frobenius isogenies do not exist in characteristic zero')
217
+
218
+ self._n = ZZ(power)
219
+ if self._n < 0:
220
+ raise ValueError('negative powers of Frobenius are not isogenies')
221
+
222
+ self._degree = self._p ** self._n
223
+
224
+ self._domain = E
225
+ as_ = [a**self._degree for a in self._domain.a_invariants()]
226
+ self._codomain = EllipticCurve(as_)
227
+
228
+ EllipticCurveHom.__init__(self, self._domain, self._codomain)
229
+
230
+ # over finite fields, isogenous curves have the same number of points
231
+ # (see #32786)
232
+ if isinstance(self._base_ring, FiniteField):
233
+ self._domain._fetch_cached_order(self._codomain)
234
+ self._codomain._fetch_cached_order(self._domain)
235
+
236
+ self._poly_ring = PolynomialRing(self._base_ring, ['x'], sparse=True)
237
+ self._mpoly_ring = PolynomialRing(self._base_ring, ['x','y'], sparse=True)
238
+ self._xfield = self._poly_ring.fraction_field()
239
+ self._xyfield = self._mpoly_ring.fraction_field()
240
+
241
+ def _call_(self, P):
242
+ """
243
+ Evaluate this Frobenius isogeny at a point `P`.
244
+
245
+ EXAMPLES::
246
+
247
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
248
+ sage: z2 = GF(11^2).gen()
249
+ sage: E = EllipticCurve(j=z2)
250
+ sage: pi = EllipticCurveHom_frobenius(E)
251
+ sage: P = E(7, 9*z2+4)
252
+ sage: pi(P) # implicit doctest
253
+ (7 : 2*z2 + 7 : 1)
254
+ """
255
+ return self._codomain(*(c**self._degree for c in P))
256
+
257
+ def _eval(self, P):
258
+ """
259
+ Less strict evaluation method for internal use.
260
+
261
+ In particular, this can be used to evaluate ``self`` at a
262
+ point defined over an extension field.
263
+
264
+ INPUT: a sequence of 3 coordinates defining a point on ``self``
265
+
266
+ OUTPUT: the result of evaluating ``self`` at the given point
267
+
268
+ EXAMPLES::
269
+
270
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
271
+ sage: E = EllipticCurve(GF(11), [1,1])
272
+ sage: pi = EllipticCurveHom_frobenius(E)
273
+ sage: Ebar = E.change_ring(GF(11^6))
274
+ sage: z6 = GF(11^6).gen()
275
+ sage: P = Ebar.lift_x(GF(11^3).gen())
276
+ sage: p = Ebar(6*z6^5 + 8*z6^4 + 8*z6^3 + 6*z6^2 + 10*z6 + 5, 2*z6^5 + 2*z6^4 + 2*z6^3 + 4*z6 + 6, 1)
277
+ sage: Q = pi._eval(P)
278
+ sage: q = Ebar(z6^5 + 3*z6^4 + 3*z6^3 + 6*z6^2 + 9, z6^5 + 10*z6^4 + 10*z6^3 + 5*z6^2 + 4*z6 + 8, 1)
279
+ sage: (P == p and Q == q) or (P == -p and Q == -q)
280
+ True
281
+ """
282
+ if self._domain.defining_polynomial()(*P):
283
+ raise ValueError(f'{P} not on {self._domain}')
284
+ k = Sequence(P).universe()
285
+ return self._codomain.base_extend(k)(*(c**self._degree for c in P))
286
+
287
+ def _repr_(self):
288
+ """
289
+ Return basic facts about this Frobenius isogeny as a string.
290
+
291
+ TESTS::
292
+
293
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
294
+ sage: z2 = GF(11^2).gen()
295
+ sage: E = EllipticCurve(j=z2)
296
+ sage: EllipticCurveHom_frobenius(E)
297
+ Frobenius isogeny of degree 11:
298
+ From: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
299
+ To: Elliptic Curve defined by y^2 = x^3 + (9*z2+3)*x + (3*z2+7) over Finite Field in z2 of size 11^2
300
+ sage: EllipticCurveHom_frobenius(E, E.base_field().degree())
301
+ Frobenius endomorphism of degree 121 = 11^2:
302
+ From: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
303
+ To: Elliptic Curve defined by y^2 = x^3 + (2*z2+6)*x + (8*z2+8) over Finite Field in z2 of size 11^2
304
+ """
305
+ kind = 'endomorphism' if self._codomain == self._domain else 'isogeny'
306
+ degs_str = '' if self._n == 1 else f' = {self._p}^{self._n}'
307
+ return f'Frobenius {kind} of degree {self._degree}{degs_str}:' \
308
+ f'\n From: {self._domain}' \
309
+ f'\n To: {self._codomain}'
310
+
311
+ # EllipticCurveHom methods
312
+
313
+ def rational_maps(self):
314
+ """
315
+ Return the explicit rational maps defining this Frobenius
316
+ isogeny as (sparse) bivariate rational maps in `x` and `y`.
317
+
318
+ EXAMPLES::
319
+
320
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
321
+ sage: E = EllipticCurve(GF(11), [1,1])
322
+ sage: pi = EllipticCurveHom_frobenius(E, 4)
323
+ sage: pi.rational_maps()
324
+ (x^14641, y^14641)
325
+
326
+ TESTS:
327
+
328
+ See :issue:`34811`::
329
+
330
+ sage: pi.rational_maps()[0].parent()
331
+ Fraction Field of Multivariate Polynomial Ring in x, y over Finite Field of size 11
332
+ sage: pi.rational_maps()[1].parent()
333
+ Fraction Field of Multivariate Polynomial Ring in x, y over Finite Field of size 11
334
+ """
335
+ x,y = self._xyfield.gens()
336
+ return (x**self._degree, y**self._degree)
337
+
338
+ def x_rational_map(self):
339
+ """
340
+ Return the `x`-coordinate rational map of this Frobenius
341
+ isogeny as a (sparse) univariate rational map in `x`.
342
+
343
+ EXAMPLES::
344
+
345
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
346
+ sage: E = EllipticCurve(GF(11), [1,1])
347
+ sage: pi = EllipticCurveHom_frobenius(E, 4)
348
+ sage: pi.x_rational_map()
349
+ x^14641
350
+
351
+ TESTS:
352
+
353
+ See :issue:`34811`::
354
+
355
+ sage: pi.x_rational_map().parent()
356
+ Fraction Field of Sparse Univariate Polynomial Ring in x over Finite Field of size 11
357
+ """
358
+ x, = self._xfield.gens()
359
+ return x**self._degree
360
+
361
+ def scaling_factor(self):
362
+ r"""
363
+ Return the Weierstrass scaling factor associated to this
364
+ Frobenius morphism.
365
+
366
+ The scaling factor is the constant `u` (in the base field)
367
+ such that `\varphi^* \omega_2 = u \omega_1`, where
368
+ `\varphi: E_1\to E_2` is this morphism and `\omega_i` are
369
+ the standard Weierstrass differentials on `E_i` defined by
370
+ `\mathrm dx/(2y+a_1x+a_3)`.
371
+
372
+ EXAMPLES::
373
+
374
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
375
+ sage: E = EllipticCurve(GF(11), [1,1])
376
+ sage: pi = EllipticCurveHom_frobenius(E)
377
+ sage: pi.formal()
378
+ t^11 + O(t^33)
379
+ sage: pi.scaling_factor()
380
+ 0
381
+ sage: pi = EllipticCurveHom_frobenius(E, 3)
382
+ sage: pi.formal()
383
+ t^1331 + O(t^1353)
384
+ sage: pi.scaling_factor()
385
+ 0
386
+ sage: pi = EllipticCurveHom_frobenius(E, 0)
387
+ sage: pi == E.scalar_multiplication(1)
388
+ True
389
+ sage: pi.scaling_factor()
390
+ 1
391
+
392
+ The scaling factor lives in the base ring::
393
+
394
+ sage: pi.scaling_factor().parent()
395
+ Finite Field of size 11
396
+
397
+ ALGORITHM: Inseparable isogenies of degree `>1` have scaling
398
+ factor `0`.
399
+ """
400
+ if self._degree == 1:
401
+ return self._base_ring.one()
402
+ return self._base_ring.zero()
403
+
404
+ def kernel_polynomial(self):
405
+ """
406
+ Return the kernel polynomial of this Frobenius isogeny
407
+ as a polynomial in `x`. This method always returns `1`.
408
+
409
+ EXAMPLES::
410
+
411
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
412
+ sage: E = EllipticCurve(GF(11), [1,1])
413
+ sage: pi = EllipticCurveHom_frobenius(E, 5)
414
+ sage: pi.kernel_polynomial()
415
+ 1
416
+ """
417
+ return self._poly_ring(1)
418
+
419
+ @cached_method
420
+ def dual(self):
421
+ """
422
+ Compute the dual of this Frobenius isogeny.
423
+
424
+ This method returns an :class:`EllipticCurveHom` object.
425
+
426
+ EXAMPLES:
427
+
428
+ An ordinary example::
429
+
430
+ sage: from sage.schemes.elliptic_curves.hom_scalar import EllipticCurveHom_scalar
431
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
432
+ sage: E = EllipticCurve(GF(31), [0,1])
433
+ sage: f = EllipticCurveHom_frobenius(E)
434
+ sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31) # needs sage.symbolic
435
+ True
436
+ sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31) # needs sage.symbolic
437
+ True
438
+
439
+ A supersingular example::
440
+
441
+ sage: E = EllipticCurve(GF(31), [1,0])
442
+ sage: f = EllipticCurveHom_frobenius(E)
443
+ sage: f.dual() * f == EllipticCurveHom_scalar(f.domain(), 31) # needs sage.symbolic
444
+ True
445
+ sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), 31) # needs sage.symbolic
446
+ True
447
+
448
+ TESTS:
449
+
450
+ Some random testing (including small characteristic)::
451
+
452
+ sage: p = random_prime(50)
453
+ sage: q = p**randrange(1,10)
454
+ sage: n = randrange(20)
455
+ sage: while True:
456
+ ....: try:
457
+ ....: E = EllipticCurve([GF(q).random_element() for _ in range(5)])
458
+ ....: break
459
+ ....: except ArithmeticError:
460
+ ....: pass
461
+ sage: f = EllipticCurveHom_frobenius(E, n)
462
+ sage: f.dual() * f == EllipticCurveHom_scalar(E, p**n) # needs sage.symbolic
463
+ True
464
+ sage: f * f.dual() == EllipticCurveHom_scalar(f.codomain(), p**n) # needs sage.symbolic
465
+ True
466
+ sage: f.dual().dual() == f # known bug -- broken in characteristic 2,3 # needs sage.symbolic
467
+ True
468
+ sage: p in (2,3) or f.dual().dual() == f # needs sage.symbolic
469
+ True
470
+
471
+ ALGORITHM:
472
+
473
+ - For supersingular curves, the dual of Frobenius is again purely
474
+ inseparable, so we start out with a Frobenius isogeny of equal
475
+ degree in the opposite direction.
476
+
477
+ - For ordinary curves, we immediately reduce to the case of prime
478
+ degree. The kernel of the dual is the unique subgroup of size `p`,
479
+ which we compute from the `p`-division polynomial.
480
+
481
+ In both cases, we then search for the correct post-isomorphism
482
+ using :meth:`find_post_isomorphism`.
483
+ """
484
+ if self._degree == 1:
485
+ return self
486
+
487
+ if self._domain.is_supersingular():
488
+ Phi = EllipticCurveHom_frobenius(self._codomain, self._n)
489
+
490
+ else:
491
+ E = self._domain
492
+ poly = self._domain.division_polynomial(self._p)
493
+ ker = self._poly_ring(list(poly)[::self._p]).monic()
494
+ Phis = []
495
+ for _ in range(self._n):
496
+ Ep = EllipticCurve([a**self._p for a in E.a_invariants()])
497
+ Phis.append(EllipticCurveIsogeny(Ep, ker, codomain=E))
498
+ E, ker = Ep, ker.map_coefficients(lambda c: c**self._p)
499
+ Phi = EllipticCurveHom_composite.from_factors(Phis[::-1], self._codomain)
500
+
501
+ scalar_mul = EllipticCurveHom_scalar(self._domain, self._degree)
502
+ iso = find_post_isomorphism(Phi * self, scalar_mul)
503
+ return iso * Phi
504
+
505
+ def inseparable_degree(self):
506
+ """
507
+ Return the inseparable degree of this Frobenius isogeny.
508
+
509
+ Since this class implements only purely inseparable isogenies,
510
+ the inseparable degree equals the degree.
511
+
512
+ EXAMPLES::
513
+
514
+ sage: from sage.schemes.elliptic_curves.hom_frobenius import EllipticCurveHom_frobenius
515
+ sage: E = EllipticCurve(GF(11), [1,1])
516
+ sage: pi = EllipticCurveHom_frobenius(E, 4)
517
+ sage: pi.inseparable_degree()
518
+ 14641
519
+ sage: pi.inseparable_degree() == pi.degree()
520
+ True
521
+ """
522
+ return self._degree