passagemath-schemes 10.6.40__cp314-cp314-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.

Potentially problematic release.


This version of passagemath-schemes might be problematic. Click here for more details.

Files changed (314) 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.40.dist-info/METADATA +204 -0
  7. passagemath_schemes-10.6.40.dist-info/METADATA.bak +205 -0
  8. passagemath_schemes-10.6.40.dist-info/RECORD +314 -0
  9. passagemath_schemes-10.6.40.dist-info/WHEEL +6 -0
  10. passagemath_schemes-10.6.40.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-314-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-314-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-314-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-314-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-314-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-314-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-314-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-314-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.cpython-314-darwin.so +0 -0
  154. sage/modular/modsym/p1list.pxd +29 -0
  155. sage/modular/modsym/p1list.pyx +1372 -0
  156. sage/modular/modsym/p1list_nf.py +1241 -0
  157. sage/modular/modsym/relation_matrix.py +591 -0
  158. sage/modular/modsym/relation_matrix_pyx.cpython-314-darwin.so +0 -0
  159. sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
  160. sage/modular/modsym/space.py +2468 -0
  161. sage/modular/modsym/subspace.py +455 -0
  162. sage/modular/modsym/tests.py +375 -0
  163. sage/modular/multiple_zeta.py +2632 -0
  164. sage/modular/multiple_zeta_F_algebra.py +786 -0
  165. sage/modular/overconvergent/all.py +6 -0
  166. sage/modular/overconvergent/genus0.py +1878 -0
  167. sage/modular/overconvergent/hecke_series.py +1187 -0
  168. sage/modular/overconvergent/weightspace.py +778 -0
  169. sage/modular/pollack_stevens/all.py +4 -0
  170. sage/modular/pollack_stevens/distributions.py +874 -0
  171. sage/modular/pollack_stevens/fund_domain.py +1572 -0
  172. sage/modular/pollack_stevens/manin_map.py +859 -0
  173. sage/modular/pollack_stevens/modsym.py +1593 -0
  174. sage/modular/pollack_stevens/padic_lseries.py +417 -0
  175. sage/modular/pollack_stevens/sigma0.py +534 -0
  176. sage/modular/pollack_stevens/space.py +1076 -0
  177. sage/modular/quasimodform/all.py +3 -0
  178. sage/modular/quasimodform/element.py +845 -0
  179. sage/modular/quasimodform/ring.py +828 -0
  180. sage/modular/quatalg/all.py +3 -0
  181. sage/modular/quatalg/brandt.py +1642 -0
  182. sage/modular/ssmod/all.py +8 -0
  183. sage/modular/ssmod/ssmod.py +827 -0
  184. sage/rings/all__sagemath_schemes.py +1 -0
  185. sage/rings/polynomial/all__sagemath_schemes.py +1 -0
  186. sage/rings/polynomial/binary_form_reduce.py +585 -0
  187. sage/schemes/all.py +41 -0
  188. sage/schemes/berkovich/all.py +6 -0
  189. sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
  190. sage/schemes/berkovich/berkovich_space.py +748 -0
  191. sage/schemes/curves/affine_curve.py +2928 -0
  192. sage/schemes/curves/all.py +33 -0
  193. sage/schemes/curves/closed_point.py +434 -0
  194. sage/schemes/curves/constructor.py +381 -0
  195. sage/schemes/curves/curve.py +542 -0
  196. sage/schemes/curves/plane_curve_arrangement.py +1283 -0
  197. sage/schemes/curves/point.py +463 -0
  198. sage/schemes/curves/projective_curve.py +3026 -0
  199. sage/schemes/curves/zariski_vankampen.py +1932 -0
  200. sage/schemes/cyclic_covers/all.py +2 -0
  201. sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
  202. sage/schemes/cyclic_covers/constructor.py +137 -0
  203. sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
  204. sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
  205. sage/schemes/elliptic_curves/BSD.py +1036 -0
  206. sage/schemes/elliptic_curves/Qcurves.py +592 -0
  207. sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
  208. sage/schemes/elliptic_curves/all.py +49 -0
  209. sage/schemes/elliptic_curves/cardinality.py +609 -0
  210. sage/schemes/elliptic_curves/cm.py +1102 -0
  211. sage/schemes/elliptic_curves/constructor.py +1552 -0
  212. sage/schemes/elliptic_curves/ec_database.py +175 -0
  213. sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
  214. sage/schemes/elliptic_curves/ell_egros.py +459 -0
  215. sage/schemes/elliptic_curves/ell_field.py +2836 -0
  216. sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
  217. sage/schemes/elliptic_curves/ell_generic.py +3760 -0
  218. sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
  219. sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
  220. sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
  221. sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
  222. sage/schemes/elliptic_curves/ell_point.py +4787 -0
  223. sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
  224. sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
  225. sage/schemes/elliptic_curves/ell_torsion.py +436 -0
  226. sage/schemes/elliptic_curves/ell_wp.py +352 -0
  227. sage/schemes/elliptic_curves/formal_group.py +760 -0
  228. sage/schemes/elliptic_curves/gal_reps.py +1459 -0
  229. sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
  230. sage/schemes/elliptic_curves/gp_simon.py +152 -0
  231. sage/schemes/elliptic_curves/heegner.py +7335 -0
  232. sage/schemes/elliptic_curves/height.py +2109 -0
  233. sage/schemes/elliptic_curves/hom.py +1406 -0
  234. sage/schemes/elliptic_curves/hom_composite.py +934 -0
  235. sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
  236. sage/schemes/elliptic_curves/hom_scalar.py +531 -0
  237. sage/schemes/elliptic_curves/hom_sum.py +682 -0
  238. sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
  239. sage/schemes/elliptic_curves/homset.py +271 -0
  240. sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
  241. sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
  242. sage/schemes/elliptic_curves/jacobian.py +237 -0
  243. sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
  244. sage/schemes/elliptic_curves/kraus.py +1014 -0
  245. sage/schemes/elliptic_curves/lseries_ell.py +943 -0
  246. sage/schemes/elliptic_curves/mod5family.py +105 -0
  247. sage/schemes/elliptic_curves/mod_poly.py +197 -0
  248. sage/schemes/elliptic_curves/mod_sym_num.cpython-314-darwin.so +0 -0
  249. sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
  250. sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
  251. sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
  252. sage/schemes/elliptic_curves/padics.py +1816 -0
  253. sage/schemes/elliptic_curves/period_lattice.py +2234 -0
  254. sage/schemes/elliptic_curves/period_lattice_region.cpython-314-darwin.so +0 -0
  255. sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
  256. sage/schemes/elliptic_curves/saturation.py +715 -0
  257. sage/schemes/elliptic_curves/sha_tate.py +1158 -0
  258. sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
  259. sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
  260. sage/schemes/hyperelliptic_curves/all.py +6 -0
  261. sage/schemes/hyperelliptic_curves/constructor.py +291 -0
  262. sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
  263. sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
  264. sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
  265. sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
  266. sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
  267. sage/schemes/hyperelliptic_curves/invariants.py +410 -0
  268. sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
  269. sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
  270. sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
  271. sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
  272. sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
  273. sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
  274. sage/schemes/hyperelliptic_curves/mestre.py +302 -0
  275. sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
  276. sage/schemes/jacobians/abstract_jacobian.py +277 -0
  277. sage/schemes/jacobians/all.py +2 -0
  278. sage/schemes/overview.py +161 -0
  279. sage/schemes/plane_conics/all.py +22 -0
  280. sage/schemes/plane_conics/con_field.py +1296 -0
  281. sage/schemes/plane_conics/con_finite_field.py +158 -0
  282. sage/schemes/plane_conics/con_number_field.py +456 -0
  283. sage/schemes/plane_conics/con_rational_field.py +406 -0
  284. sage/schemes/plane_conics/con_rational_function_field.py +580 -0
  285. sage/schemes/plane_conics/constructor.py +249 -0
  286. sage/schemes/plane_quartics/all.py +2 -0
  287. sage/schemes/plane_quartics/quartic_constructor.py +71 -0
  288. sage/schemes/plane_quartics/quartic_generic.py +73 -0
  289. sage/schemes/riemann_surfaces/all.py +1 -0
  290. sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
  291. sage_wheels/share/cremona/cremona_mini.db +0 -0
  292. sage_wheels/share/ellcurves/rank0 +30427 -0
  293. sage_wheels/share/ellcurves/rank1 +31871 -0
  294. sage_wheels/share/ellcurves/rank10 +6 -0
  295. sage_wheels/share/ellcurves/rank11 +6 -0
  296. sage_wheels/share/ellcurves/rank12 +1 -0
  297. sage_wheels/share/ellcurves/rank14 +1 -0
  298. sage_wheels/share/ellcurves/rank15 +1 -0
  299. sage_wheels/share/ellcurves/rank17 +1 -0
  300. sage_wheels/share/ellcurves/rank19 +1 -0
  301. sage_wheels/share/ellcurves/rank2 +2388 -0
  302. sage_wheels/share/ellcurves/rank20 +1 -0
  303. sage_wheels/share/ellcurves/rank21 +1 -0
  304. sage_wheels/share/ellcurves/rank22 +1 -0
  305. sage_wheels/share/ellcurves/rank23 +1 -0
  306. sage_wheels/share/ellcurves/rank24 +1 -0
  307. sage_wheels/share/ellcurves/rank28 +1 -0
  308. sage_wheels/share/ellcurves/rank3 +836 -0
  309. sage_wheels/share/ellcurves/rank4 +10 -0
  310. sage_wheels/share/ellcurves/rank5 +5 -0
  311. sage_wheels/share/ellcurves/rank6 +5 -0
  312. sage_wheels/share/ellcurves/rank7 +5 -0
  313. sage_wheels/share/ellcurves/rank8 +6 -0
  314. sage_wheels/share/ellcurves/rank9 +7 -0
