networkx.algorithms.dag.is_aperiodic

is_aperiodic(G)[source]

Returns True if G is aperiodic.

A directed graph is aperiodic if there is no integer k > 1 that divides the length of every cycle in the graph.

Parameters
GNetworkX DiGraph

A directed graph

Returns
bool

True if the graph is aperiodic False otherwise

Raises
NetworkXError

If G is not directed

Notes

This uses the method outlined in [1], which runs in \(O(m)\) time given \(m\) edges in G. Note that a graph is not aperiodic if it is acyclic as every integer trivial divides length 0 cycles.

References

1

Jarvis, J. P.; Shier, D. R. (1996), “Graph-theoretic analysis of finite Markov chains,” in Shier, D. R.; Wallenius, K. T., Applied Mathematical Modeling: A Multidisciplinary Approach, CRC Press.

Examples

A graph consisting of one cycle, the length of which is 2. Therefore k = 2 divides the length of every cycle in the graph and thus the graph is not aperiodic:

>>> DG = nx.DiGraph([(1, 2), (2, 1)])
>>> nx.is_aperiodic(DG)
False

A graph consisting of two cycles: one of length 2 and the other of length 3. The cycle lengths are coprime, so there is no single value of k where k > 1 that divides each cycle length and therefore the graph is aperiodic:

>>> DG = nx.DiGraph([(1, 2), (2, 3), (3, 1), (1, 4), (4, 1)])
>>> nx.is_aperiodic(DG)
True

A graph consisting of two cycles: one of length 2 and the other of length 4. The lengths of the cycles share a common factor k = 2, and therefore the graph is not aperiodic:

>>> DG = nx.DiGraph([(1, 2), (2, 1), (3, 4), (4, 5), (5, 6), (6, 3)])
>>> nx.is_aperiodic(DG)
False

An acyclic graph, therefore the graph is not aperiodic:

>>> DG = nx.DiGraph([(1, 2), (2, 3)])
>>> nx.is_aperiodic(DG)
False