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_scheme — Method
base_scheme(X::AbsProjectiveScheme)Return the base scheme $Y$ for $X ⊂ ℙʳ×ₖ Y → Y$ with $Y$ defined over a field $𝕜$.
sourcehomogeneous_coordinate_ring — Method
homogeneous_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)sourcerelative_ambient_dimension — Method
relative_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)
1sourceambient_coordinate_ring — Method
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$.
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)
falsesourceambient_space — Method
ambient_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]sourcedefining_ideal — Method
defining_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 generatorssourceaffine_cone — Method
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.
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)sourcehomogeneous_coordinates_on_affine_cone — Method
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$.
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
vsourcecovered_scheme — Method
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: 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)]sourceThe 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 — Method
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 -> [1]
PPP -> [1]
? -> [1]sourceprojective_space — Method
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.
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 — Method
arithmetic_genus(X::AbsProjectiveScheme{<:Field}) -> IntReturn 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 — Method
dehomogenization_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)
sourcehomogenization_map — Method
homogenization_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)sourceProperties
Further properties of projective schemes:
is_smooth — Method
is_smooth(P::AbsProjectiveScheme; algorithm::Symbol=:default) -> BoolCheck 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)
falsesourceis_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})