Isoperimetric inequalities¶
This module contains various functions to compute isoperimetric numbers of a graph.
Authors:
Peleg Michaeli
Vincent Delecroix
- sage.graphs.isoperimetric_inequalities.cheeger_constant(g)¶
Return the cheeger constant of the graph.
The Cheeger constant of a graph \(G = (V,E)\) is the minimum of \(|\partial S| / |Vol(S)|\) where \(Vol(S)\) is the sum of degrees of element in \(S\), \(\partial S\) is the edge boundary of \(S\) (number of edges with one end in \(S\) and one end in \(V \setminus S\)) and the minimum is taken over all non-empty subsets \(S\) of vertices so that \(|Vol(S)| \leq |E|\).
See also
Alternative but similar quantities can be obtained via the methods
edge_isoperimetric_number()andvertex_isoperimetric_number().EXAMPLES:
sage: graphs.PetersenGraph().cheeger_constant() 1/3
>>> from sage.all import * >>> graphs.PetersenGraph().cheeger_constant() 1/3
The Cheeger constant of a cycle on \(n\) vertices is \(1/\lfloor n/2 \rfloor\):
sage: [graphs.CycleGraph(k).cheeger_constant() for k in range(2,10)] [1, 1, 1/2, 1/2, 1/3, 1/3, 1/4, 1/4]
>>> from sage.all import * >>> [graphs.CycleGraph(k).cheeger_constant() for k in range(Integer(2),Integer(10))] [1, 1, 1/2, 1/2, 1/3, 1/3, 1/4, 1/4]
The Cheeger constant of a complete graph on \(n\) vertices is \(\lceil n/2 \rceil / (n-1)\):
sage: [graphs.CompleteGraph(k).cheeger_constant() for k in range(2,10)] [1, 1, 2/3, 3/4, 3/5, 2/3, 4/7, 5/8]
>>> from sage.all import * >>> [graphs.CompleteGraph(k).cheeger_constant() for k in range(Integer(2),Integer(10))] [1, 1, 2/3, 3/4, 3/5, 2/3, 4/7, 5/8]
For complete bipartite:
sage: [graphs.CompleteBipartiteGraph(i,j).cheeger_constant() for i in range(2,7) for j in range(2, i)] [3/5, 1/2, 3/5, 5/9, 4/7, 5/9, 1/2, 5/9, 1/2, 5/9]
>>> from sage.all import * >>> [graphs.CompleteBipartiteGraph(i,j).cheeger_constant() for i in range(Integer(2),Integer(7)) for j in range(Integer(2), i)] [3/5, 1/2, 3/5, 5/9, 4/7, 5/9, 1/2, 5/9, 1/2, 5/9]
More examples:
sage: G = Graph([(0, 1), (0, 3), (0, 8), (1, 4), (1, 6), (2, 4), (2, 7), (2, 9), ....: (3, 6), (3, 8), (4, 9), (5, 6), (5, 7), (5, 8), (7, 9)]) sage: G.cheeger_constant() 1/6 sage: G = Graph([(0, 1), (0, 2), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (3, 4), (3, 5)]) sage: G.cheeger_constant() 1/2 sage: Graph([[1,2,3,4],[(1,2),(3,4)]]).cheeger_constant() 0
>>> from sage.all import * >>> G = Graph([(Integer(0), Integer(1)), (Integer(0), Integer(3)), (Integer(0), Integer(8)), (Integer(1), Integer(4)), (Integer(1), Integer(6)), (Integer(2), Integer(4)), (Integer(2), Integer(7)), (Integer(2), Integer(9)), ... (Integer(3), Integer(6)), (Integer(3), Integer(8)), (Integer(4), Integer(9)), (Integer(5), Integer(6)), (Integer(5), Integer(7)), (Integer(5), Integer(8)), (Integer(7), Integer(9))]) >>> G.cheeger_constant() 1/6 >>> G = Graph([(Integer(0), Integer(1)), (Integer(0), Integer(2)), (Integer(1), Integer(2)), (Integer(1), Integer(3)), (Integer(1), Integer(4)), (Integer(1), Integer(5)), (Integer(2), Integer(3)), (Integer(3), Integer(4)), (Integer(3), Integer(5))]) >>> G.cheeger_constant() 1/2 >>> Graph([[Integer(1),Integer(2),Integer(3),Integer(4)],[(Integer(1),Integer(2)),(Integer(3),Integer(4))]]).cheeger_constant() 0
- sage.graphs.isoperimetric_inequalities.edge_isoperimetric_number(g)¶
Return the edge-isoperimetric number of the graph.
The edge-isoperimetric number of a graph \(G = (V,E)\) is also sometimes called the isoperimetric number. It is defined as the minimum of \(|\partial S| / |S|\) where \(\partial S\) is the edge boundary of \(S\) (number of edges with one end in \(S\) and one end in \(V \setminus S\)) and the minimum is taken over all subsets of vertices whose cardinality does not exceed half the size \(|V|\) of the graph.
See also
Alternative but similar quantities can be obtained via the methods
cheeger_constant()andvertex_isoperimetric_number().EXAMPLES:
The edge-isoperimetric number of a complete graph on \(n\) vertices is \(\lceil n/2 \rceil\):
sage: [graphs.CompleteGraph(n).edge_isoperimetric_number() for n in range(2,10)] [1, 2, 2, 3, 3, 4, 4, 5]
>>> from sage.all import * >>> [graphs.CompleteGraph(n).edge_isoperimetric_number() for n in range(Integer(2),Integer(10))] [1, 2, 2, 3, 3, 4, 4, 5]
The edge-isoperimetric constant of a cycle on \(n\) vertices is \(2/\lfloor n/2 \rfloor\):
sage: [graphs.CycleGraph(n).edge_isoperimetric_number() for n in range(2,15)] [1, 2, 1, 1, 2/3, 2/3, 1/2, 1/2, 2/5, 2/5, 1/3, 1/3, 2/7]
>>> from sage.all import * >>> [graphs.CycleGraph(n).edge_isoperimetric_number() for n in range(Integer(2),Integer(15))] [1, 2, 1, 1, 2/3, 2/3, 1/2, 1/2, 2/5, 2/5, 1/3, 1/3, 2/7]
In general, for \(d\)-regular graphs the edge-isoperimetric number is \(d\) times larger than the Cheeger constant of the graph:
sage: g = graphs.RandomRegular(3, 10) # needs networkx sage: g.edge_isoperimetric_number() == g.cheeger_constant() * 3 # needs networkx True
>>> from sage.all import * >>> g = graphs.RandomRegular(Integer(3), Integer(10)) # needs networkx >>> g.edge_isoperimetric_number() == g.cheeger_constant() * Integer(3) # needs networkx True
And the edge-isoperimetric constant of a disconnected graph is \(0\):
sage: Graph([[1,2,3,4],[(1,2),(3,4)]]).edge_isoperimetric_number() 0
>>> from sage.all import * >>> Graph([[Integer(1),Integer(2),Integer(3),Integer(4)],[(Integer(1),Integer(2)),(Integer(3),Integer(4))]]).edge_isoperimetric_number() 0
- sage.graphs.isoperimetric_inequalities.vertex_isoperimetric_number(g)¶
Return the vertex-isoperimetric number of the graph.
The vertex-isoperimetric number of a graph \(G = (V,E)\) is also sometimes called the magnifying constant. It is defined as the minimum of \(|N(S)| / |S|\) where \(|N(S)|\) is the vertex boundary of \(S\) and the minimum is taken over the subsets \(S\) of vertices of size at most half of the vertices.
See also
Alternative but similar quantities can be obtained via the methods
cheeger_constant()andedge_isoperimetric_number().EXAMPLES:
The vertex-isoperimetric number of a complete graph on \(n\) vertices is \(\lceil n/2 \rceil/\lfloor n/2 \rfloor\):
sage: [graphs.CompleteGraph(k).vertex_isoperimetric_number() for k in range(2,15)] [1, 2, 1, 3/2, 1, 4/3, 1, 5/4, 1, 6/5, 1, 7/6, 1]
>>> from sage.all import * >>> [graphs.CompleteGraph(k).vertex_isoperimetric_number() for k in range(Integer(2),Integer(15))] [1, 2, 1, 3/2, 1, 4/3, 1, 5/4, 1, 6/5, 1, 7/6, 1]
The vertex-isoperimetric number of a cycle on \(n\) vertices is \(2/\lfloor n/2 \rfloor\):
sage: [graphs.CycleGraph(k).vertex_isoperimetric_number() for k in range(2,15)] [1, 2, 1, 1, 2/3, 2/3, 1/2, 1/2, 2/5, 2/5, 1/3, 1/3, 2/7]
>>> from sage.all import * >>> [graphs.CycleGraph(k).vertex_isoperimetric_number() for k in range(Integer(2),Integer(15))] [1, 2, 1, 1, 2/3, 2/3, 1/2, 1/2, 2/5, 2/5, 1/3, 1/3, 2/7]
And the vertex-isoperimetric number of a disconnected graph is \(0\):
sage: Graph([[1,2,3],[(1,2)]]).vertex_isoperimetric_number() 0
>>> from sage.all import * >>> Graph([[Integer(1),Integer(2),Integer(3)],[(Integer(1),Integer(2))]]).vertex_isoperimetric_number() 0
The vertex-isoperimetric number is independent of edge multiplicity:
sage: G = graphs.CycleGraph(6) sage: G.vertex_isoperimetric_number() 2/3 sage: G.allow_multiple_edges(True) sage: G.add_edges(G.edges(sort=False)) sage: G.vertex_isoperimetric_number() 2/3
>>> from sage.all import * >>> G = graphs.CycleGraph(Integer(6)) >>> G.vertex_isoperimetric_number() 2/3 >>> G.allow_multiple_edges(True) >>> G.add_edges(G.edges(sort=False)) >>> G.vertex_isoperimetric_number() 2/3