NP/poly

In computational complexity theory, NP/poly is a complexity class, a non-uniform analogue of the class NP of problems solvable in polynomial time by a non-deterministic Turing machine. It is the non-deterministic complexity class corresponding to the deterministic class P/poly.

Definition
NP/poly is defined as the class of problems solvable in polynomial time by a non-deterministic Turing machine that has access to a polynomial-bounded advice function.

It may equivalently be defined as the class of problems such that, for each instance size $$n$$, there is a Boolean circuit of size polynomial in $$n$$ that implements a verifier for the problem. That is, the circuit computes a function $$f(x,y)$$ such that an input $$x$$ of length $$n$$ is a yes-instance for the problem if and only if there exists $$y$$ for which $$f(x,y)$$ is true.

Applications
NP/poly is used in a variation of Mahaney's theorem on the non-existence of sparse NP-complete languages. Mahaney's theorem itself states that the number of yes-instances of length $$n$$ of an NP-complete problem cannot be polynomially bounded unless P = NP. According to the variation, the number of yes-instances must be at least $$2^{n^\epsilon}$$ for some $$\epsilon>0$$ and for infinitely many $$n$$, unless co-NP is a subset of NP/poly, which (by the Karp–Lipton theorem) would cause the collapse of the polynomial hierarchy. The same computational hardness assumption that co-NP is not a subset of NP/poly also implies several other results in complexity such as the optimality of certain kernelization techniques.