Dynamical systems on projective schemes

A dynamical system of projective schemes determined by homogeneous polynomials functions that define what the morphism does on points in the ambient projective space.

The main constructor functions are given by DynamicalSystem and DynamicalSystem_projective. The constructors function can take either polynomials or a morphism from which to construct a dynamical system. If the domain is not specified, it is constructed. However, if you plan on working with points or subvarieties in the domain, it recommended to specify the domain.

The initialization checks are always performed by the constructor functions. It is possible, but not recommended, to skip these checks by calling the class initialization directly.

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 (2013-03) iteration functionality and new directory structure for affine/projective, height functionality

  • Brian Stout, Ben Hutz (Nov 2013) - added minimal model functionality

  • Dillon Rose (2014-01): Speed enhancements

  • Ben Hutz (2015-11): iteration of subschemes

  • Ben Hutz (2017-7): relocate code and create class

class sage.dynamics.arithmetic_dynamics.projective_ds.DynamicalSystem_projective(polys, domain)[source]

Bases: SchemeMorphism_polynomial_projective_space, DynamicalSystem

A dynamical system of projective schemes determined by homogeneous polynomials that define what the morphism does on points in the ambient projective space.

Warning

You should not create objects of this class directly because no type or consistency checking is performed. The preferred method to construct such dynamical systems is to use DynamicalSystem_projective() function

INPUT:

  • morphism_or_polys – a SchemeMorphism, a polynomial, a rational function, or a list or tuple of homogeneous polynomials

  • domain – (optional) projective space or projective subscheme

  • names – tuple of strings (default: 'X','Y') to be used as coordinate names for a projective space that is constructed

    The following combinations of morphism_or_polys and domain are meaningful:

    • morphism_or_polys is a SchemeMorphism; domain is ignored in this case.

    • morphism_or_polys is a list of homogeneous polynomials that define a rational endomorphism of domain.

    • morphism_or_polys is a list of homogeneous polynomials and domain is unspecified; domain is then taken to be the projective space of appropriate dimension over the common base ring, if one exists, of the elements of morphism_or_polys.

    • morphism_or_polys is a single polynomial or rational function; domain is ignored and taken to be a 1-dimensional projective space over the base ring of morphism_or_polys with coordinate names given by names.

OUTPUT: DynamicalSystem_projective

EXAMPLES:

sage: P1.<x,y> = ProjectiveSpace(QQ,1)
sage: DynamicalSystem_projective([y, 2*x])
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (y : 2*x)
>>> from sage.all import *
>>> P1 = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P1._first_ngens(2)
>>> DynamicalSystem_projective([y, Integer(2)*x])
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (y : 2*x)

We can define dynamical systems on \(P^1\) by giving a polynomial or rational function:

sage: R.<t> = QQ[]
sage: DynamicalSystem_projective(t^2 - 3)
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 - 3*Y^2 : Y^2)
sage: DynamicalSystem_projective(1/t^2)
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (Y^2 : X^2)
>>> from sage.all import *
>>> R = QQ['t']; (t,) = R._first_ngens(1)
>>> DynamicalSystem_projective(t**Integer(2) - Integer(3))
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 - 3*Y^2 : Y^2)
>>> DynamicalSystem_projective(Integer(1)/t**Integer(2))
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (Y^2 : X^2)

sage: R.<x> = PolynomialRing(QQ,1)
sage: DynamicalSystem_projective(x^2, names=['a','b'])
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (a : b) to
        (a^2 : b^2)
>>> from sage.all import *
>>> R = PolynomialRing(QQ,Integer(1), names=('x',)); (x,) = R._first_ngens(1)
>>> DynamicalSystem_projective(x**Integer(2), names=['a','b'])
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (a : b) to
        (a^2 : b^2)

Symbolic Ring elements are not allowed:

sage: x,y = var('x,y')                                                          # needs sage.symbolic
sage: DynamicalSystem_projective([x^2, y^2])                                    # needs sage.symbolic
Traceback (most recent call last):
...
ValueError: [x^2, y^2] must be elements of a polynomial ring
>>> from sage.all import *
>>> x,y = var('x,y')                                                          # needs sage.symbolic
>>> DynamicalSystem_projective([x**Integer(2), y**Integer(2)])                                    # needs sage.symbolic
Traceback (most recent call last):
...
ValueError: [x^2, y^2] must be elements of a polynomial ring

sage: R.<x> = PolynomialRing(QQ,1)
sage: DynamicalSystem_projective(x^2)
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 : Y^2)
>>> from sage.all import *
>>> R = PolynomialRing(QQ,Integer(1), names=('x',)); (x,) = R._first_ngens(1)
>>> DynamicalSystem_projective(x**Integer(2))
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 : Y^2)

sage: R.<t> = PolynomialRing(QQ)
sage: P.<x,y,z> = ProjectiveSpace(R, 2)
sage: X = P.subscheme([x])
sage: DynamicalSystem_projective([x^2, t*y^2, x*z], domain=X)
Dynamical System of Closed subscheme of Projective Space of dimension
2 over Univariate Polynomial Ring in t over Rational Field defined by:
  x
  Defn: Defined on coordinates by sending (x : y : z) to
        (x^2 : t*y^2 : x*z)
>>> from sage.all import *
>>> R = PolynomialRing(QQ, names=('t',)); (t,) = R._first_ngens(1)
>>> P = ProjectiveSpace(R, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme([x])
>>> DynamicalSystem_projective([x**Integer(2), t*y**Integer(2), x*z], domain=X)
Dynamical System of Closed subscheme of Projective Space of dimension
2 over Univariate Polynomial Ring in t over Rational Field defined by:
  x
  Defn: Defined on coordinates by sending (x : y : z) to
        (x^2 : t*y^2 : x*z)

When elements of the quotient ring are used, they are reduced:

sage: P.<x,y,z> = ProjectiveSpace(CC, 2)
sage: X = P.subscheme([x - y])
sage: u,v,w = X.coordinate_ring().gens()                                        # needs sage.rings.function_field
sage: DynamicalSystem_projective([u^2, v^2, w*u], domain=X)                     # needs sage.rings.function_field
Dynamical System of Closed subscheme of Projective Space of dimension
2 over Complex Field with 53 bits of precision defined by:
  x - y
  Defn: Defined on coordinates by sending (x : y : z) to
        (y^2 : y^2 : y*z)
>>> from sage.all import *
>>> P = ProjectiveSpace(CC, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme([x - y])
>>> u,v,w = X.coordinate_ring().gens()                                        # needs sage.rings.function_field
>>> DynamicalSystem_projective([u**Integer(2), v**Integer(2), w*u], domain=X)                     # needs sage.rings.function_field
Dynamical System of Closed subscheme of Projective Space of dimension
2 over Complex Field with 53 bits of precision defined by:
  x - y
  Defn: Defined on coordinates by sending (x : y : z) to
        (y^2 : y^2 : y*z)

We can also compute the forward image of subschemes through elimination. In particular, let \(X = V(h_1,\ldots, h_t)\) and define the ideal \(I = (h_1,\ldots,h_t,y_0-f_0(\bar{x}), \ldots, y_n-f_n(\bar{x}))\). Then the elimination ideal \(I_{n+1} = I \cap K[y_0,\ldots,y_n]\) is a homogeneous ideal and \(f(X) = V(I_{n+1})\):

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([(x-2*y)^2, (x-2*z)^2, x^2])
sage: X = P.subscheme(y - z)
sage: f(f(f(X)))                                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 2 over Rational Field
defined by:
  y - z
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([(x-Integer(2)*y)**Integer(2), (x-Integer(2)*z)**Integer(2), x**Integer(2)])
>>> X = P.subscheme(y - z)
>>> f(f(f(X)))                                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 2 over Rational Field
defined by:
  y - z

sage: P.<x,y,z,w> = ProjectiveSpace(QQ, 3)
sage: f = DynamicalSystem_projective([(x-2*y)^2, (x-2*z)^2, (x-2*w)^2, x^2])
sage: f(P.subscheme([x, y, z]))                                                 # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 3 over Rational Field
defined by:
  w,
  y,
  x
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(3), names=('x', 'y', 'z', 'w',)); (x, y, z, w,) = P._first_ngens(4)
>>> f = DynamicalSystem_projective([(x-Integer(2)*y)**Integer(2), (x-Integer(2)*z)**Integer(2), (x-Integer(2)*w)**Integer(2), x**Integer(2)])
>>> f(P.subscheme([x, y, z]))                                                 # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 3 over Rational Field
defined by:
  w,
  y,
  x

sage: T.<x,y,z,w,u> = ProductProjectiveSpaces([2, 1], QQ)
sage: DynamicalSystem_projective([x^2*u, y^2*w, z^2*u, w^2, u^2], domain=T)
Dynamical System of Product of projective spaces P^2 x P^1 over Rational Field
  Defn: Defined by sending (x : y : z , w : u) to
        (x^2*u : y^2*w : z^2*u , w^2 : u^2).
>>> from sage.all import *
>>> T = ProductProjectiveSpaces([Integer(2), Integer(1)], QQ, names=('x', 'y', 'z', 'w', 'u',)); (x, y, z, w, u,) = T._first_ngens(5)
>>> DynamicalSystem_projective([x**Integer(2)*u, y**Integer(2)*w, z**Integer(2)*u, w**Integer(2), u**Integer(2)], domain=T)
Dynamical System of Product of projective spaces P^2 x P^1 over Rational Field
  Defn: Defined by sending (x : y : z , w : u) to
        (x^2*u : y^2*w : z^2*u , w^2 : u^2).

sage: # needs sage.rings.number_field
sage: K.<v> = QuadraticField(-7)
sage: P.<x,y> = ProjectiveSpace(K, 1)
sage: f = DynamicalSystem([x^3 + v*x*y^2, y^3])
sage: fbar = f.change_ring(QQbar)
sage: fbar.is_postcritically_finite()
False
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = QuadraticField(-Integer(7), names=('v',)); (v,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([x**Integer(3) + v*x*y**Integer(2), y**Integer(3)])
>>> fbar = f.change_ring(QQbar)
>>> fbar.is_postcritically_finite()
False
Lattes_to_curve(return_conjugation=False, check_lattes=False)[source]

Finds a Short Weierstrass Model Elliptic curve of self self assumed to be Lattes map and not in charateristic 2 or 3

INPUT:

\(return_conjugation`\) – (default: False) if True, then return the conjugation that moves self to a map that comes from a Short Weierstrass Model Elliptic curve \(check_lattes`\).-.(default:.``False``) if True, then will ValueError if not Lattes

OUTPUT: a Short Weierstrass Model Elliptic curve which is isogenous to the Elliptic curve of ‘self’, If return_conjugation is True then also returns conjugation of ‘self’ to short form as a matrix

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = P.Lattes_map(EllipticCurve([0, 0, 0, 10, 2]), 2)
sage: f.Lattes_to_curve()
Elliptic Curve defined by y^2 = x^3 + 10*x + 2 over Rational Field
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = P.Lattes_map(EllipticCurve([Integer(0), Integer(0), Integer(0), Integer(10), Integer(2)]), Integer(2))
>>> f.Lattes_to_curve()
Elliptic Curve defined by y^2 = x^3 + 10*x + 2 over Rational Field

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: M = matrix(QQ,2,2,[[1,2],[-1,2]])
sage: f = P.Lattes_map(EllipticCurve([1, 1, 1, 1, 2]), 2)
sage: f = f.conjugate(M)
sage: f.Lattes_to_curve(return_conjugation = True)
(
[  -7/36*a^2 + 7/12*a + 7/3 -17/18*a^2 + 17/6*a + 34/3]
[    -1/8*a^2 + 1/4*a + 3/2        1/4*a^2 - 1/2*a - 3],
Elliptic Curve defined by y^2 = x^3 + (-94/27*a^2+94/9*a+376/9)*x +
12232/243 over Number Field in a with defining polynomial y^3 - 18*y - 30
)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> M = matrix(QQ,Integer(2),Integer(2),[[Integer(1),Integer(2)],[-Integer(1),Integer(2)]])
>>> f = P.Lattes_map(EllipticCurve([Integer(1), Integer(1), Integer(1), Integer(1), Integer(2)]), Integer(2))
>>> f = f.conjugate(M)
>>> f.Lattes_to_curve(return_conjugation = True)
(
[  -7/36*a^2 + 7/12*a + 7/3 -17/18*a^2 + 17/6*a + 34/3]
[    -1/8*a^2 + 1/4*a + 3/2        1/4*a^2 - 1/2*a - 3],
Elliptic Curve defined by y^2 = x^3 + (-94/27*a^2+94/9*a+376/9)*x +
12232/243 over Number Field in a with defining polynomial y^3 - 18*y - 30
)

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = P.Lattes_map(EllipticCurve([1, 1, 1, 2, 2]), 2)
sage: L.<i> = CyclotomicField(4)
sage: M = Matrix([[1+i,2*i], [0, -i]])
sage: f = f.conjugate(M)
sage: f.Lattes_to_curve(return_conjugation = True)
(
[              1 19/24*a + 19/24]
[              0               1],
Elliptic Curve defined by y^2 = x^3 + 95/96*a*x + (-1169/3456*a+1169/3456)
over Number Field in a with defining polynomial y^2 + 1
)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = P.Lattes_map(EllipticCurve([Integer(1), Integer(1), Integer(1), Integer(2), Integer(2)]), Integer(2))
>>> L = CyclotomicField(Integer(4), names=('i',)); (i,) = L._first_ngens(1)
>>> M = Matrix([[Integer(1)+i,Integer(2)*i], [Integer(0), -i]])
>>> f = f.conjugate(M)
>>> f.Lattes_to_curve(return_conjugation = True)
(
[              1 19/24*a + 19/24]
[              0               1],
Elliptic Curve defined by y^2 = x^3 + 95/96*a*x + (-1169/3456*a+1169/3456)
over Number Field in a with defining polynomial y^2 + 1
)

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: M = matrix(QQ,2,2,[[1,3],[2,1]])
sage: E = EllipticCurve([1, 1, 1, 2, 3])
sage: f = P.Lattes_map(E, 2)
sage: f = f.conjugate(M)
sage: f.Lattes_to_curve(return_conjugation = True)
(
[11/1602*a^2 41/3204*a^2]
[     -2/5*a      -1/5*a],
Elliptic Curve defined by y^2 = x^3 + 2375/3421872*a^2*x + (-254125/61593696)
over Number Field in a with defining polynomial y^3 - 267
)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> M = matrix(QQ,Integer(2),Integer(2),[[Integer(1),Integer(3)],[Integer(2),Integer(1)]])
>>> E = EllipticCurve([Integer(1), Integer(1), Integer(1), Integer(2), Integer(3)])
>>> f = P.Lattes_map(E, Integer(2))
>>> f = f.conjugate(M)
>>> f.Lattes_to_curve(return_conjugation = True)
(
[11/1602*a^2 41/3204*a^2]
[     -2/5*a      -1/5*a],
Elliptic Curve defined by y^2 = x^3 + 2375/3421872*a^2*x + (-254125/61593696)
over Number Field in a with defining polynomial y^3 - 267
)

sage: P.<x,y> = ProjectiveSpace(QQ , 1)
sage: M = matrix(QQ,2,2,[[1 , 3],[2 , 1]])
sage: E = EllipticCurve([1, 1, 1, 2, 3])
sage: f = P.Lattes_map(E , 2)
sage: f = f.conjugate(M)
sage: m,H = f.Lattes_to_curve(true)
sage: J.<x,y> = ProjectiveSpace(H.base_ring(), 1)
sage: K = J.Lattes_map(H,2)
sage: K = K.conjugate(m)
sage: K.scale_by(f[0].lc()/K[0].lc())
sage: K == f.change_ring(K.base_ring())
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ , Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> M = matrix(QQ,Integer(2),Integer(2),[[Integer(1) , Integer(3)],[Integer(2) , Integer(1)]])
>>> E = EllipticCurve([Integer(1), Integer(1), Integer(1), Integer(2), Integer(3)])
>>> f = P.Lattes_map(E , Integer(2))
>>> f = f.conjugate(M)
>>> m,H = f.Lattes_to_curve(true)
>>> J = ProjectiveSpace(H.base_ring(), Integer(1), names=('x', 'y',)); (x, y,) = J._first_ngens(2)
>>> K = J.Lattes_map(H,Integer(2))
>>> K = K.conjugate(m)
>>> K.scale_by(f[Integer(0)].lc()/K[Integer(0)].lc())
>>> K == f.change_ring(K.base_ring())
True

sage: P.<x,y> = ProjectiveSpace(RR, 1)
sage: F = DynamicalSystem_projective([x^4, y^4])
sage: F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
NotImplementedError: Base ring must be a number field
>>> from sage.all import *
>>> P = ProjectiveSpace(RR, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(4), y**Integer(4)])
>>> F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
NotImplementedError: Base ring must be a number field

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^4, y^4])
sage: F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
ValueError: Map is not Lattes
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(4), y**Integer(4)])
>>> F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
ValueError: Map is not Lattes

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^4, y^4])
sage: F.Lattes_to_curve()
Traceback (most recent call last):
...
ValueError: No Solutions found. Check if map is Lattes
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(4), y**Integer(4)])
>>> F.Lattes_to_curve()
Traceback (most recent call last):
...
ValueError: No Solutions found. Check if map is Lattes

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^3, y^3])
sage: F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
NotImplementedError: Map is not Lattes or is Complex Lattes
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(3), y**Integer(3)])
>>> F.Lattes_to_curve(check_lattes=True)
Traceback (most recent call last):
...
NotImplementedError: Map is not Lattes or is Complex Lattes

