def __init__(self, base, ideal=None): """ The Python constructor. EXAMPLES:: sage: Berkovich_Cp_Projective(3) Projective Berkovich line over Cp(3) of precision 20 """ if base in ZZ: if base.is_prime(): base = ProjectiveSpace(Qp(base), 1) else: raise ValueError("non-prime passed into Berkovich space") if base in NumberFields() or isinstance(base, sage.rings.abc.pAdicField): base = ProjectiveSpace(base, 1) if not is_ProjectiveSpace(base): try: base = ProjectiveSpace(base) except: raise ValueError( "base of projective Berkovich space must be projective space" ) if not isinstance(base.base_ring(), sage.rings.abc.pAdicField): if base.base_ring() not in NumberFields(): raise ValueError("base of projective Berkovich space must be " + \ "projective space over Qp or a number field") else: if ideal is None: raise ValueError('passed a number field but not an ideal') if base.base_ring() is not QQ: if not isinstance(ideal, NumberFieldFractionalIdeal): raise ValueError('ideal was not a number field ideal') if ideal.number_field() != base.base_ring(): raise ValueError('passed number field ' + \ '%s but ideal was an ideal of %s' %(base.base_ring(), ideal.number_field())) prime = ideal.smallest_integer() else: if ideal not in QQ: raise ValueError('ideal was not an element of QQ') prime = ideal if not ideal.is_prime(): raise ValueError('passed non prime ideal') self._base_type = 'number field' else: prime = base.base_ring().prime() ideal = None self._base_type = 'padic field' if base.dimension_relative() != 1: raise ValueError("base of projective Berkovich space must be " + \ "projective space of dimension 1 over Qp or a number field") self._p = prime self._ideal = ideal Parent.__init__(self, base=base, category=TopologicalSpaces())
def projective_embedding(self, i=None, PP=None): """ Returns a morphism from this space into an ambient projective space of the same dimension. INPUT: - ``i`` -- integer (default: dimension of self = last coordinate) determines which projective embedding to compute. The embedding is that which has a 1 in the i-th coordinate, numbered from 0. - ``PP`` -- (default: None) ambient projective space, i.e., codomain of morphism; this is constructed if it is not given. EXAMPLES:: sage: AA = AffineSpace(2, QQ, 'x') sage: pi = AA.projective_embedding(0); pi Scheme morphism: From: Affine Space of dimension 2 over Rational Field To: Projective Space of dimension 2 over Rational Field Defn: Defined on coordinates by sending (x0, x1) to (1 : x0 : x1) sage: z = AA(3, 4) sage: pi(z) (1/4 : 3/4 : 1) sage: pi(AA(0,2)) (1/2 : 0 : 1) sage: pi = AA.projective_embedding(1); pi Scheme morphism: From: Affine Space of dimension 2 over Rational Field To: Projective Space of dimension 2 over Rational Field Defn: Defined on coordinates by sending (x0, x1) to (x0 : 1 : x1) sage: pi(z) (3/4 : 1/4 : 1) sage: pi = AA.projective_embedding(2) sage: pi(z) (3 : 4 : 1) :: sage: A.<x,y> = AffineSpace(ZZ, 2) sage: A.projective_embedding(2).codomain().affine_patch(2) == A True """ n = self.dimension_relative() if i is None: try: i = self._default_embedding_index except AttributeError: i = int(n) else: i = int(i) try: phi = self.__projective_embedding[i] #assume that if you've passed in a new codomain you want to override #the existing embedding if PP is None or phi.codomain() == PP: return(phi) except AttributeError: self.__projective_embedding = {} except KeyError: pass #if no i-th embedding exists, we may still be here with PP==None if PP is None: from sage.schemes.projective.projective_space import ProjectiveSpace PP = ProjectiveSpace(n, self.base_ring()) elif PP.dimension_relative() != n: raise ValueError("projective Space must be of dimension %s"%(n)) R = self.coordinate_ring() v = list(R.gens()) if n < 0 or n >self.dimension_relative(): raise ValueError("argument i (=%s) must be between 0 and %s, inclusive"%(i,n)) v.insert(i, R(1)) phi = self.hom(v, PP) self.__projective_embedding[i] = phi #make affine patch and projective embedding match PP.affine_patch(i,self) return phi
def projective_embedding(self, i=None, PP=None): """ Returns a morphism from this space into an ambient projective space of the same dimension. INPUT: - ``i`` -- integer (default: dimension of self = last coordinate) determines which projective embedding to compute. The embedding is that which has a 1 in the i-th coordinate, numbered from 0. - ``PP`` -- (default: None) ambient projective space, i.e., codomain of morphism; this is constructed if it is not given. EXAMPLES:: sage: AA = AffineSpace(2, QQ, 'x') sage: pi = AA.projective_embedding(0); pi Scheme morphism: From: Affine Space of dimension 2 over Rational Field To: Projective Space of dimension 2 over Rational Field Defn: Defined on coordinates by sending (x0, x1) to (1 : x0 : x1) sage: z = AA(3,4) sage: pi(z) (1/4 : 3/4 : 1) sage: pi(AA(0,2)) (1/2 : 0 : 1) sage: pi = AA.projective_embedding(1); pi Scheme morphism: From: Affine Space of dimension 2 over Rational Field To: Projective Space of dimension 2 over Rational Field Defn: Defined on coordinates by sending (x0, x1) to (x0 : 1 : x1) sage: pi(z) (3/4 : 1/4 : 1) sage: pi = AA.projective_embedding(2) sage: pi(z) (3 : 4 : 1) :: sage: A.<x,y> = AffineSpace(ZZ,2) sage: A.projective_embedding(2).codomain().affine_patch(2) == A True """ n = self.dimension_relative() if i is None: try: i = self._default_embedding_index except AttributeError: i = int(n) else: i = int(i) try: phi = self.__projective_embedding[i] #assume that if you've passed in a new codomain you want to override #the existing embedding if PP is None or phi.codomain() == PP: return (phi) except AttributeError: self.__projective_embedding = {} except KeyError: pass #if no ith embedding exists, we may still be here with PP==None if PP is None: from sage.schemes.projective.projective_space import ProjectiveSpace PP = ProjectiveSpace(n, self.base_ring()) elif PP.dimension_relative() != n: raise ValueError("Projective Space must be of dimension %s" % (n)) R = self.coordinate_ring() v = list(R.gens()) if n < 0 or n > self.dimension_relative(): raise ValueError( "Argument i (=%s) must be between 0 and %s, inclusive" % (i, n)) v.insert(i, R(1)) phi = self.hom(v, PP) self.__projective_embedding[i] = phi #make affine patch and projective embedding match PP.affine_patch(i, self) return phi