Теорема Ладнера — различия между версиями
Assaron (обсуждение | вклад) (→Утверждение 2) |
Assaron (обсуждение | вклад) (<math>...</math> -> <tex>...</tex>) |
||
| Строка 1: | Строка 1: | ||
'''Теорема Ладнера''' (Ladner's Theorem) утверждает, | '''Теорема Ладнера''' (Ladner's Theorem) утверждает, | ||
| − | что если [[P]] не совпадает с [[NP]], то существует язык < | + | что если [[P]] не совпадает с [[NP]], то существует язык <tex>L</tex>, |
| − | принадлежащий < | + | принадлежащий <tex>NP</tex>, но не являющийся полиномиальным и [[NP-полнота|NP-полным]]. |
==Иллюстрация== | ==Иллюстрация== | ||
| − | Определим язык < | + | Определим язык <tex>A</tex> как множество таких формул <tex>\alpha</tex>, |
| − | что < | + | что <tex>\left\lfloor \frac{1}{2}\log_{10}^*|\alpha|\right\rfloor</tex> чётно. |
| − | Иными словами, < | + | Иными словами, <tex>A</tex> — это язык формул с длинами, лежащими в промежутках |
<math>\left[1,10^{10}\right), | <math>\left[1,10^{10}\right), | ||
\left[\underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_4, | \left[\underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_4, | ||
| − | \underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_6\right), \ | + | \underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_6\right), \ldots</math> |
| − | Далее будем обозначать < | + | Далее будем обозначать <tex>\underbrace{a^{a^{\cdot^{\cdot^{a}}}}}_n</tex> |
| − | как < | + | как <tex>^{n}a</tex>. |
| − | Рассмотрим язык [[SAT]] всех удовлетворимых формул. Логично предположить, что как в < | + | Рассмотрим язык [[SAT]] всех удовлетворимых формул. Логично предположить, что как в <tex>A</tex>, |
| − | так и в < | + | так и в <tex>\bar{A}</tex> лежит бесконечное множество элементов из <tex>SAT</tex>, |
| − | не распознаваемых за полиномиальное время, поэтому < | + | не распознаваемых за полиномиальное время, поэтому <tex>SAT \cap A \not\in P</tex>. |
| − | Из < | + | Из <tex>A \in P</tex> и <tex>SAT \in NP</tex> следует, что <tex>SAT \cap A \in NP</tex>. |
| − | Осталось показать, что < | + | Осталось показать, что <tex>SAT \cap A</tex> не является NP-полным. Пусть |
| − | это не так. Тогда из NP-полноты следует, что существует полиномиальная функция < | + | это не так. Тогда из NP-полноты следует, что существует полиномиальная функция <tex>f</tex>, |
| − | [[Сведение по Карпу|сводящая по Карпу]] < | + | [[Сведение по Карпу|сводящая по Карпу]] <tex>SAT</tex> к <tex>SAT \cap A</tex>. |
| − | Возьмём формулу < | + | Возьмём формулу <tex>\varphi</tex> длиной <tex>^{2k+1}10</tex>. |
| − | Она не лежит в < | + | Она не лежит в <tex>A</tex> и, следовательно, в <tex>SAT \cap A</tex>. |
| − | Функция < | + | Функция <tex>f</tex> не может перевести <tex>\varphi</tex> в промежуток |
| − | < | + | <tex>\left[^{2k+2}10, ^{2k+4}10\right)</tex> или дальше, так как размер |
выхода полиномиальной функции не может быть экспоненциально больше длины | выхода полиномиальной функции не может быть экспоненциально больше длины | ||
| − | входа. Значит, < | + | входа. Значит, <tex>\varphi</tex> отображается в меньший промежуток, но |
в этом случае размер выхода экспоненциально меньше длины входа. Добавляя | в этом случае размер выхода экспоненциально меньше длины входа. Добавляя | ||
| − | к этому то, что проверку на принадлежность < | + | к этому то, что проверку на принадлежность <tex>f(\varphi)</tex> к |
| − | < | + | <tex>SAT \cap A</tex> можно осуществить за <tex>O(2^{poly})</tex> |
| − | (это следует из её принадлежности классу < | + | (это следует из её принадлежности классу <tex>NP</tex>), получаем программу, |
| − | разрешающую < | + | разрешающую <tex>\varphi</tex> за полином. Утверждение о том, что все формулы |
| − | < | + | <tex>\varphi</tex> длиной <tex>^{2k+1}10</tex> принадлежат классу |
| − | < | + | <tex>P</tex>, скорее всего не верно, и, следовательно, язык |
| − | < | + | <tex>SAT \cap A</tex> не является NP-полным. |
Заметим, что это объяснение не является доказательством! | Заметим, что это объяснение не является доказательством! | ||
==Доказательство== | ==Доказательство== | ||
| − | Будем искать язык < | + | Будем искать язык <tex>A</tex>, удовлетворяющий следующим условиям: |
| − | #< | + | #<tex>A \in P</tex> (что влечёт за собой<tex>SAT \cap A \in NP</tex>); |
| − | #< | + | #<tex>SAT \cap A \not\in P</tex>; |
| − | #< | + | #<tex>SAT \not \leq SAT \cap A</tex>. |
| − | Если такой язык существует, то < | + | Если такой язык существует, то <tex>L = SAT \cap A</tex> является искомым примером множества |
| − | из < | + | из <tex>NP \setminus (P \cup NPC)</tex>. |
===Утверждение 1=== | ===Утверждение 1=== | ||
| − | Можно перечислить (возможно, с повторениями) все языки из < | + | Можно перечислить (возможно, с повторениями) все языки из <tex>P</tex>. |
Действительно, рассмотрим последовательность всех программ, упорядоченных по длине: | Действительно, рассмотрим последовательность всех программ, упорядоченных по длине: | ||
| − | < | + | <tex> \tilde{p_0}, \tilde{p_1}, \ldots, \tilde{p_n}, \ldots</tex> |
| − | Обозначим за < | + | Обозначим за <tex>p_i</tex> программу, запускающую <tex>\tilde{p_i}</tex> |
| − | с таймером < | + | с таймером <tex>in^i</tex>. Тогда среди <tex>{p_i}</tex> встречаются |
| − | только программы из < | + | только программы из <tex>P</tex>, и для каждой полиномиальной программы |
| − | < | + | <tex>\tilde{p_i}</tex>, работающей за полином <tex>g_i(n)</tex>, существует |
| − | номер < | + | номер <tex>j</tex> такой, что <tex>jn^j > g_i(n)</tex> для всех натуральных <tex>n</tex> |
| − | и < | + | и <tex>\tilde{p_j}</tex> делает то же самое, что и <tex>\tilde{p_i}</tex>. |
| − | Таким образом, < | + | Таким образом, <tex>p_j</tex> распознает тот же язык, что и <tex>\tilde{p_i}</tex>. |
===Утверждение 2=== | ===Утверждение 2=== | ||
| − | Можно перечислить все функции из < | + | Можно перечислить все функции из <tex>\tilde{P}</tex>. |
| − | Аналогично предыдущему доказательству, сначала построим последовательность < | + | Аналогично предыдущему доказательству, сначала построим последовательность <tex>\tilde{f_i}</tex>, а затем, добавив таймер <tex>in^i</tex>, получим последовательность <tex>f_i</tex>. |
| − | ===Описание способа построения < | + | ===Описание способа построения <tex>A</tex>=== |
| − | Упорядочим все слова по возрастанию длины. Разобьем всё < | + | Упорядочим все слова по возрастанию длины. Разобьем всё <tex>\Sigma^{*}</tex> на множества |
| − | < | + | <tex>A_i</tex> так, что <tex>\forall i<j, \forall \alpha \in A_i, \beta \in A_j: |\alpha| < |\beta|</tex> |
| − | (то есть разбиение происходит по длинам, причем < | + | (то есть разбиение происходит по длинам, причем <tex>A_i</tex> идут «подряд»), |
| − | < | + | <tex>SAT \cap \bigcup_{i=0}^{k} A_{2i}</tex> отличается от <tex>L(p_k)</tex> элементом |
| − | из < | + | из <tex>\bigcup_{i=0}^{2k} A_i</tex> и для любого <tex>k</tex> существует <tex>\alpha \in \bigcup_{i=0}^{2k+1} A_i</tex>, |
| − | для которого выполняются условия < | + | для которого выполняются условия <tex>f_k(\alpha) \in \bigcup_{i=0}^{2k+1} A_i</tex> и |
| − | < | + | <tex>[\alpha \in SAT] \ne [f_k(\alpha) \in SAT \cap \bigcup_{i=0}^{k} A_{2i}]</tex>. |
<!--Куда-то сюда неплохо было бы добавить картинку--> | <!--Куда-то сюда неплохо было бы добавить картинку--> | ||
| − | Если мы сможем построить такие < | + | Если мы сможем построить такие <tex>A_i</tex>, то язык <tex>L = SAT \cap \bigcup_{i=0}^{\infty} A_{2i}</tex> |
будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить | будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить | ||
| − | < | + | <tex>SAT</tex> к <tex>L</tex>. |
| − | Попытаемся построить такую полиномиальную функцию < | + | Попытаемся построить такую полиномиальную функцию <tex>f</tex>, что |
| − | < | + | <tex>A_i = \left\{x \mid f(|x|) = i\right\}</tex>. Тогда |
<math>A=\left\{x \mid f(|x|) \, \vdots \, 2 \right\}</math> и | <math>A=\left\{x \mid f(|x|) \, \vdots \, 2 \right\}</math> и | ||
<math>L=SAT \cap A = \left\{\varphi \mid \varphi \in SAT \and f(|\varphi|)\, \vdots \, 2\right\}</math> | <math>L=SAT \cap A = \left\{\varphi \mid \varphi \in SAT \and f(|\varphi|)\, \vdots \, 2\right\}</math> | ||
| − | ===Построение < | + | ===Построение <tex>f</tex>=== |
| − | Зададим < | + | Зададим <tex>f(0) = f(1) = 0</tex>. Затем рекурсивно определим <tex>f(n)</tex>. Для этого рассмотрим три случая: |
| − | *< | + | *<tex>(\log_2 n) ^ {f(n-1)} \ge n</tex>: |
| − | *:< | + | *:<tex>f(n) = f(n-1)</tex>; |
| − | *< | + | *<tex>f(n-1)=2i</tex>: |
| − | *:если существует < | + | *:если существует <tex>x</tex> такой, что <tex>|x| < \log_2 n</tex> и <tex>p_i(x) \ne L(x)</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>; |
| − | *< | + | *<tex>f(n-1)=2i+1</tex>: |
| − | *:если существует < | + | *:если существует <tex>x</tex> такой, что <tex>|x| < \log_2 n</tex>,<tex>|f_i(x)| < \log_2 n</tex> и <tex>SAT(x) \ne L(f_i(x))</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>. |
| − | Заметим, что вызовы < | + | Заметим, что вызовы <tex>L(\alpha)</tex> делаются для <tex>\alpha</tex>, для которых <tex>f</tex> уже построена. |
| − | Первый случай позволяет сказать, что < | + | Первый случай позволяет сказать, что <tex>f(n)</tex> ограничена <tex>O\left(\log_{\log_2 n} n\right) = O(\log_2 n)</tex>. |
| − | Второй «ответственен» за множества < | + | Второй «ответственен» за множества <tex>A_i</tex> для чётных <tex>i</tex>, третий — для нечетных. |
| − | Логарифм в условии < | + | Логарифм в условии <tex>|x| < \log_2 n</tex> необходим для полиномиальности <tex>f(n)</tex>. |
| − | ===Полиномиальность < | + | ===Полиномиальность <tex>f</tex>=== |
| − | Покажем, что < | + | Покажем, что <tex>f \in \tilde{P}</tex>. Для упрощения будем считать, что алфавит <tex>\Sigma=\{0,1\}</tex>. |
| − | < | + | <tex>T(n) = T(n-1) + a(n)(b_1(n) + b_2(n) + b_3(n) + b_4(n)) + c_1(n) + c2_2(n)</tex>, где: |
| − | *< | + | *<tex>T(n-1)</tex> идёт на вычисление <tex>f(n-1)</tex>; |
| − | *< | + | *<tex>a(n)</tex> — время перебора всех слов <tex>x</tex> таких, что <tex>|x| < \log_2 n</tex>; |
| − | *< | + | *<tex>b_1(n)</tex> — время работы <tex>p_i(x)</tex>; |
| − | *< | + | *<tex>b_2(n)</tex> — время работы <tex>SAT(x)</tex>; |
| − | *< | + | *<tex>b_3(n)</tex> — время работы <tex>L(x)</tex>; |
| − | *< | + | *<tex>b_4(n)</tex> — время работы <tex>L(f_i(x))</tex>; |
| − | *< | + | *<tex>c_1(n)</tex> — время, необходимое для построения программы <tex>p_i</tex>; |
| − | *< | + | *<tex>c_2(n)</tex> — время, необходимое для построения функции <tex>f_i</tex>. |
| − | < | + | <tex>a(n) = O\left(2^{\log_2 n}\right) = O(n)</tex>, таким образом <tex>a(n) \in \tilde{P}</tex>. |
| − | < | + | <tex>b_1(n) = O\left(i(\log_2 n)^i\right) = O\left(f(n-1)(\log_2 n)^{f(n-1)}\right) = O\left(f(n-1)n\right) = O(n^2) \in \tilde{P}</tex> |
| − | < | + | <tex>b_2(n) = O \left( 2^{\log_2 n} \log_2 n\right) = O\left(n \log_2 n\right) = O\left(n^2\right) \in \tilde{P}</tex> |
| − | < | + | <tex>b_3(n) = O \left(2^{\log_2 n} \log_2 n + \log_2 n\right) = O \left(n \log_2 n\right) = O\left(n^2\right) \in \tilde{P}</tex> |
| − | < | + | <tex>b_4(n) = b_3(b_1(n)) = O\left(n^4\right) \in \tilde{P}</tex> |
| − | Чтобы построить программу < | + | Чтобы построить программу <tex>p_i</tex> достаточно построить <tex>\tilde{p_i}</tex>. |
| − | Из того, что все < | + | Из того, что все <tex>\tilde{p_i}</tex> упорядочены по длине, следует, что длина |
| − | < | + | <tex>\tilde{p_i}</tex> не превосходит <tex>ci</tex> (константа зависит от языка описания программы). |
| − | Поэтому для построения i-ой программы достаточно перебрать все < | + | Поэтому для построения i-ой программы достаточно перебрать все <tex>2^{ci+1}-1</tex> слов с длиной не больше <tex>ci</tex> |
| − | и вывести i-ое, являющееся программой. Такой способ требует < | + | и вывести i-ое, являющееся программой. Такой способ требует <tex>O(2^{ci}i) = O(2^{\log_2 n} \log_2 n) = O(n^2)</tex> времени. |
| − | Аналогично можно построить и < | + | Аналогично можно построить и <tex>f_i</tex>. Из этого следует, что <tex>c_1(n)</tex> и <tex>c_2(n)</tex> тоже полиномиальны. |
| − | Получаем, что < | + | Получаем, что <tex>T(n) = T(n-1) + poly</tex>. Значит, <tex>T(n) \le n \cdot poly </tex>. |
| − | Поэтому < | + | Поэтому <tex>T(n) \in \tilde{P}</tex> и <tex>A \in P</tex>. |
| − | Таким образом, < | + | Таким образом, <tex>f</tex> полиномиальна и <tex>A \in P</tex>. |
| − | ===Доказательство выполнения свойств < | + | ===Доказательство выполнения свойств <tex>A</tex>=== |
| − | Предположим, что < | + | Предположим, что <tex>\lim_{n \to \infty}f(n) = 2i</tex>. Это значит, что фунция «застряла» в ветке «иначе» случая два, |
| − | но из этого следует, что < | + | но из этого следует, что <tex>SAT</tex> не отличается от <tex>L(p_i)</tex>. Это |
| − | влечёт за собой принадлежность < | + | влечёт за собой принадлежность <tex>SAT</tex> к <tex>P</tex>, что противоречит предположению <tex>P \ne NP</tex>. |
| − | Аналогично, в случае, если < | + | Аналогично, в случае, если <tex>\lim_{n \to \infty}f(n) = 2i+1</tex>. Тогда функция «застряла» в ветке «иначе» случая три. |
| − | Следствием этого является то, что < | + | Следствием этого является то, что <tex>SAT</tex> функцией <tex>p_i</tex> сводится к конечному множеству, что тоже |
| − | противоречит предположению < | + | противоречит предположению <tex>P \ne NP</tex>. |
| − | Получается, что < | + | Получается, что <tex>\lim_{n \to \infty}f(n) = +\infty</tex>, но по построению если <tex>f</tex> неограниченно растет, |
| − | то < | + | то <tex>L</tex> не совпадает ни с каким языком <tex>L(p_i)</tex> и ни одна функция <tex>f_i</tex> не сводит |
| − | < | + | <tex>SAT</tex> к <tex>L</tex>. Следовательно, выполняются все три требуемых свойста, и <tex>L</tex> является примером |
| − | языка из < | + | языка из <tex>NP\setminus(P \cup NPC)</tex>. |
Теорема доказана. | Теорема доказана. | ||
Версия 11:22, 13 марта 2010
Теорема Ладнера (Ladner's Theorem) утверждает, что если P не совпадает с NP, то существует язык , принадлежащий , но не являющийся полиномиальным и NP-полным.
Содержание
Иллюстрация
Определим язык как множество таких формул , что чётно. Иными словами, — это язык формул с длинами, лежащими в промежутках Далее будем обозначать как .
Рассмотрим язык SAT всех удовлетворимых формул. Логично предположить, что как в , так и в лежит бесконечное множество элементов из , не распознаваемых за полиномиальное время, поэтому . Из и следует, что .
Осталось показать, что не является NP-полным. Пусть это не так. Тогда из NP-полноты следует, что существует полиномиальная функция , сводящая по Карпу к .
Возьмём формулу длиной . Она не лежит в и, следовательно, в . Функция не может перевести в промежуток или дальше, так как размер выхода полиномиальной функции не может быть экспоненциально больше длины входа. Значит, отображается в меньший промежуток, но в этом случае размер выхода экспоненциально меньше длины входа. Добавляя к этому то, что проверку на принадлежность к можно осуществить за (это следует из её принадлежности классу ), получаем программу, разрешающую за полином. Утверждение о том, что все формулы длиной принадлежат классу , скорее всего не верно, и, следовательно, язык не является NP-полным.
Заметим, что это объяснение не является доказательством!
Доказательство
Будем искать язык , удовлетворяющий следующим условиям:
- (что влечёт за собой);
- ;
- .
Если такой язык существует, то является искомым примером множества из .
Утверждение 1
Можно перечислить (возможно, с повторениями) все языки из .
Действительно, рассмотрим последовательность всех программ, упорядоченных по длине: Обозначим за программу, запускающую с таймером . Тогда среди встречаются только программы из , и для каждой полиномиальной программы , работающей за полином , существует номер такой, что для всех натуральных и делает то же самое, что и . Таким образом, распознает тот же язык, что и .
Утверждение 2
Можно перечислить все функции из .
Аналогично предыдущему доказательству, сначала построим последовательность , а затем, добавив таймер , получим последовательность .
Описание способа построения
Упорядочим все слова по возрастанию длины. Разобьем всё на множества так, что (то есть разбиение происходит по длинам, причем идут «подряд»), отличается от элементом из и для любого существует , для которого выполняются условия и .
Если мы сможем построить такие , то язык
будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить
к .
Попытаемся построить такую полиномиальную функцию , что . Тогда и
Построение
Зададим . Затем рекурсивно определим . Для этого рассмотрим три случая:
- :
- ;
- :
- если существует такой, что и , то , иначе ;
- :
- если существует такой, что , и , то , иначе .
Заметим, что вызовы делаются для , для которых уже построена.
Первый случай позволяет сказать, что ограничена . Второй «ответственен» за множества для чётных , третий — для нечетных. Логарифм в условии необходим для полиномиальности .
Полиномиальность
Покажем, что . Для упрощения будем считать, что алфавит .
, где:
- идёт на вычисление ;
- — время перебора всех слов таких, что ;
- — время работы ;
- — время работы ;
- — время работы ;
- — время работы ;
- — время, необходимое для построения программы ;
- — время, необходимое для построения функции .
, таким образом .
Чтобы построить программу достаточно построить . Из того, что все упорядочены по длине, следует, что длина не превосходит (константа зависит от языка описания программы). Поэтому для построения i-ой программы достаточно перебрать все слов с длиной не больше и вывести i-ое, являющееся программой. Такой способ требует времени. Аналогично можно построить и . Из этого следует, что и тоже полиномиальны.
Получаем, что . Значит, . Поэтому и .
Таким образом, полиномиальна и .
Доказательство выполнения свойств
Предположим, что . Это значит, что фунция «застряла» в ветке «иначе» случая два, но из этого следует, что не отличается от . Это влечёт за собой принадлежность к , что противоречит предположению .
Аналогично, в случае, если . Тогда функция «застряла» в ветке «иначе» случая три. Следствием этого является то, что функцией сводится к конечному множеству, что тоже противоречит предположению .
Получается, что , но по построению если неограниченно растет, то не совпадает ни с каким языком и ни одна функция не сводит к . Следовательно, выполняются все три требуемых свойста, и является примером языка из .
Теорема доказана.