Berkovich Space over \(\CC_p\)#
The Berkovich affine line is the set of seminorms on \(\CC_p[x]\), with the weakest topology that makes the map \(| \cdot | \to |f|\) continuous for all \(f \in \CC_p[x]\). The Berkovich projective line is the one-point compactification of the Berkovich affine line.
The two main classes are Berkovich_Cp_Affine
and
Berkovich_Cp_Projective
, which implement the affine and
projective lines, respectively.
Berkovich_Cp_Affine
and Berkovich_Cp_Projective
take as input one of the following: the prime \(p\), a finite
extension of \(\QQ_p\), or a number field and a place.
For an exposition of Berkovich space over \(\CC_p\), see Chapter 6 of [Ben2019]. For a more involved exposition, see Chapter 1 and 2 of [BR2010].
AUTHORS:
Alexander Galarraga (2020-06-22): initial implementation
- class sage.schemes.berkovich.berkovich_space.Berkovich[source]#
Bases:
UniqueRepresentation
,Parent
The parent class for any Berkovich space
- class sage.schemes.berkovich.berkovich_space.Berkovich_Cp[source]#
Bases:
Berkovich
Abstract parent class for Berkovich space over
Cp
.- ideal()[source]#
The ideal which defines an embedding of the
base_ring
into \(\CC_p\).If this Berkovich space is backed by a p-adic field, then an embedding is already specified, and this returns
None
.OUTPUT:
An ideal of a
base_ring
ifbase_ring
is a number field.A prime of \(\QQ\) if
base_ring
is \(\QQ\).None
ifbase_ring
is a p-adic field.
EXAMPLES:
sage: # needs sage.rings.number_field sage: R.<z> = QQ[] sage: A.<a> = NumberField(z^2 + 1) sage: ideal = A.prime_above(5) sage: B = Berkovich_Cp_Projective(A, ideal) sage: B.ideal() Fractional ideal (-a - 2)
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['z']; (z,) = R._first_ngens(1) >>> A = NumberField(z**Integer(2) + Integer(1), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.prime_above(Integer(5)) >>> B = Berkovich_Cp_Projective(A, ideal) >>> B.ideal() Fractional ideal (-a - 2)
sage: B = Berkovich_Cp_Projective(QQ, 3) sage: B.ideal() 3
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(QQ, Integer(3)) >>> B.ideal() 3
sage: B = Berkovich_Cp_Projective(Qp(3)) sage: B.ideal() is None True
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Qp(Integer(3))) >>> B.ideal() is None True
- is_number_field_base()[source]#
Return
True
if this Berkovich space is backed by a number field.OUTPUT:
True
if this Berkovich space was created with a number field.False
otherwise.
EXAMPLES:
sage: B = Berkovich_Cp_Affine(Qp(3)) sage: B.is_number_field_base() False
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Qp(Integer(3))) >>> B.is_number_field_base() False
sage: B = Berkovich_Cp_Affine(QQ, 3) sage: B.is_number_field_base() True
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(QQ, Integer(3)) >>> B.is_number_field_base() True
- is_padic_base()[source]#
Return
True
if this Berkovich space is backed by a p-adic field.OUTPUT:
True
if this Berkovich space was created with a p-adic field.False
otherwise.
EXAMPLES:
sage: B = Berkovich_Cp_Affine(Qp(3)) sage: B.is_padic_base() True
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Qp(Integer(3))) >>> B.is_padic_base() True
sage: B = Berkovich_Cp_Affine(QQ, 3) sage: B.is_padic_base() False
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(QQ, Integer(3)) >>> B.is_padic_base() False
- prime()[source]#
The residue characteristic of the
base
.EXAMPLES:
sage: B = Berkovich_Cp_Projective(3) sage: B.prime() 3
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)) >>> B.prime() 3
sage: # needs sage.rings.number_field sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) sage: ideal = A.ideal(-1/2*a^2 + a - 3) sage: B = Berkovich_Cp_Affine(A, ideal) sage: B.residue_characteristic() 7
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.ideal(-Integer(1)/Integer(2)*a**Integer(2) + a - Integer(3)) >>> B = Berkovich_Cp_Affine(A, ideal) >>> B.residue_characteristic() 7
- residue_characteristic()[source]#
The residue characteristic of the
base
.EXAMPLES:
sage: B = Berkovich_Cp_Projective(3) sage: B.prime() 3
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)) >>> B.prime() 3
sage: # needs sage.rings.number_field sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) sage: ideal = A.ideal(-1/2*a^2 + a - 3) sage: B = Berkovich_Cp_Affine(A, ideal) sage: B.residue_characteristic() 7
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.ideal(-Integer(1)/Integer(2)*a**Integer(2) + a - Integer(3)) >>> B = Berkovich_Cp_Affine(A, ideal) >>> B.residue_characteristic() 7
- class sage.schemes.berkovich.berkovich_space.Berkovich_Cp_Affine(base, ideal=None)[source]#
Bases:
Berkovich_Cp
The Berkovich affine line over \(\CC_p\).
The Berkovich affine line is the set of seminorms on \(\CC_p[x]\), with the weakest topology such that the map \(| \cdot | \to |f|\) is continuous for all \(f \in \CC_p[x]\).
We can represent the Berkovich affine line in two separate ways: either using a p-adic field to represent elements or using a number field to represent elements while storing an ideal of the ring of integers of the number field, which specifies an embedding of the number field into \(\CC_p\). See the examples.
INPUT:
base
– Three cases:a prime number \(p\). Centers of elements are then represented as points of \(\QQ_p\).
\(\QQ_p\) or a finite extension of \(\QQ_p\). Centers of elements are then represented as points of
base
.A number field \(K\). Centers of elements are then represented as points of \(K\).
ideal
– (optional) a prime ideal ofbase
. Must be specified if a number field is passed tobase
, otherwise it is ignored.
EXAMPLES:
sage: B = Berkovich_Cp_Affine(3); B Affine Berkovich line over Cp(3) of precision 20
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Integer(3)); B Affine Berkovich line over Cp(3) of precision 20
We can create elements:
sage: B(-2) Type I point centered at 1 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + 2*3^12 + 2*3^13 + 2*3^14 + 2*3^15 + 2*3^16 + 2*3^17 + 2*3^18 + 2*3^19 + O(3^20)
>>> from sage.all import * >>> B(-Integer(2)) Type I point centered at 1 + 2*3 + 2*3^2 + 2*3^3 + 2*3^4 + 2*3^5 + 2*3^6 + 2*3^7 + 2*3^8 + 2*3^9 + 2*3^10 + 2*3^11 + 2*3^12 + 2*3^13 + 2*3^14 + 2*3^15 + 2*3^16 + 2*3^17 + 2*3^18 + 2*3^19 + O(3^20)
sage: B(1, 2) Type III point centered at 1 + O(3^20) of radius 2.00000000000000
>>> from sage.all import * >>> B(Integer(1), Integer(2)) Type III point centered at 1 + O(3^20) of radius 2.00000000000000
For details on element creation, see the documentation of
Berkovich_Element_Cp_Affine
. Initializing by passing in \(\QQ_p\) looks the same:sage: B = Berkovich_Cp_Affine(Qp(3)); B Affine Berkovich line over Cp(3) of precision 20
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Qp(Integer(3))); B Affine Berkovich line over Cp(3) of precision 20
However, this method allows for more control over behind-the-scenes conversion:
sage: B = Berkovich_Cp_Affine(Qp(3, 1)); B Affine Berkovich line over Cp(3) of precision 1 sage: B(1/2) Type I point centered at 2 + O(3)
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Qp(Integer(3), Integer(1))); B Affine Berkovich line over Cp(3) of precision 1 >>> B(Integer(1)/Integer(2)) Type I point centered at 2 + O(3)
Note that this point has very low precision, as
B
was initialized with a p-adic field of capped-relative precision one. For high precision, pass in a high precision p-adic field:sage: B = Berkovich_Cp_Affine(Qp(3, 1000)); B Affine Berkovich line over Cp(3) of precision 1000
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Qp(Integer(3), Integer(1000))); B Affine Berkovich line over Cp(3) of precision 1000
Points of Berkovich space can be created from points of extensions of \(\QQ_p\):
sage: B = Berkovich_Cp_Affine(3) sage: A.<a> = Qp(3).extension(x^3 - 3) sage: B(a) Type I point centered at a + O(a^61)
>>> from sage.all import * >>> B = Berkovich_Cp_Affine(Integer(3)) >>> A = Qp(Integer(3)).extension(x**Integer(3) - Integer(3), names=('a',)); (a,) = A._first_ngens(1) >>> B(a) Type I point centered at a + O(a^61)
For exact computation, a number field can be used:
sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) # needs sage.rings.number_field sage: ideal = A.prime_above(3) # needs sage.rings.number_field sage: B = Berkovich_Cp_Affine(A, ideal); B # needs sage.rings.number_field Affine Berkovich line over Cp(3), with base Number Field in a with defining polynomial x^3 + 20
>>> from sage.all import * >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1)# needs sage.rings.number_field >>> ideal = A.prime_above(Integer(3)) # needs sage.rings.number_field >>> B = Berkovich_Cp_Affine(A, ideal); B # needs sage.rings.number_field Affine Berkovich line over Cp(3), with base Number Field in a with defining polynomial x^3 + 20
Number fields have a major advantage of exact computation.
Number fields also have added functionality. Arbitrary extensions of \(\QQ\) are supported, while there is currently limited functionality for extensions of \(\QQ_p\). As seen above, constructing a Berkovich space backed by a number field requires specifying an ideal of the ring of integers of the number field. Specifying the ideal uniquely specifies an embedding of the number field into \(\CC_p\).
Unlike in the case where Berkovich space is backed by a p-adic field, any point of a Berkovich space backed by a number field must be centered at a point of that number field:
sage: # needs sage.rings.number_field sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) sage: ideal = A.prime_above(3) sage: B = Berkovich_Cp_Affine(A, ideal) sage: C.<c> = NumberField(x^2 + 1) sage: B(c) Traceback (most recent call last): ... ValueError: could not convert c to Number Field in a with defining polynomial x^3 + 20
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.prime_above(Integer(3)) >>> B = Berkovich_Cp_Affine(A, ideal) >>> C = NumberField(x**Integer(2) + Integer(1), names=('c',)); (c,) = C._first_ngens(1) >>> B(c) Traceback (most recent call last): ... ValueError: could not convert c to Number Field in a with defining polynomial x^3 + 20
- Element[source]#
alias of
Berkovich_Element_Cp_Affine
- class sage.schemes.berkovich.berkovich_space.Berkovich_Cp_Projective(base, ideal=None)[source]#
Bases:
Berkovich_Cp
The Berkovich projective line over \(\CC_p\).
The Berkovich projective line is the one-point compactification of the Berkovich affine line.
We can represent the Berkovich projective line in two separate ways: either using a p-adic field to represent elements or using a number field to represent elements while storing an ideal of the ring of integers of the number field, which specifies an embedding of the number field into \(\CC_p\). See the examples.
INPUT:
base
– Three cases:a prime number \(p\). Centers of elements are then represented as points of projective space of dimension 1 over \(\QQ_p\).
\(\QQ_p\) or a finite extension of \(\QQ_p\). Centers of elements are then represented as points of projective space of dimension 1 over
base
.A number field \(K\). Centers of elements are then represented as points of projective space of dimension 1 over
base
.
ideal
– (optional) a prime ideal ofbase
. Must be specified if a number field is passed tobase
, otherwise it is ignored.
EXAMPLES:
sage: B = Berkovich_Cp_Projective(3); B Projective Berkovich line over Cp(3) of precision 20
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)); B Projective Berkovich line over Cp(3) of precision 20
Elements can be constructed:
sage: B(1/2) Type I point centered at (2 + 3 + 3^2 + 3^3 + 3^4 + 3^5 + 3^6 + 3^7 + 3^8 + 3^9 + 3^10 + 3^11 + 3^12 + 3^13 + 3^14 + 3^15 + 3^16 + 3^17 + 3^18 + 3^19 + O(3^20) : 1 + O(3^20))
>>> from sage.all import * >>> B(Integer(1)/Integer(2)) Type I point centered at (2 + 3 + 3^2 + 3^3 + 3^4 + 3^5 + 3^6 + 3^7 + 3^8 + 3^9 + 3^10 + 3^11 + 3^12 + 3^13 + 3^14 + 3^15 + 3^16 + 3^17 + 3^18 + 3^19 + O(3^20) : 1 + O(3^20))
sage: B(2, 1) Type II point centered at (2 + O(3^20) : 1 + O(3^20)) of radius 3^0
>>> from sage.all import * >>> B(Integer(2), Integer(1)) Type II point centered at (2 + O(3^20) : 1 + O(3^20)) of radius 3^0
For details about element construction, see the documentation of
Berkovich_Element_Cp_Projective
. Initializing a Berkovich projective line by passing in a p-adic space looks the same:sage: B = Berkovich_Cp_Projective(Qp(3)); B Projective Berkovich line over Cp(3) of precision 20
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Qp(Integer(3))); B Projective Berkovich line over Cp(3) of precision 20
However, this method allows for more control over behind-the-scenes conversion:
sage: S = Qp(3, 1) sage: B = Berkovich_Cp_Projective(S); B Projective Berkovich line over Cp(3) of precision 1 sage: Q1 = B(1/2); Q1 Type I point centered at (2 + O(3) : 1 + O(3))
>>> from sage.all import * >>> S = Qp(Integer(3), Integer(1)) >>> B = Berkovich_Cp_Projective(S); B Projective Berkovich line over Cp(3) of precision 1 >>> Q1 = B(Integer(1)/Integer(2)); Q1 Type I point centered at (2 + O(3) : 1 + O(3))
Note that this point has very low precision, as S has low precision cap. Berkovich space can also be created over a number field, as long as an ideal is specified:
sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^2 + 1) # needs sage.rings.number_field sage: ideal = A.prime_above(2) # needs sage.rings.number_field sage: B = Berkovich_Cp_Projective(A, ideal); B # needs sage.rings.number_field Projective Berkovich line over Cp(2), with base Number Field in a with defining polynomial x^2 + 1
>>> from sage.all import * >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(2) + Integer(1), names=('a',)); (a,) = A._first_ngens(1)# needs sage.rings.number_field >>> ideal = A.prime_above(Integer(2)) # needs sage.rings.number_field >>> B = Berkovich_Cp_Projective(A, ideal); B # needs sage.rings.number_field Projective Berkovich line over Cp(2), with base Number Field in a with defining polynomial x^2 + 1
Number fields have the benefit that computation is exact, but lack support for all of \(\CC_p\).
Number fields also have the advantage of added functionality, as arbitrary extensions of \(\QQ\) can be constructed while there is currently limited functionality for extensions of \(\QQ_p\). As seen above, constructing a Berkovich space backed by a number field requires specifying an ideal of the ring of integers of the number field. Specifying the ideal uniquely specifies an embedding of the number field into \(\CC_p\).
Unlike in the case where Berkovich space is backed by a p-adic field, any point of a Berkovich space backed by a number field must be centered at a point of that number field:
sage: # needs sage.rings.number_field sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) sage: ideal = A.prime_above(3) sage: B = Berkovich_Cp_Projective(A, ideal) sage: C.<c> = NumberField(x^2 + 1) sage: B(c) Traceback (most recent call last): ... TypeError: could not convert c to Projective Space of dimension 1 over Number Field in a with defining polynomial x^3 + 20
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.prime_above(Integer(3)) >>> B = Berkovich_Cp_Projective(A, ideal) >>> C = NumberField(x**Integer(2) + Integer(1), names=('c',)); (c,) = C._first_ngens(1) >>> B(c) Traceback (most recent call last): ... TypeError: could not convert c to Projective Space of dimension 1 over Number Field in a with defining polynomial x^3 + 20
- Element[source]#
alias of
Berkovich_Element_Cp_Projective
- base_ring()[source]#
The base ring of this Berkovich Space.
OUTPUT: A field.
EXAMPLES:
sage: B = Berkovich_Cp_Projective(3) sage: B.base_ring() 3-adic Field with capped relative precision 20
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)) >>> B.base_ring() 3-adic Field with capped relative precision 20
sage: C = Berkovich_Cp_Projective(ProjectiveSpace(Qp(3, 1), 1)) sage: C.base_ring() 3-adic Field with capped relative precision 1
>>> from sage.all import * >>> C = Berkovich_Cp_Projective(ProjectiveSpace(Qp(Integer(3), Integer(1)), Integer(1))) >>> C.base_ring() 3-adic Field with capped relative precision 1
sage: # needs sage.rings.number_field sage: R.<x> = QQ[] sage: A.<a> = NumberField(x^3 + 20) sage: ideal = A.prime_above(3) sage: D = Berkovich_Cp_Projective(A, ideal) sage: D.base_ring() Number Field in a with defining polynomial x^3 + 20
>>> from sage.all import * >>> # needs sage.rings.number_field >>> R = QQ['x']; (x,) = R._first_ngens(1) >>> A = NumberField(x**Integer(3) + Integer(20), names=('a',)); (a,) = A._first_ngens(1) >>> ideal = A.prime_above(Integer(3)) >>> D = Berkovich_Cp_Projective(A, ideal) >>> D.base_ring() Number Field in a with defining polynomial x^3 + 20
- sage.schemes.berkovich.berkovich_space.is_Berkovich(space)[source]#
Check if
space
is a Berkovich space.OUTPUT:
True
ifspace
is a Berkovich space.False
otherwise.
EXAMPLES:
sage: B = Berkovich_Cp_Projective(3) sage: from sage.schemes.berkovich.berkovich_space import is_Berkovich sage: is_Berkovich(B) doctest:warning... DeprecationWarning: The function is_Berkovich is deprecated; use 'isinstance(..., Berkovich)' instead. See https://github.com/sagemath/sage/issues/38022 for details. True
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)) >>> from sage.schemes.berkovich.berkovich_space import is_Berkovich >>> is_Berkovich(B) doctest:warning... DeprecationWarning: The function is_Berkovich is deprecated; use 'isinstance(..., Berkovich)' instead. See https://github.com/sagemath/sage/issues/38022 for details. True
- sage.schemes.berkovich.berkovich_space.is_Berkovich_Cp(space)[source]#
Check if
space
is a Berkovich space overCp
.OUTPUT:
True
ifspace
is a Berkovich space overCp
.False
otherwise.
EXAMPLES:
sage: B = Berkovich_Cp_Projective(3) sage: from sage.schemes.berkovich.berkovich_space import is_Berkovich_Cp sage: is_Berkovich_Cp(B) doctest:warning... DeprecationWarning: The function is_Berkovich_Cp is deprecated; use 'isinstance(..., Berkovich_Cp)' instead. See https://github.com/sagemath/sage/issues/38022 for details. True
>>> from sage.all import * >>> B = Berkovich_Cp_Projective(Integer(3)) >>> from sage.schemes.berkovich.berkovich_space import is_Berkovich_Cp >>> is_Berkovich_Cp(B) doctest:warning... DeprecationWarning: The function is_Berkovich_Cp is deprecated; use 'isinstance(..., Berkovich_Cp)' instead. See https://github.com/sagemath/sage/issues/38022 for details. True