Sharp SAT — различия между версиями
SVKazakov (обсуждение | вклад) |
м (rollbackEdits.php mass rollback) |
||
(не показано 6 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
== Определение == | == Определение == | ||
− | <tex>\#SAT = \{ | + | <tex>\#SAT = \{ \langle \varphi, k \rangle | \varphi</tex> имеет <tex>k</tex> удовлетворяющих наборов <tex>\}</tex> |
== Утверждение == | == Утверждение == | ||
Строка 23: | Строка 23: | ||
Пусть полином <tex>A(x_1, x_2, ..., x_n)</tex> имеет степень <tex>d</tex>. | Пусть полином <tex>A(x_1, x_2, ..., x_n)</tex> имеет степень <tex>d</tex>. | ||
− | Итак, надо проверить следующее | + | Итак, надо проверить следующее уравнение: <tex>\sum_{x_1 = 0}^{1}\sum_{x_2 = 0}^{1}...\sum_{x_n = 0}^{1} A(x_1, x_2, ..., x_n) = k</tex>. |
− | Попросим ''Prover'' 'а прислать ''Verifier'' 'у простое число <tex>p > max(2^n, k_p)</tex> и сертификат о его простоте. | + | Попросим ''Prover'' 'а прислать ''Verifier'' 'у такое простое число <tex>p</tex>, что <tex>max(2^n+1, k_p) \le p \le 2 \cdot max(2^n+1, k_p)</tex>, и сертификат о его простоте. |
− | Проверим простоту <tex>p</tex> по сертификату и условие <tex>p | + | Проверим простоту <tex>p</tex> по сертификату и условие <tex>max(2^n+1, k_p) \le p \le 2 \cdot max(2^n+1, k_p)</tex>. Константу <tex>k_p</tex> определим позднее. |
− | Далее будем вычислять и проверять равенства по модулю <tex>p</tex>. | + | Далее будем вычислять значения и проверять равенства по модулю <tex>p</tex>. |
Пусть <tex>A_0(x_1) = \sum_{x_2 = 0}^{1}\sum_{x_3 = 0}^{1}...\sum_{x_n = 0}^{1} A(x_1, x_2, ..., x_n)</tex>. | Пусть <tex>A_0(x_1) = \sum_{x_2 = 0}^{1}\sum_{x_3 = 0}^{1}...\sum_{x_n = 0}^{1} A(x_1, x_2, ..., x_n)</tex>. | ||
Строка 35: | Строка 35: | ||
Проверим следующее утверждение: <tex>A_0(0) + A_0(1) = k</tex>. | Проверим следующее утверждение: <tex>A_0(0) + A_0(1) = k</tex>. | ||
− | Заметим, что размер формулы <tex>A_0(x_1)</tex> будет полином от | + | Заметим, что размер формулы <tex>A_0(x_1)</tex> будет полином от длины входа ''Verifier'' 'а. Этот факт следует из того, что формула имеет степень меньшую либо равную <tex>d</tex>, и она от одной переменной. Поэтому её можно представить так: <tex>A_0(x) = \sum_{i = 0}^{d} C_i \cdot x ^ i</tex>, и попросить ''Prover'' 'а прислать только сами коэффициенты <tex>C_i</tex> по модулю <tex>p</tex>. |
Шаг 1. | Шаг 1. | ||
Строка 64: | Строка 64: | ||
Итак, остается доказать, что написанный ''Verifier'' - корректный ''Verifier'' для языка <tex>\#SAT</tex>. Таким образом, нужно доказать: | Итак, остается доказать, что написанный ''Verifier'' - корректный ''Verifier'' для языка <tex>\#SAT</tex>. Таким образом, нужно доказать: | ||
− | # Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от | + | # Построенный ''Verifier'' - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий. |
− | # <tex> | + | # <tex>\langle \varphi, k \rangle \in \#SAT \Rightarrow \exists Prover : P(Verifier^{Prover}(x)) \ge 2/3</tex>. |
− | # <tex> | + | # <tex>\langle \varphi, k \rangle \notin \#SAT \Rightarrow \forall Prover : P(Verifier^{Prover}(x)) \le 1/3</tex>. |
Доказательство: | Доказательство: | ||
# Из программы ''Verifier'' видно, что она работает за <tex>O(poly(|input|))</tex>. | # Из программы ''Verifier'' видно, что она работает за <tex>O(poly(|input|))</tex>. | ||
− | # Если <tex>\varphi</tex> имеет ровно <tex>k</tex> удовлетворяющих наборов, то существует такая программа ''Prover'', что <tex>P( | + | # Если <tex>\varphi</tex> имеет ровно <tex>k</tex> удовлетворяющих наборов, то существует такая программа ''Prover'', что <tex>P(Verifier^{Prover}(x)) = 1</tex>. Такая программа: |
− | ## Присылает, например, первое простое число, большее <tex>max(2^n, k_p)</tex>, и сертификат. | + | ## Присылает, например, первое простое число, большее <tex>max(2^n+1, k_p)</tex>, и сертификат. |
## Считает сумму <tex>A_0(x_1)</tex> и присылает формулу. | ## Считает сумму <tex>A_0(x_1)</tex> и присылает формулу. | ||
## Получает <tex>r_1</tex>. | ## Получает <tex>r_1</tex>. | ||
Строка 97: | Строка 97: | ||
Из этого процесса заметим, что с вероятностью большей либо равной <tex>(1 - d / p) ^ n</tex> мы дойдем до последнего шага и будем имееть <tex>\tilde{A}_n</tex> вместо <tex>A_n</tex>. Так как на шаге <tex>n</tex> ''Verifier'' вычисляет <tex>A_n</tex> и проверяет значение, то ''Verifier'' вернет ''false''. | Из этого процесса заметим, что с вероятностью большей либо равной <tex>(1 - d / p) ^ n</tex> мы дойдем до последнего шага и будем имееть <tex>\tilde{A}_n</tex> вместо <tex>A_n</tex>. Так как на шаге <tex>n</tex> ''Verifier'' вычисляет <tex>A_n</tex> и проверяет значение, то ''Verifier'' вернет ''false''. | ||
− | Так как мы хотим сделать вероятность возврата ''false'' большую либо равную <tex>2/3</tex>, то выберем <tex>k_p</tex> так, чтобы <tex>(1 - d / k_p) ^ n \ge 2/3</tex>. | + | Так как мы хотим сделать вероятность возврата ''false'' большую либо равную <tex>2/3</tex>, то выберем <tex>k_p</tex> так, чтобы <tex>(1-d/k_p)^n \ge 2/3</tex>. Возьмем <tex>k_p = 3 d \cdot n</tex>. Заметим, что длина <tex>k_p</tex> есть <tex>poly(|input|)</tex>. Из разложения функции по Тейлору получаем: <tex>(1-d/k_p)^n = (1 - 1/(3n))^n = 1 - 1/3 + \frac{n(n - 1)}{2 (3n)^2} - \frac{n(n-1)(n-2)}{6 (3n)^3} + ... </tex>. Так как <tex>n</tex> - целое неотрицательное число, то: <tex>(1-d/k_p)^n \ge 2/3 + \frac{n(n-1)}{n^2}(\frac{1}{2 \cdot 3^2} - \frac{1}{6 \cdot 3^3}) + ... \ge 2/3</tex>. |
Утверждение доказано. | Утверждение доказано. |
Текущая версия на 19:20, 4 сентября 2022
Определение
имеет удовлетворяющих наборов
Утверждение
Доказательство
Для доказательства будем строить вероятностную программу Verifier, которая хочет проверить, верно ли, что заданная формула
имеет ровно удовлетворяющих наборов. Программа Verifier может совершить не больше полинома от длины входа действий, а также может обращаться к программе Prover, которая пытается любым возможным способом убедить Verifier в верности рассматриваемого утверждения.Далее в программе Verifier будем писать "проверим ...", что означает проверку соответствующего условия, и, при ложности, Verifier будет сразу завершаться и возвращать false, т.к. Prover её обманывает, а значит, нет правильного доказательства проверяемого утверждения.
Verifier будет выполнять следующие шаги.
Шаг 0.
Пусть формула
каким-либо образом записана. Пусть формула имеет переменных. Сделаем следующие замены и получим формулу :Заметим, что длина формулы возрастет не больше, чем в константу раз.
Пусть полином
имеет степень .Итак, надо проверить следующее уравнение:
.Попросим Prover 'а прислать Verifier 'у такое простое число
, что , и сертификат о его простоте. Проверим простоту по сертификату и условие . Константу определим позднее.Далее будем вычислять значения и проверять равенства по модулю
.Пусть
.Попросим Prover 'а прислать Verifier 'у формулу
. Проверим следующее утверждение: .Заметим, что размер формулы
будет полином от длины входа Verifier 'а. Этот факт следует из того, что формула имеет степень меньшую либо равную , и она от одной переменной. Поэтому её можно представить так: , и попросить Prover 'а прислать только сами коэффициенты по модулю .Шаг 1.
Пусть
. Отправим программе Prover.Пусть
.Попросим Prover 'а прислать Verifier 'у формулу
. Проверим следующее утверждение: .Шаг 2.
...
Шаг
.Пусть
. Отправим программе Prover.Пусть
.Попросим программу Prover прислать Verifier 'у значение
. Проверим следующее утверждение: . А также сами подставим в и проверим правильность присланного значения .Возвращаем true.
Итак, остается доказать, что написанный Verifier - корректный Verifier для языка . Таким образом, нужно доказать:
- Построенный Verifier - вероятностная машина Тьюринга, совершающая не более полинома от длины входа действий.
- .
- .
Доказательство:
- Из программы Verifier видно, что она работает за .
- Если
- Присылает, например, первое простое число, большее , и сертификат.
- Считает сумму и присылает формулу.
- Получает .
- Считает сумму и присылает формулу.
- ...
имеет ровно удовлетворяющих наборов, то существует такая программа Prover, что . Такая программа:
- Пусть имеет не удовлетворяющих наборов. Тогда для того, что бы Verifier вернул true, необходимо Prover 'у посылать такие , чтобы выполнялись все проверяемые условия. Посмотрим на то, что он может послать:
Шаг 0.
Так как
имеет не удовлетворяющих наборов, то Prover не может послать правильное – не выполнится условие . Поэтому он посылает не , а некое .Шаг 1.
Во первых, отметим, что ситуация леммы Шварца-Зиппеля. Таким образом, с вероятностью большей либо равной и, ввиду того, что должно выполняться условие , получаем, что тоже будет неправильное, т.е. некоторое .
происходит с вероятностью меньшей либо равной для некоторого случайно выбранного , что следует изШаг 2.
...
Шаг
.С вероятностью
, и потому Verifier получит не , а .Из этого процесса заметим, что с вероятностью большей либо равной
мы дойдем до последнего шага и будем имееть вместо . Так как на шаге Verifier вычисляет и проверяет значение, то Verifier вернет false.Так как мы хотим сделать вероятность возврата false большую либо равную
, то выберем так, чтобы . Возьмем . Заметим, что длина есть . Из разложения функции по Тейлору получаем: . Так как - целое неотрицательное число, то: .Утверждение доказано.