sage: K.<x>=QuadraticField(2)
sage: P.<a,y>=ProjectiveSpace(K, 1)
sage: E=EllipticCurve([1, x])
sage: f=P.Lattes_map(E, 2)
sage: f.Lattes_to_curve()
Elliptic Curve defined by y^2 = x^3 + x + a
over Number Field in a with defining polynomial y^2 - 2
>>> from sage.all import *
>>> K = QuadraticField(Integer(2), names=('x',)); (x,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(1), names=('a', 'y',)); (a, y,) = P._first_ngens(2)
>>> E=EllipticCurve([Integer(1), x])
>>> f=P.Lattes_map(E, Integer(2))
>>> f.Lattes_to_curve()
Elliptic Curve defined by y^2 = x^3 + x + a
over Number Field in a with defining polynomial y^2 - 2

sage: P.<x,y>=ProjectiveSpace(QQbar, 1)
sage: E=EllipticCurve([1, 2])
sage: f=P.Lattes_map(E, 2)
sage: f.Lattes_to_curve(check_lattes=true)
Elliptic Curve defined by y^2 = x^3 + x + 2 over Rational Field
>>> from sage.all import *
>>> P = ProjectiveSpace(QQbar, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> E=EllipticCurve([Integer(1), Integer(2)])
>>> f=P.Lattes_map(E, Integer(2))
>>> f.Lattes_to_curve(check_lattes=true)
Elliptic Curve defined by y^2 = x^3 + x + 2 over Rational Field
affine_preperiodic_model(m, n, return_conjugation=False)[source]

Return a dynamical system conjugate to this one with affine (n, m) preperiodic points.

If the base ring of this dynamical system is finite, there may not be a model with affine preperiodic points, in which case a ValueError is raised.

INPUT:

  • m – the preperiod of the preperiodic points to make affine

  • n – the period of the preperiodic points to make affine

  • return_conjugation – boolean (default: False); if True, return a tuple (g, phi) where g is a model with affine (n, m) preperiodic points and phi is the matrix that moves f to g.

OUTPUT: a dynamical system conjugate to this one

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([x^2, y^2, z^2])
sage: g = f.affine_preperiodic_model(0, 1); g                               # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2 over Rational Field
  Defn: Defined on coordinates by sending (x : y : z) to
        (-x^2 : -2*x^2 + 2*x*y - y^2 : 2*x^2 - 2*x*y + 2*y^2 + 2*y*z + z^2)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), z**Integer(2)])
>>> g = f.affine_preperiodic_model(Integer(0), Integer(1)); g                               # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2 over Rational Field
  Defn: Defined on coordinates by sending (x : y : z) to
        (-x^2 : -2*x^2 + 2*x*y - y^2 : 2*x^2 - 2*x*y + 2*y^2 + 2*y*z + z^2)

We can check that g has affine fixed points:

sage: g.periodic_points(1)                                                  # needs sage.rings.function_field
[(-1 : -1 : 1),
 (-1/2 : -1 : 1),
 (-1/2 : -1/2 : 1),
 (-1/3 : -2/3 : 1),
 (0 : -1 : 1),
 (0 : -1/2 : 1),
 (0 : 0 : 1)]
>>> from sage.all import *
>>> g.periodic_points(Integer(1))                                                  # needs sage.rings.function_field
[(-1 : -1 : 1),
 (-1/2 : -1 : 1),
 (-1/2 : -1/2 : 1),
 (-1/3 : -2/3 : 1),
 (0 : -1 : 1),
 (0 : -1/2 : 1),
 (0 : 0 : 1)]

sage: # needs sage.rings.finite_rings
sage: P.<x,y,z> = ProjectiveSpace(GF(9), 2)
sage: f = DynamicalSystem_projective([x^2, y^2, z^2])
sage: f.affine_preperiodic_model(0, 1)                                      # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2
 over Finite Field in z2 of size 3^2
  Defn: Defined on coordinates by sending (x : y : z) to
        ((-z2)*x^2 : z2*x^2 + (-z2)*x*y + (-z2)*y^2 :
         (-z2)*x^2 + z2*x*y + (z2 + 1)*y^2 - y*z + z^2)
>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> P = ProjectiveSpace(GF(Integer(9)), Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), z**Integer(2)])
>>> f.affine_preperiodic_model(Integer(0), Integer(1))                                      # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2
 over Finite Field in z2 of size 3^2
  Defn: Defined on coordinates by sending (x : y : z) to
        ((-z2)*x^2 : z2*x^2 + (-z2)*x*y + (-z2)*y^2 :
         (-z2)*x^2 + z2*x*y + (z2 + 1)*y^2 - y*z + z^2)

sage: R.<c> = GF(3)[]
sage: P.<x,y,z> = ProjectiveSpace(R, 2)
sage: f = DynamicalSystem_projective([x^2, y^2, z^2])
sage: f.affine_preperiodic_model(0, 1)  # long time
Dynamical System of Projective Space of dimension 2 over
 Univariate Polynomial Ring in c over Finite Field of size 3
  Defn: Defined on coordinates by sending (x : y : z) to
        (2*c^3*x^2 : c^3*x^2 + 2*c^3*x*y + 2*c^3*y^2 :
         2*c^3*x^2 + c^3*x*y + (c^3 + c^2)*y^2 + 2*c^2*y*z + c^2*z^2)
>>> from sage.all import *
>>> R = GF(Integer(3))['c']; (c,) = R._first_ngens(1)
>>> P = ProjectiveSpace(R, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), z**Integer(2)])
>>> f.affine_preperiodic_model(Integer(0), Integer(1))  # long time
Dynamical System of Projective Space of dimension 2 over
 Univariate Polynomial Ring in c over Finite Field of size 3
  Defn: Defined on coordinates by sending (x : y : z) to
        (2*c^3*x^2 : c^3*x^2 + 2*c^3*x*y + 2*c^3*y^2 :
         2*c^3*x^2 + c^3*x*y + (c^3 + c^2)*y^2 + 2*c^2*y*z + c^2*z^2)

sage: # needs sage.rings.number_field
sage: K.<k> = CyclotomicField(3)
sage: P.<x,y,z> = ProjectiveSpace(K, 2)
sage: f = DynamicalSystem_projective([x^2 + k*x*y + y^2, z^2, y^2])
sage: f.affine_preperiodic_model(1, 1)                                      # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2
 over Cyclotomic Field of order 3 and degree 2
  Defn: Defined on coordinates by sending (x : y : z) to
        (-y^2 : x^2 : x^2 + (-k)*x*z + z^2)
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = CyclotomicField(Integer(3), names=('k',)); (k,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + k*x*y + y**Integer(2), z**Integer(2), y**Integer(2)])
>>> f.affine_preperiodic_model(Integer(1), Integer(1))                                      # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 2
 over Cyclotomic Field of order 3 and degree 2
  Defn: Defined on coordinates by sending (x : y : z) to
        (-y^2 : x^2 : x^2 + (-k)*x*z + z^2)

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: g, mat = f.affine_preperiodic_model(0, 1, return_conjugation=True)    # needs sage.rings.function_field
sage: g == f.conjugate(mat)                                                 # needs sage.rings.function_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> g, mat = f.affine_preperiodic_model(Integer(0), Integer(1), return_conjugation=True)    # needs sage.rings.function_field
>>> g == f.conjugate(mat)                                                 # needs sage.rings.function_field
True

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: X = P.subscheme(2*y - z)
sage: f = DynamicalSystem_projective([x^2 + y^2, z^2 + y^2, z^2], domain=X)
sage: f.affine_preperiodic_model(0, 1)                                      # needs sage.rings.function_field
Dynamical System of Closed subscheme of Projective Space of dimension 2
 over Rational Field defined by: 2*y - z
  Defn: Defined on coordinates by sending (x : y : z) to
        (-x^2 - y^2 : y^2 : x^2 + z^2)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(Integer(2)*y - z)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), z**Integer(2) + y**Integer(2), z**Integer(2)], domain=X)
>>> f.affine_preperiodic_model(Integer(0), Integer(1))                                      # needs sage.rings.function_field
Dynamical System of Closed subscheme of Projective Space of dimension 2
 over Rational Field defined by: 2*y - z
  Defn: Defined on coordinates by sending (x : y : z) to
        (-x^2 - y^2 : y^2 : x^2 + z^2)
all_minimal_models(return_transformation=False, prime_list=None, algorithm=None, check_minimal=True)[source]

Determine a representative in each \(SL(2,\ZZ)\)-orbit of this map.

This can be done either with the Bruin-Molnar algorithm or the Hutz-Stoll algorithm. The Hutz-Stoll algorithm requires the map to have minimal resultant and then finds representatives in orbits with minimal resultant. The Bruin-Molnar algorithm finds representatives with the same resultant (up to sign) of the given map.

Bruin-Molnar does not work for polynomials and is more efficient for large primes.

INPUT:

  • return_transformation – boolean (default: False); this signals a return of the \(PGL_2\) transformation to conjugate this map to the calculated models

  • prime_list – (optional) a list of primes, in case one only wants to determine minimality at those specific primes

  • algorithm – (optional) string; can be one of the following:

    • 'BM' – the Bruin-Molnar algorithm [BM2012]

    • 'HS' – for the Hutz-Stoll algorithm [HS2018]

    if not specified, properties of the map are utilized to choose

  • check_minimal – (optional) boolean; to first check if the map is minimal and if not, compute a minimal model before computing for orbit representatives

OUTPUT:

A list of pairs \((F,m)\), where \(F\) is dynamical system on the projective line and \(m\) is the associated \(PGL(2,\QQ)\) element. Or just a list of dynamical systems if not returning the conjugation.

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem([2*x^2, 3*y^2])
sage: f.all_minimal_models()                                                # needs sage.rings.function_field
[Dynamical System of Projective Space of dimension 1 over Rational Field
   Defn: Defined on coordinates by sending (x : y) to
         (x^2 : y^2)]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([Integer(2)*x**Integer(2), Integer(3)*y**Integer(2)])
>>> f.all_minimal_models()                                                # needs sage.rings.function_field
[Dynamical System of Projective Space of dimension 1 over Rational Field
   Defn: Defined on coordinates by sending (x : y) to
         (x^2 : y^2)]

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: c = 2*3^6
sage: f = DynamicalSystem([x^3 - c^2*y^3, x*y^2])
sage: len(f.all_minimal_models(algorithm='HS'))                             # needs sage.rings.function_field
14
sage: len(f.all_minimal_models(prime_list=[2], algorithm='HS'))             # needs sage.rings.function_field
2
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> c = Integer(2)*Integer(3)**Integer(6)
>>> f = DynamicalSystem([x**Integer(3) - c**Integer(2)*y**Integer(3), x*y**Integer(2)])
>>> len(f.all_minimal_models(algorithm='HS'))                             # needs sage.rings.function_field
14
>>> len(f.all_minimal_models(prime_list=[Integer(2)], algorithm='HS'))             # needs sage.rings.function_field
2

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem([237568*x^3 + 1204224*x^2*y + 2032560*x*y^2
....:     + 1142289*y^3, -131072*x^3 - 663552*x^2*y - 1118464*x*y^2
....:     - 627664*y^3])
sage: len(f.all_minimal_models(algorithm='BM'))                             # needs sage.rings.function_field
2
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([Integer(237568)*x**Integer(3) + Integer(1204224)*x**Integer(2)*y + Integer(2032560)*x*y**Integer(2)
...     + Integer(1142289)*y**Integer(3), -Integer(131072)*x**Integer(3) - Integer(663552)*x**Integer(2)*y - Integer(1118464)*x*y**Integer(2)
...     - Integer(627664)*y**Integer(3)])
>>> len(f.all_minimal_models(algorithm='BM'))                             # needs sage.rings.function_field
2

REFERENCES:

arakelov_zhang_pairing(g, **kwds)[source]

Return an estimate of the Arakelov-Zhang pairing of the rational maps self and g on \(\mathbb{P}^1\) over a number field.

The Arakelov-Zhang pairing was introduced by Petsche, Szpiro, and Tucker in 2012, which measures the dynamical closeness of two rational maps. They prove inter alia that if one takes a sequence of small points for one map (for example, preperiodic points for self) and measure their dynamical height with respect to the other map (say, g), then the values of the height will tend to the value of the Arakelov-Zhang pairing.

The Arakelov-Zhang pairing involves mutual energy integrals between dynamical measures, which are in the case of polynomials, the equilibrium measures of the associated Julia sets at each place. As a result, these pairings are very difficult to compute exactly via analytic methods. We use a discrete approximation to these energy integrals.

ALGORITHM:

We select periodic points of order \(n\), or n-th preimages of a specified starting value given by f_starting_point and g_starting_point. At the archimedean places and the places of bad reduction of the two maps, we compute the discrete approximations to the energy integrals involved using these points.

INPUT:

  • g – a rational map of \(\mathbb{P}^1\) given as a projective morphism g and self should have the same field of definition

kwds:

  • n – positive integer (default: 5); order of periodic points to use or preimages to take if starting points are specified

  • f_starting_point – (default: None) value in the base number field or None. If f_starting_point is None, we solve for points of period n for self. Otherwise, we take n-th preimages of the point given by f_starting_point under f on the affine line.

  • g_starting_point – (default: None) value in the base number field or None. If g_starting_point is None, we solve for points of period n for g. Otherwise, we take n-th preimages of the point given by g_starting_point under g on the affine line.

  • check_primes_of_bad_reduction – boolean (default: False); passed to the primes_of_bad_reduction function for self and g

  • prec – (default: RealField default); default precision for RealField values which are returned

  • noise_multiplier – (default: 2) a real number. Discriminant terms involved in the computation at the archimedean places are often not needed, particularly if the capacity of the Julia sets is 1, and introduce a lot of error. By a well-known result of Mahler (see also M. Baker, “”A lower bound for averages of dynamical Green’s functions”) such error (for a set of \(N\) points) is on the order of \(\log(N)/N\) after our normalization. We check if the value of the archimedean discriminant terms is within 2*noise_multiplier of \(\log(N)/N\). If so, we discard it. In practice this greatly improves the accuracy of the estimate of the pairing. If desired, noise_multiplier can be set to 0, and no terms will be ignored.

OUTPUT: a real number estimating the Arakelov-Zhang pairing of the two rational maps

EXAMPLES:

sage: # needs sage.rings.number_field
sage: K.<k> = CyclotomicField(3)
sage: P.<x,y> = ProjectiveSpace(K, 1)
sage: f = DynamicalSystem_projective([x^2 + (2*k + 2)*y^2, y^2])
sage: g = DynamicalSystem_projective([x^2, y^2])
sage: pairingval = f.arakelov_zhang_pairing(g, n=5); pairingval
0.409598197761958
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = CyclotomicField(Integer(3), names=('k',)); (k,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + (Integer(2)*k + Integer(2))*y**Integer(2), y**Integer(2)])
>>> g = DynamicalSystem_projective([x**Integer(2), y**Integer(2)])
>>> pairingval = f.arakelov_zhang_pairing(g, n=Integer(5)); pairingval
0.409598197761958

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + 4*y^2, y^2])
sage: g = DynamicalSystem_projective([x^2, y^2])
sage: pairingval = f.arakelov_zhang_pairing(g, n=6); pairingval             # needs sage.rings.function_field
0.750178391443644
sage: # Compare to the exact value:
sage: dynheight = f.canonical_height(P(0, 1)); dynheight                    # needs sage.libs.pari
0.75017839144364417318023000563
sage: dynheight - pairingval                                                # needs sage.libs.pari sage.rings.function_field
0.000000000000000
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + Integer(4)*y**Integer(2), y**Integer(2)])
>>> g = DynamicalSystem_projective([x**Integer(2), y**Integer(2)])
>>> pairingval = f.arakelov_zhang_pairing(g, n=Integer(6)); pairingval             # needs sage.rings.function_field
0.750178391443644
>>> # Compare to the exact value:
>>> dynheight = f.canonical_height(P(Integer(0), Integer(1))); dynheight                    # needs sage.libs.pari
0.75017839144364417318023000563
>>> dynheight - pairingval                                                # needs sage.libs.pari sage.rings.function_field
0.000000000000000

