Теорема Левина — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
По одному из определений <math>NP</math> языка, язык <math>L</math> принадлежит <math>NP</math>, если существует такая функция <math>R(x, y) \in \tilde{P}</math> — <math>NP</math>-отношение для языка <math>L</math> (<math>NP</math>-relation), что: <math>x \in L \Leftrightarrow \exists y</math> — такой сертификат для <math>x</math>, что: <math>|y| \le poly(|x|)</math> и <math>R(x, y) = 1</math>. Таким образом, для проверки принадлежности некоторого слова NP языку L с NP-отношением R необходимо предъявить соответствующий сертификат. Так как для любого слова из языка существует подтверждающий сертификат, то существует программа g(x), которая для слов из языка возвращает нужный сертификат. А для слов не из языка никаких гарантий на возвращаемое значение функции нет, и потому она может либо вернуть неправильный сертификат, либо вообще зависнуть.
+
По одному из определений <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 программе''' утверждает, что для любого языка <math>L \in NP</math> и функции <math>R</math> (<math>NP</math>-отношения для <math>L</math>) существует такая программа <math>f</math>, что:
+
'''Теорема Левина об оптимальной <tex>NP</tex> программе''' утверждает, что для любого языка <tex>L \in NP</tex> и функции <tex>R</tex> (<tex>NP</tex>-отношения для <tex>L</tex>) существует такая программа <tex>f</tex>, что:
#<math>\forall x \in L</math> выполнено <math>R(x, f(x)) = 1</math>;
+
#<tex>\forall x \in L</tex> выполнено <tex>R(x, f(x)) = 1</tex>;
#<math>\forall g</math> — такой программы, что <math>\forall x \in L: R(x, g(x)) = 1</math> выполнено <math>\forall x \in L: T(f, x) \le C(g) \cdot (T(g, x) + poly(|x|))</math>, где T(f, x) — время работы программы f на входе x.
+
#<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> для него.
  
Занумеруем все программы <math>g_1, g_2, ... , g_n, ...</math> сначала по длине программы, а в случае равенства длин — лексикографически.
+
Занумеруем все программы <tex>g_1, g_2, ... , g_n, ...</tex> сначала по длине программы, а в случае равенства длин — лексикографически.
  
Будем запускать <math>g_i</math> каждый раз на один шаг и запоминать полученное состояние запущенной программы. Запускать будем в следующем порядке: 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 и так далее. Заметим, что мы запускаем программу <math>g_i</math> каждый <math>2^i</math>-й раз, а потому, если программа <math>g_i(x)</math> завершается за <math>k</math> шагов, то <math>f</math> совершит не больше <math>2^i \cdot k</math> шагов до момента завершения <math>g_i</math> на входе <math>x</math> в программе <math>f</math>.  
+
Будем запускать <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>.  
  
После того, как программа <math>g_i</math> остановилась, на её месте будем запускать программу <math>R(x, y)</math>, где <math>y</math> - значение, которое вернула <math>g_i(x)</math>. Причем f совершит не больше <math>2^i \cdot poly(|x + y|)</math> шагов до завершения программы <math>R(x, y)</math>, так как <math>R \in \tilde{P}</math> и она запускается каждый <math>2^i</math>-й раз. Если <math>R(x, y)</math> вернула <math>true</math>, то возвратим <math>y</math>, так как <math>y</math> — нужный сертификат для <math>x</math>, а если <math>false</math>, то ничего на этом месте больше запускать не будем.
+
После того, как программа <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 возвращает только те у, для которых R(x, y) = 1, то R(x, f(x)) = 0 получиться не может. Покажем, что и зависнуть на словах из языка <math>f</math> не может. Как выше уже упоминалось, если слово принадлежит языку <math>L</math>, то для него есть сертификат, а значит есть и программа <math>g</math>, которая просто этот сертификат возвращает. Так как все программы рано или поздно будут занумерованы, то и <math>g</math> будет занумерована, а следовательно и запущена. После остановки <math>g</math> и проверки правильности <math>y</math> программа <math>f</math> вернет его.
+
#Так как программа <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> вернет его.
#Как выше уже оговаривалось, если программа <math>g(x)</math> правильно находит сертификат и завершается за <math>k</math> шагов, то программа <math>f</math> завершится не более, чем за <math>2^i \cdot (k + poly(|x + y|))</math> шагов. Заметим, что <math>2^i \cdot (k + poly(|x + y|))=2^i \cdot (k + poly(|x|))</math>, так как <math>y</math> — сертификат для <math>x</math> и потому <math>|y| \le poly(|x|)</math>.
+
#Как выше уже оговаривалось, если программа <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

По одному из определений [math]NP[/math] языка, язык [math]L[/math] принадлежит [math]NP[/math], если существует такая функция [math]R(x, y) \in \tilde{P}[/math][math]NP[/math]-отношение для языка [math]L[/math] ([math]NP[/math]-relation), что: [math]x \in L \Leftrightarrow \exists y[/math] — такой сертификат для [math]x[/math], что: [math]|y| \le poly(|x|)[/math] и [math]R(x, y) = 1[/math]. Таким образом, для проверки принадлежности некоторого слова [math]NP[/math] языку [math]L[/math] с [math]NP[/math]-отношением [math]R[/math] необходимо предъявить соответствующий сертификат. Так как для любого слова из языка существует подтверждающий сертификат, то существует программа [math]g(x)[/math], которая для слов из языка возвращает нужный сертификат. А для слов не из языка никаких гарантий на возвращаемое значение функции нет, и потому она может либо вернуть неправильный сертификат, либо вообще зависнуть.

Встает вопрос о возможности построения «оптимальной» программы для заранее заданного [math]NP[/math] языка [math]L[/math] и [math]NP[/math]-отношения для этого языка [math]R[/math], которая будет находить сертификат для слова. Оптимальность программы в данном случае означает, что время ее работы для слов из языка не сильно хуже, чем у любой другой программы, правильно находящей сертификат для слов из языка.

Формулировка

Теорема Левина об оптимальной [math]NP[/math] программе утверждает, что для любого языка [math]L \in NP[/math] и функции [math]R[/math] ([math]NP[/math]-отношения для [math]L[/math]) существует такая программа [math]f[/math], что:

  1. [math]\forall x \in L[/math] выполнено [math]R(x, f(x)) = 1[/math];
  2. [math]\forall g[/math] — такой программы, что [math]\forall x \in L: R(x, g(x)) = 1[/math] выполнено [math]\forall x \in L: T(f, x) \le C(g) \cdot (T(g, x) + poly(|x|))[/math], где [math]T(f, x)[/math] — время работы программы [math]f[/math] на входе [math]x[/math].

Заметим, что функция [math]C(g)[/math] не зависит от слова [math]x[/math], т.е. константа от [math]x[/math].

Доказательство

Для доказательства теоремы будем строить оптимальную [math]NP[/math] программу [math]f[/math] для некоторого [math]NP[/math] языка [math]L[/math] и [math]NP[/math] отношения [math]R(x, y)[/math] для него.

Занумеруем все программы [math]g_1, g_2, ... , g_n, ...[/math] сначала по длине программы, а в случае равенства длин — лексикографически.

Будем запускать [math]g_i[/math] каждый раз на один шаг и запоминать полученное состояние запущенной программы. Запускать будем в следующем порядке: 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5 и так далее. Заметим, что мы запускаем программу [math]g_i[/math] каждый [math]2^i[/math]-й раз, а потому, если программа [math]g_i(x)[/math] завершается за [math]k[/math] шагов, то [math]f[/math] совершит не больше [math]2^i \cdot k[/math] шагов до момента завершения [math]g_i[/math] на входе [math]x[/math] в программе [math]f[/math].

После того, как программа [math]g_i[/math] остановилась, на её месте будем запускать программу [math]R(x, y)[/math], где [math]y[/math] - значение, которое вернула [math]g_i(x)[/math]. Причем [math]f[/math] совершит не больше [math]2^i \cdot poly(|x + y|)[/math] шагов до завершения программы [math]R(x, y)[/math], так как [math]R \in \tilde{P}[/math] и она запускается каждый [math]2^i[/math]-й раз. Если [math]R(x, y)[/math] вернула [math]true[/math], то возвратим [math]y[/math], так как [math]y[/math] — нужный сертификат для [math]x[/math], а если [math]false[/math], то ничего на этом месте больше запускать не будем.

Осталось доказать, что данная программа действительно удовлетворяет пунктам 1 и 2 теоремы Левина.

  1. Так как программа [math]f[/math] возвращает только те [math]y[/math], для которых [math]R(x, y) = 1[/math], то [math]R(x, f(x)) = 0[/math] получиться не может. Покажем, что и зависнуть на словах из языка [math]f[/math] не может. Как выше уже упоминалось, если слово принадлежит языку [math]L[/math], то для него есть сертификат, а значит есть и программа [math]g[/math], которая просто этот сертификат возвращает. Так как все программы рано или поздно будут занумерованы, то и [math]g[/math] будет занумерована, а следовательно и запущена. После остановки [math]g[/math] и проверки правильности [math]y[/math] программа [math]f[/math] вернет его.
  2. Как выше уже оговаривалось, если программа [math]g(x)[/math] правильно находит сертификат и завершается за [math]k[/math] шагов, то программа [math]f[/math] завершится не более, чем за [math]2^i \cdot (k + poly(|x + y|))[/math] шагов. Заметим, что [math]2^i \cdot (k + poly(|x + y|))=2^i \cdot (k + poly(|x|))[/math], так как [math]y[/math] — сертификат для [math]x[/math] и потому [math]|y| \le poly(|x|)[/math].

Теорема доказана.