Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gorenstein and Picard index #2667

Merged
merged 5 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions docs/oscar_references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,17 @@ @Book{HEO05
url = {https://doi.org/10.1201/9781420035216}
}

@Article{HHS11,
author = {Hausen, J\"{u}rgen and Herppich, Elaine and S\"{u}ss, Hendrik},
title = {Multigraded factorial rings and {F}ano varieties with torus action},
mrnumber = {2804508},
journal = {Doc. Math.},
fjournal = {Documenta Mathematica},
volume = {16},
pages = {71--109},
year = {2011}
}

@Book{HP89,
author = {Holt, Derek F. and Plesken, W.},
title = {Perfect groups},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ torusinvariant_weil_divisor_group(v::AbstractNormalToricVariety)
torusinvariant_prime_divisors(v::AbstractNormalToricVariety)
```

### Gorenstein and Picard index

```@docs
gorenstein_index(v::AbstractNormalToricVariety)
picard_index(v::AbstractNormalToricVariety)
```

### Cones and Fans

```@docs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,18 +158,22 @@ cox_ring(X::ToricCoveredScheme) = cox_ring(X.ntv)
dim(X::ToricCoveredScheme) = dim(X.ntv)
dim_of_torusfactor(X::ToricCoveredScheme) = dim_of_torusfactor(X.ntv)
euler_characteristic(X::ToricCoveredScheme) = euler_characteristic(X.ntv)
gorenstein_index(X::ToricCoveredScheme) = gorenstein_index(X.ntv)
polyhedral_fan(X::ToricCoveredScheme) = polyhedral_fan(X.ntv)
ideal_of_linear_relations(R::MPolyRing, X::ToricCoveredScheme) = ideal_of_linear_relations(R, X.ntv)
ideal_of_linear_relations(X::ToricCoveredScheme) = ideal_of_linear_relations(X.ntv)
irrelevant_ideal(R::MPolyRing, X::ToricCoveredScheme) = irrelevant_ideal(R, X.ntv)
irrelevant_ideal(X::ToricCoveredScheme) = irrelevant_ideal(X.ntv)
map_from_character_lattice_to_torusinvariant_weil_divisor_group(X::ToricCoveredScheme) = map_from_character_lattice_to_torusinvariant_weil_divisor_group(X.ntv)
map_from_torusinvariant_cartier_divisor_group_to_class_group(X::ToricCoveredScheme) = map_from_torusinvariant_cartier_divisor_group_to_class_group(X.ntv)
map_from_torusinvariant_cartier_divisor_group_to_picard_group(X::ToricCoveredScheme) = map_from_torusinvariant_cartier_divisor_group_to_picard_group(X.ntv)
map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(X::ToricCoveredScheme) = map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(X.ntv)
map_from_torusinvariant_weil_divisor_group_to_class_group(X::ToricCoveredScheme) = map_from_torusinvariant_weil_divisor_group_to_class_group(X.ntv)
map_from_picard_group_to_class_group(X::ToricCoveredScheme) = map_from_picard_group_to_class_group(X.ntv)
mori_cone(X::ToricCoveredScheme) = mori_cone(X.ntv)
nef_cone(X::ToricCoveredScheme) = nef_cone(X.ntv)
picard_group(X::ToricCoveredScheme) = picard_group(X.ntv)
picard_index(X::ToricCoveredScheme) = picard_index(X.ntv)
set_coordinate_names(X::ToricCoveredScheme) = set_coordinate_names(X.ntv)
set_coordinate_names_of_torus(X::ToricCoveredScheme) = set_coordinate_names_of_torus(X.ntv)
stanley_reisner_ideal(R::MPolyRing, X::ToricCoveredScheme) = stanley_reisner_ideal(R, X.ntv)
Expand Down Expand Up @@ -199,17 +203,21 @@ cox_ring(X::ToricSpec) = cox_ring(X.antv)
dim(X::ToricSpec) = dim(X.antv)
dim_of_torusfactor(X::ToricSpec) = dim_of_torusfactor(X.antv)
euler_characteristic(X::ToricSpec) = euler_characteristic(X.antv)
gorenstein_index(X::ToricSpec) = gorenstein_index(X.antv)
polyhedral_fan(X::ToricSpec) = polyhedral_fan(X.antv)
ideal_of_linear_relations(R::MPolyRing, X::ToricSpec) = ideal_of_linear_relations(R, X.antv)
ideal_of_linear_relations(X::ToricSpec) = ideal_of_linear_relations(X.antv)
irrelevant_ideal(R::MPolyRing, X::ToricSpec) = irrelevant_ideal(R, X.antv)
irrelevant_ideal(X::ToricSpec) = irrelevant_ideal(X.antv)
map_from_character_lattice_to_torusinvariant_weil_divisor_group(X::ToricSpec) = map_from_character_lattice_to_torusinvariant_weil_divisor_group(X.antv)
map_from_torusinvariant_cartier_divisor_group_to_class_group(X::ToricSpec) = map_from_torusinvariant_cartier_divisor_group_to_class_group(X.antv)
map_from_torusinvariant_cartier_divisor_group_to_picard_group(X::ToricSpec) = map_from_torusinvariant_cartier_divisor_group_to_picard_group(X.antv)
map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(X::ToricSpec) = map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(X.antv)
map_from_torusinvariant_weil_divisor_group_to_class_group(X::ToricSpec) = map_from_torusinvariant_weil_divisor_group_to_class_group(X.antv)
map_from_picard_group_to_class_group(X::ToricSpec) = map_from_picard_group_to_class_group(X.antv)
mori_cone(X::ToricSpec) = mori_cone(X.antv)
nef_cone(X::ToricSpec) = nef_cone(X.antv)
picard_index(X::ToricSpec) = picard_index(X.antv)
picard_group(X::ToricSpec) = picard_group(X.antv)
set_coordinate_names(X::ToricSpec) = set_coordinate_names(X.antv)
set_coordinate_names_of_torus(X::ToricSpec) = set_coordinate_names_of_torus(X.antv)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,36 @@ GrpAb: Z^3
return domain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(v))
end

@doc raw"""
map_from_torusinvariant_cartier_divisor_group_to_class_group(v::AbstractNormalToricVariety)

Return the map from the Cartier divisors to the class group
of an abstract normal toric variety `v`.

# Examples
```jldoctest
julia> p2 = projective_space(NormalToricVariety, 2)
Normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor

julia> map_from_torusinvariant_cartier_divisor_group_to_class_group(p2)
Map with following data
Domain:
=======
Abelian group with structure: Z^3
Codomain:
=========
Abelian group with structure: Z
```
"""
@attr GrpAbFinGenMap function map_from_torusinvariant_cartier_divisor_group_to_class_group(v::AbstractNormalToricVariety)
# check input
@req !has_torusfactor(v) "Group of the torus-invariant Cartier divisors can only be computed if the variety has no torus factor"

f = map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(v)
g = map_from_torusinvariant_weil_divisor_group_to_class_group(v)
return f * g
end


@doc raw"""
map_from_torusinvariant_cartier_divisor_group_to_picard_group(v::AbstractNormalToricVariety)
Expand Down Expand Up @@ -861,10 +891,8 @@ Abelian group with structure: Z
throw(ArgumentError("Group of the torus-invariant Cartier divisors can only be computed if the variety has no torus factor"))
end

# compute mapping
map1 = map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(v)
map2 = map_from_torusinvariant_weil_divisor_group_to_class_group(v)
return restrict_codomain(map1*map2)
f = restrict_codomain(map_from_torusinvariant_cartier_divisor_group_to_class_group(v))
return f * inv(snf(codomain(f))[2])
HereAround marked this conversation as resolved.
Show resolved Hide resolved
end


Expand All @@ -886,6 +914,77 @@ GrpAb: Z
return codomain(map_from_torusinvariant_cartier_divisor_group_to_picard_group(v))
end

@doc raw"""
map_from_picard_group_to_class_group(v::AbstractNormalToricVariety)

Return the embedding of the Picard group into the class group of an abstract normal toric variety `v`.

# Examples
```jldoctest
julia> p2 = projective_space(NormalToricVariety, 2)
Normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor

julia> map_from_picard_group_to_class_group(p2)
Map with following data
Domain:
=======
Abelian group with structure: Z
Codomain:
=========
Abelian group with structure: Z
```
"""
@attr GrpAbFinGenMap function map_from_picard_group_to_class_group(v::AbstractNormalToricVariety)
f = image(map_from_torusinvariant_cartier_divisor_group_to_class_group(v))[2]
g = snf(domain(f))[2] * f
return hom(picard_group(v), class_group(v), matrix(g))
end


############################
# Gorenstein and Picard Index
############################

@doc raw"""
gorenstein_index(v::AbstractNormalToricVariety)

Return the Gorenstein index of a $\mathbb{Q}$-Gorenstein normal toric variety `v`.
This is the smallest positive integer $l$ such that $-l K$ is Cartier, where $K$
is a canonical divisor on `v`. See exercise 8.3.10 and 8.3.11 in [CLS11](@cite) for more details.

# Examples
```jldoctest
julia> gorenstein_index(weighted_projective_space(NormalToricVariety, [2,3,5]))
3
```
"""
@attr ZZRingElem function gorenstein_index(v::AbstractNormalToricVariety)
@req is_q_gorenstein(v) "gorenstein index can only be computed for Q-gorenstein varieties"
c = divisor_class(canonical_divisor_class(v))
f = cokernel(map_from_picard_group_to_class_group(v))[2]
order(f(c))
end


@doc raw"""
picard_index(v::AbstractNormalToricVariety)

Return the index of the Picard group in the class group of a simplicial normal
toric variety `v`. Here, the Picard group embeds as the group of Cartier divisor
classes into the class group via `map_from_picard_group_to_class_group`. See
[HHS11](@cite) for more details.

# Examples
```jldoctest
julia> picard_index(weighted_projective_space(NormalToricVariety, [2,3,5]))
30
```
"""
@attr ZZRingElem function picard_index(v::AbstractNormalToricVariety)
@req is_simplicial(v) "picard index can only be computed for simplicial varieties"
return order(cokernel(map_from_picard_group_to_class_group(v))[1])
end


############################
# Cones and fans
Expand Down
4 changes: 4 additions & 0 deletions src/exports.jl
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,7 @@ export glueing_domains
export glueing_graph
export glueing_morphisms
export glueings
export gorenstein_index
export goldfarb_cube
export goldfarb_sit_cube
export grade
Expand Down Expand Up @@ -913,6 +914,8 @@ export low_index_subgroup_reps
export lower_triangular_matrix
export map
export map_from_character_lattice_to_torusinvariant_weil_divisor_group
export map_from_picard_group_to_class_group
export map_from_torusinvariant_cartier_divisor_group_to_class_group
export map_from_torusinvariant_cartier_divisor_group_to_picard_group
export map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group
export map_from_torusinvariant_weil_divisor_group_to_class_group
Expand Down Expand Up @@ -1106,6 +1109,7 @@ export permutation_of_terms
export permuted
export picard_class
export picard_group
export picard_index
export pile_polytope
export pitman_stanley_polytope
export platonic_solid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
@test elementary_divisors(class_group(antv)) == [ 2 ]
@test ngens(cox_ring(antv)) == 2
@test length(torusinvariant_prime_divisors(antv)) == 2
@test gorenstein_index(antv) == 1
@test picard_index(antv) == 2
end

@testset "Cast to affine" begin
Expand Down
18 changes: 18 additions & 0 deletions test/AlgebraicGeometry/ToricVarieties/del_pezzo_surfaces.jl
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_picard_group(dP1)) == picard_group(dP1)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP1)) == torusinvariant_cartier_divisor_group(dP1)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP1)) == torusinvariant_weil_divisor_group(dP1)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP1)) == torusinvariant_cartier_divisor_group(dP1)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP1)) == class_group(dP1)
@test domain(map_from_picard_group_to_class_group(dP1)) == picard_group(dP1)
@test codomain(map_from_picard_group_to_class_group(dP1)) == class_group(dP1)
@test gorenstein_index(dP1) == 1
@test picard_index(dP1) == 1
if set_attributes
@test matrix(map_from_torusinvariant_weil_divisor_group_to_class_group(dP1)) == matrix(ZZ, [[1, 1], [1, 1], [1, 0], [0, -1]])
@test coordinate_names(dP1) == ["x1", "x2", "x3", "e1"]
Expand All @@ -49,6 +55,12 @@
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_picard_group(dP2)) == picard_group(dP2)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP2)) == torusinvariant_cartier_divisor_group(dP2)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP2)) == torusinvariant_weil_divisor_group(dP2)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP2)) == torusinvariant_cartier_divisor_group(dP2)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP2)) == class_group(dP2)
@test domain(map_from_picard_group_to_class_group(dP2)) == picard_group(dP2)
@test codomain(map_from_picard_group_to_class_group(dP2)) == class_group(dP2)
@test gorenstein_index(dP2) == 1
@test picard_index(dP2) == 1
if set_attributes
@test matrix(map_from_torusinvariant_weil_divisor_group_to_class_group(dP2)) == matrix(ZZ, [[1, 1, 1], [1, 1, 0], [1, 0, 1], [0, -1, 0], [0, 0, -1]])
@test coordinate_names(dP2) == ["x1", "x2", "x3", "e1", "e2"]
Expand All @@ -66,6 +78,12 @@
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_picard_group(dP3)) == picard_group(dP3)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP3)) == torusinvariant_cartier_divisor_group(dP3)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(dP3)) == torusinvariant_weil_divisor_group(dP3)
@test domain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP3)) == torusinvariant_cartier_divisor_group(dP3)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_class_group(dP3)) == class_group(dP3)
@test domain(map_from_picard_group_to_class_group(dP3)) == picard_group(dP3)
@test codomain(map_from_picard_group_to_class_group(dP3)) == class_group(dP3)
@test gorenstein_index(dP3) == 1
@test picard_index(dP3) == 1
if set_attributes
@test matrix(map_from_torusinvariant_weil_divisor_group_to_class_group(dP3)) == matrix(ZZ, [[1, 1, 1, 0], [1, 1, 0, 1], [1, 0, 1, 1], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, -1]])
@test coordinate_names(dP3) == ["x1", "x2", "x3", "e1", "e2", "e3"]
Expand Down
6 changes: 6 additions & 0 deletions test/AlgebraicGeometry/ToricVarieties/hirzebruch_surfaces.jl
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@
@test domain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(F5)) == torusinvariant_cartier_divisor_group(F5)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_torusinvariant_weil_divisor_group(F5)) == torusinvariant_weil_divisor_group(F5)
@test matrix(map_from_torusinvariant_weil_divisor_group_to_class_group(F5)) == matrix(ZZ, [[1, 0], [0, 1], [1, 0], [5, 1]])
@test domain(map_from_torusinvariant_cartier_divisor_group_to_class_group(F5)) == torusinvariant_cartier_divisor_group(F5)
@test codomain(map_from_torusinvariant_cartier_divisor_group_to_class_group(F5)) == class_group(F5)
@test domain(map_from_picard_group_to_class_group(F5)) == picard_group(F5)
@test codomain(map_from_picard_group_to_class_group(F5)) == class_group(F5)
@test gorenstein_index(F5) == 1
@test picard_index(F5) == 1
if set_attributes
@test coordinate_names(F5) == ["t1", "x1", "t2", "x2"]
end
Expand Down
Loading