Теорема Бермана — Форчуна — различия между версиями
AndrewD (обсуждение | вклад) |
Kirelagin (обсуждение | вклад) (БЕСИТЕ вы меня) |
||
Строка 1: | Строка 1: | ||
{{Лемма | {{Лемма | ||
|about=1 | |about=1 | ||
− | |statement=<tex>L \in \mathrm{coNPC} \Leftrightarrow \overline L \in \mathrm{NPC}</tex> | + | |statement=<tex>L \in \mathrm{coNPC} \Leftrightarrow \overline L \in \mathrm{NPC}</tex>. |
|proof=Пусть <tex>L \in \mathrm{coNPC}</tex>. Тогда <tex>L \in \mathrm{coNP}</tex> и <tex>\overline L \in \mathrm{NP}</tex>. | |proof=Пусть <tex>L \in \mathrm{coNPC}</tex>. Тогда <tex>L \in \mathrm{coNP}</tex> и <tex>\overline L \in \mathrm{NP}</tex>. | ||
Строка 12: | Строка 12: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | <tex>TAUT = \{\phi</tex> {{---}} булева формула <tex>| \forall x = (x_1, x_2, \ldots , x_m) \, \phi(x)=1\}</tex>. | + | <tex>\mathrm{TAUT} = \{\phi</tex> {{---}} булева формула <tex>| \forall x = (x_1, x_2, \ldots , x_m) \, \phi(x)=1\}</tex>. |
}} | }} | ||
{{Лемма | {{Лемма | ||
|about=2 | |about=2 | ||
− | |statement=<tex>TAUT \in \mathrm{coNPC}</tex> | + | |statement=<tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. |
− | |proof=<tex>\overline {TAUT} = \{\phi | \exists x : \phi(x) \ne 1\} = \{\phi | \overline {\phi} \in SAT\}</tex>, то есть <tex>\overline {TAUT} \in \mathrm{NPC}</tex>. Тогда по лемме (1) <tex>TAUT \in \mathrm{coNPC}</tex>. | + | |proof=<tex>\overline {\mathrm{TAUT}} = \{\phi | \exists x : \phi(x) \ne 1\} = \{\phi | \overline {\phi} \in SAT\}</tex>, то есть <tex>\overline {\mathrm{TAUT}} \in \mathrm{NPC}</tex>. Тогда по лемме (1) <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex>. |
}} | }} | ||
Строка 27: | Строка 27: | ||
{{Теорема | {{Теорема | ||
− | |statement=<tex>\mathrm{coNPC} \cap \mathrm{SPARSE} \ne \varnothing \Rightarrow \mathrm{P} = \mathrm{NP}</tex> | + | |statement=<tex>\mathrm{coNPC} \cap \mathrm{SPARSE} \ne \varnothing \Rightarrow \mathrm{P} = \mathrm{NP}</tex>. |
− | |proof=Пусть существует <tex>S \in \mathrm{coNPC} \cap \mathrm{SPARSE}</tex>. Разрешим <tex>TAUT</tex> за полином. | + | |author=Берман, Форчун |
+ | |proof=Пусть существует <tex>S \in \mathrm{coNPC} \cap \mathrm{SPARSE}</tex>. Разрешим <tex>\mathrm{TAUT}</tex> за полином. | ||
− | Для начала напишем программу, разрешающую <tex>TAUT</tex>: | + | Для начала напишем программу, разрешающую <tex>\mathrm{TAUT}</tex>: |
− | <tex>check(\phi, i)</tex> | + | <tex>check(\phi, i)</tex>: |
'''if''' <tex>memo[\phi] \ne -1</tex> | '''if''' <tex>memo[\phi] \ne -1</tex> | ||
'''return''' <tex>memo[\phi]</tex> | '''return''' <tex>memo[\phi]</tex> | ||
Строка 38: | Строка 39: | ||
'''if''' <tex>\phi=1</tex> | '''if''' <tex>\phi=1</tex> | ||
'''return''' 1 | '''return''' 1 | ||
− | <tex>memo[\phi] \leftarrow check(\phi|_{x_i=0}, i+1)\ | + | <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>. | ||
− | Так как <tex>TAUT \in \mathrm{coNPC}</tex> и <tex>S \in \mathrm{coNPC}</tex>, то <tex>TAUT \le S</tex>, то есть <tex>\exists f \in \widetilde{P} : \phi \in TAUT \Leftrightarrow f(\phi) \in S</tex>. Поэтому, если в предыдущей программе заменить все обращения к <tex>memo[\phi]</tex>, на <tex>memo[f(\phi)]</tex>, то полученная программа по-прежнему будет разрешать <tex>TAUT</tex>. | + | Так как <tex>\mathrm{TAUT} \in \mathrm{coNPC}</tex> и <tex>S \in \mathrm{coNPC}</tex>, то <tex>\mathrm{TAUT} \le S</tex>, то есть <tex>\exists f \in \mathrm{\widetilde{P}} : \phi \in \mathrm{TAUT} \Leftrightarrow f(\phi) \in S</tex>. Поэтому, если в предыдущей программе заменить все обращения к <tex>memo[\phi]</tex>, на <tex>memo[f(\phi)]</tex>, то полученная программа по-прежнему будет разрешать <tex>\mathrm{TAUT}</tex>. |
− | Оценим необходимый размер <tex>memo</tex>. Можно считать, что <tex>T(f | + | Оценим необходимый размер <tex>memo</tex>. Можно считать, что <tex>\mathrm{T}(f, \phi) \le q(n)</tex>, где <tex>n = |\phi|</tex>, а <tex>q</tex> {{---}} монотонно возрастающий полином. Тогда <tex>|f(\phi)| \le q(n)</tex>. Так как <tex>S \in \mathrm{SPARSE}</tex>, то <tex>|S \cap \Sigma^k| \le p(k)</tex>, где <tex>p</tex> {{---}} полином. Можно считать, что <tex>p</tex> монотонно возрастает. Тогда размер <tex>memo</tex> можно оценить сверху: <tex>memo.size() \le \sum\limits_{i=0}^{q(n)}p(i) \le (1+q(n)) \cdot p(q(n)) \le r(n)</tex>, где <tex>r(n)</tex> {{---}} полином. |
− | <tex>check(\phi, i)</tex> | + | <tex>check(\phi, i)</tex>: |
'''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> | ||
Строка 52: | Строка 53: | ||
'''if''' <tex>\phi=1</tex> | '''if''' <tex>\phi=1</tex> | ||
'''return''' 1 | '''return''' 1 | ||
− | <tex>memo[f(\phi)] \leftarrow check(\phi|_{x_i=0}, i+1)\ | + | <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> | ||
Строка 60: | Строка 61: | ||
Рассмотрим произвольный элемент <tex>memo[i]</tex>. Заметим, что условие <tex>(1)</tex> в ходе выполнения программы является ложным при обращении к элементу <tex>memo[i]</tex> не более одного раза. Так как всего в <tex>memo</tex> не более <tex>r(n)</tex> элементов, то суммарно за все время выполнения программы условие <tex>(1)</tex> принимает ложное значение не более <tex>r(n)</tex> раз. Отсюда следует, что присваивание <tex>(2)</tex> выполняется не более <tex>r(n)</tex> раз, а значит в дереве не более <tex>r(n)</tex> внутренних вершин. Значит всего в дереве не более <tex>2 \cdot r(n) + 1</tex> вершин, то есть данная программа работает за полиномиальное время. | Рассмотрим произвольный элемент <tex>memo[i]</tex>. Заметим, что условие <tex>(1)</tex> в ходе выполнения программы является ложным при обращении к элементу <tex>memo[i]</tex> не более одного раза. Так как всего в <tex>memo</tex> не более <tex>r(n)</tex> элементов, то суммарно за все время выполнения программы условие <tex>(1)</tex> принимает ложное значение не более <tex>r(n)</tex> раз. Отсюда следует, что присваивание <tex>(2)</tex> выполняется не более <tex>r(n)</tex> раз, а значит в дереве не более <tex>r(n)</tex> внутренних вершин. Значит всего в дереве не более <tex>2 \cdot r(n) + 1</tex> вершин, то есть данная программа работает за полиномиальное время. | ||
− | Итого, данная программа разрешает <tex>TAUT</tex> за полиномиальное время. А так как <tex>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>. |
}} | }} | ||
Версия 00:16, 3 июня 2012
Лемма (1): |
. |
Доказательство: |
Пусть . Тогда и .Рассмотрим произвольный язык лемме). . Тогда . Так как , то , следовательно (поПолучили, что В обратную сторону доказательство аналогично. и . Значит . |
Определение: |
— булева формула . |
Лемма (2): |
. |
Доказательство: |
, то есть . Тогда по лемме (1) . |
Определение: |
полином . |
Теорема (Берман, Форчун): |
. |
Доказательство: |
Пусть существует . Разрешим за полином.Для начала напишем программу, разрешающую :: if return if return 0 if return 1 return Ответом будет .Так как и , то , то есть . Поэтому, если в предыдущей программе заменить все обращения к , на , то полученная программа по-прежнему будет разрешать .Оценим необходимый размер . Можно считать, что , где , а — монотонно возрастающий полином. Тогда . Так как , то , где — полином. Можно считать, что монотонно возрастает. Тогда размер можно оценить сверху: , где — полином.: if //(1) return if return 0 if return 1 //(2) if exit return Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. Рассмотрим произвольный элемент Итого, данная программа разрешает . Заметим, что условие в ходе выполнения программы является ложным при обращении к элементу не более одного раза. Так как всего в не более элементов, то суммарно за все время выполнения программы условие принимает ложное значение не более раз. Отсюда следует, что присваивание выполняется не более раз, а значит в дереве не более внутренних вершин. Значит всего в дереве не более вершин, то есть данная программа работает за полиномиальное время. за полиномиальное время. А так как , то , то есть , откуда . |