# Schemes¶

AUTHORS:

• William Stein, David Kohel, Kiran Kedlaya (2008): added zeta_series
• Volker Braun (2011-08-11): documenting, improving, refactoring.
class sage.schemes.generic.scheme.AffineScheme(X=None, category=None)

An abstract affine scheme.

hom(x, Y=None)

Return the scheme morphism from self to Y defined by x.

INPUT:

• x – anything hat determines a scheme morphism. If x is a scheme, try to determine a natural map to x.
• Y – the codomain scheme (optional). If Y is not given, try to determine Y from context.
• check – boolean (optional, default=True). Whether to check the defining data for consistency.

OUTPUT:

The scheme morphism from self to Y defined by x.

EXAMPLES:

We construct the inclusion from $$\mathrm{Spec}(\QQ)$$ into $$\mathrm{Spec}(\ZZ)$$ induced by the inclusion from $$\ZZ$$ into $$\QQ$$:

sage: X = Spec(QQ)
sage: X.hom(ZZ.hom(QQ))
Affine Scheme morphism:
From: Spectrum of Rational Field
To:   Spectrum of Integer Ring
Defn: Ring Coercion morphism:
From: Integer Ring
To:   Rational Field


TESTS:

We can construct a morphism to an affine curve (trac #7956):

sage: S.<p,q> = QQ[]
sage: A1.<r> = AffineSpace(QQ,1)
sage: A1_emb = Curve(p-2)
sage: A1.hom([2,r],A1_emb)
Scheme morphism:
From: Affine Space of dimension 1 over Rational Field
To:   Affine Curve over Rational Field defined by p - 2
Defn: Defined on coordinates by sending (r) to
(2, r)

class sage.schemes.generic.scheme.Scheme(X=None, category=None)

The base class for all schemes.

INPUT:

• X – a scheme, scheme morphism, commutative ring, commutative ring morphism, or None (optional). Determines the base scheme. If a commutative ring is passed, the spectrum of the ring will be used as base.
• category – the category (optional). Will be automatically construted by default.

EXAMPLES:

sage: from sage.schemes.generic.scheme import Scheme
sage: Scheme(ZZ)
<class 'sage.schemes.generic.scheme.Scheme_with_category'>


A scheme is in the category of all schemes over its base:

sage: ProjectiveSpace(4, QQ).category()
Category of schemes over Rational Field


There is a special and unique $$Spec(\ZZ)$$ that is the default base scheme:

sage: Spec(ZZ).base_scheme() is Spec(QQ).base_scheme()
True

base_extend(Y)

Extend the base of the scheme.

Derived clases must override this method.

EXAMPLES:

sage: from sage.schemes.generic.scheme import Scheme
sage: X = Scheme(ZZ)
sage: X.base_scheme()
Spectrum of Integer Ring
sage: X.base_extend(QQ)
Traceback (most recent call last):
...
NotImplementedError

base_morphism()

Return the structure morphism from self to its base scheme.

OUTPUT:

A scheme morphism.

EXAMPLES:

sage: A = AffineSpace(4, QQ)
sage: A.base_morphism()
Scheme morphism:
From: Affine Space of dimension 4 over Rational Field
To:   Spectrum of Rational Field
Defn: Structure map

sage: X = Spec(QQ)
sage: X.base_morphism()
Scheme morphism:
From: Spectrum of Rational Field
To:   Spectrum of Integer Ring
Defn: Structure map

base_ring()

Return the base ring of the scheme self.

OUTPUT:

A commutative ring.

EXAMPLES:

sage: A = AffineSpace(4, QQ)
sage: A.base_ring()
Rational Field

sage: X = Spec(QQ)
sage: X.base_ring()
Integer Ring

base_scheme()

Return the base scheme.

OUTPUT:

A scheme.

EXAMPLES:

sage: A = AffineSpace(4, QQ)
sage: A.base_scheme()
Spectrum of Rational Field

sage: X = Spec(QQ)
sage: X.base_scheme()
Spectrum of Integer Ring

coordinate_ring()

Return the coordinate ring.

OUTPUT:

The global coordinate ring of this scheme, if defined. Otherwise raise a ValueError.

EXAMPLES:

sage: R.<x, y> = QQ[]
sage: I = (x^2 - y^2)*R
sage: X = Spec(R.quotient(I))
sage: X.coordinate_ring()
Quotient of Multivariate Polynomial Ring in x, y over Rational Field by the ideal (x^2 - y^2)

count_points(n)

Count points over finite fields.

INPUT:

• n – integer.

OUTPUT:

An integer. The number of points over $$\GF{q}, \ldots, \GF{q^n}$$ on a scheme over a finite field $$\GF{q}$$.

Note

This is currently only implemented for schemes over prime order finite fields.

EXAMPLES:

sage: P.<x> = PolynomialRing(GF(3))
sage: C = HyperellipticCurve(x^3+x^2+1)
sage: C.count_points(4)
[6, 12, 18, 96]
sage: C.base_extend(GF(9,'a')).count_points(2)
Traceback (most recent call last):
...
NotImplementedError: Point counting only implemented for schemes over prime fields

dimension()

Return the absolute dimension of this scheme.

OUTPUT:

Integer.

EXAMPLES:

sage: R.<x, y> = QQ[]
sage: I = (x^2 - y^2)*R
sage: X = Spec(R.quotient(I))
sage: X.dimension_absolute()
Traceback (most recent call last):
...
NotImplementedError
sage: X.dimension()
Traceback (most recent call last):
...
NotImplementedError

dimension_absolute()

Return the absolute dimension of this scheme.

OUTPUT:

Integer.

EXAMPLES:

sage: R.<x, y> = QQ[]
sage: I = (x^2 - y^2)*R
sage: X = Spec(R.quotient(I))
sage: X.dimension_absolute()
Traceback (most recent call last):
...
NotImplementedError
sage: X.dimension()
Traceback (most recent call last):
...
NotImplementedError

dimension_relative()

Return the relative dimension of this scheme over its base.

OUTPUT:

Integer.

EXAMPLES:

sage: R.<x, y> = QQ[]
sage: I = (x^2 - y^2)*R
sage: X = Spec(R.quotient(I))
sage: X.dimension_relative()
Traceback (most recent call last):
...
NotImplementedError

hom(x, Y=None, check=True)

Return the scheme morphism from self to Y defined by x.

INPUT:

• x – anything hat determines a scheme morphism. If x is a scheme, try to determine a natural map to x.
• Y – the codomain scheme (optional). If Y is not given, try to determine Y from context.
• check – boolean (optional, default=True). Whether to check the defining data for consistency.

OUTPUT:

The scheme morphism from self to Y defined by x.

EXAMPLES:

sage: P = ProjectiveSpace(ZZ, 3)
sage: P.hom(Spec(ZZ))
Scheme morphism:
From: Projective Space of dimension 3 over Integer Ring
To:   Spectrum of Integer Ring
Defn: Structure map

identity_morphism()

Return the identity morphism.

OUTPUT:

The identity morphism of the scheme self.

EXAMPLES:

sage: X = Spec(QQ)
sage: X.identity_morphism()
Scheme endomorphism of Spectrum of Rational Field
Defn: Identity map

point(v, check=True)

Create a point.

INPUT:

• v – anything that defines a point.
• check – boolean (optional, default=True). Whether to check the defining data for consistency.

OUTPUT:

A point of the scheme.

EXAMPLES:

sage: A2 = AffineSpace(QQ,2)
sage: A2.point([4,5])
(4, 5)

sage: R.<t> = PolynomialRing(QQ)
sage: E = EllipticCurve([t + 1, t, t, 0, 0])
sage: E.point([0, 0])
(0 : 0 : 1)

point_homset(S=None)

Return the set of S-valued points of this scheme.

INPUT:

• S – a commutative ring.

OUTPUT:

The set of morphisms $$Spec(S) o X$$.

EXAMPLES:

sage: P = ProjectiveSpace(ZZ, 3)
sage: P.point_homset(ZZ)
Set of rational points of Projective Space of dimension 3 over Integer Ring
sage: P.point_homset(QQ)
Set of rational points of Projective Space of dimension 3 over Rational Field
sage: P.point_homset(GF(11))
Set of rational points of Projective Space of dimension 3 over
Finite Field of size 11


TESTS:

sage: P = ProjectiveSpace(QQ,3)
sage: P.point_homset(GF(11))
Traceback (most recent call last):
...
ValueError: There must be a natural map S --> R, but
S = Rational Field and R = Finite Field of size 11

point_set(S=None)

Return the set of S-valued points of this scheme.

INPUT:

• S – a commutative ring.

OUTPUT:

The set of morphisms $$Spec(S) o X$$.

EXAMPLES:

sage: P = ProjectiveSpace(ZZ, 3)
sage: P.point_homset(ZZ)
Set of rational points of Projective Space of dimension 3 over Integer Ring
sage: P.point_homset(QQ)
Set of rational points of Projective Space of dimension 3 over Rational Field
sage: P.point_homset(GF(11))
Set of rational points of Projective Space of dimension 3 over
Finite Field of size 11


TESTS:

sage: P = ProjectiveSpace(QQ,3)
sage: P.point_homset(GF(11))
Traceback (most recent call last):
...
ValueError: There must be a natural map S --> R, but
S = Rational Field and R = Finite Field of size 11

structure_morphism()

Return the structure morphism from self to its base scheme.

OUTPUT:

A scheme morphism.

EXAMPLES:

sage: A = AffineSpace(4, QQ)
sage: A.base_morphism()
Scheme morphism:
From: Affine Space of dimension 4 over Rational Field
To:   Spectrum of Rational Field
Defn: Structure map

sage: X = Spec(QQ)
sage: X.base_morphism()
Scheme morphism:
From: Spectrum of Rational Field
To:   Spectrum of Integer Ring
Defn: Structure map

union(X)

Return the disjoint union of the schemes self and X.

EXAMPLES:

sage: S = Spec(QQ)
sage: X = AffineSpace(1, QQ)
sage: S.union(X)
Traceback (most recent call last):
...
NotImplementedError

zeta_series(n, t)

Return the zeta series.

Compute a power series approximation to the zeta function of a scheme over a finite field.

INPUT:

• n – the number of terms of the power series to compute
• t – the variable which the series should be returned

OUTPUT:

A power series approximating the zeta function of self

EXAMPLES:

sage: P.<x> = PolynomialRing(GF(3))
sage: C = HyperellipticCurve(x^3+x^2+1)
sage: R.<t> = PowerSeriesRing(Integers())
sage: C.zeta_series(4,t)
1 + 6*t + 24*t^2 + 78*t^3 + 240*t^4 + O(t^5)
sage: (1+2*t+3*t^2)/(1-t)/(1-3*t) + O(t^5)
1 + 6*t + 24*t^2 + 78*t^3 + 240*t^4 + O(t^5)


Note that this function depends on count_points, which is only defined for prime order fields:

sage: C.base_extend(GF(9,'a')).zeta_series(4,t)
Traceback (most recent call last):
...
NotImplementedError: Point counting only implemented for schemes over prime fields

sage.schemes.generic.scheme.is_AffineScheme(x)

Return True if $$x$$ is an affine scheme.

EXAMPLES:

sage: from sage.schemes.generic.scheme import is_AffineScheme
sage: is_AffineScheme(5)
False
sage: E = Spec(QQ)
sage: is_AffineScheme(E)
True

sage.schemes.generic.scheme.is_Scheme(x)

Test whether x is a scheme.

INPUT:

• x – anything.

OUTPUT:

Boolean. Whether x derives from Scheme.

EXAMPLES:

sage: from sage.schemes.generic.scheme import is_Scheme
sage: is_Scheme(5)
False
sage: X = Spec(QQ)
sage: is_Scheme(X)
True


#### Previous topic

Set of homomorphisms between two affine schemes

#### Next topic

Spectrum of a ring as affine scheme.