Simplicial Complexes

Introduction

Abstract simplicial complexes provide a combinatorial way to define topological spaces. By no means every topological space arises in this way, but this is a (most) natural choice in a computational setup.

A simplicial complex $K$ on a vertex set $V$ is a nonempty subset of $2^V$ such that for each $\sigma \in K$ and $\tau \subset\sigma$ we have $\tau\in K$. Here $V$ is usually $[n] = \{1,2,\dots,n\}$ for some $n\geq 0$.

General textbooks offering details on the theory include:

Construction

SimplicialComplexMethod
SimplicialComplex(generators::Union{Vector{Vector{Int}}, Vector{Set{Int}}})

Construct an abstract simplicial complex from a set of faces. While arbitrary nonnegative integers are allowed as vertices, they will be relabeled to consecutive integers starting at 1.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]])
Abstract simplicial complex of dimension 2 on 4 vertices

Simplicial complex comprising the empty set only:

julia> empty = SimplicialComplex(Vector{Set{Int}}([]))
Abstract simplicial complex of dimension -1 on 0 vertices

The original vertices can be recovered:

julia> L = SimplicialComplex([[0,2,17],[2,17,90]]);

julia> facets(L)
2-element Vector{Set{Int64}}:
 Set([2, 3, 1])
 Set([4, 2, 3])

julia> vertexindices(L)
4-element Vector{Int64}:
  0
  2
 17
 90
source

Subcomplexes

star_subcomplexMethod
star_subcomplex(K::SimplicialComplex, sigma::Union{Vector{Int}, Set{Int}})

Return the star of the face sigma in the abstract simplicial complex K.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]]);

julia> star_subcomplex(K,[1])
Abstract simplicial complex of dimension 2 on 3 vertices
source
link_subcomplexMethod
link_subcomplex(K::SimplicialComplex, sigma::Union{Vector{Int}, Set{Int}})

Return the link of the face sigma in the abstract simplicial complex K.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]]);

julia> link_subcomplex(K,[2,3])
Abstract simplicial complex of dimension 0 on 2 vertices
source

Surface examples

torusMethod
torus()

Construct Möbius' (vertex-minimal) 7-vertex triangulation of the torus (surface).

source
klein_bottleMethod
klein_bottle()

Construct a 9-vertex triangulation of the Klein bottle.

source
real_projective_planeMethod
real_projective_plane()

Construct the (vertex-minimal) 6-vertex triangulation of the real projective plane.

source

Other examples

complex_projective_planeMethod
complex_projective_plane()

Construct the (vertex-minimal) 9-vertex triangulation of the complex projective plane.

source

Basic properties

nverticesMethod
nvertices(K::SimplicialComplex)

Return the number of vertices of the abstract simplicial complex K.

Examples

julia> nvertices(torus())
7
source
dimMethod
dim(K::SimplicialComplex)

Return the dimension of the abstract simplicial complex K.

source
f_vectorMethod
f_vector(K::SimplicialComplex)

Return the face vector (number of faces per dimension) of the abstract simplicial complex K.

Examples

julia> f_vector(torus())
3-element Vector{Int64}:
  7
 21
 14
source
h_vectorMethod
h_vector(K::SimplicialComplex)

Return the h-vector of the abstract simplicial complex K.

Examples

julia> h_vector(torus())
4-element Vector{Int64}:
  1
  4
 10
 -1
source
euler_characteristicMethod
euler_characteristic(K::SimplicialComplex)

Return the reduced Euler characteristic of the abstract simplicial complex K.

Examples

julia> euler_characteristic(complex_projective_plane())
2
source

Homology and cohomology

homologyMethod
homology(K::SimplicialComplex, i::Int)

Return i-th reduced integral homology group of K. Recall that the 0-th homology group is trivial if and only if K is connected.

Examples

julia> [ homology(real_projective_plane(), i) for i in [0,1,2] ]
3-element Vector{GrpAbFinGen}:
 GrpAb: Z/1
 GrpAb: Z/2
 GrpAb: Z/1
source
betti_numbersMethod
betti_numbers(K::SimplicialComplex)

