Boolean Circuits & P/poly

Nonuniform circuits, size and depth, and the class P/poly.

The idea

A Boolean circuit is a fixed-size model of computation, and $\mathsf{P}/\mathrm{poly}$ is the class of languages decided by small circuits. A circuit on $n$ inputs is a directed acyclic graph whose nodes are $\wedge$, $\vee$, and $\neg$ gates, wired from $n$ input nodes $x_{1}, \ldots, x_{n}$ to a single output; it computes one function $f \colon \{0,1\}^{n} \to \{0,1\}$, for one input length only. A language contains strings of every length, so deciding one requires a family $\{C_{n}\}_{n \ge 0}$, one circuit per length.

The family is nonuniform: no single algorithm is required to produce its circuits — this is the departure from the Turing machine, which is one device handling every input length. We charge a family by its size, the number of gates, and its depth, the longest path from an input to the output, and define $\mathsf{P}/\mathrm{poly} = \{\,\text{languages decided by a circuit family of size } n^{O(1)}\,\}.$

Because the circuits need not be describable by any algorithm, the class is generous — it contains languages no algorithm decides at all. Its value lies in the other direction: a circuit is a finite combinatorial object with nothing hidden inside it, which makes it the natural setting for proving lower bounds.

Ways to work on it

Not sure where to start? Take the ten-question placement test.