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_ringMethod
base_ring(X::AbsProjectiveScheme)

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

source
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$.

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)
source
relative_ambient_dimensionMethod
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)
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$.

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
source
ambient_spaceMethod
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]
source
defining_idealMethod
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 generators
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.

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)
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$.

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
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: 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)]
source

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_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 -> [1]
  PPP -> [1]
  ? -> [1]
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_genusMethod
arithmetic_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.

source

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::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)
source
homogenization_mapMethod
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)
source

Properties

Further properties of projective schemes:

is_smoothMethod
is_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
source
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})