# 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]#

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 if base_ring is a number field.

• A prime of $$\QQ$$ if base_ring is $$\QQ$$.

• None if base_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


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))
True

>>> from sage.all import *
>>> B = Berkovich_Cp_Affine(Qp(Integer(3)))
True

sage: B = Berkovich_Cp_Affine(QQ, 3)
False

>>> from sage.all import *
>>> B = Berkovich_Cp_Affine(QQ, Integer(3))
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 of base. Must be specified if a number field is passed to base, 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]#
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 of base. Must be specified if a number field is passed to base, 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]#
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 if space 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 over Cp.

OUTPUT:

• True if space is a Berkovich space over Cp.

• 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