Теорема Левина — различия между версиями
SVKazakov (обсуждение | вклад) |
SVKazakov (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | По одному из определений < | + | По одному из определений <tex>NP</tex> языка, язык <tex>L</tex> принадлежит <tex>NP</tex>, если существует такая функция <tex>R(x, y) \in \tilde{P}</tex> — <tex>NP</tex>-отношение для языка <tex>L</tex> (<tex>NP</tex>-relation), что: <tex>x \in L \Leftrightarrow \exists y</tex> — такой сертификат для <tex>x</tex>, что: <tex>|y| \le poly(|x|)</tex> и <tex>R(x, y) = 1</tex>. Таким образом, для проверки принадлежности некоторого слова <tex>NP</tex> языку <tex>L</tex> с <tex>NP</tex>-отношением <tex>R</tex> необходимо предъявить соответствующий сертификат. Так как для любого слова из языка существует подтверждающий сертификат, то существует программа <tex>g(x)</tex>, которая для слов из языка возвращает нужный сертификат. А для слов не из языка никаких гарантий на возвращаемое значение функции нет, и потому она может либо вернуть неправильный сертификат, либо вообще зависнуть. |
− | Встает вопрос о возможности построения «оптимальной» программы для заранее заданного NP языка L и NP-отношения для этого языка R, которая будет находить сертификат для слова. Оптимальность программы в данном случае означает, что время ее работы для слов из языка не сильно хуже, чем у любой другой программы, правильно находящей сертификат для слов из языка. | + | Встает вопрос о возможности построения «оптимальной» программы для заранее заданного <tex>NP</tex> языка <tex>L</tex> и <tex>NP</tex>-отношения для этого языка <tex>R</tex>, которая будет находить сертификат для слова. Оптимальность программы в данном случае означает, что время ее работы для слов из языка не сильно хуже, чем у любой другой программы, правильно находящей сертификат для слов из языка. |
== Формулировка == | == Формулировка == | ||
− | '''Теорема Левина об оптимальной NP программе''' утверждает, что для любого языка < | + | '''Теорема Левина об оптимальной <tex>NP</tex> программе''' утверждает, что для любого языка <tex>L \in NP</tex> и функции <tex>R</tex> (<tex>NP</tex>-отношения для <tex>L</tex>) существует такая программа <tex>f</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)) = 1</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>. |
− | Заметим, что функция C(g) не зависит от слова | + | Заметим, что функция <tex>C(g)</tex> не зависит от слова <tex>x</tex>, т.е. константа от <tex>x</tex>. |
== Доказательство == | == Доказательство == | ||
− | Для доказательства теоремы будем строить оптимальную NP программу f для некоторого NP языка L и NP отношения R(x, y) для него. | + | Для доказательства теоремы будем строить оптимальную <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 теоремы Левина. | Осталось доказать, что данная программа действительно удовлетворяет пунктам 1 и 2 теоремы Левина. | ||
− | #Так как программа f возвращает только те | + | #Так как программа <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> и проверки правильности <tex>y</tex> программа <tex>f</tex> вернет его. |
− | #Как выше уже оговаривалось, если программа < | + | #Как выше уже оговаривалось, если программа <tex>g(x)</tex> правильно находит сертификат и завершается за <tex>k</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>. |
Теорема доказана. | Теорема доказана. |
Версия 15:17, 14 марта 2010
По одному из определений
языка, язык принадлежит , если существует такая функция — -отношение для языка ( -relation), что: — такой сертификат для , что: и . Таким образом, для проверки принадлежности некоторого слова языку с -отношением необходимо предъявить соответствующий сертификат. Так как для любого слова из языка существует подтверждающий сертификат, то существует программа , которая для слов из языка возвращает нужный сертификат. А для слов не из языка никаких гарантий на возвращаемое значение функции нет, и потому она может либо вернуть неправильный сертификат, либо вообще зависнуть.Встает вопрос о возможности построения «оптимальной» программы для заранее заданного
языка и -отношения для этого языка , которая будет находить сертификат для слова. Оптимальность программы в данном случае означает, что время ее работы для слов из языка не сильно хуже, чем у любой другой программы, правильно находящей сертификат для слов из языка.Формулировка
Теорема Левина об оптимальной
программе утверждает, что для любого языка и функции ( -отношения для ) существует такая программа , что:- выполнено ;
- — такой программы, что выполнено , где — время работы программы на входе .
Заметим, что функция
не зависит от слова , т.е. константа от .Доказательство
Для доказательства теоремы будем строить оптимальную
программу для некоторого языка и отношения для него.Занумеруем все программы
сначала по длине программы, а в случае равенства длин — лексикографически.Будем запускать
каждый раз на один шаг и запоминать полученное состояние запущенной программы. Запускать будем в следующем порядке: 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 и так далее. Заметим, что мы запускаем программу каждый -й раз, а потому, если программа завершается за шагов, то совершит не больше шагов до момента завершения на входе в программе .После того, как программа
остановилась, на её месте будем запускать программу , где - значение, которое вернула . Причем совершит не больше шагов до завершения программы , так как и она запускается каждый -й раз. Если вернула , то возвратим , так как — нужный сертификат для , а если , то ничего на этом месте больше запускать не будем.Осталось доказать, что данная программа действительно удовлетворяет пунктам 1 и 2 теоремы Левина.
- Так как программа возвращает только те , для которых , то получиться не может. Покажем, что и зависнуть на словах из языка не может. Как выше уже упоминалось, если слово принадлежит языку , то для него есть сертификат, а значит есть и программа , которая просто этот сертификат возвращает. Так как все программы рано или поздно будут занумерованы, то и будет занумерована, а следовательно и запущена. После остановки и проверки правильности программа вернет его.
- Как выше уже оговаривалось, если программа правильно находит сертификат и завершается за шагов, то программа завершится не более, чем за шагов. Заметим, что , так как — сертификат для и потому .
Теорема доказана.