Note

This documents the development version of NetworkX. Documentation for the current release can be found here.

networkx.generators.classic.circulant_graph

circulant_graph(n, offsets, create_using=None)[source]

Returns the circulant graph \(Ci_n(x_1, x_2, ..., x_m)\) with \(n\) nodes.

The circulant graph \(Ci_n(x_1, ..., x_m)\) consists of \(n\) nodes \(0, ..., n-1\) such that node \(i\) is connected to nodes \((i + x) \mod n\) and \((i - x) \mod n\) for all \(x\) in \(x_1, ..., x_m\). Thus \(Ci_n(1)\) is a cycle graph.

Parameters
ninteger

The number of nodes in the graph.

offsetslist of integers

A list of node offsets, \(x_1\) up to \(x_m\), as described above.

create_usingNetworkX graph constructor, optional (default=nx.Graph)

Graph type to create. If graph instance, then cleared before populated.

Returns
NetworkX Graph of type create_using

Examples

Many well-known graph families are subfamilies of the circulant graphs; for example, to create the cycle graph on n points, we connect every node to nodes on either side (with offset plus or minus one). For n = 10,

>>> G = nx.circulant_graph(10, [1])
>>> edges = [
...     (0, 9),
...     (0, 1),
...     (1, 2),
...     (2, 3),
...     (3, 4),
...     (4, 5),
...     (5, 6),
...     (6, 7),
...     (7, 8),
...     (8, 9),
... ]
...
>>> sorted(edges) == sorted(G.edges())
True

Similarly, we can create the complete graph on 5 points with the set of offsets [1, 2]:

>>> G = nx.circulant_graph(5, [1, 2])
>>> edges = [
...     (0, 1),
...     (0, 2),
...     (0, 3),
...     (0, 4),
...     (1, 2),
...     (1, 3),
...     (1, 4),
...     (2, 3),
...     (2, 4),
...     (3, 4),
... ]
...
>>> sorted(edges) == sorted(G.edges())
True