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

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Описание способа построения A)
м
Строка 1: Строка 1:
 
'''Теорема Ладнера''' (Ladner's Theorem) утверждает,
 
'''Теорема Ладнера''' (Ladner's Theorem) утверждает,
 
что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык <tex>L</tex>,
 
что если [[Класс P|P]] не совпадает с [[Класс NP|NP]], то существует язык <tex>L</tex>,
принадлежащий <tex>NP</tex>, но не являющийся полиномиальным и [[NP-полнота|NP-полным]].
+
принадлежащий <tex>\mathrm{NP}</tex>, но не являющийся полиномиальным и [[NP-полнота|NP-полным]].
  
 
==Иллюстрация==
 
==Иллюстрация==
Строка 15: Строка 15:
  
 
Рассмотрим язык [[SAT]] всех удовлетворимых формул. Логично предположить, что как в <tex>A</tex>,
 
Рассмотрим язык [[SAT]] всех удовлетворимых формул. Логично предположить, что как в <tex>A</tex>,
так и в <tex>\bar{A}</tex> лежит бесконечное множество элементов из <tex>SAT</tex>,
+
так и в <tex>\bar{A}</tex> лежит бесконечное множество элементов из <tex>\mathrm{SAT}</tex>,
не распознаваемых за полиномиальное время, поэтому <tex>SAT \cap A \not\in P</tex>.
+
не распознаваемых за полиномиальное время, поэтому <tex>\mathrm{SAT} \cap A \not\in \mathrm{P}</tex>.
Из <tex>A \in P</tex> и <tex>SAT \in NP</tex> следует, что <tex>SAT \cap A \in NP</tex>.
+
Из <tex>A \in \mathrm{P}</tex> и <tex>\mathrm{SAT} \in \mathrm{NP}</tex> следует, что <tex>\mathrm{SAT} \cap A \in \mathrm{NP}</tex>.
  
Осталось показать, что <tex>SAT \cap A</tex> не является NP-полным. Пусть
+
Осталось показать, что <tex>\mathrm{SAT} \cap A</tex> не является NP-полным. Пусть
 
это не так. Тогда из NP-полноты следует, что существует полиномиальная функция <math>f</math>,
 
это не так. Тогда из NP-полноты следует, что существует полиномиальная функция <math>f</math>,
[[Сведение по Карпу|сводящая по Карпу]] <tex>SAT</tex> к <tex>SAT \cap A</tex>.  
+
[[Сведение по Карпу|сводящая по Карпу]] <tex>\mathrm{SAT}</tex> к <tex>\mathrm{SAT} \cap A</tex>.  
  
 
Возьмём формулу <tex>\varphi</tex> длиной <tex>^{2k+1}10</tex>.  
 
Возьмём формулу <tex>\varphi</tex> длиной <tex>^{2k+1}10</tex>.  
Она не лежит в <tex>A</tex> и, следовательно, в <tex>SAT \cap A</tex>.
+
Она не лежит в <tex>A</tex> и, следовательно, в <tex>\mathrm{SAT} \cap A</tex>.
 
Функция <tex>f</tex> не может перевести <tex>\varphi</tex> в промежуток
 
Функция <tex>f</tex> не может перевести <tex>\varphi</tex> в промежуток
 
<tex>\left[^{2k+2}10, ^{2k+4}10\right)</tex> или дальше, так как размер
 
<tex>\left[^{2k+2}10, ^{2k+4}10\right)</tex> или дальше, так как размер
Строка 31: Строка 31:
 
в этом случае размер выхода экспоненциально меньше длины входа.  Добавляя
 
в этом случае размер выхода экспоненциально меньше длины входа.  Добавляя
 
к этому то, что проверку на принадлежность <tex>f(\varphi)</tex> к
 
к этому то, что проверку на принадлежность <tex>f(\varphi)</tex> к
<tex>SAT \cap A</tex> можно осуществить за <tex>O(2^{poly})</tex>
+
<tex>\mathrm{SAT} \cap A</tex> можно осуществить за <tex>O(2^{poly})</tex>
(это следует из её принадлежности классу <tex>NP</tex>), получаем программу,
+
(это следует из её принадлежности классу <tex>\mathrm{NP}</tex>), получаем программу,
 
разрешающую <tex>\varphi</tex> за полином. Утверждение о том, что все формулы
 
разрешающую <tex>\varphi</tex> за полином. Утверждение о том, что все формулы
 
<tex>\varphi</tex> длиной <tex>^{2k+1}10</tex> принадлежат классу
 
<tex>\varphi</tex> длиной <tex>^{2k+1}10</tex> принадлежат классу
<tex>P</tex>, скорее всего не верно, и, следовательно, язык  
+
<tex>\mathrm{P}</tex>, скорее всего не верно, и, следовательно, язык  
<tex>SAT \cap A</tex> не является NP-полным.
+
<tex>\mathrm{SAT} \cap A</tex> не является NP-полным.
  
 
Заметим, что это объяснение не является доказательством!
 
Заметим, что это объяснение не является доказательством!
Строка 42: Строка 42:
 
==Доказательство==
 
==Доказательство==
 
Будем искать язык <tex>A</tex>, удовлетворяющий следующим условиям:
 
Будем искать язык <tex>A</tex>, удовлетворяющий следующим условиям:
#<tex>A \in P</tex> (что влечёт за собой <tex>SAT \cap A \in NP</tex>);
+
#<tex>A \in \mathrm{P}</tex> (что влечёт за собой <tex>\mathrm{SAT} \cap A \in \mathrm{NP}</tex>);
#<tex>SAT \cap A \not\in P</tex>;
+
#<tex>\mathrm{SAT} \cap A \not\in \mathrm{P}</tex>;
#<tex>SAT \not \leqslant SAT \cap A</tex>.
+
#<tex>\mathrm{SAT} \not \leqslant \mathrm{SAT} \cap A</tex>.
  
Если такой язык существует, то <tex>L = SAT \cap A</tex> является искомым примером множества
+
Если такой язык существует, то <tex>L = \mathrm{SAT} \cap A</tex> является искомым примером множества
из <tex>NP \setminus (P \cup NPC)</tex>.
+
из <tex>\mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})</tex>.
  
 
===Утверждение 1===
 
