Теорема Левина — различия между версиями
Kirelagin (обсуждение | вклад) (Теорема) |
|||
Строка 1: | Строка 1: | ||
− | + | {{Теорема | |
+ | |author=Левин | ||
+ | |statement= | ||
+ | Для любого языка <tex>L \in \Sigma_1</tex> и соответствующего ему (из определения <tex>\Sigma_1</tex>) отношения <tex>R</tex> существует «оптимальная» (работающая «не сильно дольше», чем любая другая) программа <tex>p</tex>, сопоставляющая словам из <tex>L</tex> их сертификаты, то есть: | ||
+ | # <tex>x \in L \Leftrightarrow R(x, p(x)) = 1</tex>; | ||
+ | # для любой другой программы <tex>q</tex>, для которой верно <tex>x \in L \Leftrightarrow R(x, q(x)) = 1</tex>, найдутся такие константа <tex>c</tex> и полином <tex>r</tex>, что <tex>\forall x \Rightarrow T(p, x) \le c \cdot T(q, x) + r(|x|)</tex>. | ||
+ | |proof= | ||
+ | Построим «оптимальную» программу <tex>p(x)</tex>. | ||
− | + | Пронумеруем все программы <tex>p_i</tex>. Поместим их в различные потоки, подадим на вход слово <tex>x</tex> и будем исполнять по одной инструкции в следующем порядке: на шаге с номером <tex>j</tex> запустим программу <tex>p_k</tex>, где <tex>k</tex> таково, что <tex>j</tex> делится на <tex>2^k</tex> и не делится на <tex>2^{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>p_k</tex>, выдав некоторое значение, завершит работу запустим в том же потоке проверку сертификата слова <tex>x</tex>, использовав вывод <tex>p_k</tex> в качестве сертификата. Если результат проверки положителен, искомый сертификат найден, иначе — продолжим работу больше ничего не запуская в этом потоке. | |
− | |||
− | |||
− | |||
− | + | Таким образом, если некоторая программа <tex>p_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>. | |
+ | }} | ||
− | == | + | == См. также == |
− | + | *[[Класс P]] | |
− | + | *[[Недетерминированные вычисления. Классы NP и Σ₁]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версия 19:50, 8 мая 2012
Теорема (Левин): |
Для любого языка и соответствующего ему (из определения ) отношения существует «оптимальная» (работающая «не сильно дольше», чем любая другая) программа , сопоставляющая словам из их сертификаты, то есть:
|
Доказательство: |
Построим «оптимальную» программу .Пронумеруем все программы . Поместим их в различные потоки, подадим на вход слово и будем исполнять по одной инструкции в следующем порядке: на шаге с номером запустим программу , где таково, что делится на и не делится на . Таким образом, программа будет исполняться на каждом -м шаге. Следовательно, если завершит работу за инструкций, то к этому времени нами будет сделано шагов.Как только Таким образом, если некоторая программа , выдав некоторое значение, завершит работу запустим в том же потоке проверку сертификата слова , использовав вывод в качестве сертификата. Если результат проверки положителен, искомый сертификат найден, иначе — продолжим работу больше ничего не запуская в этом потоке. генерирует верные сертификаты, то наша программа завершит работу не более, чем за шагов. и из определения , значит это равно . |