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

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

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