===Утверждение 1===
Можно перечислить (возможно, с повторениями) все языки из <tex>P</tex>.
+
Можно перечислить (возможно, с повторениями) все языки из <tex>\mathrm{P}</tex>.
  
 
Действительно, рассмотрим последовательность всех программ, упорядоченных по длине:
 
Действительно, рассмотрим последовательность всех программ, упорядоченных по длине:
Строка 56: Строка 56:
 
Обозначим за <tex>p_i</tex> программу, запускающую <tex>\tilde{p_i}</tex>
 
Обозначим за <tex>p_i</tex> программу, запускающую <tex>\tilde{p_i}</tex>
 
с таймером <tex>in^i</tex>. Тогда среди <tex>{p_i}</tex> встречаются
 
с таймером <tex>in^i</tex>. Тогда среди <tex>{p_i}</tex> встречаются
только программы из <tex>P</tex>, и для каждой полиномиальной программы
+
только программы из <tex>\mathrm{P}</tex>, и для каждой полиномиальной программы
 
<tex>\tilde{p_i}</tex>, работающей за полином <tex>g_i(n)</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>j</tex> такой, что <tex>jn^j > g_i(n)</tex> для всех натуральных <tex>n</tex>
Строка 63: Строка 63:
  
 
===Утверждение 2===
 
===Утверждение 2===
Можно перечислить все функции из <tex>\tilde{P}</tex>.
+
Можно перечислить все функции из <tex>\tilde{\mathrm{P}}</tex>.
  
 
Аналогично предыдущему доказательству, сначала построим последовательность <tex>\tilde{f_i}</tex>, а затем, добавив таймер <tex>in^i</tex>, получим последовательность <tex>f_i</tex>.
 
