По одному из определений [[Класс NP{{Теорема|author=Левин|statement=Для любого языка <tex>NPL \in \Sigma_1</tex> языка]], язык и соответствующего ему (из определения <tex>L\Sigma_1</tex> принадлежит ) отношения <tex>NPR</tex>, если существует такая функция <tex>R«оптимальная» (xработающая «не сильно дольше», yчем любая другая) \in \tilde{P}программа </tex> — <tex>NPp</tex>-отношение для языка , сопоставляющая словам из <tex>L</tex> (<tex>NP</tex>-relation)их сертификаты, чтото есть: # <tex>x \in L \Leftrightarrow \exists yR(x, p(x)) = 1</tex> — такой сертификат ;# для любой другой программы <tex>xq</tex>, что: для которой верно <tex>|y| x \in L \le polyLeftrightarrow R(|x|)</tex> и <tex>R, q(x, y)) = 1</tex>. Таким образом, для проверки принадлежности некоторого слова найдутся такие константа <tex>NPc</tex> языку и полином <tex>Lr</tex> с , что <tex>NP</tex>-отношением <tex>R\forall x \Rightarrow T(p, x) \le c \cdot T(q, x) + r(|x|)</tex> необходимо предъявить соответствующий сертификат. Так как для любого слова из языка существует подтверждающий сертификат, то существует программа |proof=Построим «оптимальную» программу <tex>gp(x)</tex>, которая для слов из языка возвращает нужный сертификат. А для слов не из языка никаких гарантий на возвращаемое значение функции нет, и потому она может либо вернуть неправильный сертификат, либо вообще зависнуть.
Встает вопрос о возможности построения «оптимальной» Пронумеруем все программы для заранее заданного <tex>NPp_i</tex> языка . Поместим их в различные потоки, подадим на вход слово <tex>Lx</tex> и будем исполнять по одной инструкции в следующем порядке: на шаге с номером <tex>NPj</tex>-отношения для этого языка запустим программу <tex>p_k</tex>, где <tex>k</tex> таково, что <tex>j</tex> делится на <tex>2^k</tex> и не делится на <tex>R2^{k+1}</tex>. Таким образом, которая программа <tex>p_k</tex> будет находить сертификат для словаисполняться на каждом <tex>2^k</tex>-м шаге. Оптимальность программы в данном случае означаетСледовательно, если <tex>p_k</tex> завершит работу за <tex>T(p_k, что время ее работы для слов из языка не сильно хужеx)</tex> инструкций, чем у любой другой программыто к этому времени нами будет сделано <tex>T(P_k, правильно находящей сертификат для слов из языкаx) \cdot 2^k</tex> шагов.
== Формулировка теоремы Левина об оптимальной Как только <tex>NP</tex> программе ==Для любого языка <tex>L \in NP</tex> и функции <tex>R</tex> (<tex>NP</tex>-отношения для <tex>L</tex>) существует такая программа <tex>fp_k</tex>, что:#выдав некоторое значение, завершит работу запустим в том же потоке проверку сертификата слова <tex>\forall x \in L</tex> выполнено <tex>R(x, f(x)) = 1</tex>;#<tex>\forall g</tex> — такой программы, что использовав вывод <tex>\forall x \in L: R(x, g(x)) = 1p_k</tex> выполнено <tex>\forall x \in L: T(f, x) \le C_g \cdot (T(gв качестве сертификата. Если результат проверки положителен, x) + poly(|x|))</tex>искомый сертификат найден, где <tex>T(f, x)</tex> иначе — время работы программы <tex>f</tex> на входе <tex>x</tex>продолжим работу больше ничего не запуская в этом потоке.
ЗаметимТаким образом, что если некоторая программа <tex>C_gp_k</tex> генерирует верные сертификаты, то наша программа <tex>p</tex> завершит работу не зависит от слова более, чем за <tex>(T(p_k,x) + T(R, \langle x,p_k(x) \rangle)) \cdot 2^k</tex> шагов. <tex>R \in P</tex>и <tex>|y| \le poly(|x|)</tex> из определения <tex>\Sigma_1</tex>, т.е. константа от значит это равно <tex>(T(p_k,x) + poly(|x|)) \cdot 2^k = 2^k \cdot T(p_k,x) + poly(|x|)</tex>.}}
== Доказательство См. также ==Для доказательства теоремы будем строить оптимальную <tex>NP</tex> программу <tex>f</tex> для некоторого <tex>NP</tex> языка <tex>L</tex> и <tex>NP</tex> отношения <tex>R(x, y)</tex> для него. Занумеруем все программы <tex>g_1, g_2, ... , g_n, ...</tex> сначала по длине программы, а в случае равенства длин — лексикографически. Будем запускать <tex>g_i</tex> каждый раз на один шаг и запоминать полученное состояние запущенной программы. Запускать будем в следующем порядке: 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 и так далее. Заметим, что мы запускаем программу <tex>g_i</tex> каждый <tex>2^i</tex>-й раз, а потому, если программа <tex>g_i(x)</tex> завершается за <tex>k</tex> шагов, то <tex>f</tex> совершит не больше <tex>2^i \cdot k</tex> шагов до момента завершения <tex>g_i</tex> на входе <tex>x</tex> в программе <tex>f</tex>. После того, как программа <tex>g_i</tex> остановилась, на её месте будем запускать программу <tex>R(x, y)</tex>, где <tex>y</tex> - значение, которое вернула <tex>g_i(x)</tex>. Причем <tex>f</tex> совершит не больше <tex>2^i \cdot poly(|x + y|)</tex> шагов до завершения программы <tex>R(x, y)</tex>, так как <tex>R \in \tilde{*[[Класс P}</tex> и она запускается каждый <tex>2^i</tex>-й раз. Если <tex>R(x, y)</tex> вернула <tex>true</tex>, то возвратим <tex>y</tex>, так как <tex>y</tex> — нужный сертификат для <tex>x</tex>, а если <tex>false</tex>, то ничего на этом месте больше запускать не будем.]]Осталось доказать, что данная программа действительно удовлетворяет пунктам 1 и 2 теоремы Левина*[[Недетерминированные вычисления.#Так как программа <tex>f</tex> возвращает только те <tex>y</tex>, для которых <tex>R(x, y) = 1</tex>, то <tex>R(x, f(x)) = 0</tex> получиться не может. Покажем, что и зависнуть на словах из языка <tex>f</tex> не может. Как выше уже упоминалось, если слово принадлежит языку <tex>L</tex>, то для него есть сертификат, а значит есть и программа <tex>g</tex>, которая, например, просто этот сертификат возвращает. Так как все программы рано или поздно будут занумерованы, то и <tex>g</tex> будет занумерована, а следовательно и запущена. После остановки <tex>g</tex> Классы NP и проверки правильности <tex>y</tex> программа <tex>f</tex> вернет его.#Если программа <tex>g(x)</tex> правильно находит сертификаты для слов из языка и завершается за <tex>k</tex> шагов для некоторого слова <tex>x</tex> из <tex>L</tex>, то программа <tex>f</tex> завершится не более, чем за <tex>2^i \cdot (k + poly(|x + y|))</tex> шагов для этого же слова. Заметим, что <tex>2^i \cdot (k + poly(|x + y|))=2^i \cdot (k + poly(|x|))</tex>, так как <tex>y</tex> — сертификат для <tex>x</tex> и потому <tex>|y| \le poly(|x|)</tex>. Теорема доказана.Σ₁]]