Теорема Бермана — Форчуна — различия между версиями
Kirelagin (обсуждение | вклад) |
AndrewD (обсуждение | вклад) |
||
Строка 12: | Строка 12: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | <tex>\mathrm{TAUT} = \{\phi</tex> {{---}} булева формула <tex>| \forall x = (x_1, x_2, \ldots , x_m) \, \phi(x)=1\}</tex>. | + | <tex>\mathrm{TAUT} = \{\phi</tex> {{---}} булева формула <tex>\bigm{|} \forall x = (x_1, x_2, \ldots , x_m) \, \phi(x)=1\}</tex>. |
}} | }} | ||
Строка 18: | Строка 18: | ||
|about=2 | |about=2 | ||
|statement=<tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. | |statement=<tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. | ||
− | |proof=<tex>\overline {\mathrm{TAUT}} = \{\phi | \exists x : \phi(x) \ne 1\} = \{\phi | \overline {\phi} \in \mathrm{SAT}\}</tex>, то есть <tex>\mathrm{SAT} \le \overline {\mathrm{TAUT}} \, (f(\phi) = \overline {\phi})</tex>. Кроме того, <tex>\overline {\mathrm{TAUT}} \in \mathrm{NP}</tex> <tex>(</tex>в качестве сертификата используется <tex>x</tex>, на котором <tex>\phi(x) \ne 1)</tex>. Значит <tex>\overline{\mathrm{TAUT}} \in \mathrm{NPC}</tex>. Тогда по лемме (1) <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. | + | |proof=<tex>\overline {\mathrm{TAUT}} = \{\phi \bigm{|} \exists x : \phi(x) \ne 1\} = \{\phi \bigm{|} \overline {\phi} \in \mathrm{SAT}\}</tex>, то есть <tex>\mathrm{SAT} \le \overline {\mathrm{TAUT}} \, (f(\phi) = \overline {\phi})</tex>. Кроме того, <tex>\overline {\mathrm{TAUT}} \in \mathrm{NP}</tex> <tex>(</tex>в качестве сертификата используется <tex>x</tex>, на котором <tex>\phi(x) \ne 1)</tex>. Значит <tex>\overline{\mathrm{TAUT}} \in \mathrm{NPC}</tex>. Тогда по лемме (1) <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. |
}} | }} | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | <tex>\mathrm{SPARSE} = \{L | \exists</tex> полином <tex>p: \forall n \, |L \cap \Sigma^n| \le p(n)\}</tex>. | + | <tex>\mathrm{SPARSE} = \{L \bigm{|} \exists</tex> полином <tex>p: \forall n \, |L \cap \Sigma^n| \le p(n)\}</tex>. |
}} | }} | ||
Строка 33: | Строка 33: | ||
Для начала напишем программу, разрешающую <tex>\mathrm{TAUT}</tex>: | Для начала напишем программу, разрешающую <tex>\mathrm{TAUT}</tex>: | ||
<tex>check(\phi, i)</tex>: | <tex>check(\phi, i)</tex>: | ||
− | + | '''if''' <tex>\phi=0</tex> | |
'''return''' 0 | '''return''' 0 | ||
− | + | '''if''' <tex>\phi=1</tex> | |
'''return''' 1 | '''return''' 1 | ||
− | + | '''if''' <tex>memo[\phi] \ne -1</tex> | |
'''return''' <tex>memo[\phi]</tex> | '''return''' <tex>memo[\phi]</tex> | ||
− | + | <tex>memo[\phi] \leftarrow check(\phi|_{x_i=0}, i+1) \wedge check(\phi|_{x_i=1}, i+1)</tex> | |
'''return''' <tex>memo[\phi]</tex> | '''return''' <tex>memo[\phi]</tex> | ||
Ответом будет <tex>check(\phi, 1)</tex>. | Ответом будет <tex>check(\phi, 1)</tex>. | ||
Строка 53: | Строка 53: | ||
'''if''' <tex>memo[f(\phi)] \ne -1</tex> //(1) | '''if''' <tex>memo[f(\phi)] \ne -1</tex> //(1) | ||
'''return''' <tex>memo[f(\phi)]</tex> | '''return''' <tex>memo[f(\phi)]</tex> | ||
− | + | <tex>memo[f(\phi)] \leftarrow check(\phi|_{x_i=0}, i+1) \wedge check(\phi|_{x_i=1}, i+1)</tex> //(2) | |
'''if''' <tex>memo.size() > r(n)</tex> | '''if''' <tex>memo.size() > r(n)</tex> | ||
'''exit''' <tex>0</tex> | '''exit''' <tex>0</tex> | ||
Строка 59: | Строка 59: | ||
Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. | Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. | ||
− | Рассмотрим произвольный элемент <tex>memo[i]</tex>. | + | Рассмотрим произвольный элемент <tex>memo[i]</tex>. Найдем, сколько раз условие <tex>(1)</tex> в ходе выполнения программы является ложным при обращении к элементу <tex>memo[i]</tex>. Найдем в дереве такой узел, в котором есть обращение к <tex>memo[i]</tex>, а в его поддереве обращений к этому элементу нет, причем <tex>memo[i] = -1</tex>. До этого момента количество обращений к <tex>memo[i]</tex> не превышает глубины найденного узла, что не превосходит высоты дерева, что не превосходит некоторого полинома <tex>p'(n)</tex>. После этого момента условие <tex>(1)</tex> будет принимать истинное значение при обращении к <tex>memo[i]</tex>. Значит, в ходе выполнения программы условие <tex>(1)</tex> является ложным при обращении к <tex>memo[i]</tex> не более <tex>p'(n)</tex> раз. |
+ | |||
+ | Так как всего в <tex>memo</tex> не более <tex>r(n)</tex> элементов, то суммарно за все время выполнения программы условие <tex>(1)</tex> принимает ложное значение не более <tex>p''(n) = r(n) \cdot p'(n)</tex> раз, то есть <tex>p''</tex> {{---}} полином. Отсюда следует, что присваивание <tex>(2)</tex> выполняется не более <tex>p''(n)</tex> раз, а значит в дереве не более <tex>p''(n)</tex> внутренних вершин. Значит всего в дереве не более <tex>2 \cdot p''(n) + 1</tex> вершин, то есть данная программа работает за полиномиальное время. | ||
Итого, данная программа разрешает <tex>\mathrm{TAUT}</tex> за полиномиальное время. А так как <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>, то <tex>\mathrm{P}=\mathrm{coNP}</tex>, то есть <tex>\mathrm{coP}=\mathrm{coNP}</tex>, откуда <tex>\mathrm{P}=\mathrm{NP}</tex>. | Итого, данная программа разрешает <tex>\mathrm{TAUT}</tex> за полиномиальное время. А так как <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>, то <tex>\mathrm{P}=\mathrm{coNP}</tex>, то есть <tex>\mathrm{coP}=\mathrm{coNP}</tex>, откуда <tex>\mathrm{P}=\mathrm{NP}</tex>. |
Версия 13:05, 3 июня 2012
Лемма (1): |
Язык является -полным тогда и только тогда, когда является -полным (то есть ). |
Доказательство: |
Пусть — -полный. Тогда и .Рассмотрим произвольный язык лемме). . Тогда . Так как — -полный, то , следовательно (поПолучили, что В обратную сторону доказательство аналогично. и . Значит . |
Определение: |
— булева формула . |
Лемма (2): |
. |
Доказательство: |
, то есть . Кроме того, в качестве сертификата используется , на котором . Значит . Тогда по лемме (1) . |
Определение: |
полином . |
Теорема (Берман, Форчун): |
. |
Доказательство: |
Пусть существует . Разрешим за полином.Для начала напишем программу, разрешающую :: if return 0 if return 1 if return return Ответом будет .Так как и , то , то есть . Поэтому, если в предыдущей программе заменить все обращения к , на , то полученная программа по-прежнему будет разрешать .Оценим необходимый размер . Можно считать, что , где , а — монотонно возрастающий полином. Тогда . Так как , то , где — полином. Можно считать, что монотонно возрастает. Тогда размер (число слов длины не более в языке) можно оценить сверху: , где — полином.: if return 0 if return 1 if //(1) return //(2) if exit return Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. Рассмотрим произвольный элемент . Найдем, сколько раз условие в ходе выполнения программы является ложным при обращении к элементу . Найдем в дереве такой узел, в котором есть обращение к , а в его поддереве обращений к этому элементу нет, причем . До этого момента количество обращений к не превышает глубины найденного узла, что не превосходит высоты дерева, что не превосходит некоторого полинома . После этого момента условие будет принимать истинное значение при обращении к . Значит, в ходе выполнения программы условие является ложным при обращении к не более раз.Так как всего в Итого, данная программа разрешает не более элементов, то суммарно за все время выполнения программы условие принимает ложное значение не более раз, то есть — полином. Отсюда следует, что присваивание выполняется не более раз, а значит в дереве не более внутренних вершин. Значит всего в дереве не более вершин, то есть данная программа работает за полиномиальное время. за полиномиальное время. А так как , то , то есть , откуда . |