L/poly

In computational complexity theory, L/poly is the complexity class of logarithmic space machines with a polynomial amount of advice. L/poly is a non-uniform logarithmic space class, analogous to the non-uniform polynomial time class P/poly.

Formally, for a formal language $L$ to belong to L/poly, there must exist an advice function $f$ that maps an integer $n$ to a string of length polynomial in $n$, and a Turing machine M with two read-only input tapes and one read-write tape of size logarithmic in the input size, such that an input $x$ of length $n$ belongs to $L$ if and only if machine M accepts the input $x, f(n)$. Alternatively and more simply, $L$ is in L/poly if and only if it can be recognized by branching programs of polynomial size. One direction of the proof that these two models of computation are equivalent in power is the observation that, if a branching program of polynomial size exists, it can be specified by the advice function and simulated by the Turing machine. In the other direction, a Turing machine with logarithmic writable space and a polynomial advice tape may be simulated by a branching program the states of which represent the combination of the configuration of the writable tape and the position of the Turing machine heads on the other two tapes.

In 1979, Aleliunas et al. showed that symmetric logspace is contained in L/poly. However, this result was superseded by Omer Reingold's result that SL collapses to uniform logspace.

BPL is contained in L/poly, which is a variant of Adleman's theorem.