Аналогично предыдущему доказательству, сначала построим последовательность <tex>\tilde{f_i}</tex>, а затем, добавив таймер <tex>in^i</tex>, получим последовательность <tex>f_i</tex>.
Строка 71: Строка 71:
 
<tex>A_i</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>\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>x_{2k}</tex> из <tex>\bigcup_{i=0}^{2k} A_i</tex>,  
+
*<tex>\mathrm{SAT} \cap \bigcup_{i=0}^{k} A_{2i}</tex> отличается от <tex>L(p_k)</tex> элементом <tex>x_{2k}</tex> из <tex>\bigcup_{i=0}^{2k} A_i</tex>,  
*для любого <tex>k</tex> существует <tex>x_{2k+1} \in \bigcup_{i=0}^{2k+1} A_i</tex>, для которого выполняются условия <tex>f_k(x_{2k+1}) \in \bigcup_{i=0}^{2k+1} A_i</tex> и <tex>[x_{2k+1} \in SAT] \ne [f_k(x_{2k+1}) \in SAT \cap \bigcup_{i=0}^{k} A_{2i}]</tex>.
+
*для любого <tex>k</tex> существует <tex>x_{2k+1} \in \bigcup_{i=0}^{2k+1} A_i</tex>, для которого выполняются условия <tex>f_k(x_{2k+1}) \in \bigcup_{i=0}^{2k+1} A_i</tex> и <tex>[x_{2k+1} \in \mathrm{SAT}] \ne [f_k(x_{2k+1}) \in \mathrm{SAT} \cap \bigcup_{i=0}^{k} A_{2i}]</tex>.
  
 
[[File:Ladner.png]]
 
[[File:Ladner.png]]
  
Если мы сможем построить такие <tex>A_i</tex>, то язык <tex>L = SAT \cap \bigcup_{i=0}^{\infty} A_{2i}</tex>
+
Если мы сможем построить такие <tex>A_i</tex>, то язык <tex>L = \mathrm{SAT} \cap \bigcup_{i=0}^{\infty} A_{2i}</tex>
 
будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить
 
будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить
<tex>SAT</tex> к <tex>L</tex>.
+
<tex>\mathrm{SAT}</tex> к <tex>L</tex>.
  
 
Попытаемся построить такую полиномиальную функцию <tex>f</tex>, что  
 
Попытаемся построить такую полиномиальную функцию <tex>f</tex>, что  
 
<tex>A_i = \left\{x \mid f(|x|) = i\right\}</tex>. Тогда  
 
<tex>A_i = \left\{x \mid f(|x|) = i\right\}</tex>. Тогда  
 
<tex>A=\left\{x \mid f(|x|) \equiv 0 (\mathrm{mod}\ 2) \right\}</tex> и  
 
<tex>A=\left\{x \mid f(|x|) \equiv 0 (\mathrm{mod}\ 2) \right\}</tex> и  
<tex>L=SAT \cap A = \left\{\varphi \mid \varphi \in SAT \land f(|\varphi|) \equiv 0 (\mathrm{mod}\ 2) \right\}</tex>
+
<tex>L=\mathrm{SAT} \cap A = \left\{\varphi \mid \varphi \in \mathrm{SAT} \land f(|\varphi|) \equiv 0 (\mathrm{mod}\ 2) \right\}</tex>
  
 
===Построение <tex>f</tex>===
 
===Построение <tex>f</tex>===
Строка 92: Строка 92:
 
*:если существует <tex>x</tex> такой, что <tex>|x| < \log_2 n</tex> и <tex>p_i(x) \ne [x \in L]</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>;
 
*:если существует <tex>x</tex> такой, что <tex>|x| < \log_2 n</tex> и <tex>p_i(x) \ne [x \in L]</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>;
 
