Set of homomorphisms between two projective schemes#

For schemes \(X\) and \(Y\), this module implements the set of morphisms \(Hom(X,Y)\). This is done by SchemeHomset_generic.

As a special case, the Hom-sets can also represent the points of a scheme. Recall that the \(K\)-rational points of a scheme \(X\) over \(k\) can be identified with the set of morphisms \(Spec(K) \to X\). In Sage the rational points are implemented by such scheme morphisms. This is done by SchemeHomset_points and its subclasses.

Note

You should not create the Hom-sets manually. Instead, use the Hom() method that is inherited by all schemes.

AUTHORS:

  • William Stein (2006): initial version.

  • Volker Braun (2011-08-11): significant improvement and refactoring.

  • Ben Hutz (June 2012): added support for projective ring

  • Ben Hutz (2018): add numerical point support

class sage.schemes.projective.projective_homset.SchemeHomset_points_abelian_variety_field(X, Y, category=None, check=True, base=Integer Ring)#

Bases: SchemeHomset_points_projective_field

Set of rational points of an Abelian variety.

INPUT:

See SchemeHomset_generic.

base_extend(R)#

Extend the base ring.

This is currently not implemented except for the trivial case R==ZZ.

INPUT:

  • R – a ring.

EXAMPLES:

sage: # needs sage.schemes
sage: E = EllipticCurve('37a')
sage: Hom = E.point_homset();  Hom
Abelian group of points on Elliptic Curve defined
 by y^2 + y = x^3 - x over Rational Field
sage: Hom.base_ring()
Rational Field
sage: Hom.base_extend(QQ)
Traceback (most recent call last):
...
NotImplementedError: Abelian variety point sets are not
implemented as modules over rings other than ZZ
class sage.schemes.projective.projective_homset.SchemeHomset_points_projective_field(X, Y, category=None, check=True, base=Integer Ring)#

Bases: SchemeHomset_points

Set of rational points of a projective variety over a field.

INPUT:

See SchemeHomset_generic.

EXAMPLES:

sage: from sage.schemes.projective.projective_homset import SchemeHomset_points_projective_field
sage: SchemeHomset_points_projective_field(Spec(QQ), ProjectiveSpace(QQ,2))
Set of rational points of Projective Space of dimension 2 over Rational Field
numerical_points(F=None, **kwds)#

Return some or all numerical approximations of rational points of a projective scheme.

This is for dimension 0 subschemes only and the points are determined through a groebner calculation over the base ring and then numerically approximating the roots of the resulting polynomials. If the base ring is a number field, the embedding into F must be known.

INPUT:

F - numerical ring

kwds:

  • point_tolerance - positive real number (optional, default: \(10^{-10}\)). For numerically inexact fields, two points are considered the same if their coordinates are within tolerance.

  • zero_tolerance - positive real number (optional, default: \(10^{-10}\)). For numerically inexact fields, points are on the subscheme if they satisfy the equations to within tolerance.

OUTPUT: A list of points in the ambient space.

Warning

For numerically inexact fields the list of points returned may contain repeated or be missing points due to tolerance.

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: E = P.subscheme([y^3 - x^3 - x*z^2, x*y*z])
sage: L = E(QQ).numerical_points(F=RR); L                                   # needs sage.libs.singular
[(0.000000000000000 : 0.000000000000000 : 1.00000000000000),
 (1.00000000000000 : 1.00000000000000 : 0.000000000000000)]
sage: L[0].codomain()                                                       # needs sage.libs.singular
Projective Space of dimension 2 over Real Field with 53 bits of precision
sage: S.<a> = QQ[]
sage: K.<v> = NumberField(a^5 - 7, embedding=CC(7)**(1/5))                  # needs sage.rings.number_field
sage: P.<x,y,z> = ProjectiveSpace(K, 2)                                     # needs sage.rings.number_field
sage: X = P.subscheme([x^2 - v^2*z^2, y - v*z])                             # needs sage.rings.number_field
sage: len(X(K).numerical_points(F=CDF))                                     # needs sage.libs.singular sage.rings.number_field
2
sage: P.<x1, x2, x3> = ProjectiveSpace(QQ, 2)
sage: E = P.subscheme([3000*x1^50 + 9875643*x2^2*x3^48 + 12334545*x2^50, x1 + x2])
sage: len(E(P.base_ring()).numerical_points(F=CDF, zero_tolerance=1e-6))    # needs sage.libs.singular
49
points(**kwds)#

Return some or all rational points of a projective scheme.

For dimension 0 subschemes points are determined through a groebner basis calculation. For schemes or subschemes with dimension greater than 1 points are determined through enumeration up to the specified bound.

INPUT:

