Лемма о соотношении coNP и IP — различия между версиями
м |
м |
||
Строка 26: | Строка 26: | ||
'''Шаг 0''' | '''Шаг 0''' | ||
− | Запросим у ''Prover'''а такое простое число <tex>p</tex>, что <tex>max(2^m+1, | + | Запросим у ''Prover'''а такое простое число <tex>p</tex>, что <tex>max(2^m+1, 3dm) \le p \le 2 \cdot max(2^m+1, 3dm)</tex>. |
− | Проверим | + | Проверим <tex>p</tex> на простоту и на принадлежность заданному промежутку. Как мы [[Класс P#Примеры задач и языков из P|знаем]], <tex>Primes \in \mathrm{P}</tex>, следовательно на эти операции у ''Verifier'''а уйдёт полиномиальное от размера входа время. |
Далее будем проводить все вычисления модулю <tex>p</tex>. | Далее будем проводить все вычисления модулю <tex>p</tex>. | ||
Строка 40: | Строка 40: | ||
Пусть <tex>r_i = random(p)</tex>. Отправим <tex>r_i</tex> программе ''Prover''. | Пусть <tex>r_i = random(p)</tex>. Отправим <tex>r_i</tex> программе ''Prover''. | ||
− | + | Попросим ''Prover'' 'а прислать ''Verifier'' 'у формулу <tex>A_i(x_{i+1}) = \sum\limits_{x_{i+2} = 0}^{1}\ldots\sum\limits_{x_m = 0}^{1} A(r_1,\ldots, r_i, x_{i+1}, ..., x_m)</tex>. | |
− | |||
Проверим следующее утверждение: <tex>A_i(0) + A_i(1) = A_{i-1}(r_i)</tex>. | Проверим следующее утверждение: <tex>A_i(0) + A_i(1) = A_{i-1}(r_i)</tex>. | ||
Строка 61: | Строка 60: | ||
# <tex>\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall Prover : P(Verifier^{Prover}(x)) \le 1/3</tex>. | # <tex>\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall Prover : P(Verifier^{Prover}(x)) \le 1/3</tex>. | ||
− | # | + | #Первый факт следует из построения ''Verifier'' 'а. |
#По [[Арифметизация булевых формул с кванторами | лемме (2)]], если <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k</tex>, то условия (*) выполнятются, следовательно существует такой ''Prover'', что <tex>P(Verifier^{Prover}(\langle\phi,k\rangle)) = 1</tex>, для любой пары <tex>\langle\phi,k\rangle \in \#SAT</tex>. | #По [[Арифметизация булевых формул с кванторами | лемме (2)]], если <tex>\sum\limits_{x_1 = 0}^1 \ldots \sum\limits_{x_m = 0}^1 A_\phi(x_1, \ldots, x_m)=k</tex>, то условия (*) выполнятются, следовательно существует такой ''Prover'', что <tex>P(Verifier^{Prover}(\langle\phi,k\rangle)) = 1</tex>, для любой пары <tex>\langle\phi,k\rangle \in \#SAT</tex>. | ||
+ | #Пусть количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>. Для того, что бы ''Verifier'' вернул ''true'', ''Prover'' 'у необходимо посылать такие <tex>A_i</tex>, чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать: | ||
+ | :'''Шаг 0''' | ||
+ | :Так как количество наборов, удовлетворяющих <tex>\phi</tex>, не равно <tex>k</tex>, то ''Prover'' не может послать правильное <tex>A_0</tex> – не выполнится условие <tex>A_0(0) + A_0(1) = k</tex>. Поэтому он посылает не <tex>A_0</tex>, а некое <tex>\tilde{A}_0</tex>. | ||
+ | :'''Шаг 1''' | ||
+ | :По [[Лемма Шварца-Зиппеля|лемме Шварца-Зиппеля]] <tex>P(A_0(r_1) = \tilde{A}_0(r_1)) \le \frac d p</tex> для некоторого случайно выбранного <tex>r_1</tex>. Тогда <tex>P(A_0(r_1) \ne \tilde{A}_0(r_1)) \ge 1 - \frac d p</tex>, при этом должно выполняться равенство <tex>A_1(0) + A_1(1) = A_0(r_1)</tex>. Значит с вероятностью не меньше, чем <tex>1 - \frac d p</tex>, ''Prover'' отправит ''Verifier'' 'у <tex>\tilde{A}_1</tex> вместо <tex>A_1</tex>. | ||
+ | :<tex>\ldots</tex> | ||
+ | :'''Шаг m''' | ||
+ | : <tex>P(A_{m-1}(r_m) \ne \tilde{A}_{m-1}(r_m)) \ge 1 - \frac d p</tex>. Значит с такой вероятностью ''Verifier'' получит <tex>\tilde{A}_m</tex> вместо <tex>A_m</tex>. Но так как на шаге <tex>m</tex> ''Verifier'' вычисляет <tex>A_m</tex> и сравнивает его с полученным от ''Prover'' 'а, то в этом случае ''Verifier'' вернет ''false''. | ||
+ | |||
+ | |||
}} | }} | ||
Версия 20:18, 1 июня 2012
Определение: |
имеет ровно удовлетворяющих наборов . |
Лемма (1): |
. |
Доказательство: |
Следует из леммы (1). |
Лемма (2): |
. |
Доказательство: |
Для доказательства леммы построим программы Verifier и Prover из определения класса . Сперва арифметизуем формулу . Пусть полученный полином имеет степень .По лемме (1) вместо условия , можно проверять условие .Приступим к описанию Verifier'а. Шаг 0 Запросим у Prover'а такое простое число знаем, , следовательно на эти операции у Verifier'а уйдёт полиномиальное от размера входа время. , что . Проверим на простоту и на принадлежность заданному промежутку. Как мыДалее будем проводить все вычисления модулю .Попросим Prover 'а прислать Verifier 'у формулу . Заметим, что размер формулы будет полином от длины входа Verifier 'а, так как полином от одной переменной степени не выше, чем , а значит его можно представить в виде .Проверим следующее утверждение: (здесь и далее под словом «проверим» будем подразумевать следующее: если утверждение верно, Verifier продолжает свою работу, иначе он прекращает свою работу и возвращет false).Шаг i Пусть . Отправим программе Prover.Попросим Prover 'а прислать Verifier 'у формулу .Проверим следующее утверждение: .Шаг m Пусть . Отправим программе Prover.Попросим программу Prover прислать Verifier 'у значение .Проверим следующее утверждение: . А также сами подставим в и проверим правильность присланного значения .Возвращаем true. Докажем теперь, что построенный таким образом Verifier — корректный. Таким образом, нужно доказать:
|
Лемма (3): |
. |
Доказательство: |
Сведём язык к языку следующим образом: , где — количество различных переменных в формуле .Очевидно, что По лемме (2) . . Тогда . Так как , то . |