# Projective schemes

Let $A$ be a commutative noetherian base ring and $S = A[x_0,\dots, x_n]$ the standard graded polynomial ring over $A$. Then $X = \mathrm{Proj}(S) = \mathbb P^n_A$ is a (relative) projective scheme over $\mathrm{Spec}(A)$. Similarly, for a homogeneous ideal $I \subset S$ we have $X = \mathrm{Proj}(S/I) \subset \mathbb P^n_A$ a (relative) projective scheme over $\mathrm{Spec}(A)$ which is a closed subscheme of $\mathbb P^n_A$ in a natural way. The majority of applications will be in the setting where $A = \mathbb k$ is a field, but be aware that we also support different base rings such as the usual four MPolyRing, MPolyQuoRing, MPolyLocRing, and MPolyQuoLocRing.

## Abstract types and basic interface

The abstract type for such projective schemes is

    AbsProjectiveScheme{CoeffRingType, RingType} where {CoeffRingType<:Ring}

where, in the above notation, CoeffRingType denotes the type of A and RingType the type of either S or S/I, respectively. The abstract type comes with the following interface:

base_schemeMethod
base_scheme(X::AbsProjectiveScheme)

Return the base scheme $Y$ for $X ⊂ ℙʳ×ₖ Y → Y$ with $Y$ defined over a field $𝕜$.

source
homogeneous_coordinate_ringMethod
homogeneous_coordinate_ring(P::AbsProjectiveScheme)

On a projective scheme $P = Proj(S)$ for a standard graded finitely generated algebra $S$ this returns $S$.

Example

julia> S, _ = grade(QQ["x", "y", "z"]);

julia> I = ideal(S, S + S);

julia> X = ProjectiveScheme(S, I)
Projective scheme
over rational field
defined by ideal(x + y)

julia> homogeneous_coordinate_ring(X)
Quotient
of graded multivariate polynomial ring in 3 variables over QQ
by ideal(x + y)
source
relative_ambient_dimensionMethod
relative_ambient_dimension(X::AbsProjectiveScheme)

On $X ⊂ ℙʳ_A$ this returns $r$.

Example

julia> S, _ = grade(QQ["x", "y", "z"]);

julia> I = ideal(S, S + S)
ideal(x + y)

julia> X = ProjectiveScheme(S, I)
Projective scheme
over rational field
defined by ideal(x + y)

julia> relative_ambient_dimension(X)
2

julia> dim(X)
1
source
ambient_coordinate_ringMethod
ambient_coordinate_ring(P::AbsProjectiveScheme)

On a projective scheme $P = Proj(S)$ with $S = P/I$ for a standard graded polynomial ring $P$ and a homogeneous ideal $I$ this returns $P$.

Example

julia> S, _ = grade(QQ["x", "y", "z"])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])

julia> I = ideal(S, S + S)
ideal(x + y)

julia> X = ProjectiveScheme(S, I)
Projective scheme
over rational field
defined by ideal(x + y)

julia> homogeneous_coordinate_ring(X)
Quotient
of graded multivariate polynomial ring in 3 variables over QQ
by ideal(x + y)

julia> ambient_coordinate_ring(X) === S
true

julia> ambient_coordinate_ring(X) === homogeneous_coordinate_ring(X)
false
source
ambient_spaceMethod
ambient_space(X::AbsProjectiveScheme)

On $X ⊂ ℙʳ_A$ this returns $ℙʳ_A$.

Example

julia> S, _ = grade(QQ["x", "y", "z"]);

julia> I = ideal(S, S + S);

julia> X = ProjectiveScheme(S, I)
Projective scheme
over rational field
defined by ideal(x + y)

julia> P = ambient_space(X)
Projective space of dimension 2
over rational field
with homogeneous coordinates [x, y, z]
source
defining_idealMethod
defining_ideal(X::AbsProjectiveScheme)

On $X ⊂ ℙʳ_A$ this returns the homogeneous ideal $I ⊂ A[s₀,…,sᵣ]$ defining $X$.

Example

julia> R, (u, v) = QQ["u", "v"];

julia> Q, _ = quo(R, ideal(R, u^2 + v^2));

julia> S, _ = grade(Q["x", "y", "z"]);

