Теорема Бермана — Форчуна — различия между версиями
AndrewD (обсуждение | вклад) |
AndrewD (обсуждение | вклад) |
||
Строка 48: | Строка 48: | ||
Оценим необходимый размер <tex>memo</tex>. Можно считать, что <tex>T(f(\phi)) \le q(n)</tex>, где <tex>n = |\phi|</tex>, а <tex>q</tex> {{---}} монотонно возрастающий полином. Тогда <tex>|f(\phi)| \le q(n)</tex>. Так как <tex>S \in SPARSE</tex>, то <tex>|S \cap \Sigma^k| \le p(k)</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>memo</tex>. Можно считать, что <tex>T(f(\phi)) \le q(n)</tex>, где <tex>n = |\phi|</tex>, а <tex>q</tex> {{---}} монотонно возрастающий полином. Тогда <tex>|f(\phi)| \le q(n)</tex>. Так как <tex>S \in SPARSE</tex>, то <tex>|S \cap \Sigma^k| \le p(k)</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> | + | '''if''' <tex>memo[f(\phi)] \ne -1</tex> //(1) |
'''return''' <tex>memo[f(\phi)]</tex> | '''return''' <tex>memo[f(\phi)]</tex> | ||
'''if''' <tex>\phi=0</tex> | '''if''' <tex>\phi=0</tex> | ||
Строка 54: | Строка 54: | ||
'''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)\, \&\&\, check(\phi|_{x_i=1}, i+1)</tex> | + | <tex>memo[f(\phi)] \leftarrow check(\phi|_{x_i=0}, i+1)\, \&\&\, 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> | ||
'''return''' <tex>memo[f(\phi)]</tex> | '''return''' <tex>memo[f(\phi)]</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>TAUT</tex> за полиномиальное время. Значит <tex>P=coNP</tex>, откуда <tex>P=NP</tex>. | ||
}} | }} |
Версия 23:10, 13 апреля 2012
Лемма (1): |
Доказательство: |
Пусть . Тогда и .Рассмотрим произвольный язык . Тогда . Так как , то , следовательно .Получили, что В обратную сторону доказательство аналогично. и . Значит . |
Определение: |
. |
Лемма (2): |
Доказательство: |
, то есть . Тогда по лемме 1 . |
Определение: |
полином . |
Теорема (Махэни, light): |
Доказательство: |
Пусть существует . Разрешим за полином.Для начала напишем программу, разрешающую :if return if return 0 if return 1 return Ответом будет .Так как и , то , то есть . Поэтому, если в предыдущей программе заменить все обращения к , на , то полученная программа по прежнему будет разрешать .Оценим необходимый размер . Можно считать, что , где , а — монотонно возрастающий полином. Тогда . Так как , то , где — полином. Тогда размер можно оценить сверху: , где — полином.if //(1) return if return 0 if return 1 //(2) if exit return Рассмотрим двоичное дерево, получающееся в результате рекурсивных вызовов данной программы. Рассмотрим произвольный элемент . Найдем, сколько раз условие в ходе выполнения программы является ложным при обращении к элементу . Найдем в дереве такой узел, в котором есть обращение к , а в его поддереве обращений к этому элементу нет, причем . До этого момента количество обращений к не превышает глубины найденного узла, что не превосходит высоты дерева, что не превосходит некоторого полинома . После этого момента условие будет принимать истинное значение при обращении к . Значит, в ходе выполнения программы условие является ложным при обращении к не более раз.Так как всего в Итого, данная программа разрешает не более элементов, то суммарно за все время выполнения программы условие принимает ложное значение не более раз, то есть — полином. Отсюда следует, что присваивание выполняется не более раз, а значит в дереве не более внутренних вершин. Значит всего в дереве не более вершин, то есть данная программа работает за полиномиальное время. за полиномиальное время. Значит , откуда . |