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
SimplicialComplex
— MethodSimplicialComplex(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
Subcomplexes
star_subcomplex
— Methodstar_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
link_subcomplex
— Methodlink_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
Surface examples
torus
— Methodtorus()
Construct Möbius' (vertex-minimal) 7-vertex triangulation of the torus (surface).
klein_bottle
— Methodklein_bottle()
Construct a 9-vertex triangulation of the Klein bottle.
real_projective_plane
— Methodreal_projective_plane()
Construct the (vertex-minimal) 6-vertex triangulation of the real projective plane.
Other examples
complex_projective_plane
— Methodcomplex_projective_plane()
Construct the (vertex-minimal) 9-vertex triangulation of the complex projective plane.
Basic properties
nvertices
— Methodnvertices(K::SimplicialComplex)
Return the number of vertices of the abstract simplicial complex K
.
Examples
julia> nvertices(torus())
7
dim
— Methoddim(K::SimplicialComplex)
Return the dimension of the abstract simplicial complex K
.
f_vector
— Methodf_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
h_vector
— Methodh_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
euler_characteristic
— Methodeuler_characteristic(K::SimplicialComplex)
Return the reduced Euler characteristic of the abstract simplicial complex K
.
Examples
julia> euler_characteristic(complex_projective_plane())
2
Homology and cohomology
homology
— Methodhomology(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
betti_numbers
— Methodbetti_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
cohomology
— Methodcohomology(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
Fundamental group
fundamental_group
— Methodfundamental_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"
Connection to commutative algebra
The complements of the minimal non-faces form the facets of the Alexander dual.
minimal_nonfaces
— Methodminimal_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])
alexander_dual
— Methodalexander_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
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_ideal
— Methodstanley_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)
stanley_reisner_ideal
— Methodstanley_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)
stanley_reisner_ring
— Methodstanley_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)
stanley_reisner_ring
— Methodstanley_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)
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.