Notice that if we set the noise_multiplier to 0, the accuracy is diminished:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + 4*y^2, y^2])
sage: g = DynamicalSystem_projective([x^2, y^2])
sage: pairingval = f.arakelov_zhang_pairing(g, n=6, noise_multiplier=0)     # needs sage.rings.function_field
sage: pairingval                                                            # needs sage.rings.number_field
0.650660018921632
sage: dynheight = f.canonical_height(P(0, 1)); dynheight                    # needs sage.libs.pari
0.75017839144364417318023000563
sage: pairingval - dynheight                                                # needs sage.libs.pari sage.rings.function_field
-0.0995183725220122
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + Integer(4)*y**Integer(2), y**Integer(2)])
>>> g = DynamicalSystem_projective([x**Integer(2), y**Integer(2)])
>>> pairingval = f.arakelov_zhang_pairing(g, n=Integer(6), noise_multiplier=Integer(0))     # needs sage.rings.function_field
>>> pairingval                                                            # needs sage.rings.number_field
0.650660018921632
>>> dynheight = f.canonical_height(P(Integer(0), Integer(1))); dynheight                    # needs sage.libs.pari
0.75017839144364417318023000563
>>> pairingval - dynheight                                                # needs sage.libs.pari sage.rings.function_field
-0.0995183725220122

We compute the example of Prop. 18(d) from Petsche, Szpiro and Tucker:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([y^2 - (y - x)^2, y^2])
sage: g = DynamicalSystem_projective([x^2, y^2])
sage: f.arakelov_zhang_pairing(g)                                           # needs sage.rings.function_field
0.326954667248466
sage: # Correct value should be = 0.323067...
sage: f.arakelov_zhang_pairing(g, n=9)      # long time                     # needs sage.rings.function_field
0.323091061918965
sage: _ - 0.323067                          # long time                     # needs sage.rings.function_field
0.0000240619189654789
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([y**Integer(2) - (y - x)**Integer(2), y**Integer(2)])
>>> g = DynamicalSystem_projective([x**Integer(2), y**Integer(2)])
>>> f.arakelov_zhang_pairing(g)                                           # needs sage.rings.function_field
0.326954667248466
>>> # Correct value should be = 0.323067...
>>> f.arakelov_zhang_pairing(g, n=Integer(9))      # long time                     # needs sage.rings.function_field
0.323091061918965
>>> _ - RealNumber('0.323067')                          # long time                     # needs sage.rings.function_field
0.0000240619189654789

Also from Prop. 18 of Petsche, Szpiro and Tucker, includes places of bad reduction:

sage: # needs sage.rings.number_field
sage: R.<z> = PolynomialRing(ZZ)
sage: K.<b> = NumberField(z^3 - 11)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: a = 7/(b - 1)
sage: f = DynamicalSystem_projective([a*y^2 - (a*y - x)^2, y^2])
sage: g = DynamicalSystem_projective([x^2, y^2])
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = PolynomialRing(ZZ, names=('z',)); (z,) = R._first_ngens(1)
>>> K = NumberField(z**Integer(3) - Integer(11), names=('b',)); (b,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> a = Integer(7)/(b - Integer(1))
>>> f = DynamicalSystem_projective([a*y**Integer(2) - (a*y - x)**Integer(2), y**Integer(2)])
>>> g = DynamicalSystem_projective([x**Integer(2), y**Integer(2)])

If all archimedean absolute values of a have modulus > 2, then the pairing should be h(a).:

sage: f.arakelov_zhang_pairing(g, n=6)      # long time                     # needs sage.rings.number_field
1.93846423207664
sage: _ - a.global_height()                 # long time                     # needs sage.rings.number_field
-0.00744591697867292
>>> from sage.all import *
>>> f.arakelov_zhang_pairing(g, n=Integer(6))      # long time                     # needs sage.rings.number_field
1.93846423207664
>>> _ - a.global_height()                 # long time                     # needs sage.rings.number_field
-0.00744591697867292
automorphism_group(**kwds)[source]

Calculate the subgroup of \(PGL2\) that is the automorphism group of this dynamical system.

The automorphism group is the set of \(PGL(2)\) elements that fixes this map under conjugation.

INPUT:

The following keywords are used in most cases:

  • num_cpus – (default: 2) the number of threads to use. Setting to a larger number can greatly speed up this function

The following keywords are used only when the dimension of the domain is 1 and the base ring is the rationals, but ignored in all other cases:

  • starting_prime – (default: 5) the first prime to use for CRT

  • algorithm – (optional) can be one of the following:

    • 'CRT' – Chinese Remainder Theorem

    • 'fixed_points' – fixed points algorithm

  • return_functions – boolean (default: False); True returns elements as linear fractional transformations and False returns elements as \(PGL2\) matrices

  • iso_type – boolean (default: False); True returns the isomorphism type of the automorphism group

OUTPUT: list of elements in the automorphism group

AUTHORS:

  • Original algorithm written by Xander Faber, Michelle Manes, Bianca Viray

  • Modified by Joao Alberto de Faria, Ben Hutz, Bianca Thompson

REFERENCES:

EXAMPLES:

sage: R.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 - y^2, x*y])
sage: f.automorphism_group(return_functions=True)                           # needs sage.libs.pari
[x, -x]
>>> from sage.all import *
>>> R = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = R._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), x*y])
>>> f.automorphism_group(return_functions=True)                           # needs sage.libs.pari
[x, -x]

sage: R.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + 5*x*y + 5*y^2, 5*x^2 + 5*x*y + y^2])
sage: f.automorphism_group()                                                # needs sage.libs.pari
[
[1 0]  [0 2]
[0 1], [2 0]
]
>>> from sage.all import *
>>> R = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = R._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + Integer(5)*x*y + Integer(5)*y**Integer(2), Integer(5)*x**Integer(2) + Integer(5)*x*y + y**Integer(2)])
>>> f.automorphism_group()                                                # needs sage.libs.pari
[
[1 0]  [0 2]
[0 1], [2 0]
]

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem([x^3, y^3, z^3])
sage: len(f.automorphism_group())                                           # needs sage.rings.function_field
24
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem([x**Integer(3), y**Integer(3), z**Integer(3)])
>>> len(f.automorphism_group())                                           # needs sage.rings.function_field
24

sage: R.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 - 2*x*y - 2*y^2, -2*x^2 - 2*x*y + y^2])
sage: f.automorphism_group(return_functions=True)                           # needs sage.libs.pari
[x, 1/x, -x - 1, -x/(x + 1), (-x - 1)/x, -1/(x + 1)]
>>> from sage.all import *
>>> R = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = R._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(2)*x*y - Integer(2)*y**Integer(2), -Integer(2)*x**Integer(2) - Integer(2)*x*y + y**Integer(2)])
>>> f.automorphism_group(return_functions=True)                           # needs sage.libs.pari
[x, 1/x, -x - 1, -x/(x + 1), (-x - 1)/x, -1/(x + 1)]

sage: R.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([3*x^2*y - y^3, x^3 - 3*x*y^2])
sage: lst, label = f.automorphism_group(algorithm='CRT',                    # needs sage.libs.pari
....:                                   return_functions=True,
....:                                   iso_type=True)
sage: sorted(lst), label                                                    # needs sage.libs.pari
([-1/x, 1/x, (-x - 1)/(x - 1), (-x + 1)/(x + 1), (x - 1)/(x + 1),
  (x + 1)/(x - 1), -x, x],
 'Dihedral of order 8')
>>> from sage.all import *
>>> R = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = R._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(3)*x**Integer(2)*y - y**Integer(3), x**Integer(3) - Integer(3)*x*y**Integer(2)])
>>> lst, label = f.automorphism_group(algorithm='CRT',                    # needs sage.libs.pari
...                                   return_functions=True,
...                                   iso_type=True)
>>> sorted(lst), label                                                    # needs sage.libs.pari
([-1/x, 1/x, (-x - 1)/(x - 1), (-x + 1)/(x + 1), (x - 1)/(x + 1),
  (x + 1)/(x - 1), -x, x],
 'Dihedral of order 8')

sage: A.<z> = AffineSpace(QQ, 1)
sage: f = DynamicalSystem_affine([1/z^3])
sage: F = f.homogenize(1)
sage: F.automorphism_group()                                                # needs sage.libs.pari
[
[1 0]  [0 2]  [-1  0]  [ 0 -2]
[0 1], [2 0], [ 0  1], [ 2  0]
]
>>> from sage.all import *
>>> A = AffineSpace(QQ, Integer(1), names=('z',)); (z,) = A._first_ngens(1)
>>> f = DynamicalSystem_affine([Integer(1)/z**Integer(3)])
>>> F = f.homogenize(Integer(1))
>>> F.automorphism_group()                                                # needs sage.libs.pari
[
[1 0]  [0 2]  [-1  0]  [ 0 -2]
[0 1], [2 0], [ 0  1], [ 2  0]
]

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([x**2 + x*z, y**2, z**2])
sage: f.automorphism_group()                                                # needs sage.rings.function_field
[
[1 0 0]
[0 1 0]
[0 0 1]
]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + x*z, y**Integer(2), z**Integer(2)])
>>> f.automorphism_group()                                                # needs sage.rings.function_field
[
[1 0 0]
[0 1 0]
[0 0 1]
]

sage: # needs sage.rings.number_field
sage: K.<w> = CyclotomicField(3)
sage: P.<x,y> = ProjectiveSpace(K, 1)
sage: D6 = DynamicalSystem_projective([y^2, x^2])
sage: sorted(D6.automorphism_group())
[
[-w - 1      0]  [     0 -w - 1]  [w 0]  [0 w]  [0 1]  [1 0]
[     0      1], [     1      0], [0 1], [1 0], [1 0], [0 1]
]
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = CyclotomicField(Integer(3), names=('w',)); (w,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> D6 = DynamicalSystem_projective([y**Integer(2), x**Integer(2)])
>>> sorted(D6.automorphism_group())
[
[-w - 1      0]  [     0 -w - 1]  [w 0]  [0 w]  [0 1]  [1 0]
[     0      1], [     1      0], [0 1], [1 0], [1 0], [0 1]
]
canonical_height(P, **kwds)[source]

Evaluate the (absolute) canonical height of P with respect to this dynamical system.

Must be over number field or order of a number field. Specify either the number of terms of the series to evaluate or the error bound required.

ALGORITHM:

The sum of the Green’s function at the archimedean places and the places of bad reduction.

If function is defined over \(\QQ\) uses Wells’ Algorithm, which allows us to not have to factor the resultant.

INPUT:

  • P – a projective point

kwds:

  • badprimes – (optional) a list of primes of bad reduction

  • N – (default: 10) positive integer; number of terms of the series to use in the local green functions

  • prec – (default: 100) positive integer, float point or \(p\)-adic precision

  • error_bound – (optional) a positive real number

OUTPUT: a real number

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, 2*x*y]);
sage: f.canonical_height(P.point([5,4]), error_bound=0.001)                 # needs sage.libs.pari
2.1970553519503404898926835324
sage: f.canonical_height(P.point([2,1]), error_bound=0.001)                 # needs sage.libs.pari
1.0984430632822307984974382955
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), Integer(2)*x*y]);
>>> f.canonical_height(P.point([Integer(5),Integer(4)]), error_bound=RealNumber('0.001'))                 # needs sage.libs.pari
2.1970553519503404898926835324
>>> f.canonical_height(P.point([Integer(2),Integer(1)]), error_bound=RealNumber('0.001'))                 # needs sage.libs.pari
1.0984430632822307984974382955

Notice that preperiodic points may not return exactly 0:

sage: # needs sage.rings.number_field
sage: R.<X> = PolynomialRing(QQ)
sage: K.<a> = NumberField(X^2 + X - 1)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([x^2 - 2*y^2, y^2])
sage: Q = P.point([a,1])
sage: f.canonical_height(Q, error_bound=0.000001)  # Answer only within error_bound of 0
5.7364919788790160119266380480e-8
sage: f.nth_iterate(Q, 2) == Q  # but it is indeed preperiodic
True
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = PolynomialRing(QQ, names=('X',)); (X,) = R._first_ngens(1)
>>> K = NumberField(X**Integer(2) + X - Integer(1), names=('a',)); (a,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(2)*y**Integer(2), y**Integer(2)])
>>> Q = P.point([a,Integer(1)])
>>> f.canonical_height(Q, error_bound=RealNumber('0.000001'))  # Answer only within error_bound of 0
5.7364919788790160119266380480e-8
>>> f.nth_iterate(Q, Integer(2)) == Q  # but it is indeed preperiodic
True

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: X = P.subscheme(x^2 - y^2);
sage: f = DynamicalSystem_projective([x^2, y^2, 4*z^2], domain=X);
sage: Q = X([4,4,1])
sage: f.canonical_height(Q, badprimes=[2])                                  # needs sage.rings.function_field
0.0013538030870311431824555314882
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(x**Integer(2) - y**Integer(2));
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), Integer(4)*z**Integer(2)], domain=X);
>>> Q = X([Integer(4),Integer(4),Integer(1)])
>>> f.canonical_height(Q, badprimes=[Integer(2)])                                  # needs sage.rings.function_field
0.0013538030870311431824555314882

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: X = P.subscheme(x^2 - y^2);
sage: f = DynamicalSystem_projective([x^2, y^2, 30*z^2], domain=X)
sage: Q = X([4, 4, 1])
sage: f.canonical_height(Q, badprimes=[2,3,5], prec=200)                    # needs sage.rings.function_field
2.7054056208276961889784303469356774912979228770208655455481
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(x**Integer(2) - y**Integer(2));
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), Integer(30)*z**Integer(2)], domain=X)
>>> Q = X([Integer(4), Integer(4), Integer(1)])
>>> f.canonical_height(Q, badprimes=[Integer(2),Integer(3),Integer(5)], prec=Integer(200))                    # needs sage.rings.function_field
2.7054056208276961889784303469356774912979228770208655455481

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([1000*x^2 - 29*y^2, 1000*y^2])
sage: Q = P(-1/4, 1)
sage: f.canonical_height(Q, error_bound=0.01)                               # needs sage.libs.pari
3.7996079979254623065837411853
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(1000)*x**Integer(2) - Integer(29)*y**Integer(2), Integer(1000)*y**Integer(2)])
>>> Q = P(-Integer(1)/Integer(4), Integer(1))
>>> f.canonical_height(Q, error_bound=RealNumber('0.01'))                               # needs sage.libs.pari
3.7996079979254623065837411853

sage: RSA768 = 123018668453011775513049495838496272077285356959533479219732245215\
....: 1726400507263657518745202199786469389956474942774063845925192557326303453731548\
....: 2685079170261221429134616704292143116022212404792747377940806653514195974598569\
....: 02143413
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([RSA768*x^2 + y^2, x*y])
sage: Q = P(RSA768,1)
sage: f.canonical_height(Q, error_bound=0.00000000000000001)                # needs sage.libs.pari
931.18256422718241278672729195
>>> from sage.all import *
>>> RSA768 = Integer(123018668453011775513049495838496272077285356959533479219732245215)Integer(1726400507263657518745202199786469389956474942774063845925192557326303453731548)Integer(2685079170261221429134616704292143116022212404792747377940806653514195974598569)Integer(2143413)
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([RSA768*x**Integer(2) + y**Integer(2), x*y])
>>> Q = P(RSA768,Integer(1))
>>> f.canonical_height(Q, error_bound=RealNumber('0.00000000000000001'))                # needs sage.libs.pari
931.18256422718241278672729195

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem([2*(-2*x^3 + 3*(x^2*y)) + 3*y^3, 3*y^3])
sage: f.canonical_height(P(1,0))                                            # needs sage.libs.pari
0.00000000000000000000000000000
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([Integer(2)*(-Integer(2)*x**Integer(3) + Integer(3)*(x**Integer(2)*y)) + Integer(3)*y**Integer(3), Integer(3)*y**Integer(3)])
>>> f.canonical_height(P(Integer(1),Integer(0)))                                            # needs sage.libs.pari
0.00000000000000000000000000000
conjugate(M, adjugate=False, normalize=False)[source]

Conjugate this dynamical system by M, i.e. \(M^{-1} \circ f \circ M\).

If possible the new map will be defined over the same space. Otherwise, will try to coerce to the base ring of M.

INPUT:

  • M – a square invertible matrix

  • adjugate – boolean (default: False); also classically called adjoint, takes a square matrix M and finds the transpose of its cofactor matrix. Used for conjugation in place of inverse when specified True. Functionality is the same in projective space.

  • normalize – boolean (default: False); if normalize is True, then the method normalize_coordinates is called

