# 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

simplicial_complexMethod
simplical_complex(generators::Union{Vector{Vector{Int}}, Vector{Set{Int}}})

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

Examples

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

julia> G = complete_bipartite_graph(2,3)
Undirected graph with 5 nodes and the following edges:
(3, 1)(3, 2)(4, 1)(4, 2)(5, 1)(5, 2)

julia> K = simplicial_complex(G)
Abstract simplicial complex of dimension 1 on 5 vertices

Simplicial complex comprising the empty set only:

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

The original vertices can be recovered:

julia> L = simplicial_complex([[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 = simplicial_complex([[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 = simplicial_complex([[1,2,3],[2,3,4]]);

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

## Basic properties

n_verticesMethod
n_vertices(K::SimplicialComplex)

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

Examples

julia> n_vertices(torus())
7
source
n_facetsMethod
n_facets(K::SimplicialComplex)

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

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 integral homology group of K.

Examples

julia> [ homology(real_projective_plane(), i) for i in [0,1,2] ]
3-element Vector{FinGenAbGroup}:
Z
Z/2
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 integral cohomology group of K.

Examples

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

julia> cohomology(K,1)
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

## Recognizing topological spaces

is_sphereMethod
is_sphere(K::SimplicialComplex)

Heuristically check if the abstract simplicial complex K is a combinatorial sphere; see [JLLT22]. Note that this is undecidable in general. Returns true if recognized as a sphere. Returns false if not a sphere. Returns nothing if heuristics unsuccessful.

Examples

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

julia> is_sphere(K)
false
source
is_ballMethod
is_ball(K::SimplicialComplex)

Heuristically check if the abstract simplicial complex K is a combinatorial ball; see [JLLT22]. Note that this is undecidable in general. Returns true if recognized as a ball. Returns false if not a ball. Returns nothing if heuristics unsuccessful.

Examples

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

julia> is_ball(K)
true
source
is_manifoldMethod
is_manifold(K::SimplicialComplex)

Check if the abstract simplicial complex K is a combinatorial manifold, possibly with boundary. Note that this is undecidable in general. Returns true if recognized as a manifold. Returns false if not a manifold. Returns nothing if heuristics unsuccessful.

Examples

julia> is_manifold(torus())
true

julia> is_manifold(simplicial_complex([[1,2],[2,3]]))
true

julia> is_manifold(simplicial_complex([[1,2],[2,3],[2,4]]))
false
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 = simplicial_complex([[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 = simplicial_complex([[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 [BH09].

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 generated by
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 generated by
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 = simplicial_complex([[1,2,3],[2,3,4]]);

julia> stanley_reisner_ring(K)
(Quotient of multivariate polynomial ring by ideal (x1*x4), Map: multivariate polynomial ring -> quotient of multivariate polynomial ring)
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 (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), Map: R -> quotient of multivariate polynomial ring)
source

is_isomorphicMethod
is_isomorphic(K1::SimplicialComplex, K2::SimplicialComplex)

Checks if the given simplicial complexes are isomorphic.

Examples

julia> K1 = simplicial_complex([[1,2,3],[2,3,4]]);

julia> K2 = simplicial_complex([[1,2,3],[2,3,4]]);

julia> is_isomorphic(K1, K2)
true
source
connected_sumFunction
connected_sum(K1::SimplicialComplex, K2::SimplicialComplex, f1::Int=0, f2::Int=0)

Compute the connected sum of two abstract simplicial complexes. Parameters f1 and f2 specify which facet of the first and second complex correspondingly are glued together. Default is the 0-th facet of both. The vertices in the selected facets are identified with each other according to their order in the facet (that is, in increasing index order).

Examples

julia> K = torus();

julia> surface_genus_2 = connected_sum(K, K)
Abstract simplicial complex of dimension 2 on 11 vertices

julia> homology(surface_genus_2, 1)
Z^4

julia> is_manifold(surface_genus_2)
true
source
deletionMethod
deletion(K::SimplicialComplex, face::Union{<:AbstractSet{Int},<:AbstractVector{Int}})

Remove the given face and all the faces containing it from an abstract simplicial complex K.

Examples

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

julia> K_with_deletion = deletion(K, Set([1, 2]));

julia> facets(K_with_deletion)
2-element Vector{Set{Int64}}:
Set([3, 1])
Set([4, 2, 3])
source
automorphism_groupMethod
automorphism_group(K::SimplicialComplex; action=:on_vertices)

Given a simplicial complex K return its automorphism group as a PermGroup. The group can be returned as a subgroup of the permutation group of the vertices by passing :on_vertices to the action keyword argument or on the facets by passing :on_facets.

Examples

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

julia> automorphism_group(K)
Permutation group of degree 4
source
on_simplicial_complexMethod
on_simplicial_complex(K::SimplicialComplex, g::PermGroupElem)

Given a simplicial complex K return the simplicial complex corresponding to a permutation on it's vertices given by g.

Examples

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

julia> G = automorphism_group(K)
Permutation group of degree 4

julia> g = collect(G)[2]
(1,4)

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

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.