Set of homomorphisms between two schemes#
For schemes \(X\) and \(Y\), this module implements the set of morphisms
\(\mathrm{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 \(\mathrm{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
- class sage.schemes.generic.homset.SchemeHomsetFactory[source]#
Bases:
UniqueFactory
Factory for Hom-sets of schemes.
EXAMPLES:
sage: A2 = AffineSpace(QQ, 2) sage: A3 = AffineSpace(QQ, 3) sage: Hom = A3.Hom(A2)
>>> from sage.all import * >>> A2 = AffineSpace(QQ, Integer(2)) >>> A3 = AffineSpace(QQ, Integer(3)) >>> Hom = A3.Hom(A2)
The Hom-sets are uniquely determined by domain and codomain:
sage: Hom is copy(Hom) True sage: Hom is A3.Hom(A2) True
>>> from sage.all import * >>> Hom is copy(Hom) True >>> Hom is A3.Hom(A2) True
The Hom-sets are identical if the domains and codomains are identical:
sage: loads(Hom.dumps()) is Hom True sage: A3_iso = AffineSpace(QQ, 3) sage: A3_iso is A3 True sage: Hom_iso = A3_iso.Hom(A2) sage: Hom_iso is Hom True
>>> from sage.all import * >>> loads(Hom.dumps()) is Hom True >>> A3_iso = AffineSpace(QQ, Integer(3)) >>> A3_iso is A3 True >>> Hom_iso = A3_iso.Hom(A2) >>> Hom_iso is Hom True
- create_key_and_extra_args(X, Y, category=None, base=None, check=True, as_point_homset=False)[source]#
Create a key that uniquely determines the Hom-set.
INPUT:
X
– a scheme. The domain of the morphisms.Y
– a scheme. The codomain of the morphisms.category
– a category for the Hom-sets (default: schemes over given base).base
– a scheme or a ring. The base scheme of domain and codomain schemes. If a ring is specified, the spectrum of that ring will be used as base scheme.check
– boolean (default:True
).
EXAMPLES:
sage: A2 = AffineSpace(QQ, 2) sage: A3 = AffineSpace(QQ, 3) sage: A3.Hom(A2) # indirect doctest Set of morphisms From: Affine Space of dimension 3 over Rational Field To: Affine Space of dimension 2 over Rational Field sage: from sage.schemes.generic.homset import SchemeHomsetFactory sage: SHOMfactory = SchemeHomsetFactory('test') sage: key, extra = SHOMfactory.create_key_and_extra_args(A3, A2, check=False) sage: key (..., ..., Category of schemes over Rational Field, False) sage: extra {'X': Affine Space of dimension 3 over Rational Field, 'Y': Affine Space of dimension 2 over Rational Field, 'base_ring': Rational Field, 'check': False}
>>> from sage.all import * >>> A2 = AffineSpace(QQ, Integer(2)) >>> A3 = AffineSpace(QQ, Integer(3)) >>> A3.Hom(A2) # indirect doctest Set of morphisms From: Affine Space of dimension 3 over Rational Field To: Affine Space of dimension 2 over Rational Field >>> from sage.schemes.generic.homset import SchemeHomsetFactory >>> SHOMfactory = SchemeHomsetFactory('test') >>> key, extra = SHOMfactory.create_key_and_extra_args(A3, A2, check=False) >>> key (..., ..., Category of schemes over Rational Field, False) >>> extra {'X': Affine Space of dimension 3 over Rational Field, 'Y': Affine Space of dimension 2 over Rational Field, 'base_ring': Rational Field, 'check': False}
- create_object(version, key, **extra_args)[source]#
Create a
SchemeHomset_generic
.INPUT:
version
– object version. Currently not used.key
– a key created bycreate_key_and_extra_args()
.extra_args
– a dictionary of extra keyword arguments.
EXAMPLES:
sage: A2 = AffineSpace(QQ, 2) sage: A3 = AffineSpace(QQ, 3) sage: A3.Hom(A2) is A3.Hom(A2) # indirect doctest True sage: from sage.schemes.generic.homset import SchemeHomsetFactory sage: SHOMfactory = SchemeHomsetFactory('test') sage: SHOMfactory.create_object(0, [id(A3), id(A2), A3.category(), False], ....: check=True, X=A3, Y=A2, base_ring=QQ) Set of morphisms From: Affine Space of dimension 3 over Rational Field To: Affine Space of dimension 2 over Rational Field
>>> from sage.all import * >>> A2 = AffineSpace(QQ, Integer(2)) >>> A3 = AffineSpace(QQ, Integer(3)) >>> A3.Hom(A2) is A3.Hom(A2) # indirect doctest True >>> from sage.schemes.generic.homset import SchemeHomsetFactory >>> SHOMfactory = SchemeHomsetFactory('test') >>> SHOMfactory.create_object(Integer(0), [id(A3), id(A2), A3.category(), False], ... check=True, X=A3, Y=A2, base_ring=QQ) Set of morphisms From: Affine Space of dimension 3 over Rational Field To: Affine Space of dimension 2 over Rational Field
- class sage.schemes.generic.homset.SchemeHomset_generic(X, Y, category=None, check=True, base=None)[source]#
Bases:
HomsetWithBase
The base class for Hom-sets of schemes.
INPUT:
X
– a scheme. The domain of the Hom-set.Y
– a scheme. The codomain of the Hom-set.category
– a category (optional). The category of the Hom-set.check
– boolean (default:True
). Whether to check the defining data for consistency.
EXAMPLES:
sage: from sage.schemes.generic.homset import SchemeHomset_generic sage: A2 = AffineSpace(QQ,2) sage: Hom = SchemeHomset_generic(A2, A2); Hom Set of morphisms From: Affine Space of dimension 2 over Rational Field To: Affine Space of dimension 2 over Rational Field sage: Hom.category() Category of endsets of schemes over Rational Field
>>> from sage.all import * >>> from sage.schemes.generic.homset import SchemeHomset_generic >>> A2 = AffineSpace(QQ,Integer(2)) >>> Hom = SchemeHomset_generic(A2, A2); Hom Set of morphisms From: Affine Space of dimension 2 over Rational Field To: Affine Space of dimension 2 over Rational Field >>> Hom.category() Category of endsets of schemes over Rational Field
- Element[source]#
alias of
SchemeMorphism
- natural_map()[source]#
Return a natural map in the Hom space.
OUTPUT:
A
SchemeMorphism
if there is a natural map from domain to codomain. Otherwise, aNotImplementedError
is raised.EXAMPLES:
sage: A = AffineSpace(4, QQ) sage: A.structure_morphism() # indirect doctest Scheme morphism: From: Affine Space of dimension 4 over Rational Field To: Spectrum of Rational Field Defn: Structure map
>>> from sage.all import * >>> A = AffineSpace(Integer(4), QQ) >>> A.structure_morphism() # indirect doctest Scheme morphism: From: Affine Space of dimension 4 over Rational Field To: Spectrum of Rational Field Defn: Structure map
- class sage.schemes.generic.homset.SchemeHomset_points(X, Y, category=None, check=True, base=Integer Ring)[source]#
Bases:
SchemeHomset_generic
Set of rational points of the scheme.
Recall that the \(K\)-rational points of a scheme \(X\) over \(k\) can be identified with the set of morphisms \(\mathrm{Spec}(K) \to X\). In Sage, the rational points are implemented by such scheme morphisms.
If a scheme has a finite number of points, then the homset is supposed to implement the Python iterator interface. See
SchemeHomset_points_toric_field
for example.INPUT:
See
SchemeHomset_generic
.EXAMPLES:
sage: from sage.schemes.generic.homset import SchemeHomset_points sage: SchemeHomset_points(Spec(QQ), AffineSpace(ZZ,2)) Set of rational points of Affine Space of dimension 2 over Rational Field
>>> from sage.all import * >>> from sage.schemes.generic.homset import SchemeHomset_points >>> SchemeHomset_points(Spec(QQ), AffineSpace(ZZ,Integer(2))) Set of rational points of Affine Space of dimension 2 over Rational Field
- cardinality()[source]#
Return the number of points.
OUTPUT:
An integer or infinity.
EXAMPLES:
sage: toric_varieties.P2().point_set().cardinality() # needs sage.geometry.polyhedron sage.graphs +Infinity sage: P2 = toric_varieties.P2(base_ring=GF(3)) # needs sage.geometry.polyhedron sage.graphs sage: P2.point_set().cardinality() # needs sage.geometry.polyhedron sage.graphs 13
>>> from sage.all import * >>> toric_varieties.P2().point_set().cardinality() # needs sage.geometry.polyhedron sage.graphs +Infinity >>> P2 = toric_varieties.P2(base_ring=GF(Integer(3))) # needs sage.geometry.polyhedron sage.graphs >>> P2.point_set().cardinality() # needs sage.geometry.polyhedron sage.graphs 13
- extended_codomain()[source]#
Return the codomain with extended base, if necessary.
OUTPUT:
The codomain scheme, with its base ring extended to the codomain. That is, the codomain is of the form \(\mathrm{Spec}(R)\) and the base ring of the domain is extended to \(R\).
EXAMPLES:
sage: # needs sage.rings.number_field sage: P2 = ProjectiveSpace(QQ, 2) sage: x = polygen(ZZ, 'x') sage: K.<a> = NumberField(x^2 + x - (3^3-3)) sage: K_points = P2(K); K_points Set of rational points of Projective Space of dimension 2 over Number Field in a with defining polynomial x^2 + x - 24 sage: K_points.codomain() Projective Space of dimension 2 over Rational Field sage: K_points.extended_codomain() Projective Space of dimension 2 over Number Field in a with defining polynomial x^2 + x - 24
>>> from sage.all import * >>> # needs sage.rings.number_field >>> P2 = ProjectiveSpace(QQ, Integer(2)) >>> x = polygen(ZZ, 'x') >>> K = NumberField(x**Integer(2) + x - (Integer(3)**Integer(3)-Integer(3)), names=('a',)); (a,) = K._first_ngens(1) >>> K_points = P2(K); K_points Set of rational points of Projective Space of dimension 2 over Number Field in a with defining polynomial x^2 + x - 24 >>> K_points.codomain() Projective Space of dimension 2 over Rational Field >>> K_points.extended_codomain() Projective Space of dimension 2 over Number Field in a with defining polynomial x^2 + x - 24
- list()[source]#
Return a tuple containing all points.
OUTPUT:
A tuple containing all points of the toric variety.
EXAMPLES:
sage: P1 = toric_varieties.P1(base_ring=GF(3)) # needs sage.geometry.polyhedron sage.graphs sage: P1.point_set().list() # needs sage.geometry.polyhedron sage.graphs ([0 : 1], [1 : 0], [1 : 1], [1 : 2])
>>> from sage.all import * >>> P1 = toric_varieties.P1(base_ring=GF(Integer(3))) # needs sage.geometry.polyhedron sage.graphs >>> P1.point_set().list() # needs sage.geometry.polyhedron sage.graphs ([0 : 1], [1 : 0], [1 : 1], [1 : 2])
- sage.schemes.generic.homset.is_SchemeHomset(H)[source]#
Test whether
H
is a scheme Hom-set.EXAMPLES:
sage: f = Spec(QQ).identity_morphism(); f Scheme endomorphism of Spectrum of Rational Field Defn: Identity map sage: from sage.schemes.generic.homset import is_SchemeHomset sage: is_SchemeHomset(f) doctest:warning... DeprecationWarning: The function is_SchemeHomset is deprecated; use 'isinstance(..., SchemeHomset_generic)' instead. See https://github.com/sagemath/sage/issues/38022 for details. False sage: is_SchemeHomset(f.parent()) True sage: is_SchemeHomset('a string') False
>>> from sage.all import * >>> f = Spec(QQ).identity_morphism(); f Scheme endomorphism of Spectrum of Rational Field Defn: Identity map >>> from sage.schemes.generic.homset import is_SchemeHomset >>> is_SchemeHomset(f) doctest:warning... DeprecationWarning: The function is_SchemeHomset is deprecated; use 'isinstance(..., SchemeHomset_generic)' instead. See https://github.com/sagemath/sage/issues/38022 for details. False >>> is_SchemeHomset(f.parent()) True >>> is_SchemeHomset('a string') False