OUTPUT: a dynamical system

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.conjugate(matrix([[1,2], [0,1]]))
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.conjugate(matrix([[Integer(1),Integer(2)], [Integer(0),Integer(1)]]))
Dynamical System 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)                                          # needs sage.rings.number_field
sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^3 + y^3, y^3])
sage: f.conjugate(matrix([[i,0], [0,-i]]))                                  # needs sage.rings.number_field
Dynamical System of Projective Space of dimension 1 over Integer Ring
  Defn: Defined on coordinates by sending (x : y) to
        (-x^3 + y^3 : -y^3)
>>> from sage.all import *
>>> R = PolynomialRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> K = NumberField(x**Integer(2) + Integer(1), names=('i',)); (i,) = K._first_ngens(1)# needs sage.rings.number_field
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) + y**Integer(3), y**Integer(3)])
>>> f.conjugate(matrix([[i,Integer(0)], [Integer(0),-i]]))                                  # needs sage.rings.number_field
Dynamical System 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: f = DynamicalSystem_projective([x^2 + y^2, y^2, y*z])
sage: f.conjugate(matrix([[1,2,3], [0,1,2], [0,0,1]]))
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2), y*z])
>>> f.conjugate(matrix([[Integer(1),Integer(2),Integer(3)], [Integer(0),Integer(1),Integer(2)], [Integer(0),Integer(0),Integer(1)]]))
Dynamical System 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: f = DynamicalSystem_projective([x^2+y^2, y^2])
sage: f.conjugate(matrix([[2,0], [0,1/2]]))
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (2*x^2 + 1/8*y^2 : 1/2*y^2)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2)+y**Integer(2), y**Integer(2)])
>>> f.conjugate(matrix([[Integer(2),Integer(0)], [Integer(0),Integer(1)/Integer(2)]]))
Dynamical System of Projective Space of dimension 1 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)                                          # needs sage.rings.number_field
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([1/3*x^2 + 1/2*y^2, y^2])
sage: f.conjugate(matrix([[i,0], [0,-i]]))                                  # needs sage.rings.number_field
Dynamical System of Projective Space of dimension 1
 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)
>>> from sage.all import *
>>> R = PolynomialRing(QQ, names=('x',)); (x,) = R._first_ngens(1)
>>> K = NumberField(x**Integer(2) + Integer(1), names=('i',)); (i,) = K._first_ngens(1)# needs sage.rings.number_field
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(1)/Integer(3)*x**Integer(2) + Integer(1)/Integer(2)*y**Integer(2), y**Integer(2)])
>>> f.conjugate(matrix([[i,Integer(0)], [Integer(0),-i]]))                                  # needs sage.rings.number_field
Dynamical System of Projective Space of dimension 1
 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)

Todo

Use the left and right action functionality to replace the code below with #return DynamicalSystem_projective(M.inverse()*self*M, domain=self.codomain()) once there is a function to pass to the smallest field of definition.

critical_height(**kwds)[source]

Compute the critical height of this dynamical system.

The critical height is defined by J. Silverman as the sum of the canonical heights of the critical points. This must be dimension 1 and defined over a number field or number field order.

The computations can be done either over the algebraic closure of the base field or over the minimal extension of the base field that contains the critical points.

INPUT: keyword arguments:

  • badprimes – (optional) a list of primes of bad reduction

  • N – (default: 10) positive integer; number of terms of the series to use in the local green functions

  • prec – (default: 100) positive integer, float point or \(p\)-adic precision

  • error_bound – (optional) a positive real number

  • use_algebraic_closure – boolean (default: True); if True, uses the algebraic closure. If False, uses the smallest extension of the base field containing all the critical points.

OUTPUT: real number

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 + 7*y^3, 11*y^3])
sage: f.critical_height()                                                   # needs sage.rings.number_field
1.1989273321156851418802151128
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) + Integer(7)*y**Integer(3), Integer(11)*y**Integer(3)])
>>> f.critical_height()                                                   # needs sage.rings.number_field
1.1989273321156851418802151128

sage: # needs sage.rings.number_field
sage: K.<w> = QuadraticField(2)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([x^2 + w*y^2, y^2])
sage: f.critical_height()
0.16090842452312941163719755472
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = QuadraticField(Integer(2), names=('w',)); (w,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + w*y**Integer(2), y**Integer(2)])
>>> f.critical_height()
0.16090842452312941163719755472

Postcritically finite maps have critical height 0:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 - 3/4*x*y^2 + 3/4*y^3, y^3])
sage: f.critical_height(error_bound=0.0001)                                 # needs sage.rings.number_field
0.00000000000000000000000000000
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - Integer(3)/Integer(4)*x*y**Integer(2) + Integer(3)/Integer(4)*y**Integer(3), y**Integer(3)])
>>> f.critical_height(error_bound=RealNumber('0.0001'))                                 # needs sage.rings.number_field
0.00000000000000000000000000000

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 + 3*x*y^2, y^3])
sage: f.critical_height(use_algebraic_closure=False)                        # needs sage.rings.number_field
0.000023477016733897112886491967991
sage: f.critical_height()                                                   # needs sage.rings.number_field
0.000023477016733897112886491967991
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) + Integer(3)*x*y**Integer(2), y**Integer(3)])
>>> f.critical_height(use_algebraic_closure=False)                        # needs sage.rings.number_field
0.000023477016733897112886491967991
>>> f.critical_height()                                                   # needs sage.rings.number_field
0.000023477016733897112886491967991
critical_point_portrait(check=True, use_algebraic_closure=True)[source]

If this dynamical system is post-critically finite, return its critical point portrait.

This is the directed graph of iterates starting with the critical points. Must be dimension 1. If check is True, then the map is first checked to see if it is postcritically finite.

The computations can be done either over the algebraic closure of the base field or over the minimal extension of the base field that contains the critical points.

INPUT:

  • check – boolean (default: True)

  • use_algebraic_closure – boolean (default: True); if True, uses the algebraic closure. If False, uses the smallest extension of the base field containing all the critical points.

OUTPUT: a digraph

EXAMPLES:

sage: # needs sage.rings.number_field
sage: R.<z> = QQ[]
sage: K.<v> = NumberField(z^6 + 2*z^5 + 2*z^4 + 2*z^3 + z^2 + 1)
sage: PS.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([x^2 + v*y^2, y^2])
sage: f.critical_point_portrait(check=False)        # long time             # needs sage.graphs
Looped digraph on 6 vertices
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = QQ['z']; (z,) = R._first_ngens(1)
>>> K = NumberField(z**Integer(6) + Integer(2)*z**Integer(5) + Integer(2)*z**Integer(4) + Integer(2)*z**Integer(3) + z**Integer(2) + Integer(1), names=('v',)); (v,) = K._first_ngens(1)
>>> PS = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + v*y**Integer(2), y**Integer(2)])
>>> f.critical_point_portrait(check=False)        # long time             # needs sage.graphs
Looped digraph on 6 vertices

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^5 + 5/4*x*y^4, y^5])
sage: f.critical_point_portrait(check=False)                                # needs sage.graphs sage.rings.number_field
Looped digraph on 5 vertices
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(5) + Integer(5)/Integer(4)*x*y**Integer(4), y**Integer(5)])
>>> f.critical_point_portrait(check=False)                                # needs sage.graphs sage.rings.number_field
Looped digraph on 5 vertices

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + 2*y^2, y^2])
sage: f.critical_point_portrait()                                           # needs sage.rings.number_field
Traceback (most recent call last):
...
TypeError: map must be post-critically finite
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + Integer(2)*y**Integer(2), y**Integer(2)])
>>> f.critical_point_portrait()                                           # needs sage.rings.number_field
Traceback (most recent call last):
...
TypeError: map must be post-critically finite

sage: # needs sage.rings.number_field
sage: R.<t> = QQ[]
sage: K.<v> = NumberField(t^3 + 2*t^2 + t + 1)
sage: phi = K.embeddings(QQbar)[0]
sage: P.<x, y> = ProjectiveSpace(K, 1)
sage: f = DynamicalSystem_projective([x^2 + v*y^2, y^2])
sage: f.change_ring(phi).critical_point_portrait()                          # needs sage.graphs
Looped digraph on 4 vertices
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = QQ['t']; (t,) = R._first_ngens(1)
>>> K = NumberField(t**Integer(3) + Integer(2)*t**Integer(2) + t + Integer(1), names=('v',)); (v,) = K._first_ngens(1)
>>> phi = K.embeddings(QQbar)[Integer(0)]
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + v*y**Integer(2), y**Integer(2)])
>>> f.change_ring(phi).critical_point_portrait()                          # needs sage.graphs
Looped digraph on 4 vertices

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([8*x^4 - 8*x^2*y^2 + y^4, y^4])
sage: f.critical_point_portrait(use_algebraic_closure=False)  # long time
Looped digraph on 6 vertices
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(8)*x**Integer(4) - Integer(8)*x**Integer(2)*y**Integer(2) + y**Integer(4), y**Integer(4)])
>>> f.critical_point_portrait(use_algebraic_closure=False)  # long time
Looped digraph on 6 vertices

sage: # needs sage.rings.number_field
sage: P.<x,y> = ProjectiveSpace(QQbar,1)
sage: f = DynamicalSystem_projective([8*x^4 - 8*x^2*y^2 + y^4, y^4])
sage: f.critical_point_portrait()   # long time                             # needs sage.graphs
Looped digraph on 6 vertices
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> P = ProjectiveSpace(QQbar,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(8)*x**Integer(4) - Integer(8)*x**Integer(2)*y**Integer(2) + y**Integer(4), y**Integer(4)])
>>> f.critical_point_portrait()   # long time                             # needs sage.graphs
Looped digraph on 6 vertices

sage: P.<x,y> = ProjectiveSpace(GF(3),1)
sage: f = DynamicalSystem_projective([x^2 + x*y - y^2, x*y])
sage: f.critical_point_portrait(use_algebraic_closure=False)                # needs sage.libs.pari
Looped digraph on 6 vertices
sage: f.critical_point_portrait() #long time
Looped digraph on 6 vertices
>>> from sage.all import *
>>> P = ProjectiveSpace(GF(Integer(3)),Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + x*y - y**Integer(2), x*y])
>>> f.critical_point_portrait(use_algebraic_closure=False)                # needs sage.libs.pari
Looped digraph on 6 vertices
>>> f.critical_point_portrait() #long time
Looped digraph on 6 vertices
critical_points(R=None)[source]

Return the critical points of this dynamical system defined over the ring \(R\) or the base ring of this map.

Must be dimension 1.

INPUT:

  • R – (optional) a ring

OUTPUT: list of projective space points defined over \(R\)

EXAMPLES:

sage: set_verbose(None)
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 - 2*x*y^2 + 2*y^3, y^3])
sage: f.critical_points()                                                   # needs sage.rings.function_field
[(1 : 0)]
sage: K.<w> = QuadraticField(6)                                             # needs sage.rings.number_field
sage: f.critical_points(K)                                                  # needs sage.rings.number_field
[(-1/3*w : 1), (1/3*w : 1), (1 : 0)]
>>> from sage.all import *
>>> set_verbose(None)
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - Integer(2)*x*y**Integer(2) + Integer(2)*y**Integer(3), y**Integer(3)])
>>> f.critical_points()                                                   # needs sage.rings.function_field
[(1 : 0)]
>>> K = QuadraticField(Integer(6), names=('w',)); (w,) = K._first_ngens(1)# needs sage.rings.number_field
>>> f.critical_points(K)                                                  # needs sage.rings.number_field
[(-1/3*w : 1), (1/3*w : 1), (1 : 0)]

sage: set_verbose(None)
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([2*x^2 - y^2, x*y])
sage: f.critical_points(QQbar)                                              # needs sage.rings.number_field
[(-0.7071067811865475?*I : 1), (0.7071067811865475?*I : 1)]
>>> from sage.all import *
>>> set_verbose(None)
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(2)*x**Integer(2) - y**Integer(2), x*y])
>>> f.critical_points(QQbar)                                              # needs sage.rings.number_field
[(-0.7071067811865475?*I : 1), (0.7071067811865475?*I : 1)]
critical_subscheme()[source]

Return the critical subscheme of this dynamical system.

OUTPUT: projective subscheme

EXAMPLES:

sage: set_verbose(None)
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 - 2*x*y^2 + 2*y^3, y^3])
sage: f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 1 over Rational Field
defined by:
  9*x^2*y^2 - 6*y^4
>>> from sage.all import *
>>> set_verbose(None)
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - Integer(2)*x*y**Integer(2) + Integer(2)*y**Integer(3), y**Integer(3)])
>>> f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 1 over Rational Field
defined by:
  9*x^2*y^2 - 6*y^4

sage: set_verbose(None)
sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([2*x^2 - y^2, x*y])
sage: f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 1 over Rational Field
defined by:
  4*x^2 + 2*y^2
>>> from sage.all import *
>>> set_verbose(None)
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(2)*x**Integer(2) - y**Integer(2), x*y])
>>> f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 1 over Rational Field
defined by:
  4*x^2 + 2*y^2

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = DynamicalSystem_projective([2*x^2 - y^2, x*y, z^2])
sage: f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 2 over Rational Field
defined by:
  8*x^2*z + 4*y^2*z
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([Integer(2)*x**Integer(2) - y**Integer(2), x*y, z**Integer(2)])
>>> f.critical_subscheme()                                                # needs sage.rings.function_field
Closed subscheme of Projective Space of dimension 2 over Rational Field
defined by:
  8*x^2*z + 4*y^2*z

sage: # needs sage.rings.finite_rings
sage: P.<x,y,z,w> = ProjectiveSpace(GF(81), 3)
sage: g = DynamicalSystem_projective([x^3 + y^3, y^3 + z^3, z^3 + x^3, w^3])
sage: g.critical_subscheme()
Closed subscheme of Projective Space of dimension 3 over Finite Field in
z4 of size 3^4 defined by:
  0
>>> from sage.all import *
>>> # needs sage.rings.finite_rings
>>> P = ProjectiveSpace(GF(Integer(81)), Integer(3), names=('x', 'y', 'z', 'w',)); (x, y, z, w,) = P._first_ngens(4)
>>> g = DynamicalSystem_projective([x**Integer(3) + y**Integer(3), y**Integer(3) + z**Integer(3), z**Integer(3) + x**Integer(3), w**Integer(3)])
>>> g.critical_subscheme()
Closed subscheme of Projective Space of dimension 3 over Finite Field in
z4 of size 3^4 defined by:
  0

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2, x*y])
sage: f.critical_subscheme()                                                # needs sage.rings.function_field
Traceback (most recent call last):
...
TypeError: the function is not a morphism
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2), x*y])
>>> f.critical_subscheme()                                                # needs sage.rings.function_field
Traceback (most recent call last):
...
TypeError: the function is not a morphism
degree_sequence(iterates=2)[source]

Return sequence of degrees of normalized iterates starting with the degree of this dynamical system.

INPUT:

  • iterates – (default: 2) positive integer

OUTPUT: list of integers

EXAMPLES:

sage: P2.<X,Y,Z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([Z^2, X*Y, Y^2])
sage: f.degree_sequence(15)                                                 # needs sage.rings.function_field
[2, 3, 5, 8, 11, 17, 24, 31, 45, 56, 68, 91, 93, 184, 275]
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('X', 'Y', 'Z',)); (X, Y, Z,) = P2._first_ngens(3)
>>> f = DynamicalSystem_projective([Z**Integer(2), X*Y, Y**Integer(2)])
>>> f.degree_sequence(Integer(15))                                                 # needs sage.rings.function_field
[2, 3, 5, 8, 11, 17, 24, 31, 45, 56, 68, 91, 93, 184, 275]

sage: F.<t> = PolynomialRing(QQ)
sage: P2.<X,Y,Z> = ProjectiveSpace(F, 2)
sage: f = DynamicalSystem_projective([Y*Z, X*Y, Y^2 + t*X*Z])
sage: f.degree_sequence(5)                                                  # needs sage.rings.function_field
[2, 3, 5, 8, 13]
>>> from sage.all import *
>>> F = PolynomialRing(QQ, names=('t',)); (t,) = F._first_ngens(1)
>>> P2 = ProjectiveSpace(F, Integer(2), names=('X', 'Y', 'Z',)); (X, Y, Z,) = P2._first_ngens(3)
>>> f = DynamicalSystem_projective([Y*Z, X*Y, Y**Integer(2) + t*X*Z])
>>> f.degree_sequence(Integer(5))                                                  # needs sage.rings.function_field
[2, 3, 5, 8, 13]

