Теорема Ладнера — различия между версиями
Assaron (обсуждение | вклад) (→Иллюстрация: исправлено еще немного ошибок) |
Assaron (обсуждение | вклад) (→Доказательство: исправлено немного ошибок) |
||
Строка 45: | Строка 45: | ||
Будем искать язык <math>A</math>, удовлетворяющий следующим условиям: | Будем искать язык <math>A</math>, удовлетворяющий следующим условиям: | ||
− | #<math>A \in P</math> (что влечёт за собой<math>SAT \cap A \in NP</math>) | + | #<math>A \in P</math> (что влечёт за собой<math>SAT \cap A \in NP</math>); |
− | #<math>SAT \cap A \not\in P</math> | + | #<math>SAT \cap A \not\in P</math>; |
− | #<math>SAT \nleqslant SAT \cap A</math> | + | #<math>SAT \nleqslant SAT \cap A</math>. |
− | Если такой язык существует, то <math>L = A \cap SAT</math> искомым примером множества | + | Если такой язык существует, то <math>L = A \cap SAT</math> является искомым примером множества |
из <math>NP \setminus (P \cup NPC)</math>. | из <math>NP \setminus (P \cup NPC)</math>. | ||
'''Утверждение 1.''' Можно перечислить (возможно с повторениями) все языки из <math>P</math>. | '''Утверждение 1.''' Можно перечислить (возможно с повторениями) все языки из <math>P</math>. | ||
− | Действительно, рассмотрим последовательность всех программ, упорядоченных по длине | + | Действительно, рассмотрим последовательность всех программ, упорядоченных по длине: |
<math> \tilde{p_0}, \tilde{p_1}, \ldots, \tilde{p_n}, \ldots</math> | <math> \tilde{p_0}, \tilde{p_1}, \ldots, \tilde{p_n}, \ldots</math> | ||
Обозначим за <math>p_i</math> программу, запускающую <math>\tilde{p_i}</math> | Обозначим за <math>p_i</math> программу, запускающую <math>\tilde{p_i}</math> | ||
Строка 60: | Строка 60: | ||
только программы из <math>P</math>, и для каждой полиномиальной программы | только программы из <math>P</math>, и для каждой полиномиальной программы | ||
<math>\tilde{p_i}</math>, работающей за полином <math>q_i(n)</math>, существует | <math>\tilde{p_i}</math>, работающей за полином <math>q_i(n)</math>, существует | ||
− | номер <math>j</math>, такой что <math>jn^j > g_i(n)</math> для всех натуральных <math>n</math> | + | номер <math>j</math>, такой что <math>jn^j > g_i(n)</math> для всех натуральных <math>n</math>, |
и <math>\tilde{p_j}</math> делает то же самое, что и <math>\tilde{p_i}</math>. | и <math>\tilde{p_j}</math> делает то же самое, что и <math>\tilde{p_i}</math>. | ||
Таким образом <math>p_j</math> распознает тот же язык, что и <math>\tilde{p_i}</math>. | Таким образом <math>p_j</math> распознает тот же язык, что и <math>\tilde{p_i}</math>. | ||
Строка 66: | Строка 66: | ||
'''Утверждение 2.''' Можно перечислить все функции из <math>\tilde{P}</math>. | '''Утверждение 2.''' Можно перечислить все функции из <math>\tilde{P}</math>. | ||
− | Аналогично предыдущему доказательству сначала построим последовательность <math>\tilde{f_i}</math>, | + | Аналогично предыдущему доказательству, сначала построим последовательность <math>\tilde{f_i}</math>, |
а затем, добавив таймер <math>in^i</math>, получим последовательность <math>f_i</math>. | а затем, добавив таймер <math>in^i</math>, получим последовательность <math>f_i</math>. | ||
Строка 73: | Строка 73: | ||
так, что <math>SAT \cap \bigcup_{i=0}^{k} A_{2i}</math> отличается от <math>L(p_k)</math> элементом | так, что <math>SAT \cap \bigcup_{i=0}^{k} A_{2i}</math> отличается от <math>L(p_k)</math> элементом | ||
из <math>\bigcup_{i=0}^{2k} A_i</math>, и существует <math>\alpha \in \bigcup_{i=0}^{2k+1}</math> | из <math>\bigcup_{i=0}^{2k} A_i</math>, и существует <math>\alpha \in \bigcup_{i=0}^{2k+1}</math> | ||
− | для которого выполняется | + | для которого выполняется условия <math>f(\alpha) \in \bigcup_{i=0}^{2k+1}</math> и |
<math>[\alpha \in SAT] \ne [f(\alpha) \in SAT \cap \bigcup_{i=0}^{k} A_{2i}]</math>. | <math>[\alpha \in SAT] \ne [f(\alpha) \in SAT \cap \bigcup_{i=0}^{k} A_{2i}]</math>. | ||
Строка 79: | Строка 79: | ||
Если мы сможем построить такие <math>A_i</math>, то язык <math>L = SAT \cap \bigcup_{i=0}^{\infty} A_{2i}</math> | Если мы сможем построить такие <math>A_i</math>, то язык <math>L = SAT \cap \bigcup_{i=0}^{\infty} A_{2i}</math> | ||
− | будет отличаться от любого полиномиального языка и ни какая полиномиальная функция не будет сводить | + | будет отличаться от любого полиномиального языка, и ни какая полиномиальная функция не будет сводить |
<math>SAT</math> к <math>L</math>. | <math>SAT</math> к <math>L</math>. | ||
Строка 87: | Строка 87: | ||
<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> | ||
− | Зададим <math>f(0) = f(1) = 0</math>. | + | Зададим <math>f(0) = f(1) = 0</math>. Затем рекурсивно определим <math>f(n)</math>. Для этого рассмотрим три случая: |
− | #<math>{\log_2 n} ^ {f(n-1)} \ge n</math> | + | #<math>{\log_2 n} ^ {f(n-1)} \ge n</math>: |
− | #:<math>f(n) = f(n-1)</math> | + | #:<math>f(n) = f(n-1)</math>; |
− | #<math>f(n-1)=2i</math> | + | #<math>f(n-1)=2i</math>: |
− | #:Если существует <math>x</math>, такой что <math>|x| < \log_2 n</math> и <math>p_i(x) \ne L(x)</math>, то <math>f(n) = f(n-1)+1</math>, иначе <math>f(n) = f(n-1)</math> | + | #:Если существует <math>x</math>, такой что <math>|x| < \log_2 n</math> и <math>p_i(x) \ne L(x)</math>, то <math>f(n) = f(n-1)+1</math>, иначе <math>f(n) = f(n-1)</math>; |
− | #<math>f(n-1)=2i+1</math> | + | #<math>f(n-1)=2i+1</math>: |
#:Если существует <math>x</math>, такой что <math>|x| < \log_2 n</math> и <math>SAT(x) \ne L(f_i(x))</math>, то <math>f(n) = f(n-1)+1</math>, иначе <math>f(n) = f(n-1)</math>. | #:Если существует <math>x</math>, такой что <math>|x| < \log_2 n</math> и <math>SAT(x) \ne L(f_i(x))</math>, то <math>f(n) = f(n-1)+1</math>, иначе <math>f(n) = f(n-1)</math>. | ||
Строка 103: | Строка 103: | ||
<math>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)</math>, где: | <math>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)</math>, где: | ||
*<math>T(n-1)</math> идёт на вычисление <math>f(n-1)</math>; | *<math>T(n-1)</math> идёт на вычисление <math>f(n-1)</math>; | ||
− | *<math>a(n)</math> — | + | *<math>a(n)</math> — время перебора всех слов <math>x</math>, таких что <math>|x| < \log_2 n</math>; |
− | *<math>b_1(n)</math> — | + | *<math>b_1(n)</math> — время работы <math>p_i(x)</math>; |
− | *<math>b_2(n)</math> — | + | *<math>b_2(n)</math> — время работы <math>SAT(x)</math>; |
− | *<math>b_3(n)</math> — | + | *<math>b_3(n)</math> — время работы <math>L(x)</math>; |
− | *<math>b_4(n)</math> — | + | *<math>b_4(n)</math> — время работы <math>L(f_i(x))</math>; |
− | *<math>c_1(n)</math> — | + | *<math>c_1(n)</math> — время, необходимое для построения программы <math>p_i</math>; |
− | *<math>c_2(n)</math> — | + | *<math>c_2(n)</math> — время, необходимое для построения функции <math>f_i</math>. |
− | <math>a(n) = O\left(2^{\log_2 n}\right) = O(n)</math>, таким образом <math>a(n) \in \tilde{P}</math> | + | <math>a(n) = O\left(2^{\log_2 n}\right) = O(n)</math>, таким образом <math>a(n) \in \tilde{P}</math>. |
<math>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}</math> | <math>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}</math> | ||
Строка 124: | Строка 124: | ||
Из того, что все <math>\tilde{p_i}</math> упорядоченны по длине, следует, что длина | Из того, что все <math>\tilde{p_i}</math> упорядоченны по длине, следует, что длина | ||
<math>\tilde{p_i}</math> не превосходит <math>ci</math> (константа зависит от языка описания программы). | <math>\tilde{p_i}</math> не превосходит <math>ci</math> (константа зависит от языка описания программы). | ||
− | Поэтому для построения i-ой программы достаточно перебрать все <math>2^{ci}</math> слов с длиной | + | Поэтому для построения i-ой программы достаточно перебрать все <math>2^{ci+1}-1</math> слов с длиной не больше <math>ci</math> |
и вывести i-ое, являющееся программой. Такой способ требует <math>O(2^{ci}i) = O(2^{\log_2 n} \log_2 n) = O(n^2)</math> времени. | и вывести i-ое, являющееся программой. Такой способ требует <math>O(2^{ci}i) = O(2^{\log_2 n} \log_2 n) = O(n^2)</math> времени. | ||
Аналогично можно построить и <math>f_i</math>. Из этого следует, что <math>c_1(n)</math> и <math>c_2(n)</math> тоже полиномиальны. | Аналогично можно построить и <math>f_i</math>. Из этого следует, что <math>c_1(n)</math> и <math>c_2(n)</math> тоже полиномиальны. |
Версия 21:54, 8 марта 2010
Формулировка
Теорема Ладнера (Ladner's Theorem) утверждает, что если
, то существует язык , принадлежащий .Иллюстрация
Определим язык
как множество таких формул , что чётно. Иными словами, — это язык формул с длинами, лежащими в промежутках Далее будем обозначать как .Рассмотрим язык
. Логично предположить, что как в , так и в лежит бесконечное множество элементов из , не принадлежащих классу , поэтому . Из и следует, что .Осталось показать, что
не является NP-полным. Пусть это не так. Тогда из NP-полноты следует, что существует полиномиальная функция , сводящая по Карпу к .Возьмём формулу
длиной . Она не лежит в и, следовательно, в . Функция не может перевести в промежуток или дальше, так как размер выхода полиномиальной функции не может быть экспоненциально больше длины входа. Значит отображается в меньший промежуток, но в этом случае размер выхода экспоненциально меньше длины входа. Добавляя к этому то, что проверку на принадлежность можно осуществить за (это следует из её принадлежности классу ), получаем программу, разрешающую за полином. Утверждение о том, что все формулы длиной принадлежат классу , скорее всего не верно, и, следовательно, язык не является NP-полным.Заметим, что это объяснение не является доказательством!
Доказательство
Будем искать язык
, удовлетворяющий следующим условиям:- (что влечёт за собой );
- ;
- .
Если такой язык существует, то
является искомым примером множества из .Утверждение 1. Можно перечислить (возможно с повторениями) все языки из
.Действительно, рассмотрим последовательность всех программ, упорядоченных по длине:
Обозначим за программу, запускающую с таймером . Тогда среди встречаются только программы из , и для каждой полиномиальной программы , работающей за полином , существует номер , такой что для всех натуральных , и делает то же самое, что и . Таким образом распознает тот же язык, что и .Утверждение 2. Можно перечислить все функции из
.Аналогично предыдущему доказательству, сначала построим последовательность
, а затем, добавив таймер , получим последовательность .Упорядочим все слова по возрастанию длины. Разобьем всё
на множества , так, что отличается от элементом из , и существует для которого выполняется условия и .
Если мы сможем построить такие , то язык
будет отличаться от любого полиномиального языка, и ни какая полиномиальная функция не будет сводить
к .
Попытаемся построить такую полиномиальную функцию
, что . Тогда иЗададим
. Затем рекурсивно определим . Для этого рассмотрим три случая:- ;
:
- Если существует , такой что и , то , иначе ;
:
- Если существует , такой что и , то , иначе .
:
Первый случай позволяет сказать, что
ограничена . Второй «ответственен» за множества для чётных , третий — для нечетных. Логарифм в условии необходим для полиномиальности .Покажем, что
. Для упрощения будем считать, что алфавит ., где:
- идёт на вычисление ;
- — время перебора всех слов , таких что ;
- — время работы ;
- — время работы ;
- — время работы ;
- — время работы ;
- — время, необходимое для построения программы ;
- — время, необходимое для построения функции .
, таким образом .
Чтобы построить программу
достаточно построить . Из того, что все упорядоченны по длине, следует, что длина не превосходит (константа зависит от языка описания программы). Поэтому для построения i-ой программы достаточно перебрать все слов с длиной не больше и вывести i-ое, являющееся программой. Такой способ требует времени. Аналогично можно построить и . Из этого следует, что и тоже полиномиальны.Получаем, что
. Значит . Поэтому и .Таким образом,
полиномиальна, а значит .Предположим, что
. Это значит, что фунция «застряла» в ветке «иначе» случая два, но из этого следует, что отличается от лишь на конечное число элементов. Это влечёт за собой принадлежность к , что противоречит предположению .Аналогично, в случае, если
. Тогда функция «застряла» в ветке «иначе» случая три. Следствием этого является то, что функцией сводится к конечному множеству, что тоже противоречит предположению .Получается, что
, но по построению, если неограниченно растет, то не совпадает ни с каким языком , и ни какая функция не сводит к . Следовательно, выполняются все три пункта, и является примером языка из .Теорема доказана.