Scheme morphism for points on projective varieties
AUTHORS:
Bases: sage.structure.element.AdditiveGroupElement, sage.schemes.projective.projective_point.SchemeMorphism_point_projective_field
A rational point of an abelian variety over a field.
EXAMPLES:
sage: E = EllipticCurve([0,0,1,-1,0])
sage: origin = E(0)
sage: origin.domain()
Spectrum of Rational Field
sage: origin.codomain()
Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
Bases: sage.schemes.projective.projective_point.SchemeMorphism_point_projective_ring
A rational point of projective space over a field.
INPUT:
EXAMPLES:
sage: P = ProjectiveSpace(3, RR)
sage: P(2,3,4,5)
(0.400000000000000 : 0.600000000000000 : 0.800000000000000 : 1.00000000000000)
scales by the least common multiple of the denominators.
OUTPUT: None.
EXAMPLES:
sage: R.<t>=PolynomialRing(QQ)
sage: P.<x,y,z>=ProjectiveSpace(FractionField(R),2)
sage: Q=P([t,3/t^2,1])
sage: Q.clear_denominators(); Q
(t^3 : 3 : t^2)
sage: R.<x>=PolynomialRing(QQ)
sage: K.<w>=NumberField(x^2-3)
sage: P.<x,y,z>=ProjectiveSpace(K,2)
sage: Q=P([1/w,3,0])
sage: Q.clear_denominators(); Q
(w : 9 : 0)
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: X=P.subscheme(x^2-y^2);
sage: Q=X([1/2,1/2,1]);
sage: Q.clear_denominators(); Q
(1 : 1 : 2)
Normalizes self so that the last non-zero coordinate is \(1\).
OUTPUT: None.
EXAMPLES:
sage: P.<x,y,z>=ProjectiveSpace(GF(5),2)
sage: Q=P.point([1,3,0],false);Q
(1 : 3 : 0)
sage: Q.normalize_coordinates();Q
(2 : 1 : 0)
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: X=P.subscheme(x^2-y^2);
sage: Q=X.point([23,23,46], false);Q
(23 : 23 : 46)
sage: Q.normalize_coordinates();Q
(1/2 : 1/2 : 1)
Bases: sage.schemes.projective.projective_point.SchemeMorphism_point_projective_field
The Python constructor.
See SchemeMorphism_point_projective_ring for details.
This function still normalized points so that the rightmost non-zero coordinate is 1. The is to maintain current functionality with current implementations of curves in projectives space (plane, connic, elliptic, etc). The class:\(SchemeMorphism_point_projective_ring\) is for general use.
EXAMPLES:
sage: P = ProjectiveSpace(2, QQ)
sage: P(2, 3/5, 4)
(1/2 : 3/20 : 1)
sage: P = ProjectiveSpace(3, QQ)
sage: P(0,0,0,0)
Traceback (most recent call last):
...
ValueError: [0, 0, 0, 0] does not define a valid point since all entries are 0
sage: P.<x, y, z> = ProjectiveSpace(2, QQ)
sage: X=P.subscheme([x^2-y*z])
sage: X([2,2,2])
(1 : 1 : 1)
Every point is preperiodic over a finite field. This function returns the pair \([m,n]\) where \(m\) is the preperiod and \(n\) is the period of the point self by f.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y,z> = ProjectiveSpace(GF(5),2)
sage: H = Hom(P,P)
sage: f = H([x^2 + y^2,y^2,z^2 + y*z])
sage: P(1,0,1).orbit_structure(f)
[0, 1]
sage: P.<x,y,z> = ProjectiveSpace(GF(17),2)
sage: X = P.subscheme(x^2-y^2)
sage: H = Hom(X,X)
sage: f = H([x^2,y^2,z^2])
sage: X(1,1,2).orbit_structure(f)
[3, 1]
sage: R.<t> = GF(13^3)
sage: P.<x,y> = ProjectiveSpace(R,1)
sage: H = Hom(P,P)
sage: f = H([x^2 - y^2,y^2])
sage: P(t,4).orbit_structure(f)
[11, 6]
Bases: sage.schemes.generic.morphism.SchemeMorphism_point
A rational point of projective space over a ring.
INPUT:
EXAMPLES:
sage: P = ProjectiveSpace(2, ZZ)
sage: P(2,3,4)
(2 : 3 : 4)
Evaluates the canonical height of self with respect to F. Must be over \(\ZZ\) or \(\QQ\). Specify either the number of terms of the series to evaluate or, in dimension 1, the error bound required.
ALGORITHM:
The sum of the Green’s function at the archimedean place and the places of bad reduction.
INPUT:
kwds:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,2*x*y]);
sage: Q=P(2,1)
sage: f.canonical_height(f(Q))
2.1965476757927038111992627081
sage: f.canonical_height(Q)
1.0979353871245941198040174712
Notice that preperiodic points may not be exactly 0.
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2-29/16*y^2,y^2]);
sage: Q=P(5,4)
sage: f.canonical_height(Q,N=30)
1.4989058602918874235863427216e-9
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: X=P.subscheme(x^2-y^2);
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,30*z^2]);
sage: Q=X([4,4,1])
sage: f.canonical_height(Q,badprimes=[2,3,5],prec=200)
2.7054056208276961889784303469356774912979228770208655455481
Dehomogenizes at the nth coordinate
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: X=P.subscheme(x^2-y^2);
sage: Q=X(23,23,46)
sage: Q.dehomogenize(2)
(1/2, 1/2)
sage: R.<t>=PolynomialRing(QQ)
sage: S=R.quo(R.ideal(t^3))
sage: P.<x,y,z>=ProjectiveSpace(S,2)
sage: Q=P(t,1,1)
sage: Q.dehomogenize(1)
(tbar, 1)
sage: P.<x,y,z>=ProjectiveSpace(GF(5),2)
sage: Q=P(1,3,1)
sage: Q.dehomogenize(0)
(3, 1)
sage: P.<x,y,z>=ProjectiveSpace(GF(5),2)
sage: Q=P(1,3,0)
sage: Q.dehomogenize(2)
Traceback (most recent call last):
...
ValueError: Can't dehomogenize at 0 coordinate.
Returns the logarithmic height of the points. Must be over \(\ZZ\) or \(\QQ\).
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: Q=P.point([4,4,1/30])
sage: Q.global_height()
4.78749174278205
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: Q=P([4,1,30])
sage: Q.global_height()
3.40119738166216
sage: R.<x>=PolynomialRing(QQ)
sage: k.<w>=NumberField(x^2+5)
sage: A=ProjectiveSpace(k,2,'z')
sage: A([3,5*w+1,1]).global_height(prec=100)
2.4181409534757389986565376694
Todo
p-adic heights
Evaluates the local Green’s function at the place v for self with N terms of the series or, in dimension 1, to within the specified error bound. Defaults to N=10 if no kwds provided
Use v=0 for the archimedean place. Must be over \(\ZZ\) or \(\QQ\).
ALGORITHM:
See Exercise 5.29 and Figure 5.6 of The Arithmetic of Dynamics Systems, Joseph H. Silverman, Springer, GTM 241, 2007.
INPUT:
kwds:
OUTPUT:
Examples:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,x*y]);
sage: Q=P(5,1)
sage: f.green_function(Q,0,N=30)
1.6460930159932946233759277576
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,x*y]);
sage: Q=P(5,1)
sage: Q.green_function(f,0,N=200,prec=200)
1.6460930160038721802875250367738355497198064992657997569827
Todo
error bounds for dimension > 1
Returns the multiplier of the projective point self of period \(n\) by the function \(f\). \(f\) must be an endomorphism of projective space
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y,z,w>=ProjectiveSpace(QQ,3)
sage: H=Hom(P,P)
sage: f=H([x^2,y^2,4*w^2,4*z^2]);
sage: Q=P.point([4,4,1,1],False);
sage: Q.multiplier(f,1)
[ 2 0 -8]
[ 0 2 -8]
[ 0 0 -2]
Removes the gcd from the coordinates of self (including \(-1\)).
Warning
The gcd will depend on the base ring.
OUTPUT:
EXAMPLES:
sage: P = ProjectiveSpace(ZZ,2,'x')
sage: p = P([-5,-15,-20])
sage: p.normalize_coordinates(); p
(1 : 3 : 4)
sage: P = ProjectiveSpace(Zp(7),2,'x')
sage: p = P([-5,-15,-2])
sage: p.normalize_coordinates(); p
(5 + O(7^20) : 1 + 2*7 + O(7^20) : 2 + O(7^20))
sage: R.<t> = PolynomialRing(QQ)
sage: P = ProjectiveSpace(R,2,'x')
sage: p = P([3/5*t^3,6*t, t])
sage: p.normalize_coordinates(); p
(3/5*t^2 : 6 : 1)
sage: P.<x,y> = ProjectiveSpace(Zmod(20),1)
sage: Q = P(4,8)
sage: Q.normalize_coordinates()
sage: Q
(1 : 2)
sage: R.<t> = PolynomialRing(QQ,1)
sage: S = R.quotient_ring(R.ideal(t^3))
sage: P.<x,y> = ProjectiveSpace(S,1)
sage: Q = P(t,t^2)
sage: Q.normalize_coordinates()
sage: Q
(1 : t)
Since the base ring is a polynomial ring over a field, only the gcd \(c\) is removed.
sage: R.<c> = PolynomialRing(QQ)
sage: P = ProjectiveSpace(R,1)
sage: Q = P(2*c,4*c)
sage: Q.normalize_coordinates();Q
(2 : 4)
A polynomial ring over a ring gives the more intuitive result.
sage: R.<c> = PolynomialRing(ZZ)
sage: P = ProjectiveSpace(R,1)
sage: Q = P(2*c,4*c)
sage: Q.normalize_coordinates();Q
(1 : 2)
For a map self and a point \(P\) in self.domain() this function returns the nth iterate of \(P\) by self. If normalize==True, then the coordinates are automatically normalized.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,2*y^2])
sage: P(1,1).nth_iterate(f,4)
(32768 : 32768)
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,2*y^2])
sage: P(1,1).nth_iterate(f,4,1)
(1 : 1)
sage: R.<t>=PolynomialRing(QQ)
sage: P.<x,y,z>=ProjectiveSpace(R,2)
sage: H=Hom(P,P)
sage: f=H([x^2+t*y^2,(2-t)*y^2,z^2])
sage: P(2+t,7,t).nth_iterate(f,2)
(t^4 + 2507*t^3 - 6787*t^2 + 10028*t + 16 : -2401*t^3 + 14406*t^2 -
28812*t + 19208 : t^4)
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,z^2])
sage: X(2,2,3).nth_iterate(f,3)
(256 : 256 : 6561)
Todo
Is there a more efficient way to do this?
Returns the orbit of \(P\) by self. If \(n\) is an integer it returns \([P,self(P),\ldots,self^n(P)]\). If \(n\) is a list or tuple \(n=[m,k]\) it returns \([self^m(P),\ldots,self^k(P)\)]. Automatically normalize the points if normalize=True. Perform the checks on point initialization if check=True
INPUT:
kwds:
OUTPUT:
EXAMPLES:
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2-z^2,2*z^2])
sage: P(1,2,1).orbit(f,3)
[(1 : 2 : 1), (5 : 3 : 2), (34 : 5 : 8), (1181 : -39 : 128)]
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2-z^2,2*z^2])
sage: P(1,2,1).orbit(f,[2,4])
[(34 : 5 : 8), (1181 : -39 : 128), (1396282 : -14863 : 32768)]
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,x*z])
sage: X(2,2,3).orbit(f,3,normalize=True)
[(2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3)]
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: P.point([1,2],False).orbit(f,4,check=False)
[(1 : 2), (5 : 4), (41 : 16), (1937 : 256), (3817505 : 65536)]
Scale the coordinates of the point self by \(t\). A TypeError occurs if the point is not in the base_ring of the codomain after scaling.
INPUT:
OUTPUT:
EXAMPLES:
sage: R.<t>=PolynomialRing(QQ)
sage: P=ProjectiveSpace(R,2,'x')
sage: p=P([3/5*t^3,6*t, t])
sage: p.scale_by(1/t); p
(3/5*t^2 : 6 : 1)
sage: R.<t>=PolynomialRing(QQ)
sage: S=R.quo(R.ideal(t^3))
sage: P.<x,y,z>=ProjectiveSpace(S,2)
sage: Q=P(t,1,1)
sage: Q.scale_by(t);Q
(tbar^2 : tbar : tbar)
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: Q=P(2,2,2)
sage: Q.scale_by(1/2);Q
(1 : 1 : 1)