sage: P2.<X,Y,Z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([X^2, Y^2, Z^2])
sage: f.degree_sequence(10)                                                 # needs sage.rings.function_field
[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
>>> from sage.all import *
>>> P2 = ProjectiveSpace(QQ, Integer(2), names=('X', 'Y', 'Z',)); (X, Y, Z,) = P2._first_ngens(3)
>>> f = DynamicalSystem_projective([X**Integer(2), Y**Integer(2), Z**Integer(2)])
>>> f.degree_sequence(Integer(10))                                                 # needs sage.rings.function_field
[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

sage: P2.<X,Y,Z> = ProjectiveSpace(ZZ, 2)
sage: f = DynamicalSystem_projective([X*Y, Y*Z+Z^2, Z^2])
sage: f.degree_sequence(10)                                                 # needs sage.rings.function_field
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> from sage.all import *
>>> P2 = ProjectiveSpace(ZZ, Integer(2), names=('X', 'Y', 'Z',)); (X, Y, Z,) = P2._first_ngens(3)
>>> f = DynamicalSystem_projective([X*Y, Y*Z+Z**Integer(2), Z**Integer(2)])
>>> f.degree_sequence(Integer(10))                                                 # needs sage.rings.function_field
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
dehomogenize(n)[source]

Return the standard dehomogenization at the n[0] coordinate for the domain and the n[1] coordinate for the codomain.

Note that the new function is defined over the fraction field of the base ring of this map.

INPUT:

  • n – tuple of nonnegative integers; if n is an integer, then the two values of the tuple are assumed to be the same

OUTPUT:

If the dehomogenizing indices are the same for the domain and codomain, then a DynamicalSystem_affine given by dehomogenizing the source and target of self with respect to the given indices is returned. If the dehomogenizing indices for the domain and codomain are different then the resulting affine patches are different and a scheme morphism is returned.

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.dehomogenize(0)
Dynamical System of Affine Space of dimension 1 over Integer Ring
  Defn: Defined on coordinates by sending (y) to
        (y^2/(y^2 + 1))
sage: f.dehomogenize((0, 1))
Scheme morphism:
  From: Affine Space of dimension 1 over Integer Ring
  To:   Affine Space of dimension 1 over Integer Ring
  Defn: Defined on coordinates by sending (y) to
        ((y^2 + 1)/y^2)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.dehomogenize(Integer(0))
Dynamical System of Affine Space of dimension 1 over Integer Ring
  Defn: Defined on coordinates by sending (y) to
        (y^2/(y^2 + 1))
>>> f.dehomogenize((Integer(0), Integer(1)))
Scheme morphism:
  From: Affine Space of dimension 1 over Integer Ring
  To:   Affine Space of dimension 1 over Integer Ring
  Defn: Defined on coordinates by sending (y) to
        ((y^2 + 1)/y^2)
dynamical_degree(N=3, prec=53)[source]

Return an approximation to the dynamical degree of this dynamical system. The dynamical degree is defined as \(\lim_{n \to \infty} \sqrt[n]{\deg(f^n)}\).

INPUT:

  • N – (default: 3) positive integer, iterate to use for approximation

  • prec – (default: 53) positive integer, real precision to use when computing root

OUTPUT: real number

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + x*y, y^2])
sage: f.dynamical_degree()                                                  # needs sage.rings.function_field
2.00000000000000
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + x*y, y**Integer(2)])
>>> f.dynamical_degree()                                                  # needs sage.rings.function_field
2.00000000000000

sage: P2.<X,Y,Z> = ProjectiveSpace(ZZ, 2)
sage: f = DynamicalSystem_projective([X*Y, Y*Z + Z^2, Z^2])
sage: f.dynamical_degree(N=5, prec=100)                                     # needs sage.rings.function_field
1.4309690811052555010452244131
>>> from sage.all import *
>>> P2 = ProjectiveSpace(ZZ, Integer(2), names=('X', 'Y', 'Z',)); (X, Y, Z,) = P2._first_ngens(3)
>>> f = DynamicalSystem_projective([X*Y, Y*Z + Z**Integer(2), Z**Integer(2)])
>>> f.dynamical_degree(N=Integer(5), prec=Integer(100))                                     # needs sage.rings.function_field
1.4309690811052555010452244131
dynatomic_polynomial(period)[source]

For a dynamical system of \(\mathbb{P}^1\) compute the dynatomic polynomial.

The dynatomic polynomial is the analog of the cyclotomic polynomial and its roots are the points of formal period \(period\). If possible the division is done in the coordinate ring of this map and a polynomial is returned. In rings where that is not possible, a FractionField element will be returned. In certain cases, when the conversion back to a polynomial fails, a SymbolRing element will be returned.

ALGORITHM:

For a positive integer \(n\), let \([F_n,G_n]\) be the coordinates of the \(n\)-th 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 Möbius 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:

INPUT:

  • period – 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 this map. Otherwise a fraction field element of the coordinate ring of this map. Or, a SymbolicRing element.

Todo

  • Do the division when the base ring is \(p\)-adic so that the output is a polynomial.

  • Convert back to a polynomial when the base ring is a function field (not over \(\QQ\) or \(F_p\)).

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari
x^2 + x*y + 2*y^2
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari
x^2 + x*y + 2*y^2

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y])
sage: f.dynatomic_polynomial(4)                                             # needs sage.libs.pari
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
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y])
>>> f.dynatomic_polynomial(Integer(4))                                             # needs sage.libs.pari
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: f = DynamicalSystem_projective([x^2 + y^2, 3*x*y])
sage: f.dynatomic_polynomial(3)                                             # needs sage.libs.pari
13.0000000000000*x^6 + 117.000000000000*x^4*y^2 +
78.0000000000000*x^2*y^4 + y^6
>>> from sage.all import *
>>> P = ProjectiveSpace(CC,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), Integer(3)*x*y])
>>> f.dynatomic_polynomial(Integer(3))                                             # needs sage.libs.pari
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: f = DynamicalSystem_projective([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
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(10)/Integer(9)*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(2),Integer(1)])
x^4*y^2 - 11/9*x^2*y^4 - 80/81*y^6

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 - 29/16*y^2, y^2])
sage: f.dynatomic_polynomial([2,3])                                         # needs sage.libs.pari
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
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(29)/Integer(16)*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(2),Integer(3)])                                         # needs sage.libs.pari
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: f = DynamicalSystem_projective([x^2 - y^2, y^2])
sage: f.dynatomic_polynomial([1,2])                                         # needs sage.libs.pari
x^2 - x*y
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(1),Integer(2)])                                         # needs sage.libs.pari
x^2 - x*y

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 - y^3, 3*x*y^2])
sage: f.dynatomic_polynomial([0,4])==f.dynatomic_polynomial(4)              # needs sage.libs.pari
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - y**Integer(3), Integer(3)*x*y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(0),Integer(4)])==f.dynatomic_polynomial(Integer(4))              # needs sage.libs.pari
True

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = DynamicalSystem_projective([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
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y, z**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))
Traceback (most recent call last):
...
TypeError: does not make sense in dimension >1

sage: P.<x,y> = ProjectiveSpace(Qp(5),1)                                    # needs sage.rings.padics
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])                      # needs sage.rings.padics
sage: f.dynatomic_polynomial(2)                                             # needs sage.rings.padics
(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)
>>> from sage.all import *
>>> P = ProjectiveSpace(Qp(Integer(5)),Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)# needs sage.rings.padics
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])                      # needs sage.rings.padics
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.rings.padics
(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: f = DynamicalSystem_projective([x^2 + t*y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari
x^2 + x*y + (t + 1)*y^2
>>> from sage.all import *
>>> L = PolynomialRing(QQ, names=('t',)); (t,) = L._first_ngens(1)
>>> P = ProjectiveSpace(L,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + t*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari
x^2 + x*y + (t + 1)*y^2

sage: K.<c> = PolynomialRing(ZZ)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([x^2 + c*y^2, y^2])
sage: f.dynatomic_polynomial([1, 2])                                        # needs sage.libs.pari
x^2 - x*y + (c + 1)*y^2
>>> from sage.all import *
>>> K = PolynomialRing(ZZ, names=('c',)); (c,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + c*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(1), Integer(2)])                                        # needs sage.libs.pari
x^2 - x*y + (c + 1)*y^2

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari
x^2 + x*y + 2*y^2
sage: R.<X> = PolynomialRing(QQ)
sage: K.<c> = NumberField(X^2 + X + 2)                                      # needs sage.rings.number_field
sage: PP = P.change_ring(K)
sage: ff = f.change_ring(K)
sage: p = PP((c, 1))
sage: ff(ff(p)) == p
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari
x^2 + x*y + 2*y^2
>>> R = PolynomialRing(QQ, names=('X',)); (X,) = R._first_ngens(1)
>>> K = NumberField(X**Integer(2) + X + Integer(2), names=('c',)); (c,) = K._first_ngens(1)# needs sage.rings.number_field
>>> PP = P.change_ring(K)
>>> ff = f.change_ring(K)
>>> p = PP((c, Integer(1)))
>>> ff(ff(p)) == p
True

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y])
sage: f.dynatomic_polynomial([2, 2])                                        # needs sage.libs.pari
x^4 + 4*x^2*y^2 + y^4
sage: R.<X> = PolynomialRing(QQ)
sage: K.<c> = NumberField(X^4 + 4*X^2 + 1)                                  # needs sage.rings.number_field
sage: PP = P.change_ring(K)
sage: ff = f.change_ring(K)
sage: p = PP((c, 1))
sage: ff.nth_iterate(p, 4) == ff.nth_iterate(p, 2)                          # needs sage.rings.number_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y])
>>> f.dynatomic_polynomial([Integer(2), Integer(2)])                                        # needs sage.libs.pari
x^4 + 4*x^2*y^2 + y^4
>>> R = PolynomialRing(QQ, names=('X',)); (X,) = R._first_ngens(1)
>>> K = NumberField(X**Integer(4) + Integer(4)*X**Integer(2) + Integer(1), names=('c',)); (c,) = K._first_ngens(1)# needs sage.rings.number_field
>>> PP = P.change_ring(K)
>>> ff = f.change_ring(K)
>>> p = PP((c, Integer(1)))
>>> ff.nth_iterate(p, Integer(4)) == ff.nth_iterate(p, Integer(2))                          # needs sage.rings.number_field
True

sage: P.<x,y> = ProjectiveSpace(CC, 1)
sage: f = DynamicalSystem_projective([x^2 - CC.0/3*y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari
(x^4*y + (-0.666666666666667*I)*x^2*y^3 - x*y^4
 + (-0.111111111111111 - 0.333333333333333*I)*y^5)/(x^2*y - x*y^2
                                                     + (-0.333333333333333*I)*y^3)
>>> from sage.all import *
>>> P = ProjectiveSpace(CC, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - CC.gen(0)/Integer(3)*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari
(x^4*y + (-0.666666666666667*I)*x^2*y^3 - x*y^4
 + (-0.111111111111111 - 0.333333333333333*I)*y^5)/(x^2*y - x*y^2
                                                     + (-0.333333333333333*I)*y^3)

sage: P.<x,y> = ProjectiveSpace(CC, 1)
sage: f = DynamicalSystem_projective([x^2 - CC.0/5*y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari
x^2 + x*y + (1.00000000000000 - 0.200000000000000*I)*y^2
>>> from sage.all import *
>>> P = ProjectiveSpace(CC, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - CC.gen(0)/Integer(5)*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari
x^2 + x*y + (1.00000000000000 - 0.200000000000000*I)*y^2

sage: L.<t> = PolynomialRing(QuadraticField(2).maximal_order())             # needs sage.rings.number_field
sage: P.<x, y> = ProjectiveSpace(L.fraction_field(), 1)
sage: f = DynamicalSystem_projective([x^2 + (t^2 + 1)*y^2, y^2])
sage: f.dynatomic_polynomial(2)                                             # needs sage.libs.pari sage.rings.number_field
x^2 + x*y + (t^2 + 2)*y^2
>>> from sage.all import *
>>> L = PolynomialRing(QuadraticField(Integer(2)).maximal_order(), names=('t',)); (t,) = L._first_ngens(1)# needs sage.rings.number_field
>>> P = ProjectiveSpace(L.fraction_field(), Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + (t**Integer(2) + Integer(1))*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial(Integer(2))                                             # needs sage.libs.pari sage.rings.number_field
x^2 + x*y + (t^2 + 2)*y^2

sage: P.<x,y> = ProjectiveSpace(ZZ, 1)
sage: f = DynamicalSystem_projective([x^2 - 5*y^2, y^2])
sage: f.dynatomic_polynomial([3,0 ])
0
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(5)*y**Integer(2), y**Integer(2)])
>>> f.dynatomic_polynomial([Integer(3),Integer(0) ])
0
green_function(P, v, **kwds)[source]

Evaluate the local Green’s function at the place v for P with N terms of the series or to within a given error bound.

Must be over a number field or order of a number field. Note that this is the absolute local Green’s function so is scaled by the degree of the base field.

Use v=0 for the archimedean place over \(\QQ\) or field embedding. Non-archimedean places are prime ideals for number fields or primes over \(\QQ\).

ALGORITHM:

See Exercise 5.29 and Figure 5.6 of [Sil2007].

INPUT:

  • P – a projective point

  • v – nonnegative integer; a place, use 0 for the archimedean place

kwds:

  • N – (default: 10) positive integer; number of terms of the series to use

  • prec – (default: 100) positive integer, float point or \(p\)-adic precision

  • error_bound – (optional) a positive real number

OUTPUT: a real number

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y]);
sage: Q = P(5, 1)
sage: f.green_function(Q, 0, N=30)
1.6460930159932946233759277576
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y]);
>>> Q = P(Integer(5), Integer(1))
>>> f.green_function(Q, Integer(0), N=Integer(30))
1.6460930159932946233759277576

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y]);
sage: Q = P(5, 1)
sage: f.green_function(Q, 0, N=200, prec=200)
1.6460930160038721802875250367738355497198064992657997569827
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y]);
>>> Q = P(Integer(5), Integer(1))
>>> f.green_function(Q, Integer(0), N=Integer(200), prec=Integer(200))
1.6460930160038721802875250367738355497198064992657997569827

sage: # needs sage.rings.number_field
sage: K.<w> = QuadraticField(3)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([17*x^2 + 1/7*y^2, 17*w*x*y])
sage: f.green_function(P.point([w, 2], False), K.places()[1])
1.7236334013785676107373093775
sage: f.green_function(P([2, 1]), K.ideal(7), N=7)
0.48647753726382832627633818586
sage: f.green_function(P([w, 1]), K.ideal(17), error_bound=0.001)
-0.70813041039490996737374178059
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> K = QuadraticField(Integer(3), names=('w',)); (w,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(17)*x**Integer(2) + Integer(1)/Integer(7)*y**Integer(2), Integer(17)*w*x*y])
>>> f.green_function(P.point([w, Integer(2)], False), K.places()[Integer(1)])
1.7236334013785676107373093775
>>> f.green_function(P([Integer(2), Integer(1)]), K.ideal(Integer(7)), N=Integer(7))
0.48647753726382832627633818586
>>> f.green_function(P([w, Integer(1)]), K.ideal(Integer(17)), error_bound=RealNumber('0.001'))
-0.70813041039490996737374178059

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y])
sage: f.green_function(P.point([5,2], False), 0, N=30)
1.7315451844777407992085512000
sage: f.green_function(P.point([2,1], False), 0, N=30)
0.86577259223181088325226209926
sage: f.green_function(P.point([1,1], False), 0, N=30)
0.43288629610862338612700146098
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y])
>>> f.green_function(P.point([Integer(5),Integer(2)], False), Integer(0), N=Integer(30))
1.7315451844777407992085512000
>>> f.green_function(P.point([Integer(2),Integer(1)], False), Integer(0), N=Integer(30))
0.86577259223181088325226209926
>>> f.green_function(P.point([Integer(1),Integer(1)], False), Integer(0), N=Integer(30))
0.43288629610862338612700146098
height_difference_bound(prec=None)[source]

Return an upper bound on the different between the canonical height of a point with respect to this dynamical system and the absolute height of the point.

This map must be a morphism.

ALGORITHM:

Uses a Nullstellensatz argument to compute the constant. For details: see [Hutz2015].

INPUT:

  • prec – (default: RealField default) positive integer, float point precision

OUTPUT: a real number

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + y^2, x*y])
sage: f.height_difference_bound()                                           # needs sage.symbolic
1.38629436111989

sage: P.<x,y,z> = ProjectiveSpace(ZZ, 2)
sage: f = DynamicalSystem_projective([4*x^2 + 100*y^2, 210*x*y, 10000*z^2])
sage: f.height_difference_bound()                                           # needs sage.symbolic
10.3089526606443
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), x*y])
>>> f.height_difference_bound()                                           # needs sage.symbolic
1.38629436111989