kwds:

  • bound - real number (optional, default: 0). The bound for the coordinates for subschemes with dimension at least 1.

  • precision - integer (optional, default: 53). The precision to use to compute the elements of bounded height for number fields.

  • point_tolerance - positive real number (optional, default: \(10^{-10}\)). For numerically inexact fields, two points are considered the same if their coordinates are within tolerance.

  • zero_tolerance - positive real number (optional, default: \(10^{-10}\)). For numerically inexact fields, points are on the subscheme if they satisfy the equations to within tolerance.

  • tolerance - a rational number in (0,1] used in doyle-krumm algorithm-4 for enumeration over number fields.

OUTPUT:

  • a list of rational points of a projective scheme

Warning

For numerically inexact fields such as ComplexField or RealField the list of points returned is very likely to be incomplete. It may also contain repeated points due to tolerances.

EXAMPLES:

sage: P.<x,y> = ProjectiveSpace(QQ, 1)
sage: P(QQ).points(bound=4)
[(-4 : 1), (-3 : 1), (-2 : 1), (-3/2 : 1), (-4/3 : 1), (-1 : 1),
 (-3/4 : 1), (-2/3 : 1), (-1/2 : 1), (-1/3 : 1), (-1/4 : 1), (0 : 1),
 (1/4 : 1), (1/3 : 1), (1/2 : 1), (2/3 : 1), (3/4 : 1), (1 : 0), (1 : 1),
 (4/3 : 1), (3/2 : 1), (2 : 1), (3 : 1), (4 : 1)]
sage: u = QQ['u'].0
sage: K.<v> = NumberField(u^2 + 3)                                          # needs sage.rings.number_field
sage: P.<x,y,z> = ProjectiveSpace(K, 2)                                     # needs sage.rings.number_field
sage: len(P(K).points(bound=1.8))                                           # needs sage.rings.number_field
309
sage: P1 = ProjectiveSpace(GF(2), 1)
sage: F.<a> = GF(4, 'a')                                                    # needs sage.rings.finite_rings
sage: P1(F).points()                                                        # needs sage.libs.singular sage.rings.finite_rings
[(0 : 1), (1 : 0), (1 : 1), (a : 1), (a + 1 : 1)]
sage: P.<x,y,z> = ProjectiveSpace(QQ, 2)
sage: E = P.subscheme([(y^3-y*z^2) - (x^3-x*z^2), (y^3-y*z^2) + (x^3-x*z^2)])
sage: E(P.base_ring()).points()                                             # needs sage.libs.singular
[(-1 : -1 : 1), (-1 : 0 : 1), (-1 : 1 : 1), (0 : -1 : 1), (0 : 0 : 1),
 (0 : 1 : 1), (1 : -1 : 1), (1 : 0 : 1), (1 : 1 : 1)]
sage: # needs sage.rings.real_mpfr
sage: P.<x,y,z> = ProjectiveSpace(CC, 2)
sage: E = P.subscheme([y^3 - x^3 - x*z^2, x*y*z])
sage: L = E(P.base_ring()).points(); sorted(L, key=str)                     # needs sage.libs.singular
verbose 0 (...: projective_homset.py, points) Warning: computations in
the numerical fields are inexact;points may be computed partially or incorrectly.
[(-0.500000000000000 + 0.866025403784439*I : 1.00000000000000 : 0.000000000000000),
 (-0.500000000000000 - 0.866025403784439*I : 1.00000000000000 : 0.000000000000000),
 (-1.00000000000000*I : 0.000000000000000 : 1.00000000000000),
 (0.000000000000000 : 0.000000000000000 : 1.00000000000000),
 (1.00000000000000 : 1.00000000000000 : 0.000000000000000),
 (1.00000000000000*I : 0.000000000000000 : 1.00000000000000)]
sage: L[0].codomain()                                                       # needs sage.libs.singular
Projective Space of dimension 2 over Complex Field with 53 bits of precision
sage: # needs sage.rings.complex_double
sage: P.<x,y,z> = ProjectiveSpace(CDF, 2)
sage: E = P.subscheme([y^2 + x^2 + z^2, x*y*z])
sage: len(E(P.base_ring()).points())                                        # needs sage.libs.singular
verbose 0 (...: projective_homset.py, points) Warning: computations in
the numerical fields are inexact;points may be computed partially or incorrectly.
6
class sage.schemes.projective.projective_homset.SchemeHomset_points_projective_ring(X, Y, category=None, check=True, base=Integer Ring)#

Bases: SchemeHomset_points

Set of rational points of a projective variety over a commutative ring.

INPUT:

See SchemeHomset_generic.

EXAMPLES:

sage: from sage.schemes.projective.projective_homset import SchemeHomset_points_projective_ring
sage: SchemeHomset_points_projective_ring(Spec(ZZ), ProjectiveSpace(ZZ,2))
Set of rational points of Projective Space of dimension 2 over Integer Ring
points(B=0)#

Return some or all rational points of a projective scheme.

INPUT:

  • B – integer (optional, default=0). The bound for the coordinates.

EXAMPLES:

