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,663 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ r"""
3
+ Generic dynamical systems on schemes
4
+
5
+ This is the generic class for dynamical systems and contains the exported
6
+ constructor functions. The constructor functions can take either polynomials
7
+ (or rational functions in the affine case) or morphisms from which to
8
+ construct a dynamical system. If the domain is not specified, it is
9
+ constructed. However, if you plan on working with points or subvarieties
10
+ in the domain, it recommended to specify the domain. For products of
11
+ projective spaces the domain must be specified.
12
+
13
+ The initialization checks are always performed by the constructor functions.
14
+ It is possible, but not recommended, to skip these checks by calling the
15
+ class initialization directly.
16
+
17
+ AUTHORS:
18
+
19
+ - Ben Hutz (July 2017): initial version
20
+ """
21
+
22
+ # ****************************************************************************
23
+ # Copyright (C) 2017 Ben Hutz <bn4941@gmail.com>
24
+ #
25
+ # Distributed under the terms of the GNU General Public License (GPL)
26
+ # as published by the Free Software Foundation; either version 2 of
27
+ # the License, or (at your option) any later version.
28
+ # https://www.gnu.org/licenses/
29
+ # ****************************************************************************
30
+
31
+ from copy import copy
32
+
33
+ from sage.categories.homset import End
34
+ from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
35
+ from sage.misc.lazy_import import lazy_import
36
+ from sage.rings.finite_rings.finite_field_base import FiniteField
37
+ from sage.rings.rational_field import QQ
38
+ from sage.schemes.affine.affine_space import AffineSpace_generic
39
+ from sage.schemes.affine.affine_subscheme import AlgebraicScheme_subscheme_affine
40
+ from sage.schemes.berkovich.berkovich_space import Berkovich_Cp
41
+ from sage.schemes.generic.morphism import SchemeMorphism_polynomial
42
+
43
+ lazy_import('sage.rings.algebraic_closure_finite_field', 'AlgebraicClosureFiniteField_generic')
44
+ lazy_import('sage.rings.qqbar', 'AlgebraicField_common')
45
+
46
+
47
+ class DynamicalSystem(SchemeMorphism_polynomial,
48
+ metaclass=InheritComparisonClasscallMetaclass):
49
+ r"""
50
+ Base class for dynamical systems of schemes.
51
+
52
+ INPUT:
53
+
54
+ - ``polys_or_rat_fncts`` -- list of polynomials or rational functions,
55
+ all of which should have the same parent
56
+
57
+ - ``domain`` -- an affine or projective scheme, or product of
58
+ projective schemes, on which ``polys`` defines an endomorphism
59
+ (Subschemes are also ok)
60
+
61
+ - ``names`` -- (default: ``('X', 'Y')``) tuple of strings to be used
62
+ as coordinate names for a projective space that is constructed
63
+
64
+ The following combinations of ``morphism_or_polys`` and
65
+ ``domain`` are meaningful:
66
+
67
+ * ``morphism_or_polys`` is a SchemeMorphism; ``domain`` is
68
+ ignored in this case
69
+
70
+ * ``morphism_or_polys`` is a list of homogeneous polynomials
71
+ that define a rational endomorphism of ``domain``
72
+
73
+ * ``morphism_or_polys`` is a list of homogeneous polynomials and
74
+ ``domain`` is unspecified; ``domain`` is then taken to be the
75
+ projective space of appropriate dimension over the common parent
76
+ of the elements in ``morphism_or_polys``
77
+
78
+ * ``morphism_or_polys`` is a single polynomial or rational
79
+ function; ``domain`` is ignored and taken to be a
80
+ 1-dimensional projective space over the base ring of
81
+ ``morphism_or_polys`` with coordinate names given by ``names``
82
+
83
+ EXAMPLES::
84
+
85
+ sage: A.<x> = AffineSpace(QQ,1)
86
+ sage: f = DynamicalSystem_affine([x^2 + 1])
87
+ sage: type(f)
88
+ <class 'sage.dynamics.arithmetic_dynamics.affine_ds.DynamicalSystem_affine_field'>
89
+
90
+ ::
91
+
92
+ sage: P.<x,y> = ProjectiveSpace(QQ,1)
93
+ sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
94
+ sage: type(f)
95
+ <class 'sage.dynamics.arithmetic_dynamics.projective_ds.DynamicalSystem_projective_field'>
96
+
97
+ ::
98
+
99
+ sage: P1.<x,y> = ProjectiveSpace(CC,1)
100
+ sage: H = End(P1)
101
+ sage: DynamicalSystem(H([y, x]))
102
+ Dynamical System of Projective Space of dimension 1 over Complex Field
103
+ with 53 bits of precision
104
+ Defn: Defined on coordinates by sending (x : y) to (y : x)
105
+
106
+ :class:`DynamicalSystem` defaults to projective::
107
+
108
+ sage: R.<x,y,z> = QQ[]
109
+ sage: DynamicalSystem([x^2, y^2, z^2])
110
+ Dynamical System of Projective Space of dimension 2 over Rational Field
111
+ Defn: Defined on coordinates by sending (x : y : z) to
112
+ (x^2 : y^2 : z^2)
113
+
114
+ ::
115
+
116
+ sage: A.<x,y> = AffineSpace(QQ, 2)
117
+ sage: DynamicalSystem([y, x], domain=A)
118
+ Dynamical System of Affine Space of dimension 2 over Rational Field
119
+ Defn: Defined on coordinates by sending (x, y) to (y, x)
120
+ sage: H = End(A)
121
+ sage: DynamicalSystem(H([y, x]))
122
+ Dynamical System of Affine Space of dimension 2 over Rational Field
123
+ Defn: Defined on coordinates by sending (x, y) to (y, x)
124
+
125
+ Note that ``domain`` is ignored if an endomorphism is passed in::
126
+
127
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
128
+ sage: P2.<x,y> = ProjectiveSpace(CC, 1)
129
+ sage: H = End(P2)
130
+ sage: f = H([CC.0*x^2, y^2])
131
+ sage: g = DynamicalSystem(f, domain=P)
132
+ sage: g.domain()
133
+ Projective Space of dimension 1 over Complex Field with 53 bits of precision
134
+
135
+ Constructing a common parent::
136
+
137
+ sage: P.<x,y> = ProjectiveSpace(ZZ, 1)
138
+ sage: DynamicalSystem([CC.0*x^2, 4/5*y^2])
139
+ Dynamical System of
140
+ Projective Space of dimension 1 over Complex Field with 53 bits of precision
141
+ Defn: Defined on coordinates by sending (x : y) to
142
+ (1.00000000000000*I*x^2 : 0.800000000000000*y^2)
143
+
144
+ sage: # needs sage.rings.finite_rings
145
+ sage: P.<x,y> = ProjectiveSpace(GF(5), 1)
146
+ sage: K.<t> = GF(25)
147
+ sage: DynamicalSystem([GF(5)(3)*x^2, K(t)*y^2])
148
+ Dynamical System of Projective Space of dimension 1 over Finite Field in t of size 5^2
149
+ Defn: Defined on coordinates by sending (x : y) to
150
+ (-2*x^2 : t*y^2)
151
+ """
152
+
153
+ @staticmethod
154
+ def __classcall_private__(cls, morphism_or_polys, domain=None, names=None):
155
+ r"""
156
+ Return the appropriate dynamical system on a scheme.
157
+
158
+ EXAMPLES::
159
+
160
+ sage: R.<t> = QQ[]
161
+ sage: DynamicalSystem(t^2 - 3)
162
+ Dynamical System of Projective Space of dimension 1 over Rational Field
163
+ Defn: Defined on coordinates by sending (X : Y) to
164
+ (X^2 - 3*Y^2 : Y^2)
165
+ """
166
+ if isinstance(morphism_or_polys, SchemeMorphism_polynomial):
167
+ domain = morphism_or_polys.domain()
168
+ if domain is not None:
169
+ if isinstance(domain, (AffineSpace_generic,
170
+ AlgebraicScheme_subscheme_affine)):
171
+ from sage.dynamics.arithmetic_dynamics.affine_ds import DynamicalSystem_affine
172
+ return DynamicalSystem_affine(morphism_or_polys, domain)
173
+ if isinstance(domain, Berkovich_Cp):
174
+ from sage.dynamics.arithmetic_dynamics.berkovich_ds import DynamicalSystem_Berkovich
175
+ return DynamicalSystem_Berkovich(morphism_or_polys,domain)
176
+
177
+ from sage.dynamics.arithmetic_dynamics.projective_ds import DynamicalSystem_projective
178
+ return DynamicalSystem_projective(morphism_or_polys, domain, names)
179
+
180
+ def __init__(self, polys_or_rat_fncts, domain):
181
+ r"""
182
+ The Python constructor.
183
+
184
+ EXAMPLES::
185
+
186
+ sage: from sage.dynamics.arithmetic_dynamics.generic_ds import DynamicalSystem
187
+ sage: P.<x,y> = ProjectiveSpace(QQ,1)
188
+ sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
189
+ sage: isinstance(f, DynamicalSystem)
190
+ True
191
+ """
192
+ H = End(domain)
193
+ # All consistency checks are done by the public class constructors,
194
+ # so we can set check=False here.
195
+ SchemeMorphism_polynomial.__init__(self, H, polys_or_rat_fncts, check=False)
196
+
197
+ def _repr_type(self):
198
+ r"""
199
+ Return a string representation of the type of a dynamical system.
200
+
201
+ OUTPUT: string
202
+
203
+ EXAMPLES::
204
+
205
+ sage: PS.<x,y> = ProjectiveSpace(QQ,1)
206
+ sage: f = DynamicalSystem_projective([x^3, x*y^2])
207
+ sage: f._repr_type()
208
+ 'Dynamical System'
209
+ """
210
+ return "Dynamical System"
211
+
212
+ def _repr_(self):
213
+ r"""
214
+ Return a string representation of a dynamical system.
215
+
216
+ OUTPUT: string
217
+
218
+ EXAMPLES::
219
+
220
+ sage: PS.<x,y> = ProjectiveSpace(QQ,1)
221
+ sage: f = DynamicalSystem_projective([x^3, x*y^2])
222
+ sage: f._repr_()
223
+ 'Dynamical System of Projective Space of dimension 1 over Rational Field\n
224
+ Defn: Defined on coordinates by sending (x : y) to\n (x^3 : x*y^2)'
225
+ """
226
+ s = "%s of %s" % (self._repr_type(), self.domain())
227
+ d = self._repr_defn()
228
+ if d != '':
229
+ s += "\n Defn: %s" % ('\n '.join(self._repr_defn().split('\n')))
230
+ return s
231
+
232
+ def as_scheme_morphism(self):
233
+ """
234
+ Return this dynamical system as :class:`SchemeMorphism_polynomial`.
235
+
236
+ OUTPUT: :class:`SchemeMorphism_polynomial`
237
+
238
+ EXAMPLES::
239
+
240
+ sage: P.<x,y,z> = ProjectiveSpace(ZZ, 2)
241
+ sage: f = DynamicalSystem_projective([x^2, y^2, z^2])
242
+ sage: type(f.as_scheme_morphism())
243
+ <class 'sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space'>
244
+
245
+ ::
246
+
247
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
248
+ sage: f = DynamicalSystem_projective([x^2 - y^2, y^2])
249
+ sage: type(f.as_scheme_morphism())
250
+ <class 'sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space_field'>
251
+
252
+ ::
253
+
254
+ sage: P.<x,y> = ProjectiveSpace(GF(5), 1)
255
+ sage: f = DynamicalSystem_projective([x^2, y^2])
256
+ sage: type(f.as_scheme_morphism())
257
+ <class 'sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space_finite_field'>
258
+
259
+ ::
260
+
261
+ sage: A.<x,y> = AffineSpace(ZZ, 2)
262
+ sage: f = DynamicalSystem_affine([x^2 - 2, y^2])
263
+ sage: type(f.as_scheme_morphism())
264
+ <class 'sage.schemes.affine.affine_morphism.SchemeMorphism_polynomial_affine_space'>
265
+
266
+ ::
267
+
268
+ sage: A.<x,y> = AffineSpace(QQ, 2)
269
+ sage: f = DynamicalSystem_affine([x^2 - 2, y^2])
270
+ sage: type(f.as_scheme_morphism())
271
+ <class 'sage.schemes.affine.affine_morphism.SchemeMorphism_polynomial_affine_space_field'>
272
+
273
+ ::
274
+
275
+ sage: A.<x,y> = AffineSpace(GF(3), 2)
276
+ sage: f = DynamicalSystem_affine([x^2 - 2, y^2])
277
+ sage: type(f.as_scheme_morphism())
278
+ <class 'sage.schemes.affine.affine_morphism.SchemeMorphism_polynomial_affine_space_finite_field'>
279
+ """
280
+ H = End(self.domain())
281
+ return H(list(self))
282
+
283
+ def change_ring(self, R, check=True):
284
+ r"""
285
+ Return a new dynamical system which is this map coerced to ``R``.
286
+
287
+ If ``check`` is ``True``, then the initialization checks are performed.
288
+
289
+ INPUT:
290
+
291
+ - ``R`` -- ring or morphism
292
+
293
+ OUTPUT:
294
+
295
+ A new :class:`DynamicalSystem_projective` that is this map
296
+ coerced to ``R``.
297
+
298
+ EXAMPLES::
299
+
300
+ sage: P.<x,y> = ProjectiveSpace(ZZ, 1)
301
+ sage: f = DynamicalSystem_projective([3*x^2, y^2])
302
+ sage: f.change_ring(GF(5))
303
+ Dynamical System of Projective Space of dimension 1 over Finite Field of size 5
304
+ Defn: Defined on coordinates by sending (x : y) to (-2*x^2 : y^2)
305
+ """
306
+ f = self.as_scheme_morphism()
307
+ F = f.change_ring(R)
308
+ return F.as_dynamical_system()
309
+
310
+ def specialization(self, D=None, phi=None, homset=None):
311
+ r"""
312
+ Specialization of this dynamical system.
313
+
314
+ Given a family of maps defined over a polynomial ring. A
315
+ specialization is a particular member of that family. The
316
+ specialization can be specified either by a dictionary or
317
+ a :class:`SpecializationMorphism`.
318
+
319
+ INPUT:
320
+
321
+ - ``D`` -- (optional) dictionary
322
+
323
+ - ``phi`` -- (optional) SpecializationMorphism
324
+
325
+ - ``homset`` -- (optional) homset of specialized map
326
+
327
+ OUTPUT: :class:`DynamicalSystem`
328
+
329
+ EXAMPLES::
330
+
331
+ sage: R.<c> = PolynomialRing(QQ)
332
+ sage: P.<x,y> = ProjectiveSpace(R, 1)
333
+ sage: f = DynamicalSystem_projective([x^2 + c*y^2, y^2], domain=P)
334
+ sage: f.specialization({c:1})
335
+ Dynamical System of Projective Space of dimension 1 over Rational Field
336
+ Defn: Defined on coordinates by sending (x : y) to (x^2 + y^2 : y^2)
337
+ """
338
+ F = self.as_scheme_morphism().specialization(D, phi, homset)
339
+ return F.as_dynamical_system()
340
+
341
+ def field_of_definition_critical(self, return_embedding=False, simplify_all=False, names='a'):
342
+ r"""
343
+ Return smallest extension of the base field which contains the critical points.
344
+
345
+ Ambient space of dynamical system must be either the affine line or projective
346
+ line over a number field or finite field.
347
+
348
+ INPUT:
349
+
350
+ - ``return_embedding`` -- boolean (default: ``False``); if ``True``, return an
351
+ embedding of base field of dynamical system into the returned number field or
352
+ finite field. Note that computing this embedding might be expensive.
353
+
354
+ - ``simplify_all`` -- boolean (default: ``False``); if ``True``, simplify
355
+ intermediate fields and also the resulting number field. Note that this
356
+ is not implemented for finite fields and has no effect.
357
+
358
+ - ``names`` -- (optional) string to be used as generator for returned number field
359
+ or finite field
360
+
361
+ OUTPUT:
362
+
363
+ If ``return_embedding`` is ``False``, the field of definition as an absolute number
364
+ field or finite field. If ``return_embedding`` is ``True``, a tuple
365
+ ``(K, phi)`` where ``phi`` is an embedding of the base field in ``K``.
366
+
367
+ EXAMPLES:
368
+
369
+ Note that the number of critical points is `2d-2`, but `(1:0)` has multiplicity 2 in this case::
370
+
371
+ sage: # needs sage.libs.singular sage.rings.number_field
372
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
373
+ sage: f = DynamicalSystem([1/3*x^3 + x*y^2, y^3], domain=P)
374
+ sage: f.critical_points()
375
+ [(1 : 0)]
376
+ sage: N.<a> = f.field_of_definition_critical(); N
377
+ Number Field in a with defining polynomial x^2 + 1
378
+ sage: g = f.change_ring(N)
379
+ sage: g.critical_points()
380
+ [(-a : 1), (a : 1), (1 : 0)]
381
+
382
+ ::
383
+
384
+ sage: # needs sage.libs.singular sage.rings.number_field
385
+ sage: A.<z> = AffineSpace(QQ, 1)
386
+ sage: f = DynamicalSystem([z^4 + 2*z^2 + 2], domain=A)
387
+ sage: K.<a> = f.field_of_definition_critical(); K
388
+ Number Field in a with defining polynomial z^2 + 1
389
+
390
+ ::
391
+
392
+ sage: # needs sage.libs.singular sage.rings.finite_rings
393
+ sage: G.<a> = GF(9)
394
+ sage: R.<z> = G[]
395
+ sage: R.irreducible_element(3, algorithm='first_lexicographic')
396
+ z^3 + (a + 1)*z + a
397
+ sage: A.<x> = AffineSpace(G,1)
398
+ sage: f = DynamicalSystem([x^4 + (2*a+2)*x^2 + a*x], domain=A)
399
+ sage: f[0].derivative(x).univariate_polynomial().is_irreducible()
400
+ True
401
+ sage: f.field_of_definition_critical(return_embedding=True, names='b')
402
+ (Finite Field in b of size 3^6,
403
+ Ring morphism:
404
+ From: Finite Field in a of size 3^2
405
+ To: Finite Field in b of size 3^6
406
+ Defn: a |--> 2*b^5 + 2*b^3 + b^2 + 2*b + 2)
407
+ """
408
+ ds = copy(self)
409
+ space = ds.domain().ambient_space()
410
+ K = ds.base_ring()
411
+ if space.dimension() != 1:
412
+ raise ValueError('ambient space of dynamical system must be either the affine line or projective line')
413
+ if isinstance(K, (AlgebraicClosureFiniteField_generic, AlgebraicField_common)):
414
+ if return_embedding:
415
+ return (K, K.hom(K))
416
+ else:
417
+ return K
418
+ if space.is_projective():
419
+ ds = ds.dehomogenize(1)
420
+ f,g = ds[0].numerator(), ds[0].denominator()
421
+ CR = space.coordinate_ring()
422
+ if CR.is_field():
423
+ #want the polynomial ring not the fraction field
424
+ CR = CR.ring()
425
+ x = CR.gen(0)
426
+ poly = (g*CR(f).derivative(x) - f*CR(g).derivative(x)).univariate_polynomial()
427
+ if isinstance(ds.base_ring(), FiniteField):
428
+ return poly.splitting_field(names, map=return_embedding)
429
+ else:
430
+ K = poly.splitting_field(names, map=return_embedding, simplify_all=simplify_all)
431
+ if return_embedding:
432
+ N = K[0]
433
+ else:
434
+ N = K
435
+ if N.absolute_degree() == 1:
436
+ if return_embedding:
437
+ return (QQ,ds.base_ring().embeddings(QQ)[0])
438
+ else:
439
+ return QQ
440
+ else:
441
+ return K
442
+
443
+ def field_of_definition_periodic(self, n, formal=False, return_embedding=False, simplify_all=False, names='a'):
444
+ r"""
445
+ Return smallest extension of the base field which contains all fixed points
446
+ of the ``n``-th iterate
447
+
448
+ Ambient space of dynamical system must be either the affine line
449
+ or projective line over a number field or finite field.
450
+
451
+ INPUT:
452
+
453
+ - ``n`` -- positive integer
454
+
455
+ - ``formal`` -- boolean (default: ``False``); ``True`` signals to return number
456
+ field or finite field over which the formal periodic points are defined, where a
457
+ formal periodic point is a root of the ``n``-th dynatomic polynomial.
458
+ ``False`` specifies to find number field or finite field over which all periodic
459
+ points of the ``n``-th iterate are defined.
460
+
461
+ - ``return_embedding`` -- boolean (default: ``False``); if ``True``, return
462
+ an embedding of base field of dynamical system into the returned number
463
+ field or finite field. Note that computing this embedding might be expensive.
464
+
465
+ - ``simplify_all`` -- boolean (default: ``False``); if ``True``, simplify
466
+ intermediate fields and also the resulting number field. Note that this
467
+ is not implemented for finite fields and has no effect.
468
+
469
+ - ``names`` -- (optional) string to be used as generator for returned number
470
+ field or finite field
471
+
472
+ OUTPUT:
473
+
474
+ If ``return_embedding`` is ``False``, the field of definition as an absolute
475
+ number field or finite field. If ``return_embedding`` is ``True``, a tuple
476
+ ``(K, phi)`` where ``phi`` is an embedding of the base field in ``K``.
477
+
478
+ EXAMPLES::
479
+
480
+ sage: # needs sage.libs.singular sage.rings.number_field
481
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
482
+ sage: f = DynamicalSystem([x^2, y^2], domain=P)
483
+ sage: f.periodic_points(3, minimal=False)
484
+ [(0 : 1), (1 : 0), (1 : 1)]
485
+ sage: N.<a> = f.field_of_definition_periodic(3); N
486
+ Number Field in a with defining polynomial x^6 + x^5 + x^4 + x^3 + x^2 + x + 1
487
+ sage: sorted(f.periodic_points(3, minimal=False, R=N), key=str)
488
+ [(-a^5 - a^4 - a^3 - a^2 - a - 1 : 1),
489
+ (0 : 1),
490
+ (1 : 0),
491
+ (1 : 1),
492
+ (a : 1),
493
+ (a^2 : 1),
494
+ (a^3 : 1),
495
+ (a^4 : 1),
496
+ (a^5 : 1)]
497
+
498
+ ::
499
+
500
+ sage: # needs sage.libs.singular sage.rings.number_field
501
+ sage: A.<z> = AffineSpace(QQ, 1)
502
+ sage: f = DynamicalSystem([(z^2 + 1)/(2*z + 1)], domain=A)
503
+ sage: K.<a> = f.field_of_definition_periodic(2); K
504
+ Number Field in a with defining polynomial z^4 + 12*z^3 + 39*z^2 + 18*z + 171
505
+ sage: F.<b> = f.field_of_definition_periodic(2, formal=True); F
506
+ Number Field in b with defining polynomial z^2 + 3*z + 6
507
+
508
+ ::
509
+
510
+ sage: # needs sage.rings.finite_rings
511
+ sage: G.<a> = GF(4)
512
+ sage: A.<x> = AffineSpace(G, 1)
513
+ sage: f = DynamicalSystem([x^2 + (a+1)*x + 1], domain=A)
514
+ sage: g = f.nth_iterate_map(2)[0]
515
+ sage: (g-x).univariate_polynomial().factor()
516
+ (x + 1) * (x + a + 1) * (x^2 + a*x + 1)
517
+ sage: f.field_of_definition_periodic(2, return_embedding=True, names='b')
518
+ (Finite Field in b of size 2^4,
519
+ Ring morphism:
520
+ From: Finite Field in a of size 2^2
521
+ To: Finite Field in b of size 2^4
522
+ Defn: a |--> b^2 + b)
523
+ """
524
+ ds = copy(self)
525
+ n = int(n)
526
+ K = ds.base_ring()
527
+ if n < 1:
528
+ raise ValueError('`n` must be >= 1')
529
+ space = ds.domain().ambient_space()
530
+ if space.dimension() != 1:
531
+ raise NotImplementedError("not implemented for affine or projective spaces of dimension >1")
532
+ if isinstance(K, (AlgebraicClosureFiniteField_generic, AlgebraicField_common)):
533
+ if return_embedding:
534
+ return (K, K.hom(K))
535
+ else:
536
+ return K
537
+ if space.is_projective():
538
+ ds = ds.dehomogenize(1)
539
+ CR = space.coordinate_ring()
540
+ if CR.is_field():
541
+ #want the polynomial ring not the fraction field
542
+ CR = CR.ring()
543
+ x = CR.gen(0)
544
+ if formal:
545
+ poly = ds.dynatomic_polynomial(n)
546
+ poly = CR(poly).univariate_polynomial()
547
+ else:
548
+ fn = ds.nth_iterate_map(n)
549
+ f,g = fn[0].numerator(), fn[0].denominator()
550
+ poly = (f - g*x).univariate_polynomial()
551
+ if isinstance(ds.base_ring(), FiniteField):
552
+ return poly.splitting_field(names, map=return_embedding)
553
+ else:
554
+ K = poly.splitting_field(names, map=return_embedding, simplify_all=simplify_all)
555
+ if return_embedding:
556
+ N = K[0]
557
+ else:
558
+ N = K
559
+ if N.absolute_degree() == 1:
560
+ if return_embedding:
561
+ return (QQ,ds.base_ring().embeddings(QQ)[0])
562
+ else:
563
+ return QQ
564
+ else:
565
+ return K
566
+
567
+ def field_of_definition_preimage(self, point, n, return_embedding=False, simplify_all=False, names='a'):
568
+ r"""
569
+ Return smallest extension of the base field which contains the
570
+ ``n``-th preimages of ``point``
571
+
572
+ Ambient space of dynamical system must be either the affine line or
573
+ projective line over a number field or finite field.
574
+
575
+ INPUT:
576
+
577
+ - ``point`` -- a point in this map's domain
578
+
579
+ - ``n`` -- positive integer
580
+
581
+ - ``return_embedding`` -- boolean (default: ``False``); if ``True``, return
582
+ an embedding of base field of dynamical system into the returned number
583
+ field or finite field. Note that computing this embedding might be expensive.
584
+
585
+ - ``simplify_all`` -- boolean (default: ``False``); if ``True``, simplify
586
+ intermediate fields and also the resulting number field. Note that this
587
+ is not implemented for finite fields and has no effect.
588
+
589
+ - ``names`` -- (optional) string to be used as generator for returned
590
+ number field or finite field
591
+
592
+ OUTPUT:
593
+
594
+ If ``return_embedding`` is ``False``, the field of definition as an absolute
595
+ number field or finite field. If ``return_embedding`` is ``True``, a tuple
596
+ ``(K, phi)`` where ``phi`` is an embedding of the base field in ``K``.
597
+
598
+ EXAMPLES::
599
+
600
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
601
+ sage: f = DynamicalSystem([1/3*x^2 + 2/3*x*y, x^2 - 2*y^2], domain=P)
602
+ sage: N.<a> = f.field_of_definition_preimage(P(1,1), 2, # needs sage.rings.number_field
603
+ ....: simplify_all=True); N
604
+ Number Field in a with defining polynomial
605
+ x^8 - 4*x^7 - 128*x^6 + 398*x^5 + 3913*x^4 - 8494*x^3 - 26250*x^2 + 30564*x - 2916
606
+
607
+ ::
608
+
609
+ sage: A.<z> = AffineSpace(QQ, 1)
610
+ sage: f = DynamicalSystem([z^2], domain=A)
611
+ sage: K.<a> = f.field_of_definition_preimage(A(1), 3); K # needs sage.rings.number_field
612
+ Number Field in a with defining polynomial z^4 + 1
613
+
614
+ ::
615
+
616
+ sage: G = GF(5)
617
+ sage: P.<x,y> = ProjectiveSpace(G, 1)
618
+ sage: f = DynamicalSystem([x^2 + 2*y^2, y^2], domain=P)
619
+ sage: f.field_of_definition_preimage(P(2,1), 2, return_embedding=True, # needs sage.rings.number_field
620
+ ....: names='a')
621
+ (Finite Field in a of size 5^2,
622
+ Ring morphism:
623
+ From: Finite Field of size 5
624
+ To: Finite Field in a of size 5^2
625
+ Defn: 1 |--> 1)
626
+ """
627
+ ds = copy(self)
628
+ n = int(n)
629
+ if n < 1:
630
+ raise ValueError('`n` must be >= 1')
631
+ space = ds.domain().ambient_space()
632
+ if space.dimension() != 1:
633
+ raise NotImplementedError("not implemented for affine or projective spaces of dimension >1")
634
+ try:
635
+ point = space(point)
636
+ except TypeError:
637
+ raise TypeError('`point` must be in {}'.format(ds.domain()))
638
+ if space.is_projective():
639
+ ds = ds.dehomogenize(1)
640
+ else:
641
+ point = (point[0],1)
642
+ fn = ds.nth_iterate_map(n)
643
+ f, g = fn[0].numerator(), fn[0].denominator()
644
+ CR = space.coordinate_ring()
645
+ if CR.is_field():
646
+ #want the polynomial ring not the fraction field
647
+ CR = CR.ring()
648
+ poly = (f*point[1] - g*CR(point[0])).univariate_polynomial()
649
+ if isinstance(ds.base_ring(), FiniteField):
650
+ return poly.splitting_field(names, map=return_embedding)
651
+ else:
652
+ K = poly.splitting_field(names, map=return_embedding, simplify_all=simplify_all)
653
+ if return_embedding:
654
+ N = K[0]
655
+ else:
656
+ N = K
657
+ if N.absolute_degree() == 1:
658
+ if return_embedding:
659
+ return (QQ, ds.base_ring().embeddings(QQ)[0])
660
+ else:
661
+ return QQ
662
+ else:
663
+ return K