>>> P = ProjectiveSpace(ZZ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([Integer(4)*x**Integer(2) + Integer(100)*y**Integer(2), Integer(210)*x*y, Integer(10000)*z**Integer(2)])
>>> f.height_difference_bound()                                           # needs sage.symbolic
10.3089526606443

A number field example:

sage: # needs sage.rings.number_field
sage: R.<x> = QQ[]
sage: K.<c> = NumberField(x^3 - 2)
sage: P.<x,y,z> = ProjectiveSpace(K, 2)
sage: f = DynamicalSystem_projective([1/(c+1)*x^2 + c*y^2, 210*x*y, 10000*z^2])
sage: f.height_difference_bound()                                           # needs sage.symbolic
11.3683039374269
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = QQ['x']; (x,) = R._first_ngens(1)
>>> K = NumberField(x**Integer(3) - Integer(2), names=('c',)); (c,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([Integer(1)/(c+Integer(1))*x**Integer(2) + c*y**Integer(2), Integer(210)*x*y, Integer(10000)*z**Integer(2)])
>>> f.height_difference_bound()                                           # needs sage.symbolic
11.3683039374269

sage: # needs sage.rings.number_field sage.symbolic
sage: P.<x,y,z> = ProjectiveSpace(QQbar, 2)
sage: f = DynamicalSystem_projective([x^2, QQbar(sqrt(-1))*y^2,
....:                                 QQbar(sqrt(3))*z^2])
sage: f.height_difference_bound()
2.89037175789616
>>> from sage.all import *
>>> # needs sage.rings.number_field sage.symbolic
>>> P = ProjectiveSpace(QQbar, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), QQbar(sqrt(-Integer(1)))*y**Integer(2),
...                                 QQbar(sqrt(Integer(3)))*z**Integer(2)])
>>> f.height_difference_bound()
2.89037175789616

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem([5*x^2 + 3*x*y , y^2 + 3*x^2])
sage: f.height_difference_bound(prec=100)                                   # needs sage.symbolic
5.3375380797013179737224159274
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([Integer(5)*x**Integer(2) + Integer(3)*x*y , y**Integer(2) + Integer(3)*x**Integer(2)])
>>> f.height_difference_bound(prec=Integer(100))                                   # needs sage.symbolic
5.3375380797013179737224159274
is_Lattes()[source]

Check if self is a Lattes map.

OUTPUT: True if self is Lattes, False otherwise

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^3, y^3])
sage: F.is_Lattes()
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(3), y**Integer(3)])
>>> F.is_Lattes()
False

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^2 - 2*y^2, y^2])
sage: F.is_Lattes()
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(2) - Integer(2)*y**Integer(2), y**Integer(2)])
>>> F.is_Lattes()
False

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: F = DynamicalSystem_projective([x^2 + y^2 + z^2, y^2, z^2])
sage: F.is_Lattes()
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> F = DynamicalSystem_projective([x**Integer(2) + y**Integer(2) + z**Integer(2), y**Integer(2), z**Integer(2)])
>>> F.is_Lattes()
False

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([(x + y)*(x - y)^3, y*(2*x + y)^3])
sage: F.is_Lattes()
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([(x + y)*(x - y)**Integer(3), y*(Integer(2)*x + y)**Integer(3)])
>>> F.is_Lattes()
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([(x + y)^4, 16*x*y*(x - y)^2])
sage: F.is_Lattes()
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([(x + y)**Integer(4), Integer(16)*x*y*(x - y)**Integer(2)])
>>> F.is_Lattes()
True

sage: f = P.Lattes_map(EllipticCurve([0, 0, 0, 0, 2]),2)
sage: f.is_Lattes()
True
>>> from sage.all import *
>>> f = P.Lattes_map(EllipticCurve([Integer(0), Integer(0), Integer(0), Integer(0), Integer(2)]),Integer(2))
>>> f.is_Lattes()
True

sage: f = P.Lattes_map(EllipticCurve([0, 0, 0, 0, 2]), 2)
sage: L.<i> = CyclotomicField(4)
sage: M = Matrix([[i, 0], [0, -i]])
sage: f.conjugate(M)
Dynamical System of Projective Space of dimension 1 over
 Cyclotomic Field of order 4 and degree 2
  Defn: Defined on coordinates by sending (x : y) to
        ((-1/4*i)*x^4 + (-4*i)*x*y^3 : (-i)*x^3*y + (2*i)*y^4)
sage: f.is_Lattes()
True
>>> from sage.all import *
>>> f = P.Lattes_map(EllipticCurve([Integer(0), Integer(0), Integer(0), Integer(0), Integer(2)]), Integer(2))
>>> L = CyclotomicField(Integer(4), names=('i',)); (i,) = L._first_ngens(1)
>>> M = Matrix([[i, Integer(0)], [Integer(0), -i]])
>>> f.conjugate(M)
Dynamical System of Projective Space of dimension 1 over
 Cyclotomic Field of order 4 and degree 2
  Defn: Defined on coordinates by sending (x : y) to
        ((-1/4*i)*x^4 + (-4*i)*x*y^3 : (-i)*x^3*y + (2*i)*y^4)
>>> f.is_Lattes()
True

REFERENCES:

is_PGL_minimal(prime_list=None)[source]

Check if this dynamical system is a minimal model in its conjugacy class.

See [BM2012] and [Mol2015] for a description of the algorithm. For polynomial maps it uses [HS2018].

INPUT:

  • prime_list – (optional) list of primes to check minimality

OUTPUT: boolean

EXAMPLES:

sage: PS.<X,Y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([X^2 + 3*Y^2, X*Y])
sage: f.is_PGL_minimal()                                                    # needs sage.rings.function_field
True
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('X', 'Y',)); (X, Y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([X**Integer(2) + Integer(3)*Y**Integer(2), X*Y])
>>> f.is_PGL_minimal()                                                    # needs sage.rings.function_field
True

sage: PS.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([6*x^2 + 12*x*y + 7*y^2, 12*x*y])
sage: f.is_PGL_minimal()                                                    # needs sage.rings.function_field
False
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(6)*x**Integer(2) + Integer(12)*x*y + Integer(7)*y**Integer(2), Integer(12)*x*y])
>>> f.is_PGL_minimal()                                                    # needs sage.rings.function_field
False

sage: PS.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([6*x^2 + 12*x*y + 7*y^2, y^2])
sage: f.is_PGL_minimal()                                                    # needs sage.rings.function_field
False
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(6)*x**Integer(2) + Integer(12)*x*y + Integer(7)*y**Integer(2), y**Integer(2)])
>>> f.is_PGL_minimal()                                                    # needs sage.rings.function_field
False
is_chebyshev()[source]

Check if self is a Chebyshev polynomial.

OUTPUT: True if self is Chebyshev, False otherwise

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^4, y^4])
sage: F.is_chebyshev()
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(4), y**Integer(4)])
>>> F.is_chebyshev()
False

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: F.is_chebyshev()
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> F.is_chebyshev()
False

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([2*x^2 - y^2, y^2])
sage: F.is_chebyshev()
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([Integer(2)*x**Integer(2) - y**Integer(2), y**Integer(2)])
>>> F.is_chebyshev()
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([x^3, 4*y^3 - 3*x^2*y])
sage: F.is_chebyshev()
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(3), Integer(4)*y**Integer(3) - Integer(3)*x**Integer(2)*y])
>>> F.is_chebyshev()
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: F = DynamicalSystem_projective([2*x^2 - y^2, y^2])
sage: L.<i> = CyclotomicField(4)
sage: M = Matrix([[0,i],[-i,0]])
sage: F.conjugate(M)
Dynamical System of Projective Space of dimension 1 over
 Cyclotomic Field of order 4 and degree 2
  Defn: Defined on coordinates by sending (x : y) to
        ((-i)*x^2 : (-i)*x^2 + (2*i)*y^2)
sage: F.is_chebyshev()
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([Integer(2)*x**Integer(2) - y**Integer(2), y**Integer(2)])
>>> L = CyclotomicField(Integer(4), names=('i',)); (i,) = L._first_ngens(1)
>>> M = Matrix([[Integer(0),i],[-i,Integer(0)]])
>>> F.conjugate(M)
Dynamical System of Projective Space of dimension 1 over
 Cyclotomic Field of order 4 and degree 2
  Defn: Defined on coordinates by sending (x : y) to
        ((-i)*x^2 : (-i)*x^2 + (2*i)*y^2)
>>> F.is_chebyshev()
True

REFERENCES:

is_dynamical_belyi_map()[source]

Return if this dynamical system is a dynamical Belyi map.

We define a dynamical Belyi map to be a map conjugate to a dynamical system \(f: \mathbb{P}^1 \to \mathbb{P}^1\) where the branch points are contained in \(\{0, 1, \infty \}\) and the postcritical set is contained in \(\{0, 1, \infty \}\).

Output: Boolean

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([-2*x^3 - 9*x^2*y - 12*x*y^2 - 6*y^3, y^3])
sage: f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([-Integer(2)*x**Integer(3) - Integer(9)*x**Integer(2)*y - Integer(12)*x*y**Integer(2) - Integer(6)*y**Integer(3), y**Integer(3)])
>>> f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([5*x^7 - 7*x^6*y, -7*x*y^6 + 5*y^7])
sage: f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(5)*x**Integer(7) - Integer(7)*x**Integer(6)*y, -Integer(7)*x*y**Integer(6) + Integer(5)*y**Integer(7)])
>>> f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
False

sage: # needs sage.rings.number_field
sage: F = QuadraticField(-7)
sage: P.<x,y> = ProjectiveSpace(F, 1)
sage: f = DynamicalSystem_projective([5*x^7 - 7*x^6*y, -7*x*y^6 + 5*y^7])
sage: f.is_dynamical_belyi_map()
True
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> F = QuadraticField(-Integer(7))
>>> P = ProjectiveSpace(F, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(5)*x**Integer(7) - Integer(7)*x**Integer(6)*y, -Integer(7)*x*y**Integer(6) + Integer(5)*y**Integer(7)])
>>> f.is_dynamical_belyi_map()
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([2*x^3 + 3*x^2*y - 3*x*y^2 + 2*y^3,
....:                                 x^3 + y^3])
sage: f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(2)*x**Integer(3) + Integer(3)*x**Integer(2)*y - Integer(3)*x*y**Integer(2) + Integer(2)*y**Integer(3),
...                                 x**Integer(3) + y**Integer(3)])
>>> f.is_dynamical_belyi_map()                                            # needs sage.rings.number_field
False

sage: # needs sage.rings.number_field
sage: R.<t> = PolynomialRing(QQ)
sage: N.<c> = NumberField(t^3 - 2)
sage: P.<x,y> = ProjectiveSpace(N, 1)
sage: f=DynamicalSystem_projective([x^2 + c*y^2, x*y])
sage: f.is_dynamical_belyi_map()
False
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = PolynomialRing(QQ, names=('t',)); (t,) = R._first_ngens(1)
>>> N = NumberField(t**Integer(3) - Integer(2), names=('c',)); (c,) = N._first_ngens(1)
>>> P = ProjectiveSpace(N, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f=DynamicalSystem_projective([x**Integer(2) + c*y**Integer(2), x*y])
>>> f.is_dynamical_belyi_map()
False

sage: P.<x,y> = ProjectiveSpace(GF(7), 1)
sage: f = DynamicalSystem_projective([x^3 + 6*y^3, y^3])
sage: f.is_dynamical_belyi_map()                                            # needs sage.libs.pari
False
>>> from sage.all import *
>>> P = ProjectiveSpace(GF(Integer(7)), Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) + Integer(6)*y**Integer(3), y**Integer(3)])
>>> f.is_dynamical_belyi_map()                                            # needs sage.libs.pari
False
is_postcritically_finite(err=0.01, use_algebraic_closure=True)[source]

Determine if this dynamical system is post-critically finite.

Only for endomorphisms of \(\mathbb{P}^1\). It checks if each critical point is preperiodic. The optional parameter err is passed into is_preperiodic() as part of the preperiodic check.

The computations can be done either over the algebraic closure of the base field or over the minimal extension of the base field that contains the critical points.

INPUT:

  • err – (default: 0.01) positive real number

  • use_algebraic_closure – boolean (default: True); if True, uses the algebraic closure. If False, uses the smallest extension of the base field containing all the critical points.

OUTPUT: boolean

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 - y^2, y^2])
sage: f.is_postcritically_finite()                                          # needs sage.rings.number_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), y**Integer(2)])
>>> f.is_postcritically_finite()                                          # needs sage.rings.number_field
True

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3 - y^3, y^3])
sage: f.is_postcritically_finite()                                          # needs sage.rings.number_field
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - y**Integer(3), y**Integer(3)])
>>> f.is_postcritically_finite()                                          # needs sage.rings.number_field
False

sage: # needs sage.rings.number_field
sage: R.<z> = QQ[]
sage: K.<v> = NumberField(z^8 + 3*z^6 + 3*z^4 + z^2 + 1)
sage: PS.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([x^3 + v*y^3, y^3])
sage: f.is_postcritically_finite()  # long time
True
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> R = QQ['z']; (z,) = R._first_ngens(1)
>>> K = NumberField(z**Integer(8) + Integer(3)*z**Integer(6) + Integer(3)*z**Integer(4) + z**Integer(2) + Integer(1), names=('v',)); (v,) = K._first_ngens(1)
>>> PS = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) + v*y**Integer(3), y**Integer(3)])
>>> f.is_postcritically_finite()  # long time
True

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([6*x^2 + 16*x*y + 16*y^2,
....:                                 -3*x^2 - 4*x*y - 4*y^2])
sage: f.is_postcritically_finite()                                          # needs sage.rings.number_field
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(6)*x**Integer(2) + Integer(16)*x*y + Integer(16)*y**Integer(2),
...                                 -Integer(3)*x**Integer(2) - Integer(4)*x*y - Integer(4)*y**Integer(2)])
>>> f.is_postcritically_finite()                                          # needs sage.rings.number_field
True

sage: # needs sage.libs.gap sage.rings.number_field
sage: K = UniversalCyclotomicField()
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: F = DynamicalSystem_projective([x^2 - y^2, y^2], domain=P)
sage: F.is_postcritically_finite()
True
>>> from sage.all import *
>>> # needs sage.libs.gap sage.rings.number_field
>>> K = UniversalCyclotomicField()
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> F = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), y**Integer(2)], domain=P)
>>> F.is_postcritically_finite()
True

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([8*x^4 - 8*x^2*y^2 + y^4, y^4])
sage: f.is_postcritically_finite(use_algebraic_closure=False)  # long time
True
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(8)*x**Integer(4) - Integer(8)*x**Integer(2)*y**Integer(2) + y**Integer(4), y**Integer(4)])
>>> f.is_postcritically_finite(use_algebraic_closure=False)  # long time
True

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^4 - x^2*y^2 + y^4, y^4])
sage: f.is_postcritically_finite(use_algebraic_closure=False)               # needs sage.rings.number_field
False
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(4) - x**Integer(2)*y**Integer(2) + y**Integer(4), y**Integer(4)])
>>> f.is_postcritically_finite(use_algebraic_closure=False)               # needs sage.rings.number_field
False

sage: # needs sage.rings.number_field
sage: P.<x,y> = ProjectiveSpace(QQbar,1)
sage: f = DynamicalSystem_projective([x^4 - x^2*y^2, y^4])
sage: f.is_postcritically_finite()
False
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> P = ProjectiveSpace(QQbar,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(4) - x**Integer(2)*y**Integer(2), y**Integer(4)])
>>> f.is_postcritically_finite()
False
minimal_model(return_transformation=False, prime_list=None, algorithm=None, check_primes=True)[source]

Determine if this dynamical system is minimal.

This dynamical system must be defined over the projective line over the rationals. In particular, determine if this map is affine minimal, which is enough to decide if it is minimal or not. See Proposition 2.10 in [BM2012].

INPUT:

  • return_transformation – boolean (default: False); this signals a return of the \(PGL_2\) transformation to conjugate this map to the calculated minimal model

  • prime_list – (optional) a list of primes, in case one only wants to determine minimality at those specific primes

  • algorithm – (optional) string; can be one of the following:

  • check_primes – (optional) boolean; this signals whether to

    check whether each element in prime_list is a prime

    • 'BM' – the Bruin-Molnar algorithm [BM2012]

    • 'HS' – the Hutz-Stoll algorithm [HS2018]

OUTPUT:

  • a dynamical system on the projective line which is a minimal model of this map

  • a \(PGL(2,\QQ)\) element which conjugates this map to a minimal model

EXAMPLES:

sage: PS.<X,Y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([X^2 + 3*Y^2, X*Y])
sage: f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational
Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 + 3*Y^2 : X*Y)
,
[1 0]
[0 1]
)
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('X', 'Y',)); (X, Y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([X**Integer(2) + Integer(3)*Y**Integer(2), X*Y])
>>> f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational
Field
  Defn: Defined on coordinates by sending (X : Y) to
        (X^2 + 3*Y^2 : X*Y)
,
[1 0]
[0 1]
)

