Morphisms on projective varieties

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.

  • Ben Hutz: (March 2013) iteration functionality and new directory structure

    for affine/projective

class sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space(parent, polys, check=True)

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
conjugate(M)

Conjugates self by M, i.e. M^{-1} \circ f \circ M. 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:

  • M – a square invertible matrix

OUTPUT:

  • a map from self.domain() to self.codomain().

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

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:

  • A positive integer

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
dehomogenize(n)

Returns the standard dehomogenization at the nth coordinate (\frac{self[0]}{self[n]},\frac{self[1]}{self[n]},...). Note that the new function is defined over the fraction field of the base ring of self.

INPUT:

  • n – a nonnegative integer

OUTPUT:

  • SchemeMorpism_polynomial_affine_space (on nth affine patch)

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)
dynatomic_polynomial(period)

For a map f:\mathbb{P}^1 \to \mathbb{P}^1 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 n.

ALGORITHM:

For a positive integer n, let [F_n,G_n] be the coordinates of the nth iterate of f. Then construct

\Phi^{\ast}_n(f)(x,y) = \sum_{d \mid n} (yF_d(x,y) - xG_d(x,y))^{\mu(n/d)}

where \mu is the Moebius function.

For a pair [m,n], let f^m = [F_m,G_m]. Compute

\Phi^{\ast}_{m,n}(f)(x,y) = \Phi^{\ast}_n(f)(F_m,G_m)/\Phi^{\ast}_n(f)(F_{m-1},G_{m-1})

REFERENCES:

    1. Hutz. Efficient determination of rational preperiodic points for endomorphisms of projective space. arxiv:1210.6246, 2012.
    1. Morton and P. Patel. The Galois theory of periodic points of polynomial maps. Proc. London Math. Soc., 68 (1994), 225-263.

INPUT:

  • period – a positive integer or a list/tuple [m,n] where m is the preperiod and n is the period

OUTPUT:

  • If possible, a two variable polynomial in the coordinate ring of self. Otherwise a fraction field element of the coordinate ring of self

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
::
sage: K.<c>=PolynomialRing(ZZ) sage: P.<x,y>=ProjectiveSpace(K,1) sage: H=Hom(P,P) sage: f=H([x^2+ c*y^2,y^2]) sage: f.dynatomic_polynomial([1,2]) x^2 - x*y + (c + 1)*y^2
is_morphism()

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:

  • Boolean

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

Scales by 1/gcd of the coordinate functions. Also, scales to clear any denominators from the coefficients. This is done in place.

OUTPUT:

  • None.

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

  • gcd raises an error if the base_ring does not support gcds.
nth_iterate(P, n, normalize=False)

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.

Todo

Is there a more efficient way to do this?

INPUT:

  • P – a point in self.domain()
  • n – a positive integer.
  • normalize - Boolean (optional Default: False)

OUTPUT:

  • A point in self.codomain()

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)
nth_iterate_map(n)

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:

  • n – a positive integer.

OUTPUT:

  • A map between projective spaces

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)
orbit(P, N, **kwds)

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 initialize if check=True

INPUT:

  • P – a point in self.domain()
  • n – a non-negative integer or list or tuple of two non-negative integers

kwds:

  • check – boolean (optional - default: True)
  • normalize – boolean (optional - default: False)

OUTPUT:

  • a list of points in self.codomain()

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)]
primes_of_bad_reduction(check=True)

Determines the primes of bad reduction for a map self: \mathbb{P}^N \to \mathbb{P}^N defined over \ZZ or \QQ.

If check is True, each prime is verified to be of bad reduction.

ALGORITHM:

p is a prime of bad reduction if and only if the defining polynomials of self have a common zero. Or stated another way, p is a prime of bad reducion if and only if the radical of the ideal defined by the defining polynomials of self is not (x_0,x_1,\ldots,x_N). This happens if and only if some power of each x_i 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 x_i in a groebner basis is computed. This may return extra primes.

INPUT:

  • check – Boolean (optional - default: True)

OUTPUT:

  • a list of integer primes.

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]
resultant(normalize=False)

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:

  • normalize – Boolean (optional - default: False)

OUTPUT:

  • an element of self.codomain().base_ring()

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
scale_by(t)

Scales each coordinates by a factor of t. A TypeError occurs if the point is not in the coordinate_ring of the parent after scaling.

INPUT:

  • t – a ring element

OUTPUT:

  • None.

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)
class sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space_field(parent, polys, check=True)

Bases: sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space

Place holder

class sage.schemes.projective.projective_morphism.SchemeMorphism_polynomial_projective_space_finite_field(parent, polys, check=True)

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

returns Digraph of all orbits of self mod p. For subschemes, only points on the subscheme whose image are also on the subscheme are in the digraph.

OUTPUT:

  • a digraph

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
orbit_structure(P)

Every point is preperiodic over a finite field. This funtion returns the pair [m,n] where m is the preperiod and n the period of the point P by self.

INPUT:

  • P – a point in self.domain()

OUTPUT:

  • a list [m,n] of integers

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]

Previous topic

Points on projective varieties

Next topic

Enumeration of rational points on projective schemes

This Page