Теорема Ладнера — различия между версиями
Assaron (обсуждение | вклад) м (→Доказательство: is even -> \vdots 2) |
Assaron (обсуждение | вклад) (→Доказательство: почти закончено) |
||
| Строка 54: | Строка 54: | ||
'''Утверждение 1.''' Можно перечислить (возможно с повторениями) все языки из <math>P</math>. | '''Утверждение 1.''' Можно перечислить (возможно с повторениями) все языки из <math>P</math>. | ||
| − | Действительно, рассмотрим последовательность всех программ | + | Действительно, рассмотрим последовательность всех программ, упорядоченных по длине, |
| − | <math> \tilde{ | + | <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> | ||
с таймером <math>in^i</math>. Тогда среди <math>{p_i}</math> встречаются | с таймером <math>in^i</math>. Тогда среди <math>{p_i}</math> встречаются | ||
| Строка 74: | Строка 74: | ||
<math>f(0) = f(1) = 0</math> | <math>f(0) = f(1) = 0</math> | ||
| − | Определим <math>f(n)</math>. Для этого рассмотрим | + | Определим <math>f(n)</math>. Для этого рассмотрим три случая: |
| − | + | #<math>{\log_2 n} ^ {f(n-1)} \ge n</math>. | |
| − | + | #:<math>f(n) = f(n-1)</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>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>f \in \tilde{P}</math>. Для упрощения будем считать, что алфавит <math>\Sigma={0,1}</math>. | Покажем, что <math>f \in \tilde{P}</math>. Для упрощения будем считать, что алфавит <math>\Sigma={0,1}</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) = 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>; | ||
| Строка 89: | Строка 93: | ||
*<math>b_4(n)</math> — запуск <math>L(f_i(x))</math>; | *<math>b_4(n)</math> — запуск <math>L(f_i(x))</math>; | ||
*<math>c_1(n)</math> — построение программы <math>p_i</math>; | *<math>c_1(n)</math> — построение программы <math>p_i</math>; | ||
| − | *<math> | + | *<math>c_2(n)</math> — построение программы <math>f_i</math>. |
| − | <math>a(n) \ | + | <math>a(n) = O\left(2^{\log_2 n}\right) = O(n)</math>, таким образом <math>a(n) \in \tilde{P}</math> |
| − | <math>b_1(n) \ | + | <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) </math> — |
| + | тоже из <math>\tilde{P}</math> | ||
| − | <math>b_2(n) \ | + | <math>b_2(n) = O \left( 2^{\log_2 n} \log_2 n\right) = O\left(n \log_2 n\right)</math> — из <math>\tilde{P}</math> |
| − | <math>b_3(n) \ | + | <math>b_3(n) = O \left(2^{\log_2 n} \log_2 n + \log_2 n\right) = O \left(n \log_2 n\right)</math> — из <math>\tilde{P}</math> |
| − | <math>b_4(n) | + | <math>b_4(n) = O(b3(n))</math> — из <math>\tilde{P}</math> |
| − | |||
| − | <math>c_1(n)</math> и <math>c_2(n)</math> тоже полиномиальны. | + | Чтобы построить программу <math>p_i</math> достаточно построить <math>\tilde{p_i}</math>. |
| + | Из того, что все <math>\tilde{p_i}</math> упорядоченны по длине, следует, что длина | ||
| + | <math>\tilde{p_i}</math> не превосходит <math>ci</math> (константа зависит от языка описания программы). | ||
| + | Поэтому для построения i-ой программы достаточно перебрать все <math>2^{ci}</math> слов с длиной меньше, чем <math>ci</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>T(n) = T(n-1) + poly</math>. Значит <math>T(n) \le n \cdot poly </math>. | Получаем, что <math>T(n) = T(n-1) + poly</math>. Значит <math>T(n) \le n \cdot poly </math>. | ||
Поэтому <math>T(n) \in \tilde{P}</math> и <math>A \in P</math>. | Поэтому <math>T(n) \in \tilde{P}</math> и <math>A \in P</math>. | ||
| − | + | Таким образом, <math>f</math> полиномиальна, а значит <math>A \in P</math>. | |
| + | |||
| + | Предположим, что <math>\lim_{n \to \infty}f(n) = 2i</math>. Это значит, что фунция «застряла» в ветке «иначе» случая два, | ||
| + | но из этого следует, что <math>SAT</math> отличается от <math>L(p_i)</math> лишь на конечное число элементов. Это | ||
| + | влечёт за собой принадлежность <math>SAT</math> к <math>P</math>, что противоречит предположению <math>P \ne NP</math>. | ||
| + | |||
| + | Аналогично, в случае, если <math>\lim_{n \to \infty}f(n) = 2i+1</math>. Тогда функция «застряла» в ветке «иначе» случая три. | ||
| + | Следствием этого является то, что <math>SAT</math> функцией <math>p_i</math> сводится к конечному множеству, что тоже | ||
| + | противоречит предположению <math>P \ne NP</math>. | ||
| + | |||
| + | Получается, что <math>\lim_{n \to \infty}f(n) = +\infty</math>, но по построению, если <math>f</math> неограниченно растет, | ||
| + | то <math>L</math> не совпадает ни с каким языком <math>L(p_i)</math>, и ни какая функция <math>f_i</math> не сводит | ||
| + | <math>SAT</math> к <math>L</math>. Следовательно, выполняются все три пункта, и <math>L</math> является примером | ||
| + | языка из <math>NP\setminus(P \cup NPC)</math>. | ||
Теорема доказана. | Теорема доказана. | ||
Версия 00:00, 7 марта 2010
Формулировка
Теорема Ладнера (Ladner's Theorem) утверждает, что если , то существует язык , принадлежащий .
Иллюстрация
Определим язык как множество таких формул что чётно. Иными словами, — это язык формул с длинами, лежащими в промежутках Далее будем обозначать как .
Рассмотрим язык . Логично предположить, что как в , так и в лежит бесконечное множество элементов из , не принадлежащих классу , поэтому . Из и следует, что .
Осталось показать, что не является NP-полным. Пусть это не так. Тогда из NP-полноты следует, что существует полиномиальная функция сводящая по Карпу к .
Возьмем формулу длиной . Она не лежит в и, следовательно, в . Функция не может перевести в промежуток или дальше, так как размер выхода полиномиальной функции не может быть экспоненциально больше длинны входа. Значит отображается в меньший промежуток, но в этом случае размер выхода экспоненциально меньше длины входа. Добавляя к этому то, что проверку на принадлежность можно осуществить за (это следует из принадлежности ), получаем программу разрешающую за полином. Утверждение о том, что все формулы длиной принадлежат классу скорее всего не верно, а ,следовательно, язык не является NP-полным.
Заметим, что это объяснение не является доказательством!
Доказательство
Будем искать язык , удовлетворяющий следующим условиям:
- (что влечёт за собой)
Если такой язык существует, то искомым примером множества из .
Утверждение 1. Можно перечислить (возможно с повторениями) все языки из .
Действительно, рассмотрим последовательность всех программ, упорядоченных по длине, Обозначим за программу, запускающую с таймером . Тогда среди встречаются только программы из , и для каждой полиномиальной программы , работающей за полином , существует номер , такой что для всех натуральных и делает то же самое, что и . Таким образом распознает тот же язык, что и .
Утверждение 2. Можно перечислить все функции из .
Доказательство аналогично доказательству предыдущего утверждения.
Определим . Для этого рассмотрим три случая:
- .
- .
- .
- Если существует , такой что и , то , иначе .
- .
- Если существует , такой что и , то , иначе .
Покажем, что . Для упрощения будем считать, что алфавит .
В результате всё почти хорошо. , где:
- идёт на вычисление ;
- — перебор всех слов , таких что ;
- — запуск ;
- — запуск ;
- — запуск ;
- — запуск ;
- — построение программы ;
- — построение программы .
, таким образом
— тоже из
— из
— из
— из
Чтобы построить программу достаточно построить . Из того, что все упорядоченны по длине, следует, что длина не превосходит (константа зависит от языка описания программы). Поэтому для построения i-ой программы достаточно перебрать все слов с длиной меньше, чем , и вывести i-ое, являющееся программой. Такой способ требует времени. Аналогично можно построить и . Из этого следует, что и тоже полиномиальны.
Получаем, что . Значит . Поэтому и .
Таким образом, полиномиальна, а значит .
Предположим, что . Это значит, что фунция «застряла» в ветке «иначе» случая два, но из этого следует, что отличается от лишь на конечное число элементов. Это влечёт за собой принадлежность к , что противоречит предположению .
Аналогично, в случае, если . Тогда функция «застряла» в ветке «иначе» случая три. Следствием этого является то, что функцией сводится к конечному множеству, что тоже противоречит предположению .
Получается, что , но по построению, если неограниченно растет, то не совпадает ни с каким языком , и ни какая функция не сводит к . Следовательно, выполняются все три пункта, и является примером языка из .
Теорема доказана.