Return the reduced rational Betti numbers of the abstract simplicial complex K.

Examples

julia> betti_numbers(klein_bottle())
3-element Vector{Int64}:
 0
 1
 0
source
cohomologyMethod
cohomology(K::SimplicialComplex, i::Int)

Return i-th reduced integral cohomology group of K.

Examples

julia> K = SimplicialComplex([[0,1],[1,2],[0,2]]);

julia> cohomology(K,1)
GrpAb: Z
source

Fundamental group

fundamental_groupMethod
fundamental_group(K::SimplicialComplex)

Return the fundamental group of the abstract simplicial complex K.

Examples

julia> pi_1 = fundamental_group(torus());

julia> describe(pi_1)
"Z x Z"
source

Connection to commutative algebra

The complements of the minimal non-faces form the facets of the Alexander dual.

minimal_nonfacesMethod
minimal_nonfaces(K::SimplicialComplex)

Return the minimal non-faces of the abstract simplicial complex K.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]]);

julia> minimal_nonfaces(K)
1-element Vector{Set{Int64}}:
 Set([4, 1])
source
alexander_dualMethod
alexander_dual(K::SimplicialComplex)

Return the Alexander dual of the abstract simplicial complex K.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]]);

julia> alexander_dual(K)
Abstract simplicial complex of dimension 1 on 2 vertices
source

Let $K$ be a simplicial complex on $n$ vertices. The minimal non-faces of $K$ generate a square-free monomial ideal, known as the Stanley-Reisner ideal of $K$. The quotient of the polynomial ring (in $n$ variables, with integer coefficients) modulo that ideal is the Stanley-Reisner ring. For details see Chapter 5 of Winfried Bruns, Jürgen Herzog (2009).

stanley_reisner_idealMethod
stanley_reisner_ideal(K::SimplicialComplex)

Return the Stanley-Reisner ideal of the abstract simplicial complex K.

Examples

julia> stanley_reisner_ideal(real_projective_plane())
ideal(x1*x2*x3, x1*x2*x4, x1*x5*x6, x2*x5*x6, x1*x3*x6, x1*x4*x5, x3*x4*x5, x3*x4*x6, x2*x3*x5, x2*x4*x6)
source
stanley_reisner_idealMethod
stanley_reisner_ideal(R::MPolyRing, K::SimplicialComplex)

Return the Stanley-Reisner ideal of the abstract simplicial complex K, in the given ring R.

Examples

julia> R, _ = QQ["a","b","c","d","e","f"];

julia> stanley_reisner_ideal(R, real_projective_plane())
ideal(a*b*c, a*b*d, a*e*f, b*e*f, a*c*f, a*d*e, c*d*e, c*d*f, b*c*e, b*d*f)
source
stanley_reisner_ringMethod
stanley_reisner_ring(K::SimplicialComplex)

Return the Stanley-Reisner ring of the abstract simplicial complex K.

Examples

julia> K = SimplicialComplex([[1,2,3],[2,3,4]]);

julia> stanley_reisner_ring(K)
(Quotient of multivariate polynomial ring by ideal with 1 generator, Map from
Multivariate polynomial ring in 4 variables over QQ to Quotient of multivariate polynomial ring by ideal with 1 generator defined by a julia-function with inverse)
source
stanley_reisner_ringMethod
stanley_reisner_ring(R::MPolyRing, K::SimplicialComplex)

Return the Stanley-Reisner ring of the abstract simplicial complex K, as a quotient of a given ring R.

Examples

julia>  R, _ = ZZ["a","b","c","d","e","f"];

julia> stanley_reisner_ring(R, real_projective_plane())
(Quotient of multivariate polynomial ring by ideal with 10 generators, Map from
Multivariate polynomial ring in 6 variables over ZZ to Quotient of multivariate polynomial ring by ideal with 10 generators defined by a julia-function with inverse)
source

Saving and loading

Objects of type SimplicialComplex can be saved to a file and loaded with the two methods save and load. The file is in JSON format and contains the underlying polymake object. In particular, such a file can be read by both polymake and OSCAR.