Berkovich Space over \(\CC_p\) - Schemes

Skip to content
Back to top
View this page
Edit this page

# 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

  Bases: `UniqueRepresentation`, `Parent`

  The parent class for any Berkovich space

class sage.schemes.berkovich.berkovich_space.Berkovich_Cp

  Bases: `Berkovich`

  Abstract parent class for Berkovich space over `Cp`.

  ideal()

    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

        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 (2*a - 1)

    Python

        >>> 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 (2*a - 1)

    Sage

        sage: B = Berkovich_Cp_Projective(QQ, 3)
        sage: B.ideal()
        3

    [Python]

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Projective(QQ, Integer(3))
        >>> B.ideal()
        3

    Sage

        sage: B = Berkovich_Cp_Projective(Qp(3))
        sage: B.ideal() is None
        True

    Python

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Projective(Qp(Integer(3)))
        >>> B.ideal() is None
        True

  is_number_field_base()

    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

        sage: B = Berkovich_Cp_Affine(Qp(3))
        sage: B.is_number_field_base()
        False

    Python

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

    Sage

        sage: B = Berkovich_Cp_Affine(QQ, 3)
        sage: B.is_number_field_base()
        True

    [Python]

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Affine(QQ, Integer(3))
        >>> B.is_number_field_base()
        True

  is_padic_base()

    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

        sage: B = Berkovich_Cp_Affine(Qp(3))
        sage: B.is_padic_base()
        True

    Python

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

    Sage

        sage: B = Berkovich_Cp_Affine(QQ, 3)
        sage: B.is_padic_base()
        False

    [Python]

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Affine(QQ, Integer(3))
        >>> B.is_padic_base()
        False

  prime()

    alias of `residue_characteristic()`.

  residue_characteristic()

    The residue characteristic of the `base`.

    EXAMPLES:

    Sage

        sage: B = Berkovich_Cp_Projective(3)
        sage: B.prime()
        3

    Python

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Projective(Integer(3))
        >>> B.prime()
        3

    Sage

        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

    [Python]

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

  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

      sage: B = Berkovich_Cp_Affine(3); B
      Affine Berkovich line over Cp(3) of precision 20

  Python

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

      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)

  [Python]

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

      sage: B(1, 2)
      Type III point centered at 1 + O(3^20) of radius 2.00000000000000

  Python

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

      sage: B = Berkovich_Cp_Affine(Qp(3)); B
      Affine Berkovich line over Cp(3) of precision 20

  [Python]

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

      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)

  Python

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

      sage: B = Berkovich_Cp_Affine(Qp(3, 1000)); B
      Affine Berkovich line over Cp(3) of precision 1000

  [Python]

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

      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)

  Python

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

      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

  [Python]

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

      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

  Python

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

    alias of `Berkovich_Element_Cp_Affine`

class sage.schemes.berkovich.berkovich_space.Berkovich_Cp_Projective(base, ideal=None)

  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

      sage: B = Berkovich_Cp_Projective(3); B
      Projective Berkovich line over Cp(3) of precision 20

  Python

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

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

  [Python]

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

      sage: B(2, 1)
      Type II point centered at (2 + O(3^20) : 1 + O(3^20)) of radius 3^0

  Python

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

      sage: B = Berkovich_Cp_Projective(Qp(3)); B
      Projective Berkovich line over Cp(3) of precision 20

  [Python]

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

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

  Python

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

      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

  [Python]

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

      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

  Python

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

    alias of `Berkovich_Element_Cp_Projective`

  base_ring()

    The base ring of this Berkovich Space.

    OUTPUT: a field

    EXAMPLES:

    Sage

        sage: B = Berkovich_Cp_Projective(3)
        sage: B.base_ring()
        3-adic Field with capped relative precision 20

    Python

        >>> from sage.all import *
        >>> B = Berkovich_Cp_Projective(Integer(3))
        >>> B.base_ring()
        3-adic Field with capped relative precision 20

    Sage

        sage: C = Berkovich_Cp_Projective(ProjectiveSpace(Qp(3, 1), 1))
        sage: C.base_ring()
        3-adic Field with capped relative precision 1

    [Python]

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

        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

    Python

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