sage: PS.<X,Y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([7365/2*X^4 + 6282*X^3*Y + 4023*X^2*Y^2
....:                                   + 1146*X*Y^3 + 245/2*Y^4,
....:                                 -12329/2*X^4 - 10506*X^3*Y - 6723*X^2*Y^2
....:                                   - 1914*X*Y^3 - 409/2*Y^4])
sage: f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (9847*X^4 + 28088*X^3*Y + 30048*X^2*Y^2 + 14288*X*Y^3 + 2548*Y^4
        : -12329*X^4 - 35164*X^3*Y - 37614*X^2*Y^2 - 17884*X*Y^3 - 3189*Y^4),

[2 1]
[0 1]
)
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('X', 'Y',)); (X, Y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(7365)/Integer(2)*X**Integer(4) + Integer(6282)*X**Integer(3)*Y + Integer(4023)*X**Integer(2)*Y**Integer(2)
...                                   + Integer(1146)*X*Y**Integer(3) + Integer(245)/Integer(2)*Y**Integer(4),
...                                 -Integer(12329)/Integer(2)*X**Integer(4) - Integer(10506)*X**Integer(3)*Y - Integer(6723)*X**Integer(2)*Y**Integer(2)
...                                   - Integer(1914)*X*Y**Integer(3) - Integer(409)/Integer(2)*Y**Integer(4)])
>>> f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (X : Y) to
        (9847*X^4 + 28088*X^3*Y + 30048*X^2*Y^2 + 14288*X*Y^3 + 2548*Y^4
        : -12329*X^4 - 35164*X^3*Y - 37614*X^2*Y^2 - 17884*X*Y^3 - 3189*Y^4),
<BLANKLINE>
[2 1]
[0 1]
)

sage: PS.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([6*x^2 + 12*x*y + 7*y^2, 12*x*y])
sage: f.minimal_model()                                                     # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (x^2 + 12*x*y + 42*y^2 : 2*x*y)
>>> from sage.all import *
>>> PS = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(6)*x**Integer(2) + Integer(12)*x*y + Integer(7)*y**Integer(2), Integer(12)*x*y])
>>> f.minimal_model()                                                     # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (x^2 + 12*x*y + 42*y^2 : 2*x*y)

sage: PS.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([6*x^2 + 12*x*y + 7*y^2, 12*x*y + 42*y^2])
sage: g,M = f.minimal_model(return_transformation=True, algorithm='BM')     # needs sage.rings.function_field
sage: f.conjugate(M) == g                                                   # needs sage.rings.function_field
True
>>> from sage.all import *
>>> PS = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = PS._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(6)*x**Integer(2) + Integer(12)*x*y + Integer(7)*y**Integer(2), Integer(12)*x*y + Integer(42)*y**Integer(2)])
>>> g,M = f.minimal_model(return_transformation=True, algorithm='BM')     # needs sage.rings.function_field
>>> f.conjugate(M) == g                                                   # needs sage.rings.function_field
True

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem([2*x^2, y^2])
sage: f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (x^2 : y^2)                                                    ,
[1 0]
[0 2]
)
sage: f.minimal_model(prime_list=[3])                                       # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (2*x^2 : y^2)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([Integer(2)*x**Integer(2), y**Integer(2)])
>>> f.minimal_model(return_transformation=True)                           # needs sage.rings.function_field
(
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (x^2 : y^2)                                                    ,
[1 0]
[0 2]
)
>>> f.minimal_model(prime_list=[Integer(3)])                                       # needs sage.rings.function_field
Dynamical System of Projective Space of dimension 1 over Rational Field
  Defn: Defined on coordinates by sending (x : y) to
        (2*x^2 : y^2)

REFERENCES:

multiplier(P, n, check=True)[source]

Return the multiplier of the point P of period n with respect to this dynamical system.

INPUT:

  • P – a point on domain of this map

  • n – positive integer, the period of P

  • check – boolean (default: True); verify that P has period n

OUTPUT:

A square matrix of size self.codomain().dimension_relative() in the base_ring of this dynamical system.

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = DynamicalSystem_projective([x^2, y^2, 4*z^2])
sage: Q = P.point([4,4,1], False)
sage: f.multiplier(Q,1)
[2 0]
[0 2]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), Integer(4)*z**Integer(2)])
>>> Q = P.point([Integer(4),Integer(4),Integer(1)], False)
>>> f.multiplier(Q,Integer(1))
[2 0]
[0 2]

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([7*x^2 - 28*y^2, 24*x*y])
sage: f.multiplier(P(2,5), 4)
[231361/20736]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(7)*x**Integer(2) - Integer(28)*y**Integer(2), Integer(24)*x*y])
>>> f.multiplier(P(Integer(2),Integer(5)), Integer(4))
[231361/20736]

sage: P.<x,y> = ProjectiveSpace(CC,1)
sage: f = DynamicalSystem_projective([x^3 - 25*x*y^2 + 12*y^3, 12*y^3])
sage: f.multiplier(P(1,1), 5)
[0.389017489711934]
>>> from sage.all import *
>>> P = ProjectiveSpace(CC,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - Integer(25)*x*y**Integer(2) + Integer(12)*y**Integer(3), Integer(12)*y**Integer(3)])
>>> f.multiplier(P(Integer(1),Integer(1)), Integer(5))
[0.389017489711934]

sage: P.<x,y> = ProjectiveSpace(RR,1)
sage: f = DynamicalSystem_projective([x^2 - 2*y^2, y^2])
sage: f.multiplier(P(2,1), 1)
[4.00000000000000]
>>> from sage.all import *
>>> P = ProjectiveSpace(RR,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(2)*y**Integer(2), y**Integer(2)])
>>> f.multiplier(P(Integer(2),Integer(1)), Integer(1))
[4.00000000000000]

sage: P.<x,y> = ProjectiveSpace(Qp(13),1)                                   # needs sage.rings.padics
sage: f = DynamicalSystem_projective([x^2 - 29/16*y^2, y^2])
sage: f.multiplier(P(5,4), 3)                                               # needs sage.rings.padics
[6 + 8*13 + 13^2 + 8*13^3 + 13^4 + 8*13^5 + 13^6 + 8*13^7 + 13^8 +
 8*13^9 + 13^10 + 8*13^11 + 13^12 + 8*13^13 + 13^14 + 8*13^15 + 13^16 +
 8*13^17 + 13^18 + 8*13^19 + O(13^20)]
>>> from sage.all import *
>>> P = ProjectiveSpace(Qp(Integer(13)),Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)# needs sage.rings.padics
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(29)/Integer(16)*y**Integer(2), y**Integer(2)])
>>> f.multiplier(P(Integer(5),Integer(4)), Integer(3))                                               # needs sage.rings.padics
[6 + 8*13 + 13^2 + 8*13^3 + 13^4 + 8*13^5 + 13^6 + 8*13^7 + 13^8 +
 8*13^9 + 13^10 + 8*13^11 + 13^12 + 8*13^13 + 13^14 + 8*13^15 + 13^16 +
 8*13^17 + 13^18 + 8*13^19 + O(13^20)]

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 - y^2, y^2])
sage: f.multiplier(P(0,1), 1)
Traceback (most recent call last):
...
ValueError: (0 : 1) is not periodic of period 1
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), y**Integer(2)])
>>> f.multiplier(P(Integer(0),Integer(1)), Integer(1))
Traceback (most recent call last):
...
ValueError: (0 : 1) is not periodic of period 1
multiplier_spectra(n, formal=False, type='point', use_algebraic_closure=True, check=True)[source]

Compute the n multiplier spectra of this dynamical system.

This is the set of multipliers of all peroidic points of period n included with the appropriate multiplicity. User can also specify to compute the formal n multiplier spectra instead which includes the multipliers of all formal periodic points of period n with appropriate multiplicity. The map must be defined over projective space over a number field or finite field.

By default, the computations are done over the algebraic closure of the base field. If the map is defined over projective space of dimension 1, the computation can be done over the minimal extension of the base field that contains the periodic points. Otherwise, it will be done over the base ring of the map.

INPUT:

  • n – positive integer, the period

  • formal – boolean (default: False); True specifies to find the formal n multiplier spectra of this map and False specifies to find the n multiplier spectra

  • type – (default: 'point') string; either 'point' or 'cycle' depending on whether you compute one multiplier per point or one per cycle

  • use_algebraic_closure – boolean (default: True); if True uses the algebraic closure. Using the algebraic closure can sometimes lead to numerical instability and extraneous errors. For most accurate results in dimension 1, set to False. If False, and the map is defined over projective space of dimension 1, uses the smallest extension of the base field containing all the periodic points. If the map is defined over projective space of dimension greater than 1, then the base ring of the map is used.

  • check – boolean (default: True); whether to check if the full multiplier spectra was computed. If False, can lead to mathematically incorrect answers in dimension greater than 1. Ignored if use_algebraic_closure is True or if this dynamical system is defined over projective space of dimension 1.

OUTPUT:

A list of field elements if the domain of the map is projective space of dimension 1. If the domain of the map is projective space of dimension greater than 1, a list of matrices

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 - 3/4*y^2, y^2])
sage: sorted(f.multiplier_spectra(2, type='point'))                         # needs sage.rings.number_field
[0, 1, 1, 1, 9]
sage: sorted(f.multiplier_spectra(2, type='cycle'))                         # needs sage.rings.number_field
[0, 1, 1, 9]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(3)/Integer(4)*y**Integer(2), y**Integer(2)])
>>> sorted(f.multiplier_spectra(Integer(2), type='point'))                         # needs sage.rings.number_field
[0, 1, 1, 1, 9]
>>> sorted(f.multiplier_spectra(Integer(2), type='cycle'))                         # needs sage.rings.number_field
[0, 1, 1, 9]

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([x^2, z^2, y^2])
sage: f.multiplier_spectra(1)                                               # needs sage.rings.number_field
[
[                       2 1 - 1.732050807568878?*I]
[                       0                       -2],
[                       2 1 + 1.732050807568878?*I]  [ 0  0]  [ 0  0]
[                       0                       -2], [ 0 -2], [ 0 -2],
[ 0  0]  [0 0]  [ 2 -2]
[ 0 -2], [0 0], [ 0 -2]
]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), z**Integer(2), y**Integer(2)])
>>> f.multiplier_spectra(Integer(1))                                               # needs sage.rings.number_field
[
[                       2 1 - 1.732050807568878?*I]
[                       0                       -2],
[                       2 1 + 1.732050807568878?*I]  [ 0  0]  [ 0  0]
[                       0                       -2], [ 0 -2], [ 0 -2],
[ 0  0]  [0 0]  [ 2 -2]
[ 0 -2], [0 0], [ 0 -2]
]

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([x^2, z^2, y^2])
sage: f.multiplier_spectra(2, formal=True)  # long time
[
[4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [0 0]  [0 0]
[0 4], [0 0], [0 0], [0 4], [0 4], [0 0], [0 0], [0 4], [0 0], [0 0],
[4 0]  [4 0]  [4 0]  [4 0]
[0 4], [0 4], [0 0], [0 0]
]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), z**Integer(2), y**Integer(2)])
>>> f.multiplier_spectra(Integer(2), formal=True)  # long time
[
[4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [4 0]  [0 0]  [0 0]
[0 4], [0 0], [0 0], [0 4], [0 4], [0 0], [0 0], [0 4], [0 0], [0 0],
[4 0]  [4 0]  [4 0]  [4 0]
[0 4], [0 4], [0 0], [0 0]
]

sage: # needs sage.rings.number_field
sage: set_verbose(None)
sage: z = QQ['z'].0
sage: K.<w> = NumberField(z^4 - 4*z^2 + 1,'z')
sage: P.<x,y> = ProjectiveSpace(K, 1)
sage: f = DynamicalSystem_projective([x^2 - w/4*y^2, y^2])
sage: sorted(f.multiplier_spectra(2, formal=False, type='cycle'))
[0,
 0.0681483474218635? - 1.930649271699173?*I,
 0.0681483474218635? + 1.930649271699173?*I,
 5.931851652578137? + 0.?e-49*I]
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> set_verbose(None)
>>> z = QQ['z'].gen(0)
>>> K = NumberField(z**Integer(4) - Integer(4)*z**Integer(2) + Integer(1),'z', names=('w',)); (w,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - w/Integer(4)*y**Integer(2), y**Integer(2)])
>>> sorted(f.multiplier_spectra(Integer(2), formal=False, type='cycle'))
[0,
 0.0681483474218635? - 1.930649271699173?*I,
 0.0681483474218635? + 1.930649271699173?*I,
 5.931851652578137? + 0.?e-49*I]

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([4608*x^10 - 2910096*x^9*y + 325988068*x^8*y^2
....:         + 31825198932*x^7*y^3 - 4139806626613*x^6*y^4 - 44439736715486*x^5*y^5
....:         + 2317935971590902*x^4*y^6 - 15344764859590852*x^3*y^7
....:         + 2561851642765275*x^2*y^8 + 113578270285012470*x*y^9
....:         - 150049940203963800*y^10, 4608*y^10])
sage: sorted(f.multiplier_spectra(1))                                       # needs sage.rings.number_field
[-119820502365680843999,
 -7198147681176255644585/256,
 -3086380435599991/9,
 -3323781962860268721722583135/35184372088832,
 -4290991994944936653/2097152,
 0,
 529278480109921/256,
 1061953534167447403/19683,
 848446157556848459363/19683,
 82911372672808161930567/8192,
 3553497751559301575157261317/8192]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([Integer(4608)*x**Integer(10) - Integer(2910096)*x**Integer(9)*y + Integer(325988068)*x**Integer(8)*y**Integer(2)
...         + Integer(31825198932)*x**Integer(7)*y**Integer(3) - Integer(4139806626613)*x**Integer(6)*y**Integer(4) - Integer(44439736715486)*x**Integer(5)*y**Integer(5)
...         + Integer(2317935971590902)*x**Integer(4)*y**Integer(6) - Integer(15344764859590852)*x**Integer(3)*y**Integer(7)
...         + Integer(2561851642765275)*x**Integer(2)*y**Integer(8) + Integer(113578270285012470)*x*y**Integer(9)
...         - Integer(150049940203963800)*y**Integer(10), Integer(4608)*y**Integer(10)])
>>> sorted(f.multiplier_spectra(Integer(1)))                                       # needs sage.rings.number_field
[-119820502365680843999,
 -7198147681176255644585/256,
 -3086380435599991/9,
 -3323781962860268721722583135/35184372088832,
 -4290991994944936653/2097152,
 0,
 529278480109921/256,
 1061953534167447403/19683,
 848446157556848459363/19683,
 82911372672808161930567/8192,
 3553497751559301575157261317/8192]

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^2 - 7/4*y^2, y^2])
sage: f.multiplier_spectra(3, formal=True, type='cycle')                    # needs sage.rings.number_field
[1, 1]
sage: f.multiplier_spectra(3, formal=True, type='point')                    # needs sage.rings.number_field
[1, 1, 1, 1, 1, 1]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - Integer(7)/Integer(4)*y**Integer(2), y**Integer(2)])
>>> f.multiplier_spectra(Integer(3), formal=True, type='cycle')                    # needs sage.rings.number_field
[1, 1]
>>> f.multiplier_spectra(Integer(3), formal=True, type='point')                    # needs sage.rings.number_field
[1, 1, 1, 1, 1, 1]

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^4 + 3*y^4, 4*x^2*y^2])
sage: f.multiplier_spectra(1, use_algebraic_closure=False)                  # needs sage.rings.number_field
[0,
 -1,
 1/128*a^5 - 13/384*a^4 + 5/96*a^3 + 1/16*a^2 + 43/128*a + 303/128,
 -1/288*a^5 + 1/96*a^4 + 1/24*a^3 - 1/3*a^2 + 5/32*a - 115/32,
 -5/1152*a^5 + 3/128*a^4 - 3/32*a^3 + 13/48*a^2 - 63/128*a - 227/128]
sage: f.multiplier_spectra(1)                                               # needs sage.rings.number_field
[0,
 -1,
 1.951373035591442?,
 -2.475686517795721? - 0.730035681602057?*I,
 -2.475686517795721? + 0.730035681602057?*I]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(4) + Integer(3)*y**Integer(4), Integer(4)*x**Integer(2)*y**Integer(2)])
>>> f.multiplier_spectra(Integer(1), use_algebraic_closure=False)                  # needs sage.rings.number_field
[0,
 -1,
 1/128*a^5 - 13/384*a^4 + 5/96*a^3 + 1/16*a^2 + 43/128*a + 303/128,
 -1/288*a^5 + 1/96*a^4 + 1/24*a^3 - 1/3*a^2 + 5/32*a - 115/32,
 -5/1152*a^5 + 3/128*a^4 - 3/32*a^3 + 13/48*a^2 - 63/128*a - 227/128]