*<tex>f(n-1)=2i+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>[x \in SAT] \ne [f_i(x) \in L]</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>.
+
*:если существует <tex>x</tex> такой, что <tex>|x| < \log_2 n</tex>,<tex>|f_i(x)| < \log_2 n</tex> и <tex>[x \in \mathrm{SAT}] \ne [f_i(x) \in L]</tex>, то <tex>f(n) = f(n-1)+1</tex>, иначе <tex>f(n) = f(n-1)</tex>.
  
 
Заметим, что вызовы <tex>[\alpha \in L]</tex> делаются для <tex>\alpha</tex>, для которых <tex>f</tex> уже построена.
 
Заметим, что вызовы <tex>[\alpha \in L]</tex> делаются для <tex>\alpha</tex>, для которых <tex>f</tex> уже построена.
Строка 101: Строка 101:
  
 
===Полиномиальность <tex>f</tex>===
 
===Полиномиальность <tex>f</tex>===
Покажем, что <tex>f \in \tilde{P}</tex>. Для упрощения будем считать, что алфавит <tex>\Sigma=\{0,1\}</tex>.
+
Покажем, что <tex>f \in \tilde{\mathrm{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) + c_2(n)</tex>, где:
 
<tex>T(n) = T(n-1) + a(n)(b_1(n) + b_2(n) + b_3(n) + b_4(n)) + c_1(n) + c_2(n)</tex>, где:
Строка 107: Строка 107:
 
*<tex>a(n)</tex> — время перебора всех слов <tex>x</tex> таких, что <tex>|x| < \log_2 n</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_1(n)</tex> — время работы <tex>p_i(x)</tex>;
*<tex>b_2(n)</tex> — время работы <tex>[x \in SAT]</tex>;
+
*<tex>b_2(n)</tex> — время работы <tex>[x \in \mathrm{SAT}]</tex>;
 
*<tex>b_3(n)</tex> — время работы <tex>[x \in L]</tex>;
 
*<tex>b_3(n)</tex> — время работы <tex>[x \in L]</tex>;
 
*<tex>b_4(n)</tex> — время работы <tex>[f_i(x) \in L]</tex>;
 
*<tex>b_4(n)</tex> — время работы <tex>[f_i(x) \in L]</tex>;
Строка 131: Строка 131:
  
 
Получаем, что <tex>T(n) = T(n-1) + poly</tex>. Значит, <tex>T(n) \le n \cdot poly </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>T(n) \in \tilde{\mathrm{P}}</tex> и <tex>A \in \mathrm{P}</tex>.
  
Таким образом, <tex>f</tex> полиномиальна и <tex>A \in P</tex>.
+
Таким образом, <tex>f</tex> полиномиальна и <tex>A \in \mathrm{P}</tex>.
  
 
===Доказательство выполнения свойств <tex>A</tex>===
 
===Доказательство выполнения свойств <tex>A</tex>===
 
Предположим, что <tex>\lim_{n \to \infty}f(n) = 2i</tex>. Это значит, что фунция «застряла» в ветке «иначе» случая два,
 
Предположим, что <tex>\lim_{n \to \infty}f(n) = 2i</tex>. Это значит, что фунция «застряла» в ветке «иначе» случая два,
но из этого следует, что <tex>SAT</tex> не отличается от <tex>L(p_i)</tex>. Это
+
но из этого следует, что <tex>\mathrm{SAT}</tex> не отличается от <tex>L(p_i)</tex>. Это
влечёт за собой принадлежность <tex>SAT</tex> к <tex>P</tex>, что противоречит предположению <tex>P \ne NP</tex>.
+
влечёт за собой принадлежность <tex>\mathrm{SAT}</tex> к <tex>\mathrm{P}</tex>, что противоречит предположению <tex>\mathrm{P} \ne \mathrm{NP}</tex>.
  
 
Аналогично, в случае, если <tex>\lim_{n \to \infty}f(n) = 2i+1</tex>. Тогда функция «застряла» в ветке «иначе» случая три.
 
Аналогично, в случае, если <tex>\lim_{n \to \infty}f(n) = 2i+1</tex>. Тогда функция «застряла» в ветке «иначе» случая три.
Следствием этого является то, что <tex>SAT</tex> функцией <tex>p_i</tex> сводится к конечному множеству, что тоже
+
Следствием этого является то, что <tex>\mathrm{SAT}</tex> функцией <tex>p_i</tex> сводится к конечному множеству, что тоже
противоречит предположению <tex>P \ne NP</tex>.
+
противоречит предположению <tex>\mathrm{P} \ne \mathrm{NP}</tex>.
  
 
Получается, что <tex>\lim_{n \to \infty}f(n) = +\infty</tex>, но по построению если <tex>f</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>L</tex> не совпадает ни с каким языком <tex>L(p_i)</tex> и ни одна функция <tex>f_i</tex> не сводит
<tex>SAT</tex> к <tex>L</tex>.  Следовательно, выполняются все три требуемых свойста, и <tex>L</tex> является примером
+
<tex>\mathrm{SAT}</tex> к <tex>L</tex>.  Следовательно, выполняются все три требуемых свойста, и <tex>L</tex> является примером
языка из <tex>NP\setminus(P \cup NPC)</tex>.
+
языка из <tex>\mathrm{NP}\setminus(\mathrm{P} \cup \mathrm{NPC})</tex>.
  
 
Теорема доказана.
 
Теорема доказана.

Версия 22:04, 14 апреля 2010

Теорема Ладнера (Ladner's Theorem) утверждает, что если P не совпадает с NP, то существует язык [math]L[/math], принадлежащий [math]\mathrm{NP}[/math], но не являющийся полиномиальным и NP-полным.

Иллюстрация

Определим язык [math]A[/math] как множество таких формул [math]\alpha[/math], что [math]\left\lfloor \frac{1}{2}\log_{10}^*|\alpha|\right\rfloor[/math] чётно. Иными словами, [math]A[/math] — это язык формул с длинами, лежащими в промежутках [math]\left[1,10^{10}\right), \left[\underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_4, \underbrace{10^{10^{\cdot^{\cdot^{10}}}}}_6\right), \ldots[/math] Далее будем обозначать [math]\underbrace{a^{a^{\cdot^{\cdot^{a}}}}}_n[/math] как [math]^{n}a[/math].

Рассмотрим язык SAT всех удовлетворимых формул. Логично предположить, что как в [math]A[/math], так и в [math]\bar{A}[/math] лежит бесконечное множество элементов из [math]\mathrm{SAT}[/math], не распознаваемых за полиномиальное время, поэтому [math]\mathrm{SAT} \cap A \not\in \mathrm{P}[/math]. Из [math]A \in \mathrm{P}[/math] и [math]\mathrm{SAT} \in \mathrm{NP}[/math] следует, что [math]\mathrm{SAT} \cap A \in \mathrm{NP}[/math].

Осталось показать, что [math]\mathrm{SAT} \cap A[/math] не является NP-полным. Пусть это не так. Тогда из NP-полноты следует, что существует полиномиальная функция [math]f[/math], сводящая по Карпу [math]\mathrm{SAT}[/math] к [math]\mathrm{SAT} \cap A[/math].

Возьмём формулу [math]\varphi[/math] длиной [math]^{2k+1}10[/math]. Она не лежит в [math]A[/math] и, следовательно, в [math]\mathrm{SAT} \cap A[/math]. Функция [math]f[/math] не может перевести [math]\varphi[/math] в промежуток [math]\left[^{2k+2}10, ^{2k+4}10\right)[/math] или дальше, так как размер выхода полиномиальной функции не может быть экспоненциально больше длины входа. Значит, [math]\varphi[/math] отображается в меньший промежуток, но в этом случае размер выхода экспоненциально меньше длины входа. Добавляя к этому то, что проверку на принадлежность [math]f(\varphi)[/math] к [math]\mathrm{SAT} \cap A[/math] можно осуществить за [math]O(2^{poly})[/math] (это следует из её принадлежности классу [math]\mathrm{NP}[/math]), получаем программу, разрешающую [math]\varphi[/math] за полином. Утверждение о том, что все формулы [math]\varphi[/math] длиной [math]^{2k+1}10[/math] принадлежат классу [math]\mathrm{P}[/math], скорее всего не верно, и, следовательно, язык [math]\mathrm{SAT} \cap A[/math] не является NP-полным.

Заметим, что это объяснение не является доказательством!

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

Будем искать язык [math]A[/math], удовлетворяющий следующим условиям:

  1. [math]A \in \mathrm{P}[/math] (что влечёт за собой [math]\mathrm{SAT} \cap A \in \mathrm{NP}[/math]);
  2. [math]\mathrm{SAT} \cap A \not\in \mathrm{P}[/math];
  3. [math]\mathrm{SAT} \not \leqslant \mathrm{SAT} \cap A[/math].

Если такой язык существует, то [math]L = \mathrm{SAT} \cap A[/math] является искомым примером множества из [math]\mathrm{NP} \setminus (\mathrm{P} \cup \mathrm{NPC})[/math].

Утверждение 1

Можно перечислить (возможно, с повторениями) все языки из [math]\mathrm{P}[/math].

Действительно, рассмотрим последовательность всех программ, упорядоченных по длине: [math] \tilde{p_0}, \tilde{p_1}, \ldots, \tilde{p_n}, \ldots[/math] Обозначим за [math]p_i[/math] программу, запускающую [math]\tilde{p_i}[/math] с таймером [math]in^i[/math]. Тогда среди [math]{p_i}[/math] встречаются только программы из [math]\mathrm{P}[/math], и для каждой полиномиальной программы [math]\tilde{p_i}[/math], работающей за полином [math]g_i(n)[/math], существует номер [math]j[/math] такой, что [math]jn^j \gt g_i(n)[/math] для всех натуральных [math]n[/math] и [math]\tilde{p_j}[/math] делает то же самое, что и [math]\tilde{p_i}[/math]. Таким образом, [math]p_j[/math] распознает тот же язык, что и [math]\tilde{p_i}[/math].

Утверждение 2

Можно перечислить все функции из [math]\tilde{\mathrm{P}}[/math].

Аналогично предыдущему доказательству, сначала построим последовательность [math]\tilde{f_i}[/math], а затем, добавив таймер [math]in^i[/math], получим последовательность [math]f_i[/math].

Описание способа построения [math]A[/math]

Упорядочим все слова по возрастанию длины. Разобьем всё [math]\Sigma^{*}[/math] на множества [math]A_i[/math] так, что:

  • [math]\forall i\lt j, \forall \alpha \in A_i, \beta \in A_j: |\alpha| \lt |\beta|[/math] (то есть разбиение происходит по длинам, причем [math]A_i[/math] идут «подряд»),
  • [math]\mathrm{SAT} \cap \bigcup_{i=0}^{k} A_{2i}[/math] отличается от [math]L(p_k)[/math] элементом [math]x_{2k}[/math] из [math]\bigcup_{i=0}^{2k} A_i[/math],
  • для любого [math]k[/math] существует [math]x_{2k+1} \in \bigcup_{i=0}^{2k+1} A_i[/math], для которого выполняются условия [math]f_k(x_{2k+1}) \in \bigcup_{i=0}^{2k+1} A_i[/math] и [math][x_{2k+1} \in \mathrm{SAT}] \ne [f_k(x_{2k+1}) \in \mathrm{SAT} \cap \bigcup_{i=0}^{k} A_{2i}][/math].

Ladner.png

Если мы сможем построить такие [math]A_i[/math], то язык [math]L = \mathrm{SAT} \cap \bigcup_{i=0}^{\infty} A_{2i}[/math] будет отличаться от любого полиномиального языка, и ни одна полиномиальная функция не будет сводить [math]\mathrm{SAT}[/math] к [math]L[/math].

Попытаемся построить такую полиномиальную функцию [math]f[/math], что [math]A_i = \left\{x \mid f(|x|) = i\right\}[/math]. Тогда [math]A=\left\{x \mid f(|x|) \equiv 0 (\mathrm{mod}\ 2) \right\}[/math] и [math]L=\mathrm{SAT} \cap A = \left\{\varphi \mid \varphi \in \mathrm{SAT} \land f(|\varphi|) \equiv 0 (\mathrm{mod}\ 2) \right\}[/math]

Построение [math]f[/math]

Зададим [math]f(0) = f(1) = 0[/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| \lt \log_2 n[/math] и [math]p_i(x) \ne [x \in L][/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| \lt \log_2 n[/math],[math]|f_i(x)| \lt \log_2 n[/math] и [math][x \in \mathrm{SAT}] \ne [f_i(x) \in L][/math], то [math]f(n) = f(n-1)+1[/math], иначе [math]f(n) = f(n-1)[/math].

Заметим, что вызовы [math][\alpha \in L][/math] делаются для [math]\alpha[/math], для которых [math]f[/math] уже построена.

Первый случай позволяет сказать, что [math]f(n)[/math] ограничена [math]O\left(\log_{\log_2 n} n\right) = O(\log_2 n)[/math]. Второй «ответственен» за множества [math]A_i[/math] для чётных [math]i[/math], третий — для нечетных. Логарифм в условии [math]|x| \lt \log_2 n[/math] необходим для полиномиальности [math]f(n)[/math].

Полиномиальность [math]f[/math]

Покажем, что [math]f \in \tilde{\mathrm{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) + c_2(n)[/math], где:

  • [math]T(n-1)[/math] идёт на вычисление [math]f(n-1)[/math];
  • [math]a(n)[/math] — время перебора всех слов [math]x[/math] таких, что [math]|x| \lt \log_2 n[/math];
  • [math]b_1(n)[/math] — время работы [math]p_i(x)[/math];
  • [math]b_2(n)[/math] — время работы [math][x \in \mathrm{SAT}][/math];
  • [math]b_3(n)[/math] — время работы [math][x \in L][/math];
  • [math]b_4(n)[/math] — время работы [math][f_i(x) \in L][/math];
  • [math]c_1(n)[/math] — время, необходимое для построения программы [math]p_i[/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)[/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)[/math]

[math]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)[/math]

[math]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)[/math]

[math]b_4(n) = b_3(b_1(n)) = O\left(n^4\right)[/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+1}-1[/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) \in \tilde{\mathrm{P}}[/math] и [math]A \in \mathrm{P}[/math].

Таким образом, [math]f[/math] полиномиальна и [math]A \in \mathrm{P}[/math].

Доказательство выполнения свойств [math]A[/math]

Предположим, что [math]\lim_{n \to \infty}f(n) = 2i[/math]. Это значит, что фунция «застряла» в ветке «иначе» случая два, но из этого следует, что [math]\mathrm{SAT}[/math] не отличается от [math]L(p_i)[/math]. Это влечёт за собой принадлежность [math]\mathrm{SAT}[/math] к [math]\mathrm{P}[/math], что противоречит предположению [math]\mathrm{P} \ne \mathrm{NP}[/math].

Аналогично, в случае, если [math]\lim_{n \to \infty}f(n) = 2i+1[/math]. Тогда функция «застряла» в ветке «иначе» случая три. Следствием этого является то, что [math]\mathrm{SAT}[/math] функцией [math]p_i[/math] сводится к конечному множеству, что тоже противоречит предположению [math]\mathrm{P} \ne \mathrm{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]\mathrm{SAT}[/math] к [math]L[/math]. Следовательно, выполняются все три требуемых свойста, и [math]L[/math] является примером языка из [math]\mathrm{NP}\setminus(\mathrm{P} \cup \mathrm{NPC})[/math].

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