sage: from sage.schemes.projective.projective_homset import SchemeHomset_points_projective_ring
sage: H = SchemeHomset_points_projective_ring(Spec(ZZ), ProjectiveSpace(ZZ, 2))
sage: H.points(3)
[(0 : 0 : 1), (0 : 1 : -3), (0 : 1 : -2), (0 : 1 : -1), (0 : 1 : 0), (0 : 1 : 1),
 (0 : 1 : 2), (0 : 1 : 3), (0 : 2 : -3), (0 : 2 : -1), (0 : 2 : 1), (0 : 2 : 3),
 (0 : 3 : -2), (0 : 3 : -1), (0 : 3 : 1), (0 : 3 : 2), (1 : -3 : -3),
 (1 : -3 : -2), (1 : -3 : -1), (1 : -3 : 0), (1 : -3 : 1), (1 : -3 : 2),
 (1 : -3 : 3), (1 : -2 : -3), (1 : -2 : -2), (1 : -2 : -1), (1 : -2 : 0),
 (1 : -2 : 1), (1 : -2 : 2), (1 : -2 : 3), (1 : -1 : -3), (1 : -1 : -2),
 (1 : -1 : -1), (1 : -1 : 0), (1 : -1 : 1), (1 : -1 : 2), (1 : -1 : 3),
 (1 : 0 : -3), (1 : 0 : -2), (1 : 0 : -1), (1 : 0 : 0), (1 : 0 : 1), (1 : 0 : 2),
 (1 : 0 : 3), (1 : 1 : -3), (1 : 1 : -2), (1 : 1 : -1), (1 : 1 : 0), (1 : 1 : 1),
 (1 : 1 : 2), (1 : 1 : 3), (1 : 2 : -3), (1 : 2 : -2), (1 : 2 : -1), (1 : 2 : 0),
 (1 : 2 : 1), (1 : 2 : 2), (1 : 2 : 3), (1 : 3 : -3), (1 : 3 : -2), (1 : 3 : -1),
 (1 : 3 : 0), (1 : 3 : 1), (1 : 3 : 2), (1 : 3 : 3), (2 : -3 : -3),
 (2 : -3 : -2), (2 : -3 : -1), (2 : -3 : 0), (2 : -3 : 1), (2 : -3 : 2),
 (2 : -3 : 3), (2 : -2 : -3), (2 : -2 : -1), (2 : -2 : 1), (2 : -2 : 3),
 (2 : -1 : -3), (2 : -1 : -2), (2 : -1 : -1), (2 : -1 : 0), (2 : -1 : 1),
 (2 : -1 : 2), (2 : -1 : 3), (2 : 0 : -3), (2 : 0 : -1), (2 : 0 : 1),
 (2 : 0 : 3), (2 : 1 : -3), (2 : 1 : -2), (2 : 1 : -1), (2 : 1 : 0), (2 : 1 : 1),
 (2 : 1 : 2), (2 : 1 : 3), (2 : 2 : -3), (2 : 2 : -1), (2 : 2 : 1), (2 : 2 : 3),
 (2 : 3 : -3), (2 : 3 : -2), (2 : 3 : -1), (2 : 3 : 0), (2 : 3 : 1), (2 : 3 : 2),
 (2 : 3 : 3), (3 : -3 : -2), (3 : -3 : -1), (3 : -3 : 1), (3 : -3 : 2),
 (3 : -2 : -3), (3 : -2 : -2), (3 : -2 : -1), (3 : -2 : 0), (3 : -2 : 1),
 (3 : -2 : 2), (3 : -2 : 3), (3 : -1 : -3), (3 : -1 : -2), (3 : -1 : -1),
 (3 : -1 : 0), (3 : -1 : 1), (3 : -1 : 2), (3 : -1 : 3), (3 : 0 : -2),
 (3 : 0 : -1), (3 : 0 : 1), (3 : 0 : 2), (3 : 1 : -3), (3 : 1 : -2),
 (3 : 1 : -1), (3 : 1 : 0), (3 : 1 : 1), (3 : 1 : 2), (3 : 1 : 3), (3 : 2 : -3),
 (3 : 2 : -2), (3 : 2 : -1), (3 : 2 : 0), (3 : 2 : 1), (3 : 2 : 2), (3 : 2 : 3),
 (3 : 3 : -2), (3 : 3 : -1), (3 : 3 : 1), (3 : 3 : 2)]
class sage.schemes.projective.projective_homset.SchemeHomset_polynomial_projective_space(X, Y, category=None, check=True, base=None)#

Bases: SchemeHomset_generic

Set of morphisms of a projective space.

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(2, QQ)
sage: Hom(P, P)
Set of morphisms
  From: Projective Space of dimension 2 over Rational Field
  To:   Projective Space of dimension 2 over Rational Field
identity()#

Return the identity morphism of this hom-set.

EXAMPLES:

sage: P.<x,y,z> = ProjectiveSpace(2, QQ)
sage: Hom(P, P)
Set of morphisms
  From: Projective Space of dimension 2 over Rational Field
  To:   Projective Space of dimension 2 over Rational Field
sage: _.identity()
Scheme endomorphism of Projective Space of dimension 2 over Rational Field
  Defn: Identity map