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