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,748 @@
|
|
|
1
|
+
# sage_setup: distribution = sagemath-schemes
|
|
2
|
+
# sage.doctest: needs sage.rings.padics
|
|
3
|
+
r"""
|
|
4
|
+
Berkovich Space over `\CC_p`
|
|
5
|
+
|
|
6
|
+
The Berkovich affine line is the set of seminorms on `\CC_p[x]`,
|
|
7
|
+
with the weakest topology that makes the map `| \cdot | \to |f|` continuous
|
|
8
|
+
for all `f \in \CC_p[x]`. The Berkovich projective line is the
|
|
9
|
+
one-point compactification of the Berkovich affine line.
|
|
10
|
+
|
|
11
|
+
The two main classes are :class:`Berkovich_Cp_Affine` and
|
|
12
|
+
:class:`Berkovich_Cp_Projective`, which implement the affine and
|
|
13
|
+
projective lines, respectively.
|
|
14
|
+
|
|
15
|
+
:class:`Berkovich_Cp_Affine` and :class:`Berkovich_Cp_Projective`
|
|
16
|
+
take as input one of the following: the prime `p`, a finite
|
|
17
|
+
extension of `\QQ_p`, or a number field and a place.
|
|
18
|
+
|
|
19
|
+
For an exposition of Berkovich space over `\CC_p`, see Chapter 6 of [Ben2019]_. For a more
|
|
20
|
+
involved exposition, see Chapter 1 and 2 of [BR2010]_.
|
|
21
|
+
|
|
22
|
+
AUTHORS:
|
|
23
|
+
|
|
24
|
+
- Alexander Galarraga (2020-06-22): initial implementation
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# ****************************************************************************
|
|
28
|
+
# This program is free software: you can redistribute it and/or modify
|
|
29
|
+
# it under the terms of the GNU General Public License as published by
|
|
30
|
+
# the Free Software Foundation, either version 2 of the License, or
|
|
31
|
+
# (at your option) any later version.
|
|
32
|
+
# https://www.gnu.org/licenses/
|
|
33
|
+
# ****************************************************************************
|
|
34
|
+
|
|
35
|
+
import sage.rings.abc
|
|
36
|
+
|
|
37
|
+
from sage.categories.number_fields import NumberFields
|
|
38
|
+
from sage.categories.topological_spaces import TopologicalSpaces
|
|
39
|
+
from sage.misc.lazy_import import lazy_import
|
|
40
|
+
from sage.rings.integer_ring import ZZ
|
|
41
|
+
from sage.rings.rational_field import QQ
|
|
42
|
+
from sage.schemes.affine.affine_space import AffineSpace_generic
|
|
43
|
+
from sage.schemes.berkovich.berkovich_cp_element import (Berkovich_Element_Cp_Affine,
|
|
44
|
+
Berkovich_Element_Cp_Projective)
|
|
45
|
+
from sage.schemes.projective.projective_space import ProjectiveSpace_ring, ProjectiveSpace
|
|
46
|
+
from sage.structure.parent import Parent
|
|
47
|
+
from sage.structure.unique_representation import UniqueRepresentation
|
|
48
|
+
|
|
49
|
+
lazy_import('sage.rings.number_field.number_field_ideal', 'NumberFieldFractionalIdeal')
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def is_Berkovich(space) -> bool:
|
|
53
|
+
"""
|
|
54
|
+
Check if ``space`` is a Berkovich space.
|
|
55
|
+
|
|
56
|
+
OUTPUT:
|
|
57
|
+
|
|
58
|
+
- ``True`` if ``space`` is a Berkovich space.
|
|
59
|
+
- ``False`` otherwise.
|
|
60
|
+
|
|
61
|
+
EXAMPLES::
|
|
62
|
+
|
|
63
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
64
|
+
sage: from sage.schemes.berkovich.berkovich_space import is_Berkovich
|
|
65
|
+
sage: is_Berkovich(B)
|
|
66
|
+
doctest:warning...
|
|
67
|
+
DeprecationWarning: The function is_Berkovich is deprecated; use 'isinstance(..., Berkovich)' instead.
|
|
68
|
+
See https://github.com/sagemath/sage/issues/38022 for details.
|
|
69
|
+
True
|
|
70
|
+
"""
|
|
71
|
+
from sage.misc.superseded import deprecation
|
|
72
|
+
deprecation(38022, "The function is_Berkovich is deprecated; use 'isinstance(..., Berkovich)' instead.")
|
|
73
|
+
return isinstance(space, Berkovich)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def is_Berkovich_Cp(space) -> bool:
|
|
77
|
+
"""
|
|
78
|
+
Check if ``space`` is a Berkovich space over ``Cp``.
|
|
79
|
+
|
|
80
|
+
OUTPUT:
|
|
81
|
+
|
|
82
|
+
- ``True`` if ``space`` is a Berkovich space over ``Cp``.
|
|
83
|
+
- ``False`` otherwise.
|
|
84
|
+
|
|
85
|
+
EXAMPLES::
|
|
86
|
+
|
|
87
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
88
|
+
sage: from sage.schemes.berkovich.berkovich_space import is_Berkovich_Cp
|
|
89
|
+
sage: is_Berkovich_Cp(B)
|
|
90
|
+
doctest:warning...
|
|
91
|
+
DeprecationWarning: The function is_Berkovich_Cp is deprecated; use 'isinstance(..., Berkovich_Cp)' instead.
|
|
92
|
+
See https://github.com/sagemath/sage/issues/38022 for details.
|
|
93
|
+
True
|
|
94
|
+
"""
|
|
95
|
+
from sage.misc.superseded import deprecation
|
|
96
|
+
deprecation(38022, "The function is_Berkovich_Cp is deprecated; use 'isinstance(..., Berkovich_Cp)' instead.")
|
|
97
|
+
return isinstance(space, Berkovich_Cp)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class Berkovich(UniqueRepresentation, Parent):
|
|
101
|
+
"""
|
|
102
|
+
The parent class for any Berkovich space
|
|
103
|
+
"""
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class Berkovich_Cp(Berkovich):
|
|
108
|
+
"""
|
|
109
|
+
Abstract parent class for Berkovich space over ``Cp``.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
def residue_characteristic(self):
|
|
113
|
+
"""
|
|
114
|
+
The residue characteristic of the ``base``.
|
|
115
|
+
|
|
116
|
+
EXAMPLES::
|
|
117
|
+
|
|
118
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
119
|
+
sage: B.prime()
|
|
120
|
+
3
|
|
121
|
+
|
|
122
|
+
::
|
|
123
|
+
|
|
124
|
+
sage: # needs sage.rings.number_field
|
|
125
|
+
sage: R.<x> = QQ[]
|
|
126
|
+
sage: A.<a> = NumberField(x^3 + 20)
|
|
127
|
+
sage: ideal = A.ideal(-1/2*a^2 + a - 3)
|
|
128
|
+
sage: B = Berkovich_Cp_Affine(A, ideal)
|
|
129
|
+
sage: B.residue_characteristic()
|
|
130
|
+
7
|
|
131
|
+
"""
|
|
132
|
+
return self._p
|
|
133
|
+
|
|
134
|
+
prime = residue_characteristic
|
|
135
|
+
|
|
136
|
+
def is_padic_base(self):
|
|
137
|
+
"""
|
|
138
|
+
Return ``True`` if this Berkovich space is backed by a `p`-adic field.
|
|
139
|
+
|
|
140
|
+
OUTPUT:
|
|
141
|
+
|
|
142
|
+
- ``True`` if this Berkovich space was created with a `p`-adic field.
|
|
143
|
+
- ``False`` otherwise.
|
|
144
|
+
|
|
145
|
+
EXAMPLES::
|
|
146
|
+
|
|
147
|
+
sage: B = Berkovich_Cp_Affine(Qp(3))
|
|
148
|
+
sage: B.is_padic_base()
|
|
149
|
+
True
|
|
150
|
+
|
|
151
|
+
::
|
|
152
|
+
|
|
153
|
+
sage: B = Berkovich_Cp_Affine(QQ, 3)
|
|
154
|
+
sage: B.is_padic_base()
|
|
155
|
+
False
|
|
156
|
+
"""
|
|
157
|
+
return self._base_type == 'padic field'
|
|
158
|
+
|
|
159
|
+
def is_number_field_base(self):
|
|
160
|
+
"""
|
|
161
|
+
Return ``True`` if this Berkovich space is backed by a number field.
|
|
162
|
+
|
|
163
|
+
OUTPUT:
|
|
164
|
+
|
|
165
|
+
- ``True`` if this Berkovich space was created with a number field.
|
|
166
|
+
- ``False`` otherwise.
|
|
167
|
+
|
|
168
|
+
EXAMPLES::
|
|
169
|
+
|
|
170
|
+
sage: B = Berkovich_Cp_Affine(Qp(3))
|
|
171
|
+
sage: B.is_number_field_base()
|
|
172
|
+
False
|
|
173
|
+
|
|
174
|
+
::
|
|
175
|
+
|
|
176
|
+
sage: B = Berkovich_Cp_Affine(QQ, 3)
|
|
177
|
+
sage: B.is_number_field_base()
|
|
178
|
+
True
|
|
179
|
+
"""
|
|
180
|
+
return self._base_type == 'number field'
|
|
181
|
+
|
|
182
|
+
def ideal(self):
|
|
183
|
+
r"""
|
|
184
|
+
The ideal which defines an embedding of the ``base_ring`` into `\CC_p`.
|
|
185
|
+
|
|
186
|
+
If this Berkovich space is backed by a `p`-adic field, then an embedding is
|
|
187
|
+
already specified, and this returns ``None``.
|
|
188
|
+
|
|
189
|
+
OUTPUT:
|
|
190
|
+
|
|
191
|
+
- An ideal of a ``base_ring`` if ``base_ring`` is a number field.
|
|
192
|
+
|
|
193
|
+
- A prime of `\QQ` if ``base_ring`` is `\QQ`.
|
|
194
|
+
|
|
195
|
+
- ``None`` if ``base_ring`` is a `p`-adic field.
|
|
196
|
+
|
|
197
|
+
EXAMPLES::
|
|
198
|
+
|
|
199
|
+
sage: # needs sage.rings.number_field
|
|
200
|
+
sage: R.<z> = QQ[]
|
|
201
|
+
sage: A.<a> = NumberField(z^2 + 1)
|
|
202
|
+
sage: ideal = A.prime_above(5)
|
|
203
|
+
sage: B = Berkovich_Cp_Projective(A, ideal)
|
|
204
|
+
sage: B.ideal()
|
|
205
|
+
Fractional ideal (2*a - 1)
|
|
206
|
+
|
|
207
|
+
::
|
|
208
|
+
|
|
209
|
+
sage: B = Berkovich_Cp_Projective(QQ, 3)
|
|
210
|
+
sage: B.ideal()
|
|
211
|
+
3
|
|
212
|
+
|
|
213
|
+
::
|
|
214
|
+
|
|
215
|
+
sage: B = Berkovich_Cp_Projective(Qp(3))
|
|
216
|
+
sage: B.ideal() is None
|
|
217
|
+
True
|
|
218
|
+
"""
|
|
219
|
+
return self._ideal
|
|
220
|
+
|
|
221
|
+
def __eq__(self, right):
|
|
222
|
+
"""
|
|
223
|
+
Equality operator.
|
|
224
|
+
|
|
225
|
+
EXAMPLES::
|
|
226
|
+
|
|
227
|
+
sage: B = Berkovich_Cp_Affine(3)
|
|
228
|
+
sage: A.<x> = Qq(27)
|
|
229
|
+
sage: C = Berkovich_Cp_Affine(A)
|
|
230
|
+
sage: B == C
|
|
231
|
+
True
|
|
232
|
+
|
|
233
|
+
::
|
|
234
|
+
|
|
235
|
+
sage: # needs sage.rings.number_field
|
|
236
|
+
sage: R.<x> = QQ[]
|
|
237
|
+
sage: A.<a> = NumberField(x^2 + 1)
|
|
238
|
+
sage: A_ideal = A.prime_above(2)
|
|
239
|
+
sage: B.<b> = NumberField(x^4 + 1)
|
|
240
|
+
sage: B_ideal = B.prime_above(2)
|
|
241
|
+
sage: C = Berkovich_Cp_Projective(A, A_ideal)
|
|
242
|
+
sage: D = Berkovich_Cp_Projective(B, B_ideal)
|
|
243
|
+
sage: C == D
|
|
244
|
+
False
|
|
245
|
+
|
|
246
|
+
::
|
|
247
|
+
|
|
248
|
+
sage: C = Berkovich_Cp_Affine(A, A_ideal) # needs sage.rings.number_field
|
|
249
|
+
sage: D = Berkovich_Cp_Affine(B, B_ideal) # needs sage.rings.number_field
|
|
250
|
+
sage: C == D # needs sage.rings.number_field
|
|
251
|
+
False
|
|
252
|
+
|
|
253
|
+
::
|
|
254
|
+
|
|
255
|
+
sage: A_ideal_2 = A.prime_above(5) # needs sage.rings.number_field
|
|
256
|
+
sage: E = Berkovich_Cp_Affine(A, A_ideal_2) # needs sage.rings.number_field
|
|
257
|
+
sage: C == E # needs sage.rings.number_field
|
|
258
|
+
False
|
|
259
|
+
"""
|
|
260
|
+
if not isinstance(right, Berkovich_Cp):
|
|
261
|
+
return False
|
|
262
|
+
if self._base_type != right._base_type:
|
|
263
|
+
return False
|
|
264
|
+
if self._base_type == 'padic field':
|
|
265
|
+
return self.prime() == right.prime()
|
|
266
|
+
else:
|
|
267
|
+
return self.base() == right.base() and self.ideal() == right.ideal()
|
|
268
|
+
|
|
269
|
+
def __ne__(self, right):
|
|
270
|
+
"""
|
|
271
|
+
Inequality operator.
|
|
272
|
+
|
|
273
|
+
EXAMPLES::
|
|
274
|
+
|
|
275
|
+
sage: B = Berkovich_Cp_Affine(5)
|
|
276
|
+
sage: A.<x> = Qq(25)
|
|
277
|
+
sage: C = Berkovich_Cp_Affine(A)
|
|
278
|
+
sage: B != C
|
|
279
|
+
False
|
|
280
|
+
"""
|
|
281
|
+
return not (self == right)
|
|
282
|
+
|
|
283
|
+
def __hash__(self):
|
|
284
|
+
"""
|
|
285
|
+
Hash function.
|
|
286
|
+
|
|
287
|
+
EXAMPLES::
|
|
288
|
+
|
|
289
|
+
sage: hash(Berkovich_Cp_Projective(3))
|
|
290
|
+
3
|
|
291
|
+
|
|
292
|
+
::
|
|
293
|
+
|
|
294
|
+
sage: # needs sage.rings.number_field
|
|
295
|
+
sage: R.<z> = QQ[]
|
|
296
|
+
sage: A.<a> = NumberField(z^2 + 1)
|
|
297
|
+
sage: B = Berkovich_Cp_Projective(A, A.primes_above(5)[0])
|
|
298
|
+
sage: C = Berkovich_Cp_Projective(A, A.primes_above(5)[1])
|
|
299
|
+
sage: hash(B) != hash(C)
|
|
300
|
+
True
|
|
301
|
+
"""
|
|
302
|
+
if self._base_type == 'padic field':
|
|
303
|
+
return hash(self.prime())
|
|
304
|
+
return hash(self.ideal())
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class Berkovich_Cp_Affine(Berkovich_Cp):
|
|
308
|
+
r"""
|
|
309
|
+
The Berkovich affine line over `\CC_p`.
|
|
310
|
+
|
|
311
|
+
The Berkovich affine line is the set of seminorms on `\CC_p[x]`,
|
|
312
|
+
with the weakest topology such that the map `| \cdot | \to |f|` is continuous
|
|
313
|
+
for all `f \in \CC_p[x]`.
|
|
314
|
+
|
|
315
|
+
We can represent the Berkovich affine line in two separate ways:
|
|
316
|
+
either using a `p`-adic field to represent elements or using
|
|
317
|
+
a number field to represent elements while storing an ideal
|
|
318
|
+
of the ring of integers of the number field, which specifies
|
|
319
|
+
an embedding of the number field into `\CC_p`. See the examples.
|
|
320
|
+
|
|
321
|
+
INPUT:
|
|
322
|
+
|
|
323
|
+
- ``base`` -- three cases:
|
|
324
|
+
|
|
325
|
+
* a prime number `p`. Centers of elements are then represented
|
|
326
|
+
as points of `\QQ_p`.
|
|
327
|
+
|
|
328
|
+
* `\QQ_p` or a finite extension of `\QQ_p`. Centers of elements
|
|
329
|
+
are then represented as points of ``base``.
|
|
330
|
+
|
|
331
|
+
* A number field `K`. Centers of elements are then represented
|
|
332
|
+
as points of `K`.
|
|
333
|
+
|
|
334
|
+
- ``ideal`` -- (optional) a prime ideal of ``base``. Must be
|
|
335
|
+
specified if a number field is passed to ``base``, otherwise
|
|
336
|
+
it is ignored.
|
|
337
|
+
|
|
338
|
+
EXAMPLES::
|
|
339
|
+
|
|
340
|
+
sage: B = Berkovich_Cp_Affine(3); B
|
|
341
|
+
Affine Berkovich line over Cp(3) of precision 20
|
|
342
|
+
|
|
343
|
+
We can create elements::
|
|
344
|
+
|
|
345
|
+
sage: B(-2)
|
|
346
|
+
Type I point centered at 1 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5
|
|
347
|
+
+ 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + 2*3^12 + 2*3^13
|
|
348
|
+
+ 2*3^14 + 2*3^15 + 2*3^16 + 2*3^17 + 2*3^18 + 2*3^19 + O(3^20)
|
|
349
|
+
|
|
350
|
+
::
|
|
351
|
+
|
|
352
|
+
sage: B(1, 2)
|
|
353
|
+
Type III point centered at 1 + O(3^20) of radius 2.00000000000000
|
|
354
|
+
|
|
355
|
+
For details on element creation, see the documentation
|
|
356
|
+
of :class:`Berkovich_Element_Cp_Affine`. Initializing by
|
|
357
|
+
passing in `\QQ_p` looks the same::
|
|
358
|
+
|
|
359
|
+
sage: B = Berkovich_Cp_Affine(Qp(3)); B
|
|
360
|
+
Affine Berkovich line over Cp(3) of precision 20
|
|
361
|
+
|
|
362
|
+
However, this method allows for more control over behind-the-scenes conversion::
|
|
363
|
+
|
|
364
|
+
sage: B = Berkovich_Cp_Affine(Qp(3, 1)); B
|
|
365
|
+
Affine Berkovich line over Cp(3) of precision 1
|
|
366
|
+
|
|
367
|
+
sage: B(1/2)
|
|
368
|
+
Type I point centered at 2 + O(3)
|
|
369
|
+
|
|
370
|
+
Note that this point has very low precision, as ``B`` was initialized
|
|
371
|
+
with a `p`-adic field of capped-relative precision one. For high precision,
|
|
372
|
+
pass in a high precision `p`-adic field::
|
|
373
|
+
|
|
374
|
+
sage: B = Berkovich_Cp_Affine(Qp(3, 1000)); B
|
|
375
|
+
Affine Berkovich line over Cp(3) of precision 1000
|
|
376
|
+
|
|
377
|
+
Points of Berkovich space can be created from points of
|
|
378
|
+
extensions of `\QQ_p`::
|
|
379
|
+
|
|
380
|
+
sage: B = Berkovich_Cp_Affine(3)
|
|
381
|
+
sage: A.<a> = Qp(3).extension(x^3 - 3)
|
|
382
|
+
sage: B(a)
|
|
383
|
+
Type I point centered at a + O(a^61)
|
|
384
|
+
|
|
385
|
+
For exact computation, a number field can be used::
|
|
386
|
+
|
|
387
|
+
sage: R.<x> = QQ[]
|
|
388
|
+
sage: A.<a> = NumberField(x^3 + 20) # needs sage.rings.number_field
|
|
389
|
+
sage: ideal = A.prime_above(3) # needs sage.rings.number_field
|
|
390
|
+
sage: B = Berkovich_Cp_Affine(A, ideal); B # needs sage.rings.number_field
|
|
391
|
+
Affine Berkovich line over Cp(3), with base
|
|
392
|
+
Number Field in a with defining polynomial x^3 + 20
|
|
393
|
+
|
|
394
|
+
Number fields have a major advantage of exact computation.
|
|
395
|
+
|
|
396
|
+
Number fields also have added functionality. Arbitrary extensions of
|
|
397
|
+
`\QQ` are supported, while there is currently limited functionality
|
|
398
|
+
for extensions of `\QQ_p`. As seen above, constructing a Berkovich
|
|
399
|
+
space backed by a number field requires specifying an ideal of the
|
|
400
|
+
ring of integers of the number field. Specifying the ideal uniquely
|
|
401
|
+
specifies an embedding of the number field into `\CC_p`.
|
|
402
|
+
|
|
403
|
+
Unlike in the case where Berkovich space is backed by a `p`-adic
|
|
404
|
+
field, any point of a Berkovich space backed by a number field
|
|
405
|
+
must be centered at a point of that number field::
|
|
406
|
+
|
|
407
|
+
sage: # needs sage.rings.number_field
|
|
408
|
+
sage: R.<x> = QQ[]
|
|
409
|
+
sage: A.<a> = NumberField(x^3 + 20)
|
|
410
|
+
sage: ideal = A.prime_above(3)
|
|
411
|
+
sage: B = Berkovich_Cp_Affine(A, ideal)
|
|
412
|
+
sage: C.<c> = NumberField(x^2 + 1)
|
|
413
|
+
sage: B(c)
|
|
414
|
+
Traceback (most recent call last):
|
|
415
|
+
...
|
|
416
|
+
ValueError: could not convert c to Number Field in a
|
|
417
|
+
with defining polynomial x^3 + 20
|
|
418
|
+
|
|
419
|
+
TESTS::
|
|
420
|
+
|
|
421
|
+
sage: A.<x> = AffineSpace(Qp(3), 1)
|
|
422
|
+
sage: Berkovich_Cp_Affine(A)
|
|
423
|
+
Affine Berkovich line over Cp(3) of precision 20
|
|
424
|
+
|
|
425
|
+
::
|
|
426
|
+
|
|
427
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
428
|
+
sage: TestSuite(B).run()
|
|
429
|
+
"""
|
|
430
|
+
|
|
431
|
+
Element = Berkovich_Element_Cp_Affine
|
|
432
|
+
|
|
433
|
+
def __init__(self, base, ideal=None):
|
|
434
|
+
"""
|
|
435
|
+
The Python constructor.
|
|
436
|
+
|
|
437
|
+
EXAMPLES::
|
|
438
|
+
|
|
439
|
+
sage: Berkovich_Cp_Affine(3)
|
|
440
|
+
Affine Berkovich line over Cp(3) of precision 20
|
|
441
|
+
"""
|
|
442
|
+
if base in ZZ:
|
|
443
|
+
if base.is_prime():
|
|
444
|
+
from sage.rings.padics.factory import Qp
|
|
445
|
+
|
|
446
|
+
base = Qp(base) # change to Qpbar
|
|
447
|
+
else:
|
|
448
|
+
raise ValueError("non-prime passed into Berkovich space")
|
|
449
|
+
if isinstance(base, AffineSpace_generic):
|
|
450
|
+
base = base.base_ring()
|
|
451
|
+
if base in NumberFields():
|
|
452
|
+
if ideal is None:
|
|
453
|
+
raise ValueError('passed a number field but not an ideal')
|
|
454
|
+
if base is not QQ:
|
|
455
|
+
if not isinstance(ideal, NumberFieldFractionalIdeal):
|
|
456
|
+
raise ValueError('ideal was not an ideal of a number field')
|
|
457
|
+
if ideal.number_field() != base:
|
|
458
|
+
raise ValueError('passed number field ' +
|
|
459
|
+
'%s but ideal was an ideal of %s' % (base, ideal.number_field()))
|
|
460
|
+
prime = ideal.smallest_integer()
|
|
461
|
+
else:
|
|
462
|
+
if ideal not in QQ:
|
|
463
|
+
raise ValueError('ideal was not an element of QQ')
|
|
464
|
+
prime = ideal
|
|
465
|
+
if not ideal.is_prime():
|
|
466
|
+
raise ValueError('passed non prime ideal')
|
|
467
|
+
self._base_type = 'number field'
|
|
468
|
+
elif isinstance(base, sage.rings.abc.pAdicField): # change base to Qpbar
|
|
469
|
+
prime = base.prime()
|
|
470
|
+
ideal = None
|
|
471
|
+
self._base_type = 'padic field'
|
|
472
|
+
else:
|
|
473
|
+
raise ValueError("base of Berkovich Space must be a padic field "
|
|
474
|
+
"or a number field")
|
|
475
|
+
self._ideal = ideal
|
|
476
|
+
self._p = prime
|
|
477
|
+
Parent.__init__(self, base=base, category=TopologicalSpaces())
|
|
478
|
+
|
|
479
|
+
def _repr_(self):
|
|
480
|
+
"""
|
|
481
|
+
String representation of this Berkovich Space.
|
|
482
|
+
|
|
483
|
+
EXAMPLES::
|
|
484
|
+
|
|
485
|
+
sage: B = Berkovich_Cp_Affine(3); B
|
|
486
|
+
Affine Berkovich line over Cp(3) of precision 20
|
|
487
|
+
|
|
488
|
+
::
|
|
489
|
+
|
|
490
|
+
sage: R.<z> = QQ[]
|
|
491
|
+
sage: A.<a> = NumberField(z^2 + 1) # needs sage.rings.number_field
|
|
492
|
+
sage: ideal = A.prime_above(3) # needs sage.rings.number_field
|
|
493
|
+
sage: Berkovich_Cp_Affine(A, ideal) # needs sage.rings.number_field
|
|
494
|
+
Affine Berkovich line over Cp(3), with base
|
|
495
|
+
Number Field in a with defining polynomial z^2 + 1
|
|
496
|
+
"""
|
|
497
|
+
if self._base_type == 'padic field':
|
|
498
|
+
return "Affine Berkovich line over Cp(%s) of precision %s" % (self.prime(),
|
|
499
|
+
self.base().precision_cap())
|
|
500
|
+
else:
|
|
501
|
+
return "Affine Berkovich line over Cp(%s), with base %s" % (self.prime(),
|
|
502
|
+
self.base())
|
|
503
|
+
|
|
504
|
+
def _latex_(self):
|
|
505
|
+
r"""
|
|
506
|
+
LaTeX representation of this Berkovich Space.
|
|
507
|
+
|
|
508
|
+
EXAMPLES:
|
|
509
|
+
|
|
510
|
+
sage: B = Berkovich_Cp_Affine(3)
|
|
511
|
+
sage: latex(B)
|
|
512
|
+
\text{Affine Berkovich line over } \Bold{C}_{3}
|
|
513
|
+
"""
|
|
514
|
+
return r"\text{Affine Berkovich line over } \Bold{C}_{%s}" % (self.prime())
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
class Berkovich_Cp_Projective(Berkovich_Cp):
|
|
518
|
+
r"""
|
|
519
|
+
The Berkovich projective line over `\CC_p`.
|
|
520
|
+
|
|
521
|
+
The Berkovich projective line is the one-point compactification
|
|
522
|
+
of the Berkovich affine line.
|
|
523
|
+
|
|
524
|
+
We can represent the Berkovich projective line in two separate ways:
|
|
525
|
+
either using a `p`-adic field to represent elements or using
|
|
526
|
+
a number field to represent elements while storing an ideal
|
|
527
|
+
of the ring of integers of the number field, which specifies
|
|
528
|
+
an embedding of the number field into `\CC_p`. See the examples.
|
|
529
|
+
|
|
530
|
+
INPUT:
|
|
531
|
+
|
|
532
|
+
- ``base`` -- three cases:
|
|
533
|
+
|
|
534
|
+
* a prime number `p`. Centers of elements are then represented
|
|
535
|
+
as points of projective space of dimension 1 over `\QQ_p`.
|
|
536
|
+
|
|
537
|
+
* `\QQ_p` or a finite extension of `\QQ_p`. Centers of elements
|
|
538
|
+
are then represented as points of projective space of dimension 1
|
|
539
|
+
over ``base``.
|
|
540
|
+
|
|
541
|
+
* A number field `K`. Centers of elements are then represented
|
|
542
|
+
as points of projective space of dimension 1 over ``base``.
|
|
543
|
+
|
|
544
|
+
- ``ideal`` -- (optional) a prime ideal of ``base``. Must be
|
|
545
|
+
specified if a number field is passed to ``base``, otherwise
|
|
546
|
+
it is ignored.
|
|
547
|
+
|
|
548
|
+
EXAMPLES::
|
|
549
|
+
|
|
550
|
+
sage: B = Berkovich_Cp_Projective(3); B
|
|
551
|
+
Projective Berkovich line over Cp(3) of precision 20
|
|
552
|
+
|
|
553
|
+
Elements can be constructed::
|
|
554
|
+
|
|
555
|
+
sage: B(1/2)
|
|
556
|
+
Type I point centered at (2 + 3 + 3^2 + 3^3 + 3^4 + 3^5
|
|
557
|
+
+ 3^6 + 3^7 + 3^8 + 3^9 + 3^10 + 3^11 + 3^12 + 3^13 + 3^14
|
|
558
|
+
+ 3^15 + 3^16 + 3^17 + 3^18 + 3^19 + O(3^20) : 1 + O(3^20))
|
|
559
|
+
|
|
560
|
+
::
|
|
561
|
+
|
|
562
|
+
sage: B(2, 1)
|
|
563
|
+
Type II point centered at (2 + O(3^20) : 1 + O(3^20)) of radius 3^0
|
|
564
|
+
|
|
565
|
+
For details about element construction, see the documentation of
|
|
566
|
+
:class:`Berkovich_Element_Cp_Projective`. Initializing a Berkovich projective
|
|
567
|
+
line by passing in a `p`-adic space looks the same::
|
|
568
|
+
|
|
569
|
+
sage: B = Berkovich_Cp_Projective(Qp(3)); B
|
|
570
|
+
Projective Berkovich line over Cp(3) of precision 20
|
|
571
|
+
|
|
572
|
+
However, this method allows for more control over
|
|
573
|
+
behind-the-scenes conversion::
|
|
574
|
+
|
|
575
|
+
sage: S = Qp(3, 1)
|
|
576
|
+
sage: B = Berkovich_Cp_Projective(S); B
|
|
577
|
+
Projective Berkovich line over Cp(3) of precision 1
|
|
578
|
+
|
|
579
|
+
sage: Q1 = B(1/2); Q1
|
|
580
|
+
Type I point centered at (2 + O(3) : 1 + O(3))
|
|
581
|
+
|
|
582
|
+
Note that this point has very low precision, as S has low
|
|
583
|
+
precision cap. Berkovich space can also be created over
|
|
584
|
+
a number field, as long as an ideal is specified::
|
|
585
|
+
|
|
586
|
+
sage: R.<x> = QQ[]
|
|
587
|
+
sage: A.<a> = NumberField(x^2 + 1) # needs sage.rings.number_field
|
|
588
|
+
sage: ideal = A.prime_above(2) # needs sage.rings.number_field
|
|
589
|
+
sage: B = Berkovich_Cp_Projective(A, ideal); B # needs sage.rings.number_field
|
|
590
|
+
Projective Berkovich line over Cp(2), with base
|
|
591
|
+
Number Field in a with defining polynomial x^2 + 1
|
|
592
|
+
|
|
593
|
+
Number fields have the benefit that computation is exact,
|
|
594
|
+
but lack support for all of `\CC_p`.
|
|
595
|
+
|
|
596
|
+
Number fields also have the advantage of added functionality,
|
|
597
|
+
as arbitrary extensions of `\QQ` can be constructed while
|
|
598
|
+
there is currently limited functionality for extensions of `\QQ_p`.
|
|
599
|
+
As seen above, constructing a Berkovich space backed by a number
|
|
600
|
+
field requires specifying an ideal of the ring of integers
|
|
601
|
+
of the number field. Specifying the ideal uniquely specifies
|
|
602
|
+
an embedding of the number field into `\CC_p`.
|
|
603
|
+
|
|
604
|
+
Unlike in the case where Berkovich space is backed by a `p`-adic
|
|
605
|
+
field, any point of a Berkovich space backed by a number field
|
|
606
|
+
must be centered at a point of that number field::
|
|
607
|
+
|
|
608
|
+
sage: # needs sage.rings.number_field
|
|
609
|
+
sage: R.<x> = QQ[]
|
|
610
|
+
sage: A.<a> = NumberField(x^3 + 20)
|
|
611
|
+
sage: ideal = A.prime_above(3)
|
|
612
|
+
sage: B = Berkovich_Cp_Projective(A, ideal)
|
|
613
|
+
sage: C.<c> = NumberField(x^2 + 1)
|
|
614
|
+
sage: B(c)
|
|
615
|
+
Traceback (most recent call last):
|
|
616
|
+
...
|
|
617
|
+
TypeError: could not convert c to Projective Space
|
|
618
|
+
of dimension 1 over Number Field in a with defining polynomial x^3 + 20
|
|
619
|
+
|
|
620
|
+
TESTS::
|
|
621
|
+
|
|
622
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
623
|
+
sage: TestSuite(B).run()
|
|
624
|
+
"""
|
|
625
|
+
|
|
626
|
+
Element = Berkovich_Element_Cp_Projective
|
|
627
|
+
|
|
628
|
+
def __init__(self, base, ideal=None):
|
|
629
|
+
"""
|
|
630
|
+
The Python constructor.
|
|
631
|
+
|
|
632
|
+
EXAMPLES::
|
|
633
|
+
|
|
634
|
+
sage: Berkovich_Cp_Projective(3)
|
|
635
|
+
Projective Berkovich line over Cp(3) of precision 20
|
|
636
|
+
"""
|
|
637
|
+
if base in ZZ:
|
|
638
|
+
if base.is_prime():
|
|
639
|
+
from sage.rings.padics.factory import Qp
|
|
640
|
+
|
|
641
|
+
base = ProjectiveSpace(Qp(base), 1)
|
|
642
|
+
else:
|
|
643
|
+
raise ValueError("non-prime passed into Berkovich space")
|
|
644
|
+
if base in NumberFields() or isinstance(base, sage.rings.abc.pAdicField):
|
|
645
|
+
base = ProjectiveSpace(base, 1)
|
|
646
|
+
if not isinstance(base, ProjectiveSpace_ring):
|
|
647
|
+
try:
|
|
648
|
+
base = ProjectiveSpace(base)
|
|
649
|
+
except (TypeError, ValueError):
|
|
650
|
+
raise ValueError("base of projective Berkovich space must be projective space")
|
|
651
|
+
if not isinstance(base.base_ring(), sage.rings.abc.pAdicField):
|
|
652
|
+
if base.base_ring() not in NumberFields():
|
|
653
|
+
raise ValueError("base of projective Berkovich space must be "
|
|
654
|
+
"projective space over Qp or a number field")
|
|
655
|
+
else:
|
|
656
|
+
if ideal is None:
|
|
657
|
+
raise ValueError('passed a number field but not an ideal')
|
|
658
|
+
if base.base_ring() is not QQ:
|
|
659
|
+
if not isinstance(ideal, NumberFieldFractionalIdeal):
|
|
660
|
+
raise ValueError('ideal was not a number field ideal')
|
|
661
|
+
if ideal.number_field() != base.base_ring():
|
|
662
|
+
raise ValueError('passed number field ' +
|
|
663
|
+
'%s but ideal was an ideal of %s' % (base.base_ring(), ideal.number_field()))
|
|
664
|
+
prime = ideal.smallest_integer()
|
|
665
|
+
else:
|
|
666
|
+
if ideal not in QQ:
|
|
667
|
+
raise ValueError('ideal was not an element of QQ')
|
|
668
|
+
prime = ideal
|
|
669
|
+
if not ideal.is_prime():
|
|
670
|
+
raise ValueError('passed non prime ideal')
|
|
671
|
+
self._base_type = 'number field'
|
|
672
|
+
else:
|
|
673
|
+
prime = base.base_ring().prime()
|
|
674
|
+
ideal = None
|
|
675
|
+
self._base_type = 'padic field'
|
|
676
|
+
if base.dimension_relative() != 1:
|
|
677
|
+
raise ValueError("base of projective Berkovich space must be "
|
|
678
|
+
"projective space of dimension 1 over Qp or a number field")
|
|
679
|
+
self._p = prime
|
|
680
|
+
self._ideal = ideal
|
|
681
|
+
Parent.__init__(self, base=base, category=TopologicalSpaces())
|
|
682
|
+
|
|
683
|
+
def base_ring(self):
|
|
684
|
+
r"""
|
|
685
|
+
The base ring of this Berkovich Space.
|
|
686
|
+
|
|
687
|
+
OUTPUT: a field
|
|
688
|
+
|
|
689
|
+
EXAMPLES::
|
|
690
|
+
|
|
691
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
692
|
+
sage: B.base_ring()
|
|
693
|
+
3-adic Field with capped relative precision 20
|
|
694
|
+
|
|
695
|
+
::
|
|
696
|
+
|
|
697
|
+
sage: C = Berkovich_Cp_Projective(ProjectiveSpace(Qp(3, 1), 1))
|
|
698
|
+
sage: C.base_ring()
|
|
699
|
+
3-adic Field with capped relative precision 1
|
|
700
|
+
|
|
701
|
+
::
|
|
702
|
+
|
|
703
|
+
sage: # needs sage.rings.number_field
|
|
704
|
+
sage: R.<x> = QQ[]
|
|
705
|
+
sage: A.<a> = NumberField(x^3 + 20)
|
|
706
|
+
sage: ideal = A.prime_above(3)
|
|
707
|
+
sage: D = Berkovich_Cp_Projective(A, ideal)
|
|
708
|
+
sage: D.base_ring()
|
|
709
|
+
Number Field in a with defining polynomial x^3 + 20
|
|
710
|
+
"""
|
|
711
|
+
return self.base().base_ring()
|
|
712
|
+
|
|
713
|
+
def _repr_(self):
|
|
714
|
+
"""
|
|
715
|
+
String representation of this Berkovich Space.
|
|
716
|
+
|
|
717
|
+
EXAMPLES::
|
|
718
|
+
|
|
719
|
+
sage: B = Berkovich_Cp_Projective(3); B
|
|
720
|
+
Projective Berkovich line over Cp(3) of precision 20
|
|
721
|
+
|
|
722
|
+
::
|
|
723
|
+
|
|
724
|
+
sage: R.<x> = QQ[]
|
|
725
|
+
sage: A.<a> = NumberField(x^2 + 1) # needs sage.rings.number_field
|
|
726
|
+
sage: v = A.ideal(a + 1) # needs sage.rings.number_field
|
|
727
|
+
sage: Berkovich_Cp_Projective(A, v) # needs sage.rings.number_field
|
|
728
|
+
Projective Berkovich line over Cp(2),
|
|
729
|
+
with base Number Field in a with defining polynomial x^2 + 1
|
|
730
|
+
"""
|
|
731
|
+
if self._base_type == 'padic field':
|
|
732
|
+
return "Projective Berkovich line over Cp(%s) of precision %s" % (self.prime(),
|
|
733
|
+
self.base().base_ring().precision_cap())
|
|
734
|
+
else:
|
|
735
|
+
return "Projective Berkovich line over Cp(%s), with base %s" % (self.prime(),
|
|
736
|
+
self.base().base_ring())
|
|
737
|
+
|
|
738
|
+
def _latex_(self):
|
|
739
|
+
r"""
|
|
740
|
+
LaTeX representation of this Berkovich Space.
|
|
741
|
+
|
|
742
|
+
EXAMPLES:
|
|
743
|
+
|
|
744
|
+
sage: B = Berkovich_Cp_Projective(3)
|
|
745
|
+
sage: latex(B)
|
|
746
|
+
\text{Projective Berkovich line over } \Bold{C}_{3}
|
|
747
|
+
"""
|
|
748
|
+
return r"\text{Projective Berkovich line over } \Bold{C}_{%s}" % (self.prime())
|