@@ -0,0 +1,301 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Dynamical systems on projective varieties (Cython helper)
4
+
5
+ This is the helper file providing functionality for projective_ds.py.
6
+
7
+ AUTHORS:
8
+
9
+ - Dillon Rose (2014-01): Speed enhancements
10
+ """
11
+
12
+ # ****************************************************************************
13
+ # Copyright (C) 2014 William Stein <wstein@gmail.com>
14
+ #
15
+ # This program is free software: you can redistribute it and/or modify
16
+ # it under the terms of the GNU General Public License as published by
17
+ # the Free Software Foundation, either version 2 of the License, or
18
+ # (at your option) any later version.
19
+ # https://www.gnu.org/licenses/
20
+ # ****************************************************************************
21
+
22
+ from sage.arith.functions cimport LCM_list
23
+ from sage.rings.finite_rings.finite_field_constructor import GF
24
+ from sage.combinat.subset import subsets
25
+
26
+
27
+ cpdef _fast_possible_periods(self, return_points=False):
28
+ r"""
29
+ Return the list of possible minimal periods of a periodic point
30
+ over `\QQ` and (optionally) a point in each cycle.
31
+
32
+ ALGORITHM:
33
+
34
+ See [Hutz-gr]_
35
+
36
+ INPUT:
37
+
38
+ - ``return_points`` -- boolean (default: ``False``); if ``True``, then
39
+ return the points as well as the possible periods
40
+
41
+ OUTPUT:
42
+
43
+ A list of positive integers, or a list of pairs of projective points
44
+ and periods if ``return_points`` is ``True``.
45
+
46
+ EXAMPLES::
47
+
48
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _fast_possible_periods
49
+ sage: P.<x,y> = ProjectiveSpace(GF(23),1)
50
+ sage: f = DynamicalSystem_projective([x^2-2*y^2, y^2])
51
+ sage: _fast_possible_periods(f, False)
52
+ [1, 5, 11, 22, 110]
53
+
54
+ ::
55
+
56
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _fast_possible_periods
57
+ sage: P.<x,y> = ProjectiveSpace(GF(13),1)
58
+ sage: f = DynamicalSystem_projective([x^2-y^2, y^2])
59
+ sage: sorted(_fast_possible_periods(f, True))
60
+ [[(0 : 1), 2], [(1 : 0), 1], [(3 : 1), 3], [(3 : 1), 36]]
61
+
62
+ ::
63
+
64
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _fast_possible_periods
65
+ sage: PS.<x,y,z> = ProjectiveSpace(2,GF(7))
66
+ sage: f = DynamicalSystem_projective([-360*x^3 + 760*x*z^2, y^3 - 604*y*z^2 + 240*z^3, 240*z^3])
67
+ sage: _fast_possible_periods(f, False)
68
+ [1, 2, 4, 6, 12, 14, 28, 42, 84]
69
+
70
+ .. TODO::
71
+
72
+ - More space efficient hash/point-table.
73
+ """
74
+ cdef int i, N
75
+ cdef int hash_p, hash_q
76
+ cdef int index, startindex
77
+ cdef list points_periods
78
+ cdef list P, Q
79
+ cdef set periods, lorders, rvalues
80
+
81
+ if not self._is_prime_finite_field:
82
+ raise TypeError("must be prime field")
83
+
84
+ PS = self.domain()
85
+ from sage.schemes.projective.projective_space import ProjectiveSpace_ring
86
+ if not isinstance(PS, ProjectiveSpace_ring) or PS != self.codomain():
87
+ raise NotImplementedError("must be an endomorphism of projective space")
88
+
89
+ p = PS.base_ring().order()
90
+ N = int(PS.dimension_relative())
91
+
92
+ point_table = [[0, 0] for i in range(p**(N + 1))]
93
+ index = 1
94
+ periods = set()
95
+ points_periods = []
96
+
97
+ for P in _enum_points(p, N):
98
+ hash_p = _hash(P, p)
99
+ if point_table[hash_p][1] == 0:
100
+ startindex = index
101
+ while point_table[hash_p][1] == 0:
102
+ point_table[hash_p][1] = index
103
+ Q = <list> self._fast_eval(P)
104
+ _normalize_coordinates(Q, p, N+1)
105
+ hash_q = _hash(Q, p)
106
+ point_table[hash_p][0] = hash_q
107
+ P = Q
108
+ hash_p = hash_q
109
+ index += 1
110
+
111
+ if point_table[hash_p][1] >= startindex:
112
+ P_proj = PS(P)
113
+ period = index - point_table[hash_p][1]
114
+ periods.add(period)
115
+ points_periods.append([P_proj, period])
116
+ l = P_proj.multiplier(self, period, False)
117
+ lorders = set()
118
+ for poly, _ in l.charpoly().factor():
119
+ if poly.degree() == 1:
120
+ eig = -poly.constant_coefficient()
121
+ if not eig:
122
+ continue # exclude 0
123
+ else:
124
+ eig = GF((p, poly.degree()), 't', modulus=poly).gen()
125
+ if eig:
126
+ lorders.add(eig.multiplicative_order())
127
+ S = subsets(lorders)
128
+ next(S) # get rid of the empty set
129
+ rvalues = set()
130
+ for s in S:
131
+ rvalues.add(LCM_list(s))
132
+ if N == 1:
133
+ for r in rvalues:
134
+ periods.add(period*r)
135
+ points_periods.append([P_proj, period*r])
136
+ if p == 2 or p == 3: # need e=1 for N=1, QQ
137
+ periods.add(period*r*p)
138
+ points_periods.append([P_proj, period*r*p])
139
+ else:
140
+ for r in rvalues:
141
+ periods.add(period*r)
142
+ periods.add(period*r*p)
143
+ points_periods.append([P_proj, period*r])
144
+ points_periods.append([P_proj, period*r*p])
145
+ if p == 2: # need e=3 for N>1, QQ
146
+ periods.add(period*r*4)
147
+ points_periods.append([P_proj, period*r*4])
148
+ periods.add(period*r*8)
149
+ points_periods.append([P_proj, period*r*8])
150
+
151
+ if not return_points:
152
+ return sorted(periods)
153
+ else:
154
+ return points_periods
155
+
156
+
157
+ def _enum_points(int prime, int dimension):
158
+ """
159
+ Enumerate points in projective space over finite field with given prime and dimension.
160
+
161
+ EXAMPLES::
162
+
163
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _enum_points
164
+ sage: list(_enum_points(3,2))
165
+ [[1, 0, 0], [0, 1, 0], [1, 1, 0], [2, 1, 0], [0, 0, 1],
166
+ [1, 0, 1], [2, 0, 1], [0, 1, 1], [1, 1, 1], [2, 1, 1],
167
+ [0, 2, 1], [1, 2, 1], [2, 2, 1]]
168
+ """
169
+ cdef int current_range
170
+ cdef int highest_range
171
+ cdef int value
172
+
173
+ current_range = 1
174
+ highest_range = prime**dimension
175
+
176
+ while current_range <= highest_range:
177
+ for value in range(current_range, 2*current_range):
178
+ yield _get_point_from_hash(value, prime, dimension)
179
+ current_range = current_range * prime
180
+
181
+
182
+ cpdef int _hash(list Point, int prime) noexcept:
183
+ """
184
+ Hash point given as list to unique number.
185
+
186
+ EXAMPLES::
187
+
188
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _hash
189
+ sage: _hash([1, 2, 1], 3)
190
+ 16
191
+ """
192
+ cdef int hash_q
193
+ cdef int coefficient
194
+
195
+ hash_q = 0
196
+
197
+ for coefficient in reversed(Point):
198
+ hash_q = hash_q*prime + coefficient
199
+
200
+ return hash_q
201
+
202
+ cpdef list _get_point_from_hash(int value, int prime, int dimension):
203
+ """
204
+ Hash unique number to point as a list.
205
+
206
+ EXAMPLES::
207
+
208
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _get_point_from_hash
209
+ sage: _get_point_from_hash(16, 3, 2)
210
+ [1, 2, 1]
211
+ """
212
+ cdef list P = []
213
+ cdef int i
214
+
215
+ for i in range(dimension + 1):
216
+ P.append(value % prime)
217
+ value /= prime
218
+
219
+ return P
220
+
221
+ cdef inline int _mod_inv(int num, int prime) noexcept:
222
+ """
223
+ Find the inverse of the number modulo the given prime.
224
+ """
225
+ cdef int a, b, q, t, x, y
226
+ a = prime
227
+ b = num
228
+ x = 1
229
+ y = 0
230
+ while b != 0:
231
+ t = b
232
+ q = a / t
233
+ b = a - q*t
234
+ a = t
235
+ t = x
236
+ x = y - q*t
237
+ y = t
238
+
239
+ if y < 0:
240
+ return y + prime
241
+ else:
242
+ return y
243
+
244
+ cpdef _normalize_coordinates(list point, int prime, int len_points):
245
+ """
246
+ Normalize the coordinates of the point for the given prime.
247
+
248
+ .. NOTE::
249
+
250
+ This mutates ``point``.
251
+
252
+ EXAMPLES::
253
+
254
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _normalize_coordinates
255
+ sage: L = [1,5,1]
256
+ sage: _normalize_coordinates(L, 3, 3)
257
+ sage: L
258
+ [1, 2, 1]
259
+ """
260
+ cdef int last_coefficient, coefficient, mod_inverse, val
261
+
262
+ for coefficient in range(len_points):
263
+ val = ((<int> point[coefficient]) + prime) % prime
264
+ point[coefficient] = val
265
+ if val != 0:
266
+ last_coefficient = val
267
+
268
+ mod_inverse = _mod_inv(last_coefficient, prime)
269
+
270
+ for coefficient in range(len_points):
271
+ point[coefficient] = (point[coefficient] * mod_inverse) % prime
272
+
273
+ cpdef _all_periodic_points(self):
274
+ """
275
+ Find all periodic points over a finite field.
276
+
277
+ EXAMPLES::
278
+
279
+ sage: from sage.dynamics.arithmetic_dynamics.projective_ds_helper import _all_periodic_points
280
+ sage: P.<x,y> = ProjectiveSpace(GF(7), 1)
281
+ sage: f = DynamicalSystem_projective([x^2 - y^2, y^2], domain=P)
282
+ sage: _all_periodic_points(f)
283
+ [(1 : 0), (0 : 1), (6 : 1)]
284
+ """
285
+ cdef list periodic_points, path
286
+ cdef set elements
287
+
288
+ periodic_points = []
289
+ path = []
290
+ elements = set(self.domain())
291
+ while elements:
292
+ number = elements.pop()
293
+ path = [number]
294
+ next_element = self(number)
295
+ while next_element in elements:
296
+ path.append(next_element)
297
+ elements.remove(next_element)
298
+ next_element = self(next_element)
299
+ if next_element in path:
300
+ periodic_points += path[path.index(next_element):]
301
+ return periodic_points