passagemath-schemes 10.6.47__cp312-cp312-macosx_13_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- passagemath_schemes/.dylibs/libflint.22.0.dylib +0 -0
- passagemath_schemes/.dylibs/libgmp.10.dylib +0 -0
- passagemath_schemes/.dylibs/libgmpxx.4.dylib +0 -0
- passagemath_schemes/.dylibs/libmpfr.6.dylib +0 -0
- passagemath_schemes/__init__.py +3 -0
- passagemath_schemes-10.6.47.dist-info/METADATA +204 -0
- passagemath_schemes-10.6.47.dist-info/METADATA.bak +205 -0
- passagemath_schemes-10.6.47.dist-info/RECORD +311 -0
- passagemath_schemes-10.6.47.dist-info/WHEEL +6 -0
- passagemath_schemes-10.6.47.dist-info/top_level.txt +3 -0
- sage/all__sagemath_schemes.py +23 -0
- sage/databases/all__sagemath_schemes.py +7 -0
- sage/databases/cremona.py +1723 -0
- sage/dynamics/all__sagemath_schemes.py +2 -0
- sage/dynamics/arithmetic_dynamics/affine_ds.py +1083 -0
- sage/dynamics/arithmetic_dynamics/all.py +14 -0
- sage/dynamics/arithmetic_dynamics/berkovich_ds.py +1101 -0
- sage/dynamics/arithmetic_dynamics/dynamical_semigroup.py +1543 -0
- sage/dynamics/arithmetic_dynamics/endPN_automorphism_group.py +2426 -0
- sage/dynamics/arithmetic_dynamics/endPN_minimal_model.py +1169 -0
- sage/dynamics/arithmetic_dynamics/generic_ds.py +663 -0
- sage/dynamics/arithmetic_dynamics/product_projective_ds.py +339 -0
- sage/dynamics/arithmetic_dynamics/projective_ds.py +9558 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.cpython-312-darwin.so +0 -0
- sage/dynamics/arithmetic_dynamics/projective_ds_helper.pyx +301 -0
- sage/dynamics/arithmetic_dynamics/wehlerK3.py +2576 -0
- sage/lfunctions/all.py +18 -0
- sage/lfunctions/dokchitser.py +745 -0
- sage/lfunctions/pari.py +818 -0
- sage/lfunctions/zero_sums.cpython-312-darwin.so +0 -0
- sage/lfunctions/zero_sums.pyx +1847 -0
- sage/modular/abvar/abvar.py +5135 -0
- sage/modular/abvar/abvar_ambient_jacobian.py +413 -0
- sage/modular/abvar/abvar_newform.py +244 -0
- sage/modular/abvar/all.py +8 -0
- sage/modular/abvar/constructor.py +186 -0
- sage/modular/abvar/cuspidal_subgroup.py +371 -0
- sage/modular/abvar/finite_subgroup.py +896 -0
- sage/modular/abvar/homology.py +720 -0
- sage/modular/abvar/homspace.py +998 -0
- sage/modular/abvar/lseries.py +415 -0
- sage/modular/abvar/morphism.py +935 -0
- sage/modular/abvar/torsion_point.py +274 -0
- sage/modular/abvar/torsion_subgroup.py +740 -0
- sage/modular/all.py +43 -0
- sage/modular/arithgroup/all.py +20 -0
- sage/modular/arithgroup/arithgroup_element.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/arithgroup_element.pyx +474 -0
- sage/modular/arithgroup/arithgroup_generic.py +1402 -0
- sage/modular/arithgroup/arithgroup_perm.py +2692 -0
- sage/modular/arithgroup/congroup.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/congroup.pyx +334 -0
- sage/modular/arithgroup/congroup_gamma.py +363 -0
- sage/modular/arithgroup/congroup_gamma0.py +692 -0
- sage/modular/arithgroup/congroup_gamma1.py +653 -0
- sage/modular/arithgroup/congroup_gammaH.py +1469 -0
- sage/modular/arithgroup/congroup_generic.py +628 -0
- sage/modular/arithgroup/congroup_sl2z.py +267 -0
- sage/modular/arithgroup/farey_symbol.cpython-312-darwin.so +0 -0
- sage/modular/arithgroup/farey_symbol.pyx +1066 -0
- sage/modular/arithgroup/tests.py +418 -0
- sage/modular/btquotients/all.py +4 -0
- sage/modular/btquotients/btquotient.py +3753 -0
- sage/modular/btquotients/pautomorphicform.py +2570 -0
- sage/modular/buzzard.py +100 -0
- sage/modular/congroup.py +29 -0
- sage/modular/congroup_element.py +13 -0
- sage/modular/cusps.py +1109 -0
- sage/modular/cusps_nf.py +1270 -0
- sage/modular/dims.py +569 -0
- sage/modular/dirichlet.py +3310 -0
- sage/modular/drinfeld_modform/all.py +2 -0
- sage/modular/drinfeld_modform/element.py +446 -0
- sage/modular/drinfeld_modform/ring.py +773 -0
- sage/modular/drinfeld_modform/tutorial.py +236 -0
- sage/modular/etaproducts.py +1065 -0
- sage/modular/hecke/algebra.py +746 -0
- sage/modular/hecke/all.py +20 -0
- sage/modular/hecke/ambient_module.py +1019 -0
- sage/modular/hecke/degenmap.py +119 -0
- sage/modular/hecke/element.py +325 -0
- sage/modular/hecke/hecke_operator.py +780 -0
- sage/modular/hecke/homspace.py +206 -0
- sage/modular/hecke/module.py +1767 -0
- sage/modular/hecke/morphism.py +174 -0
- sage/modular/hecke/submodule.py +989 -0
- sage/modular/hypergeometric_misc.cpython-312-darwin.so +0 -0
- sage/modular/hypergeometric_misc.pxd +4 -0
- sage/modular/hypergeometric_misc.pyx +166 -0
- sage/modular/hypergeometric_motive.py +2017 -0
- sage/modular/local_comp/all.py +2 -0
- sage/modular/local_comp/liftings.py +292 -0
- sage/modular/local_comp/local_comp.py +1071 -0
- sage/modular/local_comp/smoothchar.py +1825 -0
- sage/modular/local_comp/type_space.py +748 -0
- sage/modular/modform/all.py +30 -0
- sage/modular/modform/ambient.py +815 -0
- sage/modular/modform/ambient_R.py +177 -0
- sage/modular/modform/ambient_eps.py +306 -0
- sage/modular/modform/ambient_g0.py +124 -0
- sage/modular/modform/ambient_g1.py +204 -0
- sage/modular/modform/constructor.py +545 -0
- sage/modular/modform/cuspidal_submodule.py +708 -0
- sage/modular/modform/defaults.py +14 -0
- sage/modular/modform/eis_series.py +505 -0
- sage/modular/modform/eisenstein_submodule.py +663 -0
- sage/modular/modform/element.py +4131 -0
- sage/modular/modform/find_generators.py +59 -0
- sage/modular/modform/half_integral.py +154 -0
- sage/modular/modform/hecke_operator_on_qexp.py +247 -0
- sage/modular/modform/j_invariant.py +47 -0
- sage/modular/modform/l_series_gross_zagier.py +133 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.cpython-312-darwin.so +0 -0
- sage/modular/modform/l_series_gross_zagier_coeffs.pyx +177 -0
- sage/modular/modform/notes.py +45 -0
- sage/modular/modform/numerical.py +514 -0
- sage/modular/modform/periods.py +14 -0
- sage/modular/modform/ring.py +1257 -0
- sage/modular/modform/space.py +1860 -0
- sage/modular/modform/submodule.py +118 -0
- sage/modular/modform/tests.py +64 -0
- sage/modular/modform/theta.py +110 -0
- sage/modular/modform/vm_basis.py +381 -0
- sage/modular/modform/weight1.py +220 -0
- sage/modular/modform_hecketriangle/abstract_ring.py +1932 -0
- sage/modular/modform_hecketriangle/abstract_space.py +2528 -0
- sage/modular/modform_hecketriangle/all.py +30 -0
- sage/modular/modform_hecketriangle/analytic_type.py +590 -0
- sage/modular/modform_hecketriangle/constructor.py +416 -0
- sage/modular/modform_hecketriangle/element.py +351 -0
- sage/modular/modform_hecketriangle/functors.py +752 -0
- sage/modular/modform_hecketriangle/graded_ring.py +541 -0
- sage/modular/modform_hecketriangle/graded_ring_element.py +2225 -0
- sage/modular/modform_hecketriangle/hecke_triangle_group_element.py +3352 -0
- sage/modular/modform_hecketriangle/hecke_triangle_groups.py +1432 -0
- sage/modular/modform_hecketriangle/readme.py +1214 -0
- sage/modular/modform_hecketriangle/series_constructor.py +580 -0
- sage/modular/modform_hecketriangle/space.py +1037 -0
- sage/modular/modform_hecketriangle/subspace.py +423 -0
- sage/modular/modsym/all.py +17 -0
- sage/modular/modsym/ambient.py +3846 -0
- sage/modular/modsym/boundary.py +1420 -0
- sage/modular/modsym/element.py +336 -0
- sage/modular/modsym/g1list.py +178 -0
- sage/modular/modsym/ghlist.py +182 -0
- sage/modular/modsym/hecke_operator.py +73 -0
- sage/modular/modsym/manin_symbol.cpython-312-darwin.so +0 -0
- sage/modular/modsym/manin_symbol.pxd +5 -0
- sage/modular/modsym/manin_symbol.pyx +497 -0
- sage/modular/modsym/manin_symbol_list.py +1295 -0
- sage/modular/modsym/modsym.py +400 -0
- sage/modular/modsym/modular_symbols.py +384 -0
- sage/modular/modsym/p1list_nf.py +1241 -0
- sage/modular/modsym/relation_matrix.py +591 -0
- sage/modular/modsym/relation_matrix_pyx.cpython-312-darwin.so +0 -0
- sage/modular/modsym/relation_matrix_pyx.pyx +108 -0
- sage/modular/modsym/space.py +2468 -0
- sage/modular/modsym/subspace.py +455 -0
- sage/modular/modsym/tests.py +375 -0
- sage/modular/multiple_zeta.py +2632 -0
- sage/modular/multiple_zeta_F_algebra.py +786 -0
- sage/modular/overconvergent/all.py +6 -0
- sage/modular/overconvergent/genus0.py +1878 -0
- sage/modular/overconvergent/hecke_series.py +1187 -0
- sage/modular/overconvergent/weightspace.py +778 -0
- sage/modular/pollack_stevens/all.py +4 -0
- sage/modular/pollack_stevens/distributions.py +874 -0
- sage/modular/pollack_stevens/fund_domain.py +1572 -0
- sage/modular/pollack_stevens/manin_map.py +859 -0
- sage/modular/pollack_stevens/modsym.py +1593 -0
- sage/modular/pollack_stevens/padic_lseries.py +417 -0
- sage/modular/pollack_stevens/sigma0.py +534 -0
- sage/modular/pollack_stevens/space.py +1076 -0
- sage/modular/quasimodform/all.py +3 -0
- sage/modular/quasimodform/element.py +845 -0
- sage/modular/quasimodform/ring.py +828 -0
- sage/modular/quatalg/all.py +3 -0
- sage/modular/quatalg/brandt.py +1642 -0
- sage/modular/ssmod/all.py +8 -0
- sage/modular/ssmod/ssmod.py +827 -0
- sage/rings/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/all__sagemath_schemes.py +1 -0
- sage/rings/polynomial/binary_form_reduce.py +585 -0
- sage/schemes/all.py +41 -0
- sage/schemes/berkovich/all.py +6 -0
- sage/schemes/berkovich/berkovich_cp_element.py +2582 -0
- sage/schemes/berkovich/berkovich_space.py +748 -0
- sage/schemes/curves/affine_curve.py +2928 -0
- sage/schemes/curves/all.py +33 -0
- sage/schemes/curves/closed_point.py +434 -0
- sage/schemes/curves/constructor.py +381 -0
- sage/schemes/curves/curve.py +542 -0
- sage/schemes/curves/plane_curve_arrangement.py +1283 -0
- sage/schemes/curves/point.py +463 -0
- sage/schemes/curves/projective_curve.py +3026 -0
- sage/schemes/curves/zariski_vankampen.py +1932 -0
- sage/schemes/cyclic_covers/all.py +2 -0
- sage/schemes/cyclic_covers/charpoly_frobenius.py +320 -0
- sage/schemes/cyclic_covers/constructor.py +137 -0
- sage/schemes/cyclic_covers/cycliccover_finite_field.py +1309 -0
- sage/schemes/cyclic_covers/cycliccover_generic.py +310 -0
- sage/schemes/elliptic_curves/BSD.py +1036 -0
- sage/schemes/elliptic_curves/Qcurves.py +592 -0
- sage/schemes/elliptic_curves/addition_formulas_ring.py +94 -0
- sage/schemes/elliptic_curves/all.py +49 -0
- sage/schemes/elliptic_curves/cardinality.py +609 -0
- sage/schemes/elliptic_curves/cm.py +1102 -0
- sage/schemes/elliptic_curves/constructor.py +1552 -0
- sage/schemes/elliptic_curves/ec_database.py +175 -0
- sage/schemes/elliptic_curves/ell_curve_isogeny.py +3972 -0
- sage/schemes/elliptic_curves/ell_egros.py +459 -0
- sage/schemes/elliptic_curves/ell_field.py +2836 -0
- sage/schemes/elliptic_curves/ell_finite_field.py +3359 -0
- sage/schemes/elliptic_curves/ell_generic.py +3760 -0
- sage/schemes/elliptic_curves/ell_local_data.py +1207 -0
- sage/schemes/elliptic_curves/ell_modular_symbols.py +775 -0
- sage/schemes/elliptic_curves/ell_number_field.py +4220 -0
- sage/schemes/elliptic_curves/ell_padic_field.py +107 -0
- sage/schemes/elliptic_curves/ell_point.py +4787 -0
- sage/schemes/elliptic_curves/ell_rational_field.py +7368 -0
- sage/schemes/elliptic_curves/ell_tate_curve.py +671 -0
- sage/schemes/elliptic_curves/ell_torsion.py +436 -0
- sage/schemes/elliptic_curves/ell_wp.py +352 -0
- sage/schemes/elliptic_curves/formal_group.py +760 -0
- sage/schemes/elliptic_curves/gal_reps.py +1459 -0
- sage/schemes/elliptic_curves/gal_reps_number_field.py +1669 -0
- sage/schemes/elliptic_curves/gp_simon.py +152 -0
- sage/schemes/elliptic_curves/heegner.py +7335 -0
- sage/schemes/elliptic_curves/height.py +2109 -0
- sage/schemes/elliptic_curves/hom.py +1406 -0
- sage/schemes/elliptic_curves/hom_composite.py +934 -0
- sage/schemes/elliptic_curves/hom_frobenius.py +522 -0
- sage/schemes/elliptic_curves/hom_scalar.py +531 -0
- sage/schemes/elliptic_curves/hom_sum.py +682 -0
- sage/schemes/elliptic_curves/hom_velusqrt.py +1290 -0
- sage/schemes/elliptic_curves/homset.py +271 -0
- sage/schemes/elliptic_curves/isogeny_class.py +1521 -0
- sage/schemes/elliptic_curves/isogeny_small_degree.py +2797 -0
- sage/schemes/elliptic_curves/jacobian.py +237 -0
- sage/schemes/elliptic_curves/kodaira_symbol.py +344 -0
- sage/schemes/elliptic_curves/kraus.py +1014 -0
- sage/schemes/elliptic_curves/lseries_ell.py +943 -0
- sage/schemes/elliptic_curves/mod5family.py +105 -0
- sage/schemes/elliptic_curves/mod_poly.py +197 -0
- sage/schemes/elliptic_curves/mod_sym_num.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/mod_sym_num.pyx +3796 -0
- sage/schemes/elliptic_curves/modular_parametrization.py +305 -0
- sage/schemes/elliptic_curves/padic_lseries.py +1793 -0
- sage/schemes/elliptic_curves/padics.py +1816 -0
- sage/schemes/elliptic_curves/period_lattice.py +2234 -0
- sage/schemes/elliptic_curves/period_lattice_region.cpython-312-darwin.so +0 -0
- sage/schemes/elliptic_curves/period_lattice_region.pyx +722 -0
- sage/schemes/elliptic_curves/saturation.py +715 -0
- sage/schemes/elliptic_curves/sha_tate.py +1158 -0
- sage/schemes/elliptic_curves/weierstrass_morphism.py +1117 -0
- sage/schemes/elliptic_curves/weierstrass_transform.py +200 -0
- sage/schemes/hyperelliptic_curves/all.py +6 -0
- sage/schemes/hyperelliptic_curves/constructor.py +291 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_finite_field.py +1914 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_g2.py +192 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_generic.py +954 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_padic_field.py +1332 -0
- sage/schemes/hyperelliptic_curves/hyperelliptic_rational_field.py +84 -0
- sage/schemes/hyperelliptic_curves/invariants.py +410 -0
- sage/schemes/hyperelliptic_curves/jacobian_endomorphism_utils.py +315 -0
- sage/schemes/hyperelliptic_curves/jacobian_g2.py +32 -0
- sage/schemes/hyperelliptic_curves/jacobian_generic.py +419 -0
- sage/schemes/hyperelliptic_curves/jacobian_homset.py +186 -0
- sage/schemes/hyperelliptic_curves/jacobian_morphism.py +875 -0
- sage/schemes/hyperelliptic_curves/kummer_surface.py +99 -0
- sage/schemes/hyperelliptic_curves/mestre.py +302 -0
- sage/schemes/hyperelliptic_curves/monsky_washnitzer.py +3871 -0
- sage/schemes/jacobians/abstract_jacobian.py +277 -0
- sage/schemes/jacobians/all.py +2 -0
- sage/schemes/overview.py +161 -0
- sage/schemes/plane_conics/all.py +22 -0
- sage/schemes/plane_conics/con_field.py +1296 -0
- sage/schemes/plane_conics/con_finite_field.py +158 -0
- sage/schemes/plane_conics/con_number_field.py +456 -0
- sage/schemes/plane_conics/con_rational_field.py +406 -0
- sage/schemes/plane_conics/con_rational_function_field.py +580 -0
- sage/schemes/plane_conics/constructor.py +249 -0
- sage/schemes/plane_quartics/all.py +2 -0
- sage/schemes/plane_quartics/quartic_constructor.py +71 -0
- sage/schemes/plane_quartics/quartic_generic.py +73 -0
- sage/schemes/riemann_surfaces/all.py +1 -0
- sage/schemes/riemann_surfaces/riemann_surface.py +4117 -0
- sage_wheels/share/cremona/cremona_mini.db +0 -0
- sage_wheels/share/ellcurves/rank0 +30427 -0
- sage_wheels/share/ellcurves/rank1 +31871 -0
- sage_wheels/share/ellcurves/rank10 +6 -0
- sage_wheels/share/ellcurves/rank11 +6 -0
- sage_wheels/share/ellcurves/rank12 +1 -0
- sage_wheels/share/ellcurves/rank14 +1 -0
- sage_wheels/share/ellcurves/rank15 +1 -0
- sage_wheels/share/ellcurves/rank17 +1 -0
- sage_wheels/share/ellcurves/rank19 +1 -0
- sage_wheels/share/ellcurves/rank2 +2388 -0
- sage_wheels/share/ellcurves/rank20 +1 -0
- sage_wheels/share/ellcurves/rank21 +1 -0
- sage_wheels/share/ellcurves/rank22 +1 -0
- sage_wheels/share/ellcurves/rank23 +1 -0
- sage_wheels/share/ellcurves/rank24 +1 -0
- sage_wheels/share/ellcurves/rank28 +1 -0
- sage_wheels/share/ellcurves/rank3 +836 -0
- sage_wheels/share/ellcurves/rank4 +10 -0
- sage_wheels/share/ellcurves/rank5 +5 -0
- sage_wheels/share/ellcurves/rank6 +5 -0
- sage_wheels/share/ellcurves/rank7 +5 -0
- sage_wheels/share/ellcurves/rank8 +6 -0
- 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()
|