>>> f.multiplier_spectra(Integer(1))                                               # needs sage.rings.number_field
[0,
 -1,
 1.951373035591442?,
 -2.475686517795721? - 0.730035681602057?*I,
 -2.475686517795721? + 0.730035681602057?*I]

sage: P.<x,y> = ProjectiveSpace(GF(5), 1)
sage: f = DynamicalSystem_projective([x^4 + 2*y^4, 4*x^2*y^2])
sage: f.multiplier_spectra(1, use_algebraic_closure=False)                  # needs sage.rings.finite_rings
[0, 3*a + 3, 2*a + 1, 1, 1]
sage: f.multiplier_spectra(1)
[0, 2*z2 + 1, 3*z2 + 3, 1, 1]
>>> from sage.all import *
>>> P = ProjectiveSpace(GF(Integer(5)), Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(4) + Integer(2)*y**Integer(4), Integer(4)*x**Integer(2)*y**Integer(2)])
>>> f.multiplier_spectra(Integer(1), use_algebraic_closure=False)                  # needs sage.rings.finite_rings
[0, 3*a + 3, 2*a + 1, 1, 1]
>>> f.multiplier_spectra(Integer(1))
[0, 2*z2 + 1, 3*z2 + 3, 1, 1]

sage: # needs sage.rings.number_field
sage: P.<x,y> = ProjectiveSpace(QQbar, 1)
sage: f = DynamicalSystem_projective([x^5 + 3*y^5, 4*x^3*y^2])
sage: f.multiplier_spectra(1)
[0,
 -4.106544657178796?,
 -7/4,
 1.985176555073911?,
 -3.064315948947558? - 1.150478041113253?*I,
 -3.064315948947558? + 1.150478041113253?*I]
>>> from sage.all import *
>>> # needs sage.rings.number_field
>>> P = ProjectiveSpace(QQbar, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(5) + Integer(3)*y**Integer(5), Integer(4)*x**Integer(3)*y**Integer(2)])
>>> f.multiplier_spectra(Integer(1))
[0,
 -4.106544657178796?,
 -7/4,
 1.985176555073911?,
 -3.064315948947558? - 1.150478041113253?*I,
 -3.064315948947558? + 1.150478041113253?*I]

sage: K = GF(3).algebraic_closure()
sage: P.<x,y> = ProjectiveSpace(K, 1)
sage: f = DynamicalSystem_projective([x^5 + 2*y^5, 4*x^3*y^2])
sage: f.multiplier_spectra(1)
[0, z3 + 2, z3 + 1, z3, 1, 1]
>>> from sage.all import *
>>> K = GF(Integer(3)).algebraic_closure()
>>> P = ProjectiveSpace(K, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(5) + Integer(2)*y**Integer(5), Integer(4)*x**Integer(3)*y**Integer(2)])
>>> f.multiplier_spectra(Integer(1))
[0, z3 + 2, z3 + 1, z3, 1, 1]
nth_iterate(P, n, **kwds)[source]

Return the n-th iterate of the point P by this dynamical system.

If normalize is True, then the coordinates are automatically normalized.

Todo

Is there a more efficient way to do this?

INPUT:

  • P – a point in this map’s domain

  • n – positive integer

kwds:

  • normalize – boolean (default: False)

OUTPUT: a point in this map’s codomain

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, 2*y^2])
sage: Q = P(1,1)
sage: f.nth_iterate(Q,4)
(32768 : 32768)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), Integer(2)*y**Integer(2)])
>>> Q = P(Integer(1),Integer(1))
>>> f.nth_iterate(Q,Integer(4))
(32768 : 32768)

sage: P.<x,y> = ProjectiveSpace(ZZ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, 2*y^2])
sage: Q = P(1,1)
sage: f.nth_iterate(Q, 4, normalize=True)
(1 : 1)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), Integer(2)*y**Integer(2)])
>>> Q = P(Integer(1),Integer(1))
>>> f.nth_iterate(Q, Integer(4), normalize=True)
(1 : 1)

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = DynamicalSystem_projective([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)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2), Integer(2)*y**Integer(2), z**Integer(2) - x**Integer(2)])
>>> Q = P(Integer(2),Integer(7),Integer(1))
>>> f.nth_iterate(Q,Integer(2))
(-16/7 : -2744 : 1)

sage: R.<t> = PolynomialRing(QQ)
sage: P.<x,y,z> = ProjectiveSpace(R,2)
sage: f = DynamicalSystem_projective([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)
>>> from sage.all import *
>>> R = PolynomialRing(QQ, names=('t',)); (t,) = R._first_ngens(1)
>>> P = ProjectiveSpace(R,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + t*y**Integer(2), (Integer(2)-t)*y**Integer(2), z**Integer(2)])
>>> Q = P(Integer(2) + t, Integer(7), t)
>>> f.nth_iterate(Q,Integer(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: f = DynamicalSystem_projective([x^2, y^2, z^2], domain=X)
sage: f.nth_iterate(X(2,2,3), 3)
(256 : 256 : 6561)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(x**Integer(2)-y**Integer(2))
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), z**Integer(2)], domain=X)
>>> f.nth_iterate(X(Integer(2),Integer(2),Integer(3)), Integer(3))
(256 : 256 : 6561)

sage: K.<c> = FunctionField(QQ)
sage: P.<x,y> = ProjectiveSpace(K,1)
sage: f = DynamicalSystem_projective([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)

sage: P.<x,y,z> = ProjectiveSpace(QQ,2)
sage: f = DynamicalSystem_projective([x^2 + 3*y^2, 2*y^2, z^2])
sage: f.nth_iterate(P(2, 7, 1), -2)
Traceback (most recent call last):
...
TypeError: must be a forward orbit
>>> from sage.all import *
>>> K = FunctionField(QQ, names=('c',)); (c,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3) - Integer(2)*x*y**Integer(2) - c*y**Integer(3), x*y**Integer(2)])
>>> f.nth_iterate(P(c,Integer(1)), Integer(2))
((c^6 - 9*c^4 + 25*c^2 - c - 21)/(c^2 - 3) : 1)

>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + Integer(3)*y**Integer(2), Integer(2)*y**Integer(2), z**Integer(2)])
>>> f.nth_iterate(P(Integer(2), Integer(7), Integer(1)), -Integer(2))
Traceback (most recent call last):
...
TypeError: must be a forward orbit

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: f = DynamicalSystem_projective([x^3, x*y^2], domain=P)
sage: f.nth_iterate(P(0, 1), 3, check=False)
(0 : 0)
sage: f.nth_iterate(P(0, 1), 3)
Traceback (most recent call last):
...
ValueError: [0, 0] does not define a valid projective point since all entries are zero
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3), x*y**Integer(2)], domain=P)
>>> f.nth_iterate(P(Integer(0), Integer(1)), Integer(3), check=False)
(0 : 0)
>>> f.nth_iterate(P(Integer(0), Integer(1)), Integer(3))
Traceback (most recent call last):
...
ValueError: [0, 0] does not define a valid projective point since all entries are zero

sage: P.<x,y> = ProjectiveSpace(ZZ, 1)
sage: f = DynamicalSystem_projective([x^3, x*y^2], domain=P)
sage: f.nth_iterate(P(2,1), 3, normalize=False)
(134217728 : 524288)
sage: f.nth_iterate(P(2,1), 3, normalize=True)
(256 : 1)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ, Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(3), x*y**Integer(2)], domain=P)
>>> f.nth_iterate(P(Integer(2),Integer(1)), Integer(3), normalize=False)
(134217728 : 524288)
>>> f.nth_iterate(P(Integer(2),Integer(1)), Integer(3), normalize=True)
(256 : 1)

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem([x + y, y])
sage: Q = (3,1)
sage: f.nth_iterate(Q,0)
(3 : 1)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem([x + y, y])
>>> Q = (Integer(3),Integer(1))
>>> f.nth_iterate(Q,Integer(0))
(3 : 1)
nth_iterate_map(n, normalize=False)[source]

Return the n-th iterate of this dynamical system.

ALGORITHM:

Uses a form of successive squaring to reducing computations.

Todo

This could be improved.

INPUT:

  • n – positive integer

  • normalize – boolean; remove gcd’s during iteration

OUTPUT: a projective dynamical system

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: f.nth_iterate_map(2)
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.nth_iterate_map(Integer(2))
Dynamical System 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: f = DynamicalSystem_projective([x^2 - y^2, x*y])
sage: f.nth_iterate_map(3)
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(CC,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), x*y])
>>> f.nth_iterate_map(Integer(3))
Dynamical System 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: f = DynamicalSystem_projective([x^2 - y^2, x*y, z^2 + x^2])
sage: f.nth_iterate_map(2)
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) - y**Integer(2), x*y, z**Integer(2) + x**Integer(2)])
>>> f.nth_iterate_map(Integer(2))
Dynamical System 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: f = DynamicalSystem_projective([x^2, x*z, z^2], domain=X)
sage: f.nth_iterate_map(2)                                                  # needs sage.rings.function_field
Dynamical System 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)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(x*z-y**Integer(2))
>>> f = DynamicalSystem_projective([x**Integer(2), x*z, z**Integer(2)], domain=X)
>>> f.nth_iterate_map(Integer(2))                                                  # needs sage.rings.function_field
Dynamical System 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)

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: f = DynamicalSystem_projective([y^2 * z^3, y^3 * z^2, x^5])
sage: f.nth_iterate_map( 5, normalize=True)
Dynamical System of Projective Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (x : y : z) to
(y^202*z^443 : x^140*y^163*z^342 : x^645)
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ, Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([y**Integer(2) * z**Integer(3), y**Integer(3) * z**Integer(2), x**Integer(5)])
>>> f.nth_iterate_map( Integer(5), normalize=True)
Dynamical System of Projective Space of dimension 2 over Rational Field
Defn: Defined on coordinates by sending (x : y : z) to
(y^202*z^443 : x^140*y^163*z^342 : x^645)
nth_preimage_tree(Q, n, **kwds)[source]

Return the n-th pre-image tree rooted at Q.

This map must be an endomorphism of the projective line defined over a number field, algebraic field, or finite field.

INPUT:

  • Q – a point in the domain of this map

  • n – positive integer, the depth of the pre-image tree

kwds:

  • return_points – boolean (default: False); if True, return a list of lists where the index \(i\) is the level of the tree and the elements of the list at that index are the \(i\)-th preimage points as an algebraic element of the splitting field of the polynomial \(f^n - Q = 0\).

  • numerical – boolean (default: False); calculate pre-images numerically. Note if this is set to True, preimage points are displayed as complex numbers.

  • prec – (default: 100) positive integer; the precision of the ComplexField if we compute the preimage points numerically

  • display_labels – boolean (default: True); whether to display vertex labels. Since labels can be very cluttered, can set display_labels to False and use return_points to get a hold of the points themselves, either as algebraic or complex numbers.

  • display_complex – boolean (default: False); display vertex labels as complex numbers. Note if this option is chosen that we must choose an embedding from the splitting field field_def of the \(n\)-th-preimage equation into \(\CC\). We make the choice of the first embedding returned by field_def.embeddings(ComplexField()).

  • digits – positive integer; the number of decimal digits to display for complex numbers. This only applies if display_complex is set to True.

OUTPUT:

If return_points is False, a GraphPlot object representing the \(n\)-th pre-image tree. If return_points is True, a tuple (GP, points), where GP is a GraphPlot object, and points is a list of lists as described above under return_points.

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2])
sage: Q = P(0,1)
sage: f.nth_preimage_tree(Q, 2)                                             # needs sage.plot
GraphPlot object for Digraph on 7 vertices
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> Q = P(Integer(0),Integer(1))
>>> f.nth_preimage_tree(Q, Integer(2))                                             # needs sage.plot
GraphPlot object for Digraph on 7 vertices

sage: P.<x,y> = ProjectiveSpace(GF(3), 1)
sage: f = DynamicalSystem_projective([x^2 + x*y + y^2, y^2])
sage: Q = P(0,1)
sage: f.nth_preimage_tree(Q, 2, return_points=True)                         # needs sage.plot
(GraphPlot object for Digraph on 4 vertices,
 [[(0 : 1)], [(1 : 1)], [(0 : 1), (2 : 1)]])
>>> from sage.all import *
>>> P = ProjectiveSpace(GF(Integer(3)), Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + x*y + y**Integer(2), y**Integer(2)])
>>> Q = P(Integer(0),Integer(1))
>>> f.nth_preimage_tree(Q, Integer(2), return_points=True)                         # needs sage.plot
(GraphPlot object for Digraph on 4 vertices,
 [[(0 : 1)], [(1 : 1)], [(0 : 1), (2 : 1)]])
orbit(P, N, **kwds)[source]

Return the orbit of the point P by this dynamical system.

Let \(F\) be this dynamical system. If N is an integer return \([P,F(P),\ldots,F^N(P)]\). If N is a list or tuple \(N=[m,k]\) return \([F^m(P),\ldots,F^k(P)]\). Automatically normalize the points if normalize=True. Perform the checks on point initialization if check=True.

INPUT:

  • P – a point in this dynamical system’s domain

  • n – nonnegative integer or list or tuple of two nonnegative integers

kwds:

  • check – boolean (default: True)

  • normalize – boolean (default: False)

OUTPUT: list of points in this dynamical system’s codomain

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(ZZ,2)
sage: f = DynamicalSystem_projective([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)]
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2) - z**Integer(2), Integer(2)*z**Integer(2)])
>>> f.orbit(P(Integer(1),Integer(2),Integer(1)), Integer(3))
[(1 : 2 : 1), (5 : 3 : 2), (34 : 5 : 8), (1181 : -39 : 128)]

sage: P.<x,y,z> = ProjectiveSpace(ZZ,2)
sage: f = DynamicalSystem_projective([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)]
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2) - z**Integer(2), Integer(2)*z**Integer(2)])
>>> f.orbit(P(Integer(1),Integer(2),Integer(1)), [Integer(2),Integer(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: f = DynamicalSystem_projective([x^2, y^2, x*z], domain=X)
sage: f.orbit(X(2,2,3), 3, normalize=True)
[(2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3)]
>>> from sage.all import *
>>> P = ProjectiveSpace(ZZ,Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = P._first_ngens(3)
>>> X = P.subscheme(x**Integer(2) - y**Integer(2))
>>> f = DynamicalSystem_projective([x**Integer(2), y**Integer(2), x*z], domain=X)
>>> f.orbit(X(Integer(2),Integer(2),Integer(3)), Integer(3), normalize=True)
[(2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3), (2 : 2 : 3)]

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([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)]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)])
>>> f.orbit(P.point([Integer(1),Integer(2)], False), Integer(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: f = DynamicalSystem_projective([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)]
>>> from sage.all import *
>>> K = FunctionField(QQ, names=('c',)); (c,) = K._first_ngens(1)
>>> P = ProjectiveSpace(K,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + c*y**Integer(2), y**Integer(2)])
>>> f.orbit(P(Integer(0),Integer(1)), Integer(3))
[(0 : 1), (c : 1), (c^2 + c : 1), (c^4 + 2*c^3 + c^2 + c : 1)]

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2 + y^2, y^2], domain=P)
sage: f.orbit(P.point([1, 2], False), 4, check=False)
[(1 : 2), (5 : 4), (41 : 16), (1937 : 256), (3817505 : 65536)]
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2) + y**Integer(2), y**Integer(2)], domain=P)
>>> f.orbit(P.point([Integer(1), Integer(2)], False), Integer(4), check=False)
[(1 : 2), (5 : 4), (41 : 16), (1937 : 256), (3817505 : 65536)]

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^2, 2*y^2], domain=P)
sage: f.orbit(P(2, 1),[-1, 4])
Traceback (most recent call last):
...
TypeError: orbit bounds must be nonnegative
sage: f.orbit(P(2, 1), 0.1)
Traceback (most recent call last):
...
TypeError: Attempt to coerce non-integral RealNumber to Integer
>>> from sage.all import *
>>> P = ProjectiveSpace(QQ,Integer(1), names=('x', 'y',)); (x, y,) = P._first_ngens(2)
>>> f = DynamicalSystem_projective([x**Integer(2), Integer(2)*y**Integer(2)], domain=P)
>>> f.orbit(P(Integer(2), Integer(1)),[-Integer(1), Integer(4)])
Traceback (most recent call last):
...
TypeError: orbit bounds must be nonnegative
>>> f.orbit(P(Integer(2), Integer(1)), RealNumber('0.1'))
Traceback (most recent call last):
...
TypeError: Attempt to coerce non-integral RealNumber to Integer

sage: P.<x,y> = ProjectiveSpace(QQ,1)
sage: f = DynamicalSystem_projective([x^3, x*y^2], doma