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,1101 @@
1
+ # sage_setup: distribution = sagemath-schemes
2
+ # sage.doctest: needs sage.rings.padics
3
+ r"""
4
+ Dynamical systems on Berkovich space over `\CC_p`.
5
+
6
+ A dynamical system on Berkovich space over `\CC_p` is
7
+ determined by a dynamical system on `A^1(\CC_p)` or `P^1(\CC_p)`,
8
+ which naturally induces a dynamical system on affine or
9
+ projective Berkovich space.
10
+
11
+ For an exposition of dynamical systems on Berkovich space, see chapter
12
+ 7 of [Ben2019]_, or for a more involved exposition, chapter 2 of [BR2010]_.
13
+
14
+ AUTHORS:
15
+
16
+ - Alexander Galarraga (August 14th, 2020): initial implementation
17
+ """
18
+
19
+ # ****************************************************************************
20
+ # This program is free software: you can redistribute it and/or modify
21
+ # it under the terms of the GNU General Public License as published by
22
+ # the Free Software Foundation, either version 2 of the License, or
23
+ # (at your option) any later version.
24
+ # https://www.gnu.org/licenses/
25
+ # ****************************************************************************
26
+
27
+ from sage.categories.number_fields import NumberFields
28
+ from sage.dynamics.arithmetic_dynamics.affine_ds import DynamicalSystem_affine
29
+ from sage.dynamics.arithmetic_dynamics.generic_ds import DynamicalSystem
30
+ from sage.dynamics.arithmetic_dynamics.projective_ds import DynamicalSystem_projective
31
+ from sage.matrix.constructor import Matrix
32
+ from sage.misc.classcall_metaclass import typecall
33
+ from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
34
+ from sage.misc.lazy_import import lazy_import
35
+ from sage.rings.infinity import Infinity
36
+ from sage.rings.integer_ring import ZZ
37
+ from sage.rings.rational_field import QQ
38
+ from sage.schemes.affine.affine_space import AffineSpace_generic
39
+ from sage.schemes.berkovich.berkovich_space import (Berkovich_Cp_Affine,
40
+ Berkovich_Cp_Projective, Berkovich_Cp,
41
+ Berkovich_Element_Cp_Affine)
42
+ from sage.schemes.projective.projective_space import ProjectiveSpace_ring
43
+ from sage.structure.element import Element
44
+
45
+ lazy_import('sage.rings.padics.padic_base_generic', 'pAdicBaseGeneric')
46
+
47
+
48
+ class DynamicalSystem_Berkovich(Element, metaclass=InheritComparisonClasscallMetaclass):
49
+ r"""
50
+ A dynamical system on Berkovich space over `\CC_p`.
51
+
52
+ A dynamical system on Berkovich space over `\CC_p` is
53
+ determined by a dynamical system on `A^1(\CC_p)` or `P^1(\CC_p)`,
54
+ which naturally induces a dynamical system on affine or
55
+ projective Berkovich space.
56
+
57
+ INPUT:
58
+
59
+ - ``dynamical_system`` -- a :class:`DynamicalSystem`
60
+ over affine or projective space. If this input is not defined
61
+ over a `p`-adic field, then ``domain`` MUST be specified.
62
+
63
+ - ``domain`` -- (optional) affine or projective Berkovich space
64
+ over `\CC_p`. ``domain`` must be specified if ``dynamical_system``
65
+ is defined over a number field.
66
+
67
+ - ``ideal`` -- (optional) an ideal of the ``base_ring`` of the domain
68
+ of ``dynamical_system``. Used to create ``domain`` as a Berkovich
69
+ space backed by a number field more efficiently, see examples.
70
+
71
+ EXAMPLES:
72
+
73
+ We can easily create a dynamical system on Berkovich space
74
+ using a dynamical system on projective space over `\QQ_p`::
75
+
76
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
77
+ sage: f = DynamicalSystem_projective([2*x^2 + 4*y^2, 3*x^2 + 9*y^2])
78
+ sage: DynamicalSystem_Berkovich(f)
79
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
80
+ induced by the map
81
+ Defn: Defined on coordinates by sending (x : y) to
82
+ ((2 + O(3^20))*x^2 + (1 + 3 + O(3^20))*y^2
83
+ : (3 + O(3^21))*x^2 + (3^2 + O(3^22))*y^2)
84
+
85
+ Or directly from polynomials::
86
+
87
+ sage: P.<x,y> = ProjectiveSpace(Qp(3),1)
88
+ sage: DynamicalSystem_Berkovich([x^2 + y^2, y^2])
89
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
90
+ induced by the map
91
+ Defn: Defined on coordinates by sending (x : y) to
92
+ (x^2 + y^2 : y^2)
93
+
94
+ :class:`DynamicalSystem_Berkovich` defaults to projective::
95
+
96
+ sage: R.<x,y> = Qp(3)[]
97
+ sage: DynamicalSystem_Berkovich([x^2, y^2])
98
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
99
+ induced by the map
100
+ Defn: Defined on coordinates by sending (x : y) to
101
+ (x^2 : y^2)
102
+
103
+ To create an affine dynamical system on Berkovich space, pass an
104
+ affine dynamical system to :class:`DynamicalSystem_Berkovich`::
105
+
106
+ sage: A.<z> = AffineSpace(Qp(3), 1)
107
+ sage: f = DynamicalSystem_affine(z^2 + 1)
108
+ sage: DynamicalSystem_Berkovich(f)
109
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20 induced by the map
110
+ Defn: Defined on coordinates by sending (z) to
111
+ (z^2 + 1 + O(3^20))
112
+
113
+ ``domain`` can be used to specify the type of dynamical system::
114
+
115
+ sage: A.<z> = AffineSpace(Qp(3), 1)
116
+ sage: C = Berkovich_Cp_Affine(3)
117
+ sage: DynamicalSystem_Berkovich([z^2 + 1], C)
118
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20 induced by the map
119
+ Defn: Defined on coordinates by sending (z) to
120
+ (z^2 + 1 + O(3^20))
121
+
122
+ We can create dynamical systems which act on Berkovich spaces backed by number fields::
123
+
124
+ sage: # needs sage.rings.number_field
125
+ sage: R.<z> = QQ[]
126
+ sage: A.<a> = NumberField(z^2 + 1)
127
+ sage: ideal = A.prime_above(2)
128
+ sage: P.<x,y> = ProjectiveSpace(A, 1)
129
+ sage: B = Berkovich_Cp_Projective(P, ideal)
130
+ sage: DynamicalSystem_Berkovich([x^2 + y^2, 2*a*x*y], B)
131
+ Dynamical system of Projective Berkovich line over Cp(2), with base Number Field
132
+ in a with defining polynomial z^2 + 1 induced by the map
133
+ Defn: Defined on coordinates by sending (x : y) to
134
+ (x^2 + y^2 : (2*a)*x*y)
135
+
136
+ We can use the optional parameter ``ideal`` to create the
137
+ same dynamical system more efficiently::
138
+
139
+ sage: # needs sage.rings.number_field
140
+ sage: R.<z> = QQ[]
141
+ sage: A.<a> = NumberField(z^2 + 1)
142
+ sage: prime_ideal = A.prime_above(2)
143
+ sage: P.<x,y> = ProjectiveSpace(A, 1)
144
+ sage: DynamicalSystem_Berkovich([x^2 + y^2, 2*a*x*y], ideal=prime_ideal)
145
+ Dynamical system of Projective Berkovich line over Cp(2), with base Number Field
146
+ in a with defining polynomial z^2 + 1 induced by the map
147
+ Defn: Defined on coordinates by sending (x : y) to
148
+ (x^2 + y^2 : (2*a)*x*y)
149
+
150
+ Creating a map on Berkovich space
151
+ creates the Berkovich space it acts on::
152
+
153
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
154
+ sage: f = DynamicalSystem_projective([x^2, y^2])
155
+ sage: g = DynamicalSystem_Berkovich(f)
156
+ sage: B = g.domain(); B
157
+ Projective Berkovich line over Cp(3) of precision 20
158
+
159
+ The image of type I point is the image of the center::
160
+
161
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
162
+ sage: F = DynamicalSystem_Berkovich([x^2, y^2])
163
+ sage: B = F.domain()
164
+ sage: Q1 = B(2)
165
+ sage: F(Q1)
166
+ Type I point centered at (1 + 3 + O(3^20) : 1 + O(3^20))
167
+
168
+ For type II/III points with no poles in the corresponding disk,
169
+ the image is the type II/III point corresponding to the image
170
+ of the disk::
171
+
172
+ sage: Q2 = B(0, 3)
173
+ sage: F(Q2)
174
+ Type II point centered at (0 : 1 + O(3^20)) of radius 3^2
175
+
176
+ The image of any type II point can be computed::
177
+
178
+ sage: g = DynamicalSystem_projective([x^2 + y^2, x*y])
179
+ sage: G = DynamicalSystem_Berkovich(g)
180
+ sage: Q3 = B(0, 1)
181
+ sage: G(Q3)
182
+ Type II point centered at (0 : 1 + O(3^20)) of radius 3^0
183
+
184
+ The image of type III points can be computed has long as the
185
+ corresponding disk contains no poles of the dynamical system::
186
+
187
+ sage: Q4 = B(1/9, 1.5)
188
+ sage: G(Q4)
189
+ Type III point centered at (3^-2 + 3^2 + O(3^18) : 1 + O(3^20))
190
+ of radius 1.50000000000000
191
+
192
+ Sometimes, however, the poles are contained in an extension of
193
+ `\QQ_p` that Sage does not support::
194
+
195
+ sage: H = DynamicalSystem_Berkovich([x*y^2, x^3 + 20*y^3])
196
+ sage: H(Q4) # not tested
197
+ Traceback (most recent call last):
198
+ ...
199
+ NotImplementedError: cannot check if poles lie in type III disk
200
+
201
+ ``Q4``, however, does not contain any poles of ``H`` (this
202
+ can be checked using pencil and paper or the number field functionality
203
+ in Sage). There are two ways around this error: the first and simplest is
204
+ to have ``H`` act on a Berkovich space backed by a number field::
205
+
206
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
207
+ sage: B = Berkovich_Cp_Projective(P, 3)
208
+ sage: H = DynamicalSystem_Berkovich([x*y^2, x^3 + 20*y^3], B)
209
+ sage: Q4 = B(1/9, 1.5)
210
+ sage: H(Q4) # needs sage.rings.number_field
211
+ Type III point centered at (81/14581 : 1) of radius 0.00205761316872428
212
+
213
+ Alternatively, if checking for poles in the disk has been done already,
214
+ ``type_3_pole_check`` can be set to ``False``::
215
+
216
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
217
+ sage: H = DynamicalSystem_Berkovich([x*y^2, x^3 + 20*y^3])
218
+ sage: B = H.domain()
219
+ sage: Q4 = B(1/9, 1.5)
220
+ sage: H(Q4, False)
221
+ Type III point centered at (3^4 + 3^10 + 2*3^11 + 2*3^13 + 2*3^14 +
222
+ 2*3^15 + 3^17 + 2*3^18 + 2*3^19 + 3^20 + 3^21 + 3^22 + O(3^24) : 1 +
223
+ O(3^20)) of radius 0.00205761316872428
224
+
225
+ WARNING: setting ``type_3_pole_check`` to ``False`` can lead to
226
+ mathematically incorrect answers.
227
+ """
228
+
229
+ @staticmethod
230
+ def __classcall_private__(cls, dynamical_system, domain=None, ideal=None):
231
+ """
232
+ Return the appropriate dynamical system on Berkovich space.
233
+
234
+ EXAMPLES::
235
+
236
+ sage: R.<t> = Qp(3)[]
237
+ sage: f = DynamicalSystem_affine(t^2 - 3)
238
+ sage: DynamicalSystem_Berkovich(f)
239
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20 induced by the map
240
+ Defn: Defined on coordinates by sending ((1 + O(3^20))*t) to
241
+ ((1 + O(3^20))*t^2 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 +
242
+ 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + 2*3^12 + 2*3^13 + 2*3^14 +
243
+ 2*3^15 + 2*3^16 + 2*3^17 + 2*3^18 + 2*3^19 + 2*3^20 + O(3^21))
244
+ """
245
+ if not (isinstance(domain, Berkovich_Cp) or domain is None):
246
+ raise TypeError('domain must be a Berkovich space over Cp, not %s' % domain)
247
+
248
+ if isinstance(domain, Berkovich_Cp_Affine):
249
+ if not isinstance(dynamical_system, DynamicalSystem_affine):
250
+ try:
251
+ dynamical_system = DynamicalSystem_affine(dynamical_system)
252
+ except (TypeError, ValueError):
253
+ raise TypeError('domain was affine Berkovich space, but dynamical_system did not '
254
+ 'convert to an affine dynamical system')
255
+ if isinstance(domain, Berkovich_Cp_Projective):
256
+ if not isinstance(dynamical_system, DynamicalSystem_projective):
257
+ try:
258
+ dynamical_system = DynamicalSystem_projective(dynamical_system)
259
+ except (TypeError, ValueError):
260
+ raise TypeError('domain was projective Berkovich space, but dynamical_system did not convert '
261
+ 'to a projective dynamical system')
262
+
263
+ if not isinstance(dynamical_system, DynamicalSystem):
264
+ try:
265
+ dynamical_system = DynamicalSystem(dynamical_system)
266
+ except (TypeError, ValueError):
267
+ raise TypeError('dynamical_system did not convert to a dynamical system')
268
+ morphism_domain = dynamical_system.domain()
269
+
270
+ if not isinstance(morphism_domain.base_ring(), pAdicBaseGeneric):
271
+ if morphism_domain.base_ring() in NumberFields():
272
+ if domain is None and ideal is not None:
273
+ if isinstance(morphism_domain, AffineSpace_generic):
274
+ domain = Berkovich_Cp_Affine(morphism_domain.base_ring(), ideal)
275
+ else:
276
+ domain = Berkovich_Cp_Projective(morphism_domain, ideal)
277
+ else:
278
+ if ideal is not None:
279
+ if ideal != domain.ideal():
280
+ raise ValueError('conflicting inputs for ideal and domain')
281
+ else:
282
+ raise ValueError('base ring of domain of dynamical_system must be p-adic or a number field '
283
+ 'not %s' % morphism_domain.base_ring())
284
+
285
+ if isinstance(morphism_domain, AffineSpace_generic):
286
+ return DynamicalSystem_Berkovich_affine(dynamical_system, domain)
287
+
288
+ return DynamicalSystem_Berkovich_projective(dynamical_system, domain)
289
+
290
+ def __init__(self, dynamical_system, domain):
291
+ r"""
292
+ The Python constructor.
293
+
294
+ TESTS::
295
+
296
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
297
+ sage: f = DynamicalSystem_projective([2*x^2 + 4*y^2, 3*x^2 + 9*y^2])
298
+ sage: g = DynamicalSystem_Berkovich(f)
299
+ sage: isinstance(g, DynamicalSystem_Berkovich)
300
+ True
301
+ """
302
+ self._system = dynamical_system
303
+ self._domain = domain
304
+
305
+ def __eq__(self, other):
306
+ """
307
+ Equality operator.
308
+
309
+ EXAMPLES::
310
+
311
+ sage: R.<x,y> = ProjectiveSpace(Qp(3), 1)
312
+ sage: f = DynamicalSystem_Berkovich([x^2, y^2])
313
+ sage: f == f
314
+ True
315
+
316
+ ::
317
+
318
+ sage: g = DynamicalSystem_Berkovich([x^3, x*y^2])
319
+ sage: f == g
320
+ True
321
+ """
322
+ if not isinstance(other, type(self)):
323
+ return False
324
+ return self._system == other._system
325
+
326
+ def __neq__(self, other):
327
+ """
328
+ Inequality operator.
329
+
330
+ EXAMPLES::
331
+
332
+ sage: R.<x, y> = ProjectiveSpace(Qp(3), 1)
333
+ sage: f = DynamicalSystem_Berkovich([x^2, y^2])
334
+ sage: f != f
335
+ False
336
+
337
+ ::
338
+
339
+ sage: g = DynamicalSystem_Berkovich([x^2 + y^2, y^2])
340
+ sage: f != g
341
+ True
342
+ """
343
+ return not (self == other)
344
+
345
+ def domain(self):
346
+ """
347
+ Return the domain of this dynamical system.
348
+
349
+ OUTPUT: a Berkovich space over ``Cp``
350
+
351
+ EXAMPLES::
352
+
353
+ sage: Q.<x,y> = ProjectiveSpace(Qp(3), 1)
354
+ sage: f = DynamicalSystem_projective([3*x^2, 2*y^2])
355
+ sage: g = DynamicalSystem_Berkovich(f)
356
+ sage: g.domain()
357
+ Projective Berkovich line over Cp(3) of precision 20
358
+ """
359
+ return self._domain
360
+
361
+ def as_scheme_dynamical_system(self):
362
+ r"""
363
+ Return this dynamical system as :class:`DynamicalSystem`.
364
+
365
+ OUTPUT: an affine or projective :class:`DynamicalSystem`
366
+
367
+ EXAMPLES::
368
+
369
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
370
+ sage: f = DynamicalSystem_Berkovich([x^2 + y^2, x*y])
371
+ sage: f.as_scheme_dynamical_system()
372
+ Dynamical System of Projective Space of dimension 1 over
373
+ 3-adic Field with capped relative precision 20
374
+ Defn: Defined on coordinates by sending (x : y) to (x^2 + y^2 : x*y)
375
+ """
376
+ return self._system
377
+
378
+ def __getitem__(self, i):
379
+ """
380
+ Return the `i`-th polynomial.
381
+
382
+ INPUT:
383
+
384
+ - ``i`` -- integer
385
+
386
+ OUTPUT: an element of polynomial ring or a
387
+ fraction field of a polynomial ring
388
+
389
+ EXAMPLES::
390
+
391
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
392
+ sage: f = DynamicalSystem_projective([x^2 + y^2, 2*y^2])
393
+ sage: g = DynamicalSystem_Berkovich(f)
394
+ sage: g[0]
395
+ x^2 + y^2
396
+ """
397
+ return self._system._polys[i]
398
+
399
+ def defining_polynomials(self):
400
+ """
401
+ Return the defining polynomials.
402
+
403
+ OUTPUT: a tuple of polynomials that defines the
404
+ dynamical system.
405
+
406
+ EXAMPLES::
407
+
408
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
409
+ sage: f = DynamicalSystem_projective([2*x^2 + 4*y^2, 3*x^2 + 9*y^2])
410
+ sage: g = DynamicalSystem_Berkovich(f)
411
+ sage: g.defining_polynomials()
412
+ ((2 + O(3^20))*x^2 + (1 + 3 + O(3^20))*y^2,
413
+ (3 + O(3^21))*x^2 + (3^2 + O(3^22))*y^2)
414
+ """
415
+ return self._system._polys
416
+
417
+ def base_ring(self):
418
+ """
419
+ The base ring of this dynamical system, that is, the field of definition of the coefficients.
420
+
421
+ OUTPUT: a field
422
+
423
+ EXAMPLES::
424
+
425
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
426
+ sage: f = DynamicalSystem_Berkovich([x^2 + y^2, y^2])
427
+ sage: f.base_ring()
428
+ 3-adic Field with capped relative precision 20
429
+
430
+ ::
431
+
432
+ sage: # needs sage.rings.number_field
433
+ sage: R.<z> = QQ[]
434
+ sage: A.<a> = NumberField(z^3 + 20)
435
+ sage: P.<x,y> = ProjectiveSpace(A, 1)
436
+ sage: f = DynamicalSystem_Berkovich([x^2, x^2 + y^2], ideal=A.prime_above(2))
437
+ sage: f.base_ring()
438
+ Number Field in a with defining polynomial z^3 + 20
439
+ """
440
+ return self.domain().base_ring()
441
+
442
+ def _repr_(self):
443
+ r"""
444
+ Return a string representation of this dynamical system.
445
+
446
+ OUTPUT: string
447
+
448
+ EXAMPLES::
449
+
450
+ sage: Q.<x,y> = ProjectiveSpace(Qp(3), 1)
451
+ sage: f = DynamicalSystem_projective([3*x^2, 2*y^2])
452
+ sage: f = DynamicalSystem_Berkovich(f)
453
+ sage: f._repr_()
454
+ 'Dynamical system of Projective Berkovich line over Cp(3) of precision 20 induced by the map\n
455
+ Defn: Defined on coordinates by sending (x : y) to\n ((3 + O(3^21))*x^2 : (2 + O(3^20))*y^2)'
456
+ """
457
+ domain_str = self._domain._repr_()
458
+ return "Dynamical system of " + domain_str + " induced by the map" + \
459
+ "\n Defn: %s" % ('\n '.join(self._system._repr_defn().split('\n')))
460
+
461
+
462
+ class DynamicalSystem_Berkovich_projective(DynamicalSystem_Berkovich):
463
+ r"""
464
+ A dynamical system on projective Berkovich space over `\CC_p`.
465
+
466
+ A dynamical system on projective Berkovich space over `\CC_p` is
467
+ determined by a dynamical system on `A^1(\CC_p)` or `P^1(\CC_p)`,
468
+ which naturally induces a dynamical system on affine or
469
+ projective Berkovich space.
470
+
471
+ INPUT:
472
+
473
+ - ``dynamical_system`` -- a :class:`DynamicalSystem_Projective`
474
+ of relative dimension 1. If this input is not defined
475
+ over a `p`-adic field, then ``domain`` MUST be specified.
476
+
477
+ - ``domain`` -- (optional) projective Berkovich space
478
+ over `\CC_p`. If the input to ``dynamical_system`` is
479
+ not defined over a `p`-adic field, ``domain``
480
+ must be specified.
481
+
482
+ EXAMPLES:
483
+
484
+ We can easily create a dynamical system on Berkovich space
485
+ using a dynamical system on projective space over `\QQ_p`::
486
+
487
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
488
+ sage: f = DynamicalSystem_projective([1/2*x^2 + x*y + 3*y^2, 3*x^2 + 9*y^2])
489
+ sage: DynamicalSystem_Berkovich(f)
490
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
491
+ induced by the map
492
+ Defn: Defined on coordinates by sending (x : y) to
493
+ ((2 + 3 + 3^2 + 3^3 + 3^4 + 3^5 + 3^6 + 3^7 + 3^8 + 3^9 + 3^10 + 3^11
494
+ + 3^12 + 3^13 + 3^14 + 3^15 + 3^16 + 3^17 + 3^18 + 3^19 + O(3^20))*x^2
495
+ + x*y + (3 + O(3^21))*y^2 : (3 + O(3^21))*x^2 + (3^2 + O(3^22))*y^2)
496
+
497
+ Or from a morphism::
498
+
499
+ sage: P1.<x,y> = ProjectiveSpace(Qp(3), 1)
500
+ sage: H = End(P1)
501
+ sage: DynamicalSystem_Berkovich(H([y, x]))
502
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
503
+ induced by the map
504
+ Defn: Defined on coordinates by sending (x : y) to (y : x)
505
+
506
+ Or from polynomials::
507
+
508
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
509
+ sage: DynamicalSystem_Berkovich([x^2+y^2, y^2])
510
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
511
+ induced by the map
512
+ Defn: Defined on coordinates by sending (x : y) to (x^2 + y^2 : y^2)
513
+ """
514
+ @staticmethod
515
+ def __classcall_private__(cls, dynamical_system, domain=None):
516
+ """
517
+ Return the appropriate dynamical system on projective Berkovich space over ``Cp``.
518
+
519
+ EXAMPLES::
520
+
521
+ sage: P1.<x,y> = ProjectiveSpace(Qp(3), 1)
522
+ sage: from sage.dynamics.arithmetic_dynamics.berkovich_ds import DynamicalSystem_Berkovich_projective
523
+ sage: DynamicalSystem_Berkovich_projective([y, x])
524
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
525
+ induced by the map
526
+ Defn: Defined on coordinates by sending (x : y) to (y : x)
527
+ """
528
+ if not isinstance(dynamical_system, DynamicalSystem):
529
+ if not isinstance(dynamical_system, DynamicalSystem_projective):
530
+ dynamical_system = DynamicalSystem_projective(dynamical_system)
531
+ else:
532
+ raise TypeError('affine dynamical system passed to projective constructor')
533
+ R = dynamical_system.base_ring()
534
+ morphism_domain = dynamical_system.domain()
535
+ if not isinstance(morphism_domain, ProjectiveSpace_ring):
536
+ raise TypeError('the domain of dynamical_system must be projective space, not %s' % morphism_domain)
537
+ if morphism_domain.dimension_relative() != 1:
538
+ raise ValueError('domain was not relative dimension 1')
539
+ if not isinstance(R, pAdicBaseGeneric):
540
+ if domain is None:
541
+ raise TypeError('dynamical system defined over %s, not p-adic, ' % morphism_domain.base_ring() +
542
+ 'and domain is None')
543
+ if not isinstance(domain, Berkovich_Cp_Projective):
544
+ raise TypeError('domain was %s, not a projective Berkovich space over Cp' % domain)
545
+ if domain.base() != morphism_domain:
546
+ raise ValueError('base of domain was %s, with coordinate ring %s ' % (domain.base(),
547
+ domain.base().coordinate_ring()) + 'while dynamical_system acts on %s, ' % morphism_domain +
548
+ 'with coordinate ring %s' % morphism_domain.coordinate_ring())
549
+ else:
550
+ domain = Berkovich_Cp_Projective(morphism_domain)
551
+ return typecall(cls, dynamical_system, domain)
552
+
553
+ def __init__(self, dynamical_system, domain=None):
554
+ """
555
+ Python constructor.
556
+
557
+ EXAMPLES::
558
+
559
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
560
+ sage: DynamicalSystem_Berkovich([x^2 + x*y + 2*y^2, 2*x*y])
561
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
562
+ induced by the map
563
+ Defn: Defined on coordinates by sending (x : y) to
564
+ (x^2 + x*y + (2 + O(3^20))*y^2 : (2 + O(3^20))*x*y)
565
+ """
566
+ DynamicalSystem_Berkovich.__init__(self, dynamical_system, domain)
567
+
568
+ def scale_by(self, t):
569
+ """
570
+ Scale each coordinate of this dynamical system by a factor of `t`.
571
+
572
+ INPUT:
573
+
574
+ - ``t`` -- a ring element
575
+
576
+ OUTPUT: none
577
+
578
+ EXAMPLES::
579
+
580
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
581
+ sage: f = DynamicalSystem_Berkovich([x^2, y^2])
582
+ sage: f.scale_by(x); f
583
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
584
+ induced by the map
585
+ Defn: Defined on coordinates by sending (x : y) to (x^3 : x*y^2)
586
+
587
+ ::
588
+
589
+ sage: # needs sage.rings.number_field
590
+ sage: Q.<z> = QQ[]
591
+ sage: A.<a> = NumberField(z^3 + 20)
592
+ sage: ideal = A.prime_above(3)
593
+ sage: P.<x,y> = ProjectiveSpace(A, 1)
594
+ sage: B = Berkovich_Cp_Projective(P, ideal)
595
+ sage: f = DynamicalSystem_Berkovich([x^2 + y^2, 2*x*y], B)
596
+ sage: f.scale_by(2); f
597
+ Dynamical system of Projective Berkovich line over Cp(3), with base Number
598
+ Field in a with defining polynomial z^3 + 20 induced by the map
599
+ Defn: Defined on coordinates by sending (x : y) to
600
+ (2*x^2 + 2*y^2 : 4*x*y)
601
+ """
602
+ self._system.scale_by(t)
603
+
604
+ def normalize_coordinates(self):
605
+ r"""
606
+ Normalize the coordinates of the inducing map.
607
+
608
+ OUTPUT: none
609
+
610
+ EXAMPLES::
611
+
612
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
613
+ sage: f = DynamicalSystem_Berkovich([2*x^2, 2*y^2])
614
+ sage: f.normalize_coordinates(); f
615
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
616
+ induced by the map
617
+ Defn: Defined on coordinates by sending (x : y)
618
+ to ((2 + O(3^20))*x^2 : (2 + O(3^20))*y^2)
619
+
620
+
621
+ Normalize_coordinates may sometimes fail over `p`-adic fields::
622
+
623
+ sage: g = DynamicalSystem_Berkovich([2*x^2, x*y])
624
+ sage: g.normalize_coordinates() # not tested
625
+ Traceback (most recent call last):
626
+ ...
627
+ TypeError: unable to coerce since the denominator is not 1
628
+
629
+ To fix this issue, create a system on Berkovich space backed
630
+ by a number field::
631
+
632
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
633
+ sage: B = Berkovich_Cp_Projective(P, 3)
634
+ sage: g = DynamicalSystem_Berkovich([2*x^2, x*y], B)
635
+ sage: g.normalize_coordinates(); g
636
+ Dynamical system of Projective Berkovich line over Cp(3), with base Rational Field
637
+ induced by the map
638
+ Defn: Defined on coordinates by sending (x : y) to (2*x : y)
639
+ """
640
+ self._system.normalize_coordinates()
641
+
642
+ def conjugate(self, M, adjugate=False, new_ideal=None):
643
+ r"""
644
+ Conjugate this dynamical system by ``M``, i.e. `M^{-1} \circ f \circ M`.
645
+
646
+ If possible the new map will be defined over the same space.
647
+ Otherwise, will try to coerce to the base ring of ``M``.
648
+
649
+ INPUT:
650
+
651
+ - ``M`` -- a square invertible matrix
652
+
653
+ - ``adjugate`` -- boolean (default: ``False``); also classically
654
+ called adjoint, takes a square matrix ``M`` and finds the transpose
655
+ of its cofactor matrix. Used for conjugation in place of inverse
656
+ when specified ``'True'``. Functionality is the same in projective space.
657
+
658
+ - ``new_ideal`` -- (optional) an ideal of the ``base_ring`` of ``M``.
659
+ Used to specify an extension in the case where ``M`` is not defined
660
+ over the same number field as this dynamical system.
661
+
662
+ OUTPUT: a dynamical system
663
+
664
+ EXAMPLES::
665
+
666
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
667
+ sage: f = DynamicalSystem_projective([x^2 + y^2, 2*y^2])
668
+ sage: g = DynamicalSystem_Berkovich(f)
669
+ sage: g.conjugate(Matrix([[1, 1], [0, 1]]))
670
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
671
+ induced by the map
672
+ Defn: Defined on coordinates by sending (x : y) to
673
+ (x^2 + (2 + O(3^20))*x*y : (2 + O(3^20))*y^2)
674
+
675
+ ::
676
+
677
+ sage: # needs sage.rings.number_field
678
+ sage: P.<x,y> = ProjectiveSpace(QQ, 1)
679
+ sage: f = DynamicalSystem_Berkovich([x^2 + y^2, y^2], ideal=5)
680
+ sage: R.<z> = QQ[]
681
+ sage: A.<a> = NumberField(z^2 + 1)
682
+ sage: conj = Matrix([[1, a], [0, 1]])
683
+ sage: f.conjugate(conj)
684
+ Dynamical system of Projective Berkovich line over Cp(5), with base Number Field
685
+ in a with defining polynomial z^2 + 1 induced by the map
686
+ Defn: Defined on coordinates by sending (x : y) to
687
+ (x^2 + (2*a)*x*y + (-a)*y^2 : y^2)
688
+
689
+ We can use ``new_ideal`` to specify a new domain when
690
+ the base ring of ``M`` and of this dynamical system are not the
691
+ same::
692
+
693
+ sage: # needs sage.rings.number_field
694
+ sage: ideal = A.ideal(5).factor()[1][0]; ideal
695
+ Fractional ideal (-2*a - 1)
696
+ sage: g = f.conjugate(conj, new_ideal=ideal)
697
+ sage: g.domain().ideal()
698
+ Fractional ideal (-2*a - 1)
699
+ """
700
+ if self.domain().is_padic_base():
701
+ return DynamicalSystem_Berkovich(self._system.conjugate(M, adjugate=adjugate))
702
+ from sage.rings.number_field.number_field_ideal import NumberFieldFractionalIdeal
703
+ if not (isinstance(new_ideal, NumberFieldFractionalIdeal) or new_ideal is None or new_ideal in ZZ):
704
+ raise TypeError('new_ideal must be an ideal of a number field, not %s' % new_ideal)
705
+ new_system = self._system.conjugate(M, adjugate=adjugate)
706
+ system_domain = new_system.domain()
707
+ if new_ideal is None:
708
+ if system_domain.base_ring() is not QQ:
709
+ new_ideal = system_domain.base_ring().prime_above(self.domain().ideal())
710
+ else:
711
+ new_ideal = self.domain().ideal()
712
+ return DynamicalSystem_Berkovich(new_system, ideal=new_ideal)
713
+
714
+ def resultant(self, normalize=False):
715
+ r"""
716
+ Compute the resultant of the defining polynomials of
717
+ this dynamical system.
718
+
719
+ If ``normalize`` is ``True``, then first normalize the coordinate
720
+ functions with :meth:`normalize_coordinates`.
721
+
722
+ INPUT:
723
+
724
+ - ``normalize`` -- boolean (default: ``False``)
725
+
726
+ OUTPUT: an element of the base ring of this map
727
+
728
+ EXAMPLES::
729
+
730
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
731
+ sage: f = DynamicalSystem_Berkovich([x^2 + y^2, y^2])
732
+ sage: f.resultant()
733
+ 1 + O(3^20)
734
+
735
+ ::
736
+
737
+ sage: # needs sage.rings.number_field
738
+ sage: R.<z> = QQ[]
739
+ sage: A.<a> = NumberField(z^3 + 20)
740
+ sage: P.<x,y> = ProjectiveSpace(A, 1)
741
+ sage: f = DynamicalSystem_Berkovich([2*x^2, x^2 + y^2], ideal=A.prime_above(2))
742
+ sage: f.resultant()
743
+ 4
744
+ """
745
+ return self._system.resultant(normalize=normalize)
746
+
747
+ def dehomogenize(self, n):
748
+ """
749
+ Return the map induced by the standard dehomogenization.
750
+
751
+ The dehomogenization is done at the ``n[0]`` coordinate
752
+ of the domain and the ``n[1]`` coordinate of the codomain.
753
+
754
+ INPUT:
755
+
756
+ - ``n`` -- tuple of nonnegative integers; if `n` is an integer,
757
+ then the two values of the tuple are assumed to be the same
758
+
759
+ OUTPUT: a dynamical system on affine Berkovich space
760
+
761
+ EXAMPLES::
762
+
763
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
764
+ sage: f = DynamicalSystem_projective([x^2 + y^2, x*y + y^2])
765
+ sage: g = DynamicalSystem_Berkovich(f)
766
+ sage: g.dehomogenize(1)
767
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20
768
+ induced by the map
769
+ Defn: Defined on coordinates by sending (x) to
770
+ ((x^2 + 1 + O(3^20))/(x + 1 + O(3^20)))
771
+ """
772
+ new_system = self._system.dehomogenize(n)
773
+ base_ring = self.domain().base_ring()
774
+ ideal = self.domain().ideal()
775
+ new_domain = Berkovich_Cp_Affine(base_ring, ideal)
776
+ return DynamicalSystem_Berkovich_affine(new_system, new_domain)
777
+
778
+ def __call__(self, x, type_3_pole_check=True):
779
+ """
780
+ Makes dynamical systems on Berkovich space over ``Cp`` callable.
781
+
782
+ INPUT:
783
+
784
+ - ``x`` -- a point of projective Berkovich space over ``Cp``
785
+
786
+ - ``type_3_pole_check`` -- boolean (default: ``True``); WARNING:
787
+ changing the value of ``type_3_pole_check`` can lead to mathematically
788
+ incorrect answers. Only set to ``False`` if there are NO
789
+ poles of the dynamical system in the disk corresponding
790
+ to the type III point ``x``. See Examples.
791
+
792
+ OUTPUT: a point of projective Berkovich space over ``Cp``
793
+
794
+ EXAMPLES::
795
+
796
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
797
+ sage: g = DynamicalSystem_projective([x^2 + y^2, x*y])
798
+ sage: G = DynamicalSystem_Berkovich(g)
799
+ sage: B = G.domain()
800
+ sage: Q3 = B(0, 1)
801
+ sage: G(Q3)
802
+ Type II point centered at (0 : 1 + O(3^20)) of radius 3^0
803
+
804
+ ::
805
+
806
+ sage: P.<x,y> = ProjectiveSpace(Qp(3), 1)
807
+ sage: H = DynamicalSystem_Berkovich([x*y^2, x^3 + 20*y^3])
808
+ sage: B = H.domain()
809
+ sage: Q4 = B(1/9, 1.5)
810
+ sage: H(Q4, False)
811
+ Type III point centered at (3^4 + 3^10 + 2*3^11 + 2*3^13 + 2*3^14 +
812
+ 2*3^15 + 3^17 + 2*3^18 + 2*3^19 + 3^20 + 3^21 + 3^22 + O(3^24) : 1 +
813
+ O(3^20)) of radius 0.00205761316872428
814
+
815
+ ALGORITHM:
816
+
817
+ - For type II points, we use the approach outlined in Example
818
+ 7.37 of [Ben2019]_
819
+ - For type III points, we use Proposition 7.6 of [Ben2019]_
820
+ """
821
+ if not isinstance(x.parent(), Berkovich_Cp_Projective):
822
+ try:
823
+ x = self.domain()(x)
824
+ except (TypeError, ValueError):
825
+ raise TypeError('action of dynamical system not defined on %s' % x.parent())
826
+ if x.parent().is_padic_base() != self.domain().is_padic_base():
827
+ raise ValueError('x was not backed by the same type of field as f')
828
+ if x.prime() != self.domain().prime():
829
+ raise ValueError('x and f are defined over Berkovich spaces over Cp for different p')
830
+ if x.type_of_point() == 1:
831
+ return self.domain()(self._system(x.center()))
832
+ if x.type_of_point() == 4:
833
+ raise NotImplementedError('action on Type IV points not implemented')
834
+ f = self._system
835
+ if x.type_of_point() == 2:
836
+ if self.domain().is_number_field_base():
837
+ ideal = self.domain().ideal()
838
+ ring_of_integers = self.domain().base_ring().ring_of_integers()
839
+ field = f.domain().base_ring()
840
+ M = Matrix([[field(x.prime()**(-1 * x.power())), x.center()[0]], [field(0), field(1)]])
841
+ F = list(f*M)
842
+ R = field['z']
843
+ S = f.domain().coordinate_ring()
844
+ z = R.gen(0)
845
+ dehomogenize_hom = S.hom([z, 1])
846
+ for i in range(len(F)):
847
+ F[i] = dehomogenize_hom(F[i])
848
+ lcm = field(1)
849
+ for poly in F:
850
+ for i in poly:
851
+ if i != 0:
852
+ lcm = i.denominator().lcm(lcm)
853
+ for i in range(len(F)):
854
+ F[i] *= lcm
855
+ gcd = [i for i in F[0] if i != 0][0]
856
+ for poly in F:
857
+ for i in poly:
858
+ if i != 0:
859
+ gcd = gcd * i * gcd.lcm(i).inverse_of_unit()
860
+ for i in range(len(F)):
861
+ F[i] *= gcd.inverse_of_unit()
862
+ gcd = F[0].gcd(F[1])
863
+ F[0] = F[0].quo_rem(gcd)[0]
864
+ F[1] = F[1].quo_rem(gcd)[0]
865
+ fraction = []
866
+ for poly in F:
867
+ new_poly = []
868
+ for i in poly:
869
+ if self.domain().is_padic_base():
870
+ new_poly.append(i.residue())
871
+ else:
872
+ new_poly.append(ring_of_integers(i).mod(ideal))
873
+ new_poly = R(new_poly)
874
+ fraction.append(new_poly)
875
+ gcd = fraction[0].gcd(fraction[1])
876
+ num = fraction[0].quo_rem(gcd)[0]
877
+ dem = fraction[1].quo_rem(gcd)[0]
878
+ if dem.is_zero():
879
+ f = DynamicalSystem_affine(F[0] / F[1]).homogenize(1)
880
+ f = f.conjugate(Matrix([[0, 1], [1, 0]]))
881
+ g = DynamicalSystem_Berkovich(f)
882
+ return g(self.domain()(QQ(0), QQ(1))).involution_map()
883
+ # if the reduction is not constant, the image is the Gauss point
884
+ if not (num.is_constant() and dem.is_constant()):
885
+ return self.domain()(QQ(0), QQ(1))
886
+ if self.domain().is_padic_base():
887
+ reduced_value = field(num * dem.inverse_of_unit()).lift_to_precision(field.precision_cap())
888
+ else:
889
+ reduced_value = field(num * dem.inverse_of_unit())
890
+ new_num = F[0]-reduced_value*F[1]
891
+ if self.domain().is_padic_base():
892
+ power_of_p = min([i.valuation() for i in new_num])
893
+ else:
894
+ power_of_p = min([i.valuation(ideal) for i in new_num])
895
+ inverse_map = field(x.prime()**power_of_p) * z + reduced_value
896
+ if self.domain().is_padic_base():
897
+ return self.domain()(inverse_map(0), (inverse_map(1) - inverse_map(0)).abs())
898
+ else:
899
+ val = (inverse_map(1) - inverse_map(0)).valuation(ideal)
900
+ if val == Infinity:
901
+ return self.domain()(inverse_map(0), 0)
902
+ return self.domain()(inverse_map(0), x.prime()**(-1 * val))
903
+ # point is now type III, so we compute using Proposition 7.6 [of Benedetto]
904
+ affine_system = f.dehomogenize(1)
905
+ dem = affine_system.defining_polynomials()[0].denominator().univariate_polynomial()
906
+ if type_3_pole_check:
907
+ if self.domain().is_padic_base():
908
+ factorization = [i[0] for i in dem.factor()]
909
+ for factor in factorization:
910
+ if factor.degree() >= 2:
911
+ try:
912
+ factor_root_field = factor.root_field('a')
913
+ factor = factor.change_ring(factor_root_field)
914
+ except (TypeError, ValueError):
915
+ raise NotImplementedError('cannot check if poles lie in type III disk')
916
+ else:
917
+ factor_root_field = factor.base_ring()
918
+ center = factor_root_field(x.center()[0])
919
+ for pole in [i[0] for i in factor.roots()]:
920
+ if (center - pole).abs() <= x.radius():
921
+ raise NotImplementedError('image of type III point not implemented when poles in disk')
922
+ else:
923
+ dem_splitting_field, embedding = dem.splitting_field('a', True)
924
+ poles = [i[0] for i in dem.roots(dem_splitting_field)]
925
+ primes_above = dem_splitting_field.primes_above(self.domain().ideal())
926
+ # check if all primes of the extension map the roots to outside
927
+ # the disk corresponding to the type III point
928
+ for prime in primes_above:
929
+ no_poles = True
930
+ for pole in poles:
931
+ valuation = (embedding(x.center()[0]) - pole).valuation(prime)
932
+ if valuation == Infinity:
933
+ no_poles = False
934
+ break
935
+ elif x.prime()**(-1 * valuation/prime.absolute_ramification_index()) <= x.radius():
936
+ no_poles = False
937
+ break
938
+ if not no_poles:
939
+ break
940
+ if not no_poles:
941
+ raise NotImplementedError('image of type III not implemented when poles in disk')
942
+ nth_derivative = f.dehomogenize(1).defining_polynomials()[0]
943
+ variable = nth_derivative.parent().gens()[0]
944
+ a = x.center()[0]
945
+ Taylor_expansion = []
946
+ from sage.arith.misc import factorial
947
+ for i in range(f.degree() + 1):
948
+ Taylor_expansion.append(nth_derivative(a) * 1/factorial(i))
949
+ nth_derivative = nth_derivative.derivative(variable)
950
+ r = x.radius()
951
+ new_center = f(a)
952
+ if self.domain().is_padic_base():
953
+ new_radius = max([Taylor_expansion[i].abs()*r**i for i in range(1, len(Taylor_expansion))])
954
+ else:
955
+ if prime is None:
956
+ prime = x.parent().ideal()
957
+ dem_splitting_field = x.parent().base_ring()
958
+ p = x.prime()
959
+ new_radius = 0
960
+ for i in range(1, len(Taylor_expansion)):
961
+ valuation = dem_splitting_field(Taylor_expansion[i]).valuation(prime)
962
+ new_radius = max(new_radius, p**(-valuation/prime.absolute_ramification_index())*r**i)
963
+ return self.domain()(new_center, new_radius)
964
+
965
+
966
+ class DynamicalSystem_Berkovich_affine(DynamicalSystem_Berkovich):
967
+ r"""
968
+ A dynamical system of the affine Berkovich line over `\CC_p`.
969
+
970
+ INPUT:
971
+
972
+ - ``dynamical_system`` -- a :class:`DynamicalSystem_affine`
973
+ of relative dimension 1
974
+
975
+ - ``domain`` -- (optional) affine or projective Berkovich space
976
+ over `\CC_p`. If the input to ``dynamical_system`` is
977
+ not defined over `\QQ_p` or a finite extension, ``domain``
978
+ must be specified.
979
+
980
+ EXAMPLES:
981
+
982
+ A dynamical system of the affine Berkovich line is
983
+ induced by a dynamical system on `\QQ_p` or an extension
984
+ of `\QQ_p`::
985
+
986
+ sage: A.<x> = AffineSpace(Qp(5), 1)
987
+ sage: f = DynamicalSystem_affine([(x^2 + 1)/x])
988
+ sage: DynamicalSystem_Berkovich(f)
989
+ Dynamical system of Affine Berkovich line over Cp(5) of precision 20 induced by the map
990
+ Defn: Defined on coordinates by sending (x) to ((x^2 + 1 + O(5^20))/x)
991
+
992
+ Dynamical system can be created from a morphism::
993
+
994
+ sage: H = End(A)
995
+ sage: phi = H([x + 3])
996
+ sage: DynamicalSystem_Berkovich(phi)
997
+ Dynamical system of Affine Berkovich line over Cp(5) of precision 20 induced by the map
998
+ Defn: Defined on coordinates by sending (x) to (x + 3 + O(5^20))
999
+ """
1000
+ @staticmethod
1001
+ def __classcall_private__(cls, dynamical_system, domain=None):
1002
+ """
1003
+ Return the appropriate dynamical system on affine Berkovich space over ``Cp``.
1004
+
1005
+ EXAMPLES::
1006
+
1007
+ sage: A.<x> = AffineSpace(Qp(3), 1)
1008
+ sage: from sage.dynamics.arithmetic_dynamics.berkovich_ds import DynamicalSystem_Berkovich_affine
1009
+ sage: DynamicalSystem_Berkovich_affine(DynamicalSystem_affine(x^2))
1010
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20
1011
+ induced by the map
1012
+ Defn: Defined on coordinates by sending (x) to (x^2)
1013
+ """
1014
+ if not isinstance(dynamical_system, DynamicalSystem):
1015
+ if not isinstance(dynamical_system, DynamicalSystem_affine):
1016
+ dynamical_system = DynamicalSystem_projective(dynamical_system)
1017
+ else:
1018
+ raise TypeError('projective dynamical system passed to affine constructor')
1019
+ R = dynamical_system.base_ring()
1020
+ morphism_domain = dynamical_system.domain()
1021
+ if not isinstance(morphism_domain, AffineSpace_generic):
1022
+ raise TypeError('the domain of dynamical_system must be affine space, not %s' % morphism_domain)
1023
+ if morphism_domain.dimension_relative() != 1:
1024
+ raise ValueError('domain not relative dimension 1')
1025
+ if not isinstance(R, pAdicBaseGeneric):
1026
+ if domain is None:
1027
+ raise TypeError('dynamical system defined over %s, not padic, ' % morphism_domain.base_ring() +
1028
+ 'and domain was not specified')
1029
+ if not isinstance(domain, Berkovich_Cp_Affine):
1030
+ raise TypeError('domain was %s, not an affine Berkovich space over Cp' % domain)
1031
+ else:
1032
+ domain = Berkovich_Cp_Affine(morphism_domain.base_ring())
1033
+ return typecall(cls, dynamical_system, domain)
1034
+
1035
+ def __init__(self, dynamical_system, domain):
1036
+ """
1037
+ Python constructor.
1038
+
1039
+ EXAMPLES::
1040
+
1041
+ sage: A.<x> = AffineSpace(Qp(3), 1)
1042
+ sage: from sage.dynamics.arithmetic_dynamics.berkovich_ds import DynamicalSystem_Berkovich_affine
1043
+ sage: DynamicalSystem_Berkovich_affine(DynamicalSystem_affine(x^3))
1044
+ Dynamical system of Affine Berkovich line over Cp(3) of precision 20
1045
+ induced by the map
1046
+ Defn: Defined on coordinates by sending (x) to (x^3)
1047
+ """
1048
+ DynamicalSystem_Berkovich.__init__(self, dynamical_system, domain)
1049
+
1050
+ def homogenize(self, n):
1051
+ """
1052
+ Return the homogenization of this dynamical system.
1053
+
1054
+ For dynamical systems of Berkovich space, this is the dynamical
1055
+ system of projective Berkovich space induced by the homogenization of
1056
+ the dynamical system.
1057
+
1058
+ INPUT:
1059
+
1060
+ - ``n`` -- tuple of nonnegative integers. If `n` is an integer,
1061
+ then the two values of the tuple are assumed to be the same
1062
+
1063
+ OUTPUT: a dynamical system on projective Berkovich space
1064
+
1065
+ EXAMPLES::
1066
+
1067
+ sage: A.<x> = AffineSpace(Qp(3), 1)
1068
+ sage: f = DynamicalSystem_affine(1/x)
1069
+ sage: f = DynamicalSystem_Berkovich(f)
1070
+ sage: f.homogenize(1)
1071
+ Dynamical system of Projective Berkovich line over Cp(3) of precision 20
1072
+ induced by the map
1073
+ Defn: Defined on coordinates by sending (x0 : x1) to (x1 : x0)
1074
+ """
1075
+ new_system = self._system.homogenize(n)
1076
+ ideal = self.domain().ideal()
1077
+ base_space = new_system.domain()
1078
+ new_domain = Berkovich_Cp_Projective(base_space, ideal)
1079
+ return DynamicalSystem_Berkovich_projective(new_system, new_domain)
1080
+
1081
+ def __call__(self, x):
1082
+ """
1083
+ Makes this dynamical system callable.
1084
+
1085
+ EXAMPLES::
1086
+
1087
+ sage: P.<x> = AffineSpace(Qp(3), 1)
1088
+ sage: f = DynamicalSystem_affine(x^2)
1089
+ sage: g = DynamicalSystem_Berkovich(f)
1090
+ sage: B = g.domain()
1091
+ sage: Q1 = B(2)
1092
+ sage: g(Q1)
1093
+ Type I point centered at 1 + 3 + O(3^20)
1094
+ """
1095
+ if not isinstance(x, Berkovich_Element_Cp_Affine):
1096
+ try:
1097
+ x = self.domain()(x)
1098
+ except (TypeError, ValueError):
1099
+ raise ValueError('action of dynamical system not defined on %s' % x)
1100
+ proj_system = self.homogenize(1)
1101
+ return proj_system(x.as_projective_point()).as_affine_point()