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$.
Examples
julia> S, _ = grade(QQ[:x, :y, :z][1]);
julia> I = ideal(S, S[1] + S[2]);
julia> X = proj(S, I)
Projective scheme
over rational field
defined by ideal (x + y)
julia> homogeneous_coordinate_ring(X)
Quotient
of multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
y -> [1]
z -> [1]
by ideal (x + y)
relative_ambient_dimension
— Methodrelative_ambient_dimension(X::AbsProjectiveScheme)
On $X ⊂ ℙʳ_A$ this returns $r$.
Examples
julia> S, _ = grade(QQ[:x, :y, :z][1]);
julia> I = ideal(S, S[1] + S[2])
Ideal generated by
x + y
julia> X = proj(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$.
Examples
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 generated by
x + y
julia> X = proj(S, I)
Projective scheme
over rational field
defined by ideal (x + y)
julia> homogeneous_coordinate_ring(X)
Quotient
of multivariate polynomial ring in 3 variables over QQ graded by
x -> [1]
y -> [1]
z -> [1]
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$.
Examples
julia> S, _ = grade(QQ[:x, :y, :z][1]);
julia> I = ideal(S, S[1] + S[2]);
julia> X = proj(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]
defining_ideal
— Methoddefining_ideal(X::AbsProjectiveScheme)
On $X ⊂ ℙʳ_A$ this returns the homogeneous ideal $I ⊂ A[s₀,…,sᵣ]$ defining $X$.
Examples
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]);
julia> P = proj(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal (u^2 + v^2)
with homogeneous coordinates [x, y, z]
julia> defining_ideal(P)
Ideal with 0 generators
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.
Examples
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]);
julia> P = proj(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal (u^2 + v^2)
with homogeneous coordinates [x, y, z]
julia> affine_cone(P)
(scheme(u^2 + v^2), Map: S -> quotient of multivariate polynomial ring)
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$.
Examples
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]);
julia> P = proj(S)
Projective space of dimension 2
over quotient of multivariate polynomial ring by ideal (u^2 + v^2)
with homogeneous coordinates [x, y, z]
julia> Oscar.homogeneous_coordinates_on_affine_cone(P)
3-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
x
y
z
julia> gens(OO(affine_cone(P)[1])) # all coordinates on the affine cone
5-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, 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)
Scheme
over rational field
with default covering
described by patches
1: affine 2-space
2: affine 2-space
3: affine 2-space
in the coordinate(s)
1: [(s1//s0), (s2//s0)]
2: [(s0//s1), (s2//s1)]
3: [(s0//s2), (s1//s2)]
The minimal concrete type realizing this interface is
ProjectiveScheme{CoeffRingType, RingType} <: AbsProjectiveScheme{CoeffRingType, RingType}
Constructors
Besides proj(S)
for some graded polynomial ring or a graded affine algebra S
, we provide the following constructors:
proj(S::MPolyDecRing)
proj(S::MPolyDecRing, I::MPolyIdeal{T}) where {T<:MPolyDecRingElem}
proj(I::MPolyIdeal{<:MPolyDecRingElem})
proj(Q::MPolyQuoRing{<:MPolyDecRingElem})
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
over rational field
with homogeneous coordinates [x, PPP, ?]
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
— Methodarithmetic_genus(X::AbsProjectiveScheme{<:Field}) -> Int
Return the arithmetic genus of X
, i.e. the integer $(-1)^n (h_X(0) - 1)$ where $h_X$ is the Hilbert polynomial of X
and $n$ its dimension.
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::AbsAffineScheme)
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[2])
(x1//x0)
homogenization_map
— Methodhomogenization_map(P::AbsProjectiveScheme, U::AbsAffineScheme)
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: affine 4-space
2: affine 4-space
3: affine 4-space
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)
Properties
Further properties of projective schemes:
is_smooth
— Methodis_smooth(P::AbsProjectiveScheme; algorithm::Symbol=:default) -> Bool
Check whether the scheme P
is smooth.
Algorithms
There are three possible algorithms for checking smoothness, determined by the value of the keyword argument algorithm
:
:projective_jacobian
- uses the Jacobian criterion for projective schemes, see Exercise 4.2.10 of [Liu06],:covered_jacobian
- uses covered version of the Jacobian criterion,:affine_cone
- checks that the affine cone is smooth outside the origin.
The :projective_jacobian
and the :covered
algorithms only work for equidimensional schemes. The algorithms first check for equidimensionality, which can be expensive. If you already know that the scheme is equidimensional, then you can avoid recomputing that by writing set_attribute!(P, :is_equidimensional, true)
before checking for smoothness.
The algorithms :covered_jacobian
and :affine_cone
only work when the base ring is a field.
The default algorithm is :projective_jacobian
if the scheme is equidimensional, otherwise it is :affine_cone
.
Examples
julia> A, (x, y, z) = grade(QQ[:x, :y, :z][1]);
julia> B, _ = quo(A, ideal(A, [x^2 + y^2]));
julia> C = proj(B)
Projective scheme
over rational field
defined by ideal (x^2 + y^2)
julia> is_smooth(C)
false
julia> is_smooth(C; algorithm=:covered_jacobian)
false
is_empty(P::AbsProjectiveScheme{<:Field})
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})