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_ringinto \(\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_ringif- base_ringis a number field.
- A prime of \(\QQ\) if - base_ringis \(\QQ\).
- Noneif- base_ringis 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 (2*a - 1) - >>> 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: 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 - Trueif this Berkovich space is backed by a number field.- OUTPUT: - Trueif this Berkovich space was created with a number field.
- Falseotherwise.
 - 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 - Trueif this Berkovich space is backed by a \(p\)-adic field.- OUTPUT: - Trueif this Berkovich space was created with a \(p\)-adic field.
- Falseotherwise.
 - 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 - Bwas 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 - spaceis a Berkovich space.- OUTPUT: - Trueif- spaceis a Berkovich space.
- Falseotherwise.
 - 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 - spaceis a Berkovich space over- Cp.- OUTPUT: - Trueif- spaceis a Berkovich space over- Cp.
- Falseotherwise.
 - 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