A morphism of schemes determined by rational functions that define what the morphism does on points in the ambient projective space.
AUTHORS:
David Kohel, William Stein
William Stein (2006-02-11): fixed bug where P(0,0,0) was allowed as a projective point.
Volker Braun (2011-08-08): Renamed classes, more documentation, misc cleanups.
for affine/projective
Bases: sage.schemes.generic.morphism.SchemeMorphism_polynomial
A morphism of schemes determined by rational functions that define what the morphism does on points in the ambient projective space.
EXAMPLES:
sage: R.<x,y> = QQ[]
sage: P1 = ProjectiveSpace(R)
sage: H = P1.Hom(P1)
sage: H([y,2*x])
Scheme endomorphism of Projective Space of dimension 1 over Rational Field
Defn: Defined on coordinates by sending (x : y) to
(y : 2*x)
An example of a morphism between projective plane curves (see #10297):
sage: P2.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = x^3+y^3+60*z^3
sage: g = y^2*z-( x^3 - 6400*z^3/3)
sage: C = Curve(f)
sage: E = Curve(g)
sage: xbar,ybar,zbar = C.coordinate_ring().gens()
sage: H = C.Hom(E)
sage: H([zbar,xbar-ybar,-(xbar+ybar)/80])
Scheme morphism:
From: Projective Curve over Rational Field defined by x^3 + y^3 + 60*z^3
To: Projective Curve over Rational Field defined by -x^3 + y^2*z + 6400/3*z^3
Defn: Defined on coordinates by sending (x : y : z) to
(z : x - y : -1/80*x - 1/80*y)
A more complicated example:
sage: P2.<x,y,z> = ProjectiveSpace(2,QQ)
sage: P1 = P2.subscheme(x-y)
sage: H12 = P1.Hom(P2)
sage: H12([x^2,x*z, z^2])
Scheme morphism:
From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by:
x - y
To: Projective Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (x : y : z) to
(y^2 : y*z : z^2)
We illustrate some error checking:
sage: R.<x,y> = QQ[]
sage: P1 = ProjectiveSpace(R)
sage: H = P1.Hom(P1)
sage: f = H([x-y, x*y])
Traceback (most recent call last):
...
ValueError: polys (=[x - y, x*y]) must be of the same degree
sage: H([x-1, x*y+x])
Traceback (most recent call last):
...
ValueError: polys (=[x - 1, x*y + x]) must be homogeneous
sage: H([exp(x),exp(y)])
Traceback (most recent call last):
...
TypeError: polys (=[e^x, e^y]) must be elements of
Multivariate Polynomial Ring in x, y over Rational Field
Conjugates self by M, i.e. . If possible the map will be defined over the
same space as self. Otherwise, will try to coerce to the base_ring of M.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.conjugate(matrix([[1,2],[0,1]]))
Scheme endomorphism of Projective Space of dimension 1 over Integer Ring
Defn: Defined on coordinates by sending (x : y) to
(x^2 + 4*x*y + 3*y^2 : y^2)
sage: R.<x>=PolynomialRing(QQ)
sage: K.<i>=NumberField(x^2+1)
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^3+y^3,y^3])
sage: f.conjugate(matrix([[i,0],[0,-i]]))
Scheme endomorphism of Projective Space of dimension 1 over Integer Ring
Defn: Defined on coordinates by sending (x : y) to
(-x^3 + y^3 : -y^3)
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2,y*z])
sage: f.conjugate(matrix([[1,2,3],[0,1,2],[0,0,1]]))
Scheme endomorphism of Projective Space of dimension 2 over Integer Ring
Defn: Defined on coordinates by sending (x : y : z) to
(x^2 + 4*x*y + 3*y^2 + 6*x*z + 9*y*z + 7*z^2 : y^2 + 2*y*z : y*z + 2*z^2)
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.conjugate(matrix([[2,0],[0,1/2]]))
Scheme endomorphism of Projective Space of dimension 1 over Multivariate
Polynomial Ring in x, y over Rational Field
Defn: Defined on coordinates by sending (x : y) to
(2*x^2 + 1/8*y^2 : 1/2*y^2)
sage: R.<x>=PolynomialRing(QQ)
sage: K.<i>=NumberField(x^2+1)
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([1/3*x^2+1/2*y^2,y^2])
sage: f.conjugate(matrix([[i,0],[0,-i]]))
Scheme endomorphism of Projective Space of dimension 1 over Multivariate
Polynomial Ring in x, y over Number Field in i with defining polynomial
x^2 + 1
Defn: Defined on coordinates by sending (x : y) to
((1/3*i)*x^2 + (1/2*i)*y^2 : (-i)*y^2)
This function returns the degree of self. The degree is defined as the degree of the homogeneous polynomials that are the coordinates of self.
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.degree()
2
sage: P.<x,y,z>=ProjectiveSpace(CC,2)
sage: H=Hom(P,P)
sage: f=H([x^3+y^3,y^2*z,z*x*y])
sage: f.degree()
3
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: f.degree()
2
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: f.degree()
2
Returns the standard dehomogenization at the nth coordinate .
Note that the new function is defined over the fraction field of the base ring of self.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.dehomogenize(0)
Scheme endomorphism of Affine Space of dimension 1 over Integer Ring
Defn: Defined on coordinates by sending (x) to
(x^2/(x^2 + 1))
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2-z^2,2*z^2])
sage: f.dehomogenize(2)
Scheme endomorphism of Affine Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (x0, x1) to
(1/2*x0^2 + 1/2*x1^2, 1/2*x1^2 - 1/2)
sage: R.<t>=PolynomialRing(QQ)
sage: P.<x,y,z>=ProjectiveSpace(FractionField(R),2)
sage: H=Hom(P,P)
sage: f=H([x^2+t*y^2,t*y^2-z^2,t*z^2])
sage: f.dehomogenize(2)
Scheme endomorphism of Affine Space of dimension 2 over Fraction Field
of Univariate Polynomial Ring in t over Rational Field
Defn: Defined on coordinates by sending (x0, x1) to
(1/t*x0^2 + x1^2, x1^2 - 1/t)
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: f.dehomogenize(2)
Scheme endomorphism of Closed subscheme of Affine Space of dimension 2
over Integer Ring defined by:
x0^2 - x1^2
Defn: Defined on coordinates by sending (x0, x1) to
(x1^2/x0, x1^2/x0)
For a map this function computes the dynatomic polynomial.
The dynatomic polynomial is the analog of the cyclotomic polynomial and its roots are the points of formal period
.
ALGORITHM:
For a positive integer , let
be the coordinates of the
iterate of
.
Then construct
where is the Moebius function.
For a pair , let
. Compute
REFERENCES:
INPUT:
OUTPUT:
Todo
Do the division when the base ring is p-adic or a function field so that the output is a polynomial.
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.dynatomic_polynomial(2)
x^2 + x*y + 2*y^2
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,x*y])
sage: f.dynatomic_polynomial(4)
2*x^12 + 18*x^10*y^2 + 57*x^8*y^4 + 79*x^6*y^6 + 48*x^4*y^8 + 12*x^2*y^10 + y^12
sage: P.<x,y>=ProjectiveSpace(CC,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,3*x*y])
sage: f.dynatomic_polynomial(3)
13.0000000000000*x^6 + 117.000000000000*x^4*y^2 +
78.0000000000000*x^2*y^4 + y^6
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2-10/9*y^2,y^2])
sage: f.dynatomic_polynomial([2,1])
x^4*y^2 - 11/9*x^2*y^4 - 80/81*y^6
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2-29/16*y^2,y^2])
sage: f.dynatomic_polynomial([2,3])
x^12 - 95/8*x^10*y^2 + 13799/256*x^8*y^4 - 119953/1024*x^6*y^6 +
8198847/65536*x^4*y^8 - 31492431/524288*x^2*y^10 +
172692729/16777216*y^12
sage: P.<x,y>=ProjectiveSpace(ZZ,1)
sage: H=Hom(P,P)
sage: f=H([x^2-y^2,y^2])
sage: f.dynatomic_polynomial([1,2])
x^2 - x*y
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^3-y^3,3*x*y^2])
sage: f.dynatomic_polynomial([0,4])==f.dynatomic_polynomial(4)
True
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,x*y,z^2])
sage: f.dynatomic_polynomial(2)
Traceback (most recent call last):
...
TypeError: Does not make sense in dimension >1
#TODO: it would be nice to get this to actually be a polynomial
sage: P.<x,y>=ProjectiveSpace(Qp(5),1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.dynatomic_polynomial(2)
(x^4*y + (2 + O(5^20))*x^2*y^3 - x*y^4 + (2 + O(5^20))*y^5)/(x^2*y -
x*y^2 + y^3)
sage: L.<t>=PolynomialRing(QQ)
sage: P.<x,y>=ProjectiveSpace(L,1)
sage: H=Hom(P,P)
sage: f=H([x^2+t*y^2,y^2])
sage: f.dynatomic_polynomial(2)
x^2 + x*y + (t + 1)*y^2
returns True if self is a morphism (no common zero of defining polynomials). The map is a morphism if and only if the ideal generated by the defining polynomials is the unit ideal.
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.is_morphism()
True
sage: P.<x,y,z>=ProjectiveSpace(RR,2)
sage: H=Hom(P,P)
sage: f=H([x*z-y*z,x^2-y^2,z^2])
sage: f.is_morphism()
False
sage: R.<t>=PolynomialRing(GF(5))
sage: P.<x,y,z>=ProjectiveSpace(R,2)
sage: H=Hom(P,P)
sage: f=H([x*z-t*y^2,x^2-y^2,t*z^2])
sage: f.is_morphism()
True
Scales by 1/gcd of the coordinate functions. Also, scales to clear any denominators from the coefficients. This is done in place.
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([5/4*x^3,5*x*y^2])
sage: f.normalize_coordinates(); f
Scheme endomorphism of Projective Space of dimension 1 over Rational
Field
Defn: Defined on coordinates by sending (x : y) to
(x^2 : 4*y^2)
sage: P.<x,y,z>=ProjectiveSpace(GF(7),2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^3+x*y^2,x*y^2,x*z^2])
sage: f.normalize_coordinates(); f
Scheme endomorphism of Closed subscheme of Projective Space of dimension
2 over Finite Field of size 7 defined by:
x^2 - y^2
Defn: Defined on coordinates by sending (x : y : z) to
(2*y^2 : y^2 : z^2)
Note
For a map self and a point in self.domain()
this function returns the nth iterate of
by self. If normalize=True, then the coordinates
are automatically normalized.
Todo
Is there a more efficient way to do this?
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: Q=P(1,1)
sage: f.nth_iterate(Q,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: Q=P(1,1)
sage: f.nth_iterate(Q,4,1)
(1 : 1)
#is this the right behavior?
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: H=Hom(P,P)
sage: f=H([x^2,2*y^2,z^2-x^2])
sage: Q=P(2,7,1)
sage: f.nth_iterate(Q,2)
(-16/7 : -2744 : 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: Q=P(2+t,7,t)
sage: f.nth_iterate(Q,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: f.nth_iterate(X(2,2,3),3)
(256 : 256 : 6561)
sage: K.<c>=FunctionField(QQ)
sage: P.<x,y>=ProjectiveSpace(K,1)
sage: H=Hom(P,P)
sage: f=H([x^3-2*x*y^2 - c*y^3,x*y^2])
sage: f.nth_iterate(P(c,1),2)
((c^6 - 9*c^4 + 25*c^2 - c - 21)/(c^2 - 3) : 1)
For a map self this function returns the nth iterate of self as a function on self.domain()
ALGORITHM:
Uses a form of successive squaring to reducing computations.
Todo
This could be improved.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2])
sage: f.nth_iterate_map(2)
Scheme endomorphism of Projective Space of dimension 1 over Rational
Field
Defn: Defined on coordinates by sending (x : y) to
(x^4 + 2*x^2*y^2 + 2*y^4 : y^4)
sage: P.<x,y>=ProjectiveSpace(CC,1)
sage: H=Hom(P,P)
sage: f=H([x^2-y^2,x*y])
sage: f.nth_iterate_map(3)
Scheme endomorphism of Projective Space of dimension 1 over Complex
Field with 53 bits of precision
Defn: Defined on coordinates by sending (x : y) to
(x^8 + (-7.00000000000000)*x^6*y^2 + 13.0000000000000*x^4*y^4 +
(-7.00000000000000)*x^2*y^6 + y^8 : x^7*y + (-4.00000000000000)*x^5*y^3
+ 4.00000000000000*x^3*y^5 - x*y^7)
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: H=Hom(P,P)
sage: f=H([x^2-y^2,x*y,z^2+x^2])
sage: f.nth_iterate_map(2)
Scheme endomorphism of Projective Space of dimension 2 over Integer Ring
Defn: Defined on coordinates by sending (x : y : z) to
(x^4 - 3*x^2*y^2 + y^4 : x^3*y - x*y^3 : 2*x^4 - 2*x^2*y^2 + y^4
+ 2*x^2*z^2 + z^4)
sage: P.<x,y,z>=ProjectiveSpace(QQ,2)
sage: X=P.subscheme(x*z-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,x*z,z^2])
sage: f.nth_iterate_map(2)
Scheme endomorphism of Closed subscheme of Projective Space of dimension
2 over Rational Field defined by:
-y^2 + x*z
Defn: Defined on coordinates by sending (x : y : z) to
(x^4 : x^2*z^2 : z^4)
Returns the orbit of by self. If
is an integer it returns
.
If
is a list or tuple
it returns
.
Automatically normalize the points if normalize=True. Perform the checks on point initialize 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: f.orbit(P(1,2,1),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: f.orbit(P(1,2,1),[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: f.orbit(X(2,2,3),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: f.orbit(P.point([1,2],False),4,check=False)
[(1 : 2), (5 : 4), (41 : 16), (1937 : 256), (3817505 : 65536)]
sage: K.<c>=FunctionField(QQ)
sage: P.<x,y>=ProjectiveSpace(K,1)
sage: H=Hom(P,P)
sage: f=H([x^2+c*y^2,y^2])
sage: f.orbit(P(0,1),3)
[(0 : 1), (c : 1), (c^2 + c : 1), (c^4 + 2*c^3 + c^2 + c : 1)]
Determines the primes of bad reduction for a map
defined over
or
.
If check is True, each prime is verified to be of bad reduction.
ALGORITHM:
is a prime of bad reduction if and only if the defining polynomials of self
have a common zero. Or stated another way,
is a prime of bad reducion if and only if the
radical of the ideal defined by the defining polynomials of self is not
.
This happens if and only if some power of each
is not in the ideal defined by the defining
polynomials of self. This last condition is what is checked. The lcm of the coefficients of
the monomials
in a groebner basis is computed. This may return extra primes.
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([1/3*x^2+1/2*y^2,y^2])
sage: print f.primes_of_bad_reduction()
[2, 3]
sage: P.<x,y,z,w>=ProjectiveSpace(QQ,3)
sage: H=Hom(P,P)
sage: f=H([12*x*z-7*y^2,31*x^2-y^2,26*z^2,3*w^2-z*w])
sage: f.primes_of_bad_reduction()
[2, 3, 7, 13, 31]
This is an example where check=False returns extra primes
sage: P.<x,y,z>=ProjectiveSpace(ZZ,2)
sage: H=Hom(P,P)
sage: f=H([3*x*y^2 + 7*y^3 - 4*y^2*z + 5*z^3, -5*x^3 + x^2*y + y^3 + 2*x^2*z, -2*x^2*y + x*y^2 + y^3 - 4*y^2*z + x*z^2])
sage: f.primes_of_bad_reduction(False)
[2, 5, 37, 2239, 304432717]
sage: f.primes_of_bad_reduction()
[5, 37, 2239, 304432717]
Computes the resultant of the defining polynomials of self if self is a map on the projective line. If normalize==True, then first normalize the coordinate functions with normalize_coordinates().
INPUT:
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,6*y^2])
sage: f.resultant()
36
sage: R.<t>=PolynomialRing(GF(17))
sage: P.<x,y>=ProjectiveSpace(R,1)
sage: H=Hom(P,P)
sage: f=H([t*x^2+t*y^2,6*y^2])
sage: f.resultant()
2*t^2
Scales each coordinates by a factor of . A TypeError occurs if the point is not in the coordinate_ring of the parent after scaling.
INPUT:
OUTPUT:
EXAMPLES:
sage: A.<x,y>=ProjectiveSpace(QQ,1)
sage: H=Hom(A,A)
sage: f=H([x^3-2*x*y^2,x^2*y])
sage: f.scale_by(1/x)
sage: f
Scheme endomorphism of Projective Space of dimension 1 over Rational
Field
Defn: Defined on coordinates by sending (x : y) to
(x^2 - 2*y^2 : x*y)
sage: R.<t>=PolynomialRing(QQ)
sage: P.<x,y>=ProjectiveSpace(R,1)
sage: H=Hom(P,P)
sage: f=H([3/5*x^2,6*y^2])
sage: f.scale_by(5/3*t); f
Scheme endomorphism of Projective Space of dimension 1 over Univariate
Polynomial Ring in t over Rational Field
Defn: Defined on coordinates by sending (x : y) to
(t*x^2 : 10*t*y^2)
sage: P.<x,y,z>=ProjectiveSpace(GF(7),2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,z^2])
sage: f.scale_by(x-y);f
Scheme endomorphism of Closed subscheme of Projective Space of dimension
2 over Finite Field of size 7 defined by:
x^2 - y^2
Defn: Defined on coordinates by sending (x : y : z) to
(x*y^2 - y^3 : x*y^2 - y^3 : x*z^2 - y*z^2)
Bases: sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space
Place holder
Bases: sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space_field
The Python constructor.
See SchemeMorphism_polynomial for details.
EXAMPLES:
sage: P1.<x,y> = ProjectiveSpace(QQ,1)
sage: H = P1.Hom(P1)
sage: H([y,2*x])
Scheme endomorphism of Projective Space of dimension 1 over Rational Field
Defn: Defined on coordinates by sending (x : y) to
(y : 2*x)
returns Digraph of all orbits of self mod . For subschemes, only points on the subscheme whose
image are also on the subscheme are in the digraph.
OUTPUT:
EXAMPLES:
sage: P.<x,y>=ProjectiveSpace(GF(13),1)
sage: H=Hom(P,P)
sage: f=H([x^2-y^2,y^2])
sage: f.cyclegraph()
Looped digraph on 14 vertices
sage: P.<x,y,z>=ProjectiveSpace(GF(5^2,'t'),2)
sage: H=Hom(P,P)
sage: f=H([x^2+y^2,y^2,z^2+y*z])
sage: f.cyclegraph()
Looped digraph on 651 vertices
sage: P.<x,y,z>=ProjectiveSpace(GF(7),2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,z^2])
sage: f.cyclegraph()
Looped digraph on 15 vertices
Every point is preperiodic over a finite field. This funtion returns the pair where
is the
preperiod and
the period of the point P by self.
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: f.orbit_structure(P(2,1,2))
[0, 6]
sage: P.<x,y,z>=ProjectiveSpace(GF(7),2)
sage: X=P.subscheme(x^2-y^2)
sage: H=Hom(X,X)
sage: f=H([x^2,y^2,z^2])
sage: f.orbit_structure(X(1,1,2))
[0, 2]
sage: P.<x,y>=ProjectiveSpace(GF(13),1)
sage: H=Hom(P,P)
sage: f=H([x^2-y^2,y^2])
sage: f.orbit_structure(P(3,4))
[2, 3]