julia> P = projective_scheme(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal with 1 generator
with homogeneous coordinates [x, y, z]

julia> defining_ideal(P)
ideal()
source
affine_coneMethod
affine_cone(X::AbsProjectiveScheme)

On $X = Proj(S) ⊂ ℙʳ_𝕜$ this returns a pair (C, f) where $C = C(X) ⊂ 𝕜ʳ⁺¹$ is the affine cone of $X$ and $f : S → 𝒪(C)$ is the morphism of rings from the homogeneous_coordinate_ring to the coordinate_ring of the affine cone.

Note that if the base scheme is not affine, then the affine cone is not affine.

Example

julia> R, (u, v) = QQ["u", "v"];

julia> Q, _ = quo(R, ideal(R, u^2 + v^2));

julia> S, _ = grade(Q["x", "y", "z"]);

julia> P = projective_scheme(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal with 1 generator
with homogeneous coordinates [x, y, z]

julia> affine_cone(P)
(Spec of quotient of multivariate polynomial ring, Map with following data
Domain:
=======
S
Codomain:
=========
Quotient of multivariate polynomial ring by ideal with 1 generator)
source
homogeneous_coordinates_on_affine_coneMethod
homogeneous_coordinates_on_affine_cone(X::AbsProjectiveScheme)

On $X ⊂ ℙʳ_A$ this returns a vector with the homogeneous coordinates $[s₀,…,sᵣ]$ as entries where each one of the $sᵢ$ is a function on the affine cone of $X$.

Example

julia> R, (u, v) = QQ["u", "v"];

julia> Q, _ = quo(R, ideal(R, u^2 + v^2));

julia> S, _ = grade(Q["x", "y", "z"]);

julia> P = projective_scheme(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal with 1 generator
with homogeneous coordinates [x, y, z]

julia> homogeneous_coordinates_on_affine_cone(P)
3-element Vector{MPolyQuoRingElem{QQMPolyRingElem}}:
x
y
z

julia> gens(OO(affine_cone(P))) # all coordinates on the affine cone
5-element Vector{MPolyQuoRingElem{QQMPolyRingElem}}:
x
y
z
u
v

source
covered_schemeMethod
covered_scheme(P::AbsProjectiveScheme)

Return a CoveredScheme $X$ isomorphic to P with standard affine charts given by dehomogenization.

Use dehomogenization_map with U one of the affine_charts of $X$ to obtain the dehomogenization map from the homogeneous_coordinate_ring of P to the coordinate_ring of U.

Examples

julia> P = projective_space(QQ, 2);

julia> Pcov = covered_scheme(P)
Scheme
over rational field
with default covering
described by patches
1: spec of multivariate polynomial ring
2: spec of multivariate polynomial ring
3: spec of multivariate polynomial ring
in the coordinate(s)
1: [(s1//s0), (s2//s0)]
2: [(s0//s1), (s2//s1)]
3: [(s0//s2), (s1//s2)]
source

The minimal concrete type realizing this interface is

    ProjectiveScheme{CoeffRingType, RingType} <: AbsProjectiveScheme{CoeffRingType, RingType}

## Constructors

Besides ProjectiveScheme(S) for some graded polynomial ring or a graded affine algebra S, we provide the following constructors:

    projective_scheme(S::MPolyDecRing)
projective_scheme(S::MPolyDecRing, I::MPolyIdeal{T}) where {T<:MPolyDecRingElem}
projective_scheme(I::MPolyIdeal{<:MPolyDecRingElem})
projective_scheme(Q::MPolyQuoRing{MPolyDecRingElem{T, PT}}) where {T, PT<:MPolyRingElem{T}} = ProjectiveScheme(Q)

Subschemes defined by homogeneous ideals, ring elements, or lists of elements can be created via the respective methods of the subscheme(P::AbsProjectiveScheme, ...) function. Special constructors are provided for projective space itself via the function projective_space and its various methods.

projective_spaceMethod
projective_space(A::Ring, var_symb::Vector{VarName})

Create the (relative) projective space Proj(A[x₀,…,xₙ]) over A where x₀,…,xₙ is a list of variable names.

Examples

julia> projective_space(QQ, [:x, :PPP, :?])
Projective space of dimension 2
over rational field
with homogeneous coordinates [x, PPP, ?]

julia> homogeneous_coordinate_ring(ans)
Multivariate polynomial ring in 3 variables over QQ graded by
x -> 
PPP -> 
? -> 
source
projective_spaceMethod
projective_space(A::Ring, r::Int; var_name::VarName=:s)

Create the (relative) projective space Proj(A[s₀,…,sᵣ]) over A where s is a string for the variable names.

source

## Attributes

Besides those attributes already covered by the above general interface we have the following (self-explanatory) ones for projective schemes over a field.

    dim(P::AbsProjectiveScheme{<:Field})
hilbert_polynomial(P::AbsProjectiveScheme{<:Field})
degree(P::AbsProjectiveScheme{<:Field})
arithmetic_genus(P::AbsProjectiveScheme{<:Field})

## Methods

To facilitate the interplay between an AbsProjectiveScheme and the affine charts of its covered_scheme we provide the following methods:

dehomogenization_mapMethod
dehomogenization_map(X::AbsProjectiveScheme, U::AbsSpec)

Return the restriction morphism from the graded coordinate ring of $X$ to 𝒪(U).

Examples

julia> P = projective_space(QQ, ["x0", "x1", "x2"])
Projective space of dimension 2
over rational field
with homogeneous coordinates [x0, x1, x2]

julia> X = covered_scheme(P);

julia> U = first(affine_charts(X))
Spectrum
of multivariate polynomial ring in 2 variables (x1//x0), (x2//x0)
over rational field

julia> phi = dehomogenization_map(P, U);

julia> S = homogeneous_coordinate_ring(P);

julia> phi(S)
(x1//x0)

source
dehomogenization_mapMethod
dehomogenization_map(X::AbsProjectiveScheme, i::Int)

Return the restriction morphism from the graded coordinate ring of $X$ to 𝒪(Uᵢ). Where Uᵢ is the i-th affine chart of X.

source
homogenization_mapMethod
homogenization_map(P::AbsProjectiveScheme, U::AbsSpec)

Given an affine chart $U ⊂ P$ of an AbsProjectiveScheme $P$, return a method $h$ for the homogenization of elements $a ∈ 𝒪(U)$.

This means that $h(a)$ returns a pair $(p, q)$ representing a fraction $p/q ∈ S$ of the ambient_coordinate_ring of $P$ such that $a$ is the dehomogenization of $p/q$.

Note: For the time being, this only works for affine charts which are of the standard form $sᵢ ≠ 0$ for $sᵢ∈ S$ one of the homogeneous coordinates of $P$.

Note: Since this map returns representatives only, it is not a mathematical morphism and, hence, in particular not an instance of Map.

Examples

julia> A, _ = QQ["u", "v"];

julia> P = projective_space(A, ["x0", "x1", "x2"])
Projective space of dimension 2
over multivariate polynomial ring in 2 variables over QQ
with homogeneous coordinates [x0, x1, x2]

julia> X = covered_scheme(P)
Scheme
over rational field
with default covering
described by patches
1: spec of multivariate polynomial ring
2: spec of multivariate polynomial ring
3: spec of multivariate polynomial ring
in the coordinate(s)
1: [(x1//x0), (x2//x0), u, v]
2: [(x0//x1), (x2//x1), u, v]
3: [(x0//x2), (x1//x2), u, v]

julia> U = first(affine_charts(X))
Spectrum
of multivariate polynomial ring in 4 variables (x1//x0), (x2//x0), u, v
over rational field

julia> phi = homogenization_map(P, U);

julia> R = OO(U);

julia> phi.(gens(R))
4-element Vector{Tuple{MPolyDecRingElem{QQMPolyRingElem, AbstractAlgebra.Generic.MPoly{QQMPolyRingElem}}, MPolyDecRingElem{QQMPolyRingElem, AbstractAlgebra.Generic.MPoly{QQMPolyRingElem}}}}:
(x1, x0)
(x2, x0)
(u, 1)
(v, 1)
source

## Properties

Further properties of projective schemes (all self-explanatory):

    is_empty(P::AbsProjectiveScheme{<:Field})
is_smooth(P::AbsProjectiveScheme)
is_irreducible(P::AbsProjectiveScheme)
is_reduced(P::AbsProjectiveScheme)
is_geometrically_reduced(P::AbsProjectiveScheme{<:Field})
is_geometrically_irreducible(P::AbsProjectiveScheme{<:Field})
is_integral(X::AbsProjectiveScheme{<:Field})
is_geometrically_integral(X::AbsProjectiveScheme{<:Field})