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_ring — Methodbase_ring(X::AbsProjectiveScheme)On $X ⊂ ℙʳ_A$ this returns $A$.
base_scheme — Methodbase_scheme(X::AbsProjectiveScheme)Return the base scheme $Y$ for $X ⊂ ℙʳ×ₖ Y → Y$ with $Y$ defined over a field $𝕜$.
homogeneous_coordinate_ring — Methodhomogeneous_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"][1]);
julia> I = ideal(S, S[1] + S[2]);
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)
relative_ambient_dimension — Methodrelative_ambient_dimension(X::AbsProjectiveScheme)On $X ⊂ ℙʳ_A$ this returns $r$.
Example
julia> S, _ = grade(QQ["x", "y", "z"][1]);
julia> I = ideal(S, S[1] + S[2])
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
ambient_coordinate_ring — Methodambient_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"][1])
(Graded multivariate polynomial ring in 3 variables over QQ, MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}[x, y, z])
julia> I = ideal(S, S[1] + S[2])
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
ambient_space — Methodambient_space(X::AbsProjectiveScheme)On $X ⊂ ℙʳ_A$ this returns $ℙʳ_A$.
Example
```jldoctest julia> S, _ = grade(QQ["x", "y", "z"][1]);
julia> I = ideal(S, S[1] + S[2]);
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
defining_ideal — Methoddefining_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"][1])
(Graded multivariate polynomial ring in 3 variables over quotient of multivariate polynomial ring, MPolyDecRingElem{MPolyQuoRingElem{QQMPolyRingElem}, AbstractAlgebra.Generic.MPoly{MPolyQuoRingElem{QQMPolyRingElem}}}[x, y, z])
julia> P = projective_scheme(S);
julia> defining_ideal(P)
ideal()
affine_cone — Methodaffine_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"][1])
(Graded multivariate polynomial ring in 3 variables over quotient of multivariate polynomial ring, MPolyDecRingElem{MPolyQuoRingElem{QQMPolyRingElem}, AbstractAlgebra.Generic.MPoly{MPolyQuoRingElem{QQMPolyRingElem}}}[x, y, z])
julia> P = projective_scheme(S);
julia> affine_cone(P)
(Spec of Quotient of multivariate polynomial ring by ideal with 1 generator, Map with following data
Domain:
=======
S
Codomain:
=========
Quotient of multivariate polynomial ring by ideal with 1 generator)
homogeneous_coordinates_on_affine_cone — Methodhomogeneous_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"][1])
(Graded multivariate polynomial ring in 3 variables over quotient of multivariate polynomial ring, MPolyDecRingElem{MPolyQuoRingElem{QQMPolyRingElem}, AbstractAlgebra.Generic.MPoly{MPolyQuoRingElem{QQMPolyRingElem}}}[x, y, z])
julia> P = projective_scheme(S);
julia> homogeneous_coordinates_on_affine_cone(P)
3-element Vector{MPolyQuoRingElem{QQMPolyRingElem}}:
x
y
z
julia> gens(OO(affine_cone(P)[1])) # all coordinates on the affine cone
5-element Vector{MPolyQuoRingElem{QQMPolyRingElem}}:
x
y
z
u
v
covered_scheme — Methodcovered_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)
covered scheme with 3 affine patches in its default coveringThe 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_space — Methodprojective_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
with homogeneous coordinates x PPP ?
over Rational field
julia> homogeneous_coordinate_ring(ans)
Multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
PPP -> [1]
? -> [1]
projective_space — Methodprojective_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.
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_map — Methoddehomogenization_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
with homogeneous coordinates x0 x1 x2
over Rational field
julia> X = covered_scheme(P);
julia> U = first(affine_charts(X))
Spec of Quotient of multivariate polynomial ring by ideal with 0 generators
julia> phi = dehomogenization_map(P, U);
julia> S = homogeneous_coordinate_ring(P);
julia> phi(S[2])
(x1//x0)
dehomogenization_map — Methoddehomogenization_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.
homogenization_map — Methodhomogenization_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 Hecke.Map.
Examples
julia> A, _ = QQ["u", "v"];
julia> P = projective_space(A, ["x0", "x1", "x2"])
Projective space of dimension 2
with homogeneous coordinates x0 x1 x2
over Multivariate polynomial ring in 2 variables over QQ
julia> X = covered_scheme(P);
julia> U = first(affine_charts(X))
Spec of Localization of quotient of multivariate polynomial ring at products of 1 element
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)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})