Złożoność obliczeniowa/Wykład 15: Kryptografia a złożoność: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Arek (dyskusja | edycje)
Nie podano opisu zmian
m Zastępowanie tekstu – „ </math>” na „</math>”
 
(Nie pokazano 21 wersji utworzonych przez 4 użytkowników)
Linia 3: Linia 3:
W dotychczasowych rozważaniach naszym celem było znalezienie możliwie
W dotychczasowych rozważaniach naszym celem było znalezienie możliwie
efektywnego rozwiązania dla zadanych problemów; nadmierna złożoność problemu
efektywnego rozwiązania dla zadanych problemów; nadmierna złożoność problemu
była przez nas traktowana jako cecha niepożądana, gdyż utrudniająca nasze
była przez nas traktowana jako cecha niepożądana, utrudniająca nam
zadanie. W tym rozdziale nasze podejście będzie odmienne; duża złożoność będzie
zadanie. W tym rozdziale nasze podejście będzie odmienne; duża złożoność będzie
dla nas cechą bardzo cenną. Będzie nas przy tym w mniejszym niż dotychczas
dla nas cechą bardzo cenną. Będzie nas przy tym, w mniejszym niż dotychczas
stopniu interesować złożoność pesymistyczna -- w końcu nie satysfakcjonuje
stopniu, interesować złożoność pesymistyczna -- w końcu nie satysfakcjonuje
nas "gwarancja", mówiąca że "jeżeli osoba podsłuchująca będzie miała pecha
nas "gwarancja" mówiąca, że "jeżeli osoba podsłuchująca będzie miała pecha,
to odszyfrowanie wiadomości będzie dla niej zadaniem czasochłonnym".
to odszyfrowanie wiadomości będzie dla niej zadaniem czasochłonnym".
Wolelibyśmy, żeby odszyfrowywanie wiadomości przez osoby nieuprawnione było
Wolelibyśmy, żeby odszyfrowywanie wiadomości przez osoby nieuprawnione było
czasochłonne praktycznie zawsze -- tak, by próba podsłuchiwania dawała szansę
czasochłonne, praktycznie zawsze -- tak, by próba podsłuchiwania dawała szansę
sukcesu bardzo bliską zeru. Duża pesymistyczna złożoność nie będzie zatem warunkiem
sukcesu bardzo bliską zeru. Duża pesymistyczna złożoność nie będzie zatem warunkiem
wystarczającym bycia dobrym kryptosystemem; przyda nam się jednak w charakterze
wystarczającym bycia dobrym kryptosystemem; przyda nam się jednak w charakterze
warunku koniecznego.
warunku koniecznego.


{{definicja|||
{{definicja|1.1||
Niech <math>\displaystyle f: \{ 0, 1 \} ^\star \rightarrow \{ 0, 1 \} ^\star</math>. Mówimy, że <math>\displaystyle f</math> jest
Niech <math>f: \{ 0, 1 \} ^\star \rightarrow \{ 0, 1 \} ^\star</math>. Mówimy, że <math>f</math> jest
funkcją jednokierunkową wtedy i tylko wtedy gdy:
funkcją jednokierunkową wtedy i tylko wtedy, gdy:
* <math>\displaystyle f</math> jest różnowartościowa,
* <math>f</math> jest różnowartościowa,
* istnieje pewna stała <math>\displaystyle k > 1</math> taka, że <math>\displaystyle \forall_{x \in \{0, 1\}^\star}
* istnieje pewna stała <math>k > 1</math> taka, że <math>\forall_{x \in \{0, 1\}^\star} |x|^{1/k} \leq f(x) \leq |x|^k</math>,
|x|^{1/k} \leq f(x) \leq |x|^k</math>,
* <math>f</math> jest obliczalna w czasie wielomianowym (czyli należy do klasy <math>FP</math>),
* <math>\displaystyle f</math> jest obliczalna w czasie wielomianowym (czyli należy do klasy <math>\displaystyle FP</math>),
* nie istnieje wielomianowy algorytm obliczający odwrotność funkcji <math>f</math> -- czyli znajdujący dla słowa <math>y</math> słowo <math>x</math>, takie że <math>f(x) = y</math> lub stwierdzający, że takie słowo nie istnieje.
* nie istnieje wielomianowy algorytm obliczający odwrotność funkcji <math>\displaystyle f</math>
-- czyli znajdujący dla słowa <math>\displaystyle y</math> słowo <math>\displaystyle x</math>, takie że <math>\displaystyle f(x) = y</math> lub
stwierdzający, że takie słowo nie istnieje.


}}
}}


Warto zauważyć, że powyższa definicja niejawnie zakłada prawdziwość zdania
Warto zauważyć, że powyższa definicja niejawnie zakłada prawdziwość zdania
<math>\displaystyle P \neq NP</math>.
<math>P \neq NP</math>.


{{cwiczenie|||
{{cwiczenie|1.2||
Niech <math>\displaystyle f</math> spełnia pierwsze trzy warunki podane w definicji funkcji jednokierunkowej.
Niech <math>f</math> spełnia pierwsze trzy warunki podane w definicji funkcji jednokierunkowej.
Pokaż, że obliczanie odwrotności funkcji <math>\displaystyle f</math> jest problemem z klasy <math>\displaystyle FNP</math>.
Pokaż, że obliczanie odwrotności funkcji <math>f</math> jest problemem z klasy <math>FNP</math>.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Z drugiego warunku wiemy, że <math>\displaystyle f^{-1}(y)</math> ma długość co najwyżej <math>\displaystyle |y|^k</math>. Możemy
Z drugiego warunku wiemy, że <math>f^{-1}(y)</math> ma długość co najwyżej <math>|y|^k</math>. Możemy
zatem jako kandydatów na świadków rozpatrywać wszystkie słowa o długości
zatem jako kandydatów na świadków rozpatrywać wszystkie słowa o długości
nie większej niż <math>\displaystyle |y|^k</math>. Takie słowa możemy następnie deterministycznie
nie większej niż <math>|y|^k</math>. Takie słowa możemy następnie deterministycznie
przekształcić za pomocą funkcji <math>\displaystyle f</math> i sprawdzić, czy otrzymane słowo jest równe
przekształcić za pomocą funkcji <math>f</math> i sprawdzić, czy otrzymane słowo jest równe
<math>\displaystyle y</math>.
<math>y</math>.
</div></div>
</div></div>


Z drugiej strony nierówność <math>\displaystyle P \neq NP</math> wcale nie gwaratuje istnienia funkcji
Z drugiej strony nierówność <math>P \neq NP</math> wcale nie gwaratuje istnienia funkcji
jednokierunkowych; jak się okazuje istnienie tego typu funkcji jest ściśle
jednokierunkowych; jak się okazuje istnienie tego typu funkcji jest ściśle
powiązane z pewną klasą złożoności, którą przedstawiamy poniżej.
powiązane z pewną klasą złożoności, którą przedstawiamy poniżej.


{{definicja|Jednoznaczną maszyną Turinga||
{{definicja|1.3||
nazywamy niedeterministyczną maszynę
Jednoznaczną maszyną Turinga nazywamy niedeterministyczną maszynę Turinga taką, że dla każdego słowa wejściowego <math>x</math> istnieje co najwyżej jedna akceptująca ścieżka obliczeń.
Turinga taką, że dla każdego słowa wejściowego <math>\displaystyle x</math> istnieje co najwyżej jedna
akceptująca ścieżka obliczeń.
}}
}}


{{definicja|||
{{definicja|1.4||
Klasa <math>\displaystyle UP</math> to klasa problemów rozstrzygalnych za pomocą jednoznacznych maszyn
Klasa <math>UP</math> to klasa problemów rozstrzygalnych za pomocą jednoznacznych maszyn
Turinga w czasie wielomianowym.
Turinga w czasie wielomianowym.
}}
}}


{{uwaga|||
{{uwaga|1.5||
Klasę <math>\displaystyle UP</math>, podobnie jak klasę <math>\displaystyle NP</math>, można zdefiniować z użyciem pojęcia
Klasę <math>UP</math>, podobnie jak klasę <math>NP</math>, można zdefiniować z użyciem pojęcia
świadka:
świadka:


<math>\displaystyle L \in UP \iff \exists_{p(x) - wielomian} \exists_{L' \in P}
<math>L \in UP \iff \exists_{p(x) - wielomian} \exists_{L' \in P}
\forall_{n \in {\mathbb N}} \forall_{w \in \{ 0, 1 \} ^n}
\forall_{n \in {\mathbb N}} \forall_{w \in \{ 0, 1 \} ^n}
[w \in L \Rightarrow ({\exists !}_{v \in \{ 0, 1 \}^{p(n)}} \langle w, v \rangle \in L')]
[w \in L \Rightarrow ({\exists !}_{v \in \{ 0, 1 \}^{p(n)}} \langle w, v \rangle \in L')]
\wedge
\wedge
[w \notin L \Rightarrow (\neg \exists_{v \in \{ 0, 1 \}^{p(n)}} \langle w, v \rangle \in L')]</math>
[w \notin L \Rightarrow (\neg \exists_{v \in \{ 0, 1 \}^{p(n)}} \langle w, v \rangle \in L')]</math>.


W językach z klasy <math>\displaystyle UL</math> każde słowo ma dokładnie jednego świadka. Dowód
W językach z klasy <math>UL</math> każde słowo ma dokładnie jednego świadka. Dowód
równoważności powyższych definicji jest analogiczny jak w przypadku klasy
równoważności powyższych definicji jest analogiczny jak w przypadku klasy
<math>\displaystyle NP</math>.
<math>NP</math>.
}}
}}


Jest jasne, że <math>\displaystyle P \subseteq UP \subseteq NP</math> -- maszyny deterministyczne są
Jest jasne, że <math>P \subseteq UP \subseteq NP</math> -- maszyny deterministyczne są
specjalnymi przypadkami maszyn jednoznacznych. Dość powszechny jest pogląd,
specjalnymi przypadkami maszyn jednoznacznych. Dość powszechny jest pogląd,
że obie powyższe relacje zawierania są właściwe (to znaczy nie zachodzi równość).
że obie powyższe relacje zawierania są właściwe (to znaczy nie zachodzi równość).


Pokażemy teraz bardzo ciekawy związek pomiędzy klasą <math>\displaystyle UP</math> a funkcjami
Pokażemy teraz bardzo ciekawy związek pomiędzy klasą <math>UP</math> a funkcjami
jednokierunkowymi.
jednokierunkowymi.


{{twierdzenie|||
{{twierdzenie|1.6||
Funkcje jednokierunkowe istnieją <math>\displaystyle \iff UP \neq P</math>
Funkcje jednokierunkowe istnieją wtedy i tylko wtedy, gdy <math>UP \neq P</math>.
}}
}}


{{dowod|||
{{dowod|||
Zaczniemy od dowodu w kierunku <math>\displaystyle \Rightarrow</math>. Załóżmy, że istnieje pewna funkcja
Zaczniemy od dowodu w kierunku <math>\Rightarrow</math>. Załóżmy, że istnieje pewna funkcja
jednokierunkowa <math>\displaystyle f</math>. Możemy wtedy zdefiniować następujący język:
jednokierunkowa <math>f</math>. Możemy wtedy zdefiniować następujący język:


<math>\displaystyle L_f = \{ (x, y): \exists_z f(z) = y \wedge z \leq x\}</math>  
<math>L_f = \{ (x, y): \exists_z f(z) = y \wedge z \leq x\}</math>,


przy czym mówimy, że <math>\displaystyle z \leq x</math> wtedy i tylko wtedy gdy
przy czym mówimy, że <math>z \leq x</math> wtedy i tylko wtedy, gdy
* <math>\displaystyle |z| \leq |y|</math>, lub
* <math>|z| \leq |y|</math> lub
* <math>\displaystyle |z| = |y|</math> i w porządku leksykograficznym <math>\displaystyle z</math> występuje nie później niż
* <math>|z| = |y|</math> i w porządku leksykograficznym <math>z</math> występuje nie później niż <math>x</math>.
<math>\displaystyle x</math>.


Łatwo można zauważyć, że <math>\displaystyle L_f \in UP</math> - maszyna rozwiązująca ten problem
Łatwo można zauważyć, że <math>L_f \in UP</math> - maszyna rozwiązująca ten problem
najpierw "zgaduje" słowo <math>\displaystyle z</math> o wielkości nie większej niż <math>\displaystyle |y|^k</math>, po czym
najpierw "zgaduje" słowo <math>z</math> o wielkości nie większej niż <math>|y|^k</math>, po czym
sprawdza, czy w ustalonym porządku występuje ono nie później niż <math>\displaystyle x</math> i czy
sprawdza, czy w ustalonym porządku występuje ono nie później niż <math>x</math> i czy
zachodzi <math>\displaystyle f(z) = y</math>. Z własności funkcji jednokierunkowych -- konkretnie z
zachodzi <math>f(z) = y</math>. Z własności funkcji jednokierunkowych -- konkretnie z
różnowartościowości -- wynika, że maszyna ta ma co najwyżej jedną akceptującą
różnowartościowości -- wynika, że maszyna ta ma co najwyżej jedną akceptującą
ścieżkę postępowania.
ścieżkę postępowania.


Chcemy teraz pokazać, że <math>\displaystyle L_f \notin P</math>. Załóżmy zatem nie wprost, że istnieje
Chcemy teraz pokazać, że <math>L_f \notin P</math>. Załóżmy zatem nie wprost, że istnieje
jakiś wielomianowy algorytm rozwiązujący <math>\displaystyle L_f</math>. Wykorzystamy go teraz do
jakiś wielomianowy algorytm rozwiązujący <math>L_f</math>. Wykorzystamy go teraz do
obliczenia odwrotności funkcji <math>\displaystyle f</math> w czasie wielomianowym. W pierwszym kroku
obliczenia odwrotności funkcji <math>f</math> w czasie wielomianowym. W pierwszym kroku
zapytamy algorytm, czy <math>\displaystyle (1^{|y|^k}, y) \in L_f</math> (przez <math>\displaystyle 1^{|y|^k}</math> oznaczamy
zapytamy algorytm, czy <math>(1^{|y|^k}, y) \in L_f</math> (przez <math>1^{|y|^k}</math> oznaczamy
tutaj ciąg <math>\displaystyle |y|^k</math> symboli <math>\displaystyle 1</math>) - jeżeli otrzymamy odpowiedź "nie" to
tutaj ciąg <math>|y|^k</math> symboli <math>1</math>) - jeżeli otrzymamy odpowiedź NIE, to
korzystając z definicji funkcji jednokierunkowej możemy od razu stwierdzić,
korzystając z definicji funkcji jednokierunkowej, możemy od razu stwierdzić,
że nie istnieje słowo <math>\displaystyle x</math> takie, że <math>\displaystyle f(x) = y</math>. Jeżeli otrzymamy odpowiedź
że nie istnieje słowo <math>x</math> takie, że <math>f(x) = y</math>. Jeżeli otrzymamy odpowiedź
"tak" to z użyciem co najwyżej <math>\displaystyle |y|^k - 1</math> zapytań do naszego algorytmu
TAK, to z użyciem co najwyżej <math>|y|^k - 1</math> zapytań do naszego algorytmu
jesteśmy w stanie ustalić długość szukanego słowa <math>\displaystyle x</math> (pytamy kolejno o
jesteśmy w stanie ustalić długość szukanego słowa <math>x</math> (pytamy kolejno o
<math>\displaystyle (1^{|y|^k - 1}, y)</math>, <math>\displaystyle (1^{|y|^k - 2}, y)</math>, itd. aż do momentu gdy uzyskamy
<math>(1^{|y|^k - 1}, y)</math>, <math>(1^{|y|^k - 2}, y)</math>, itd., aż do momentu, gdy uzyskamy
odpowiedź "nie"). Gdy znamy już długość słowa <math>\displaystyle x</math> pozostaje nam już tylko
odpowiedź NIE). Gdy znamy już długość słowa <math>x</math> pozostaje nam tylko
obliczyć kolejne jego bity. Pierwszy bit otrzymamy pytając o parę
obliczyć kolejne jego bity. Pierwszy bit otrzymamy, pytając o parę
<math>\displaystyle (01^{|x| - 1}, y)</math> -- odpowiedź "tak" oznacza, że pierwszym bitem jest 0.
<math>(01^{|x| - 1}, y)</math> -- odpowiedź "tak" oznacza, że pierwszym bitem jest 0.
Aby uzyskać drugi bit zapytamy -- w zależności od pierwszej odpowiedzi --
Aby uzyskać drugi bit zapytamy -- w zależności od pierwszej odpowiedzi --
o <math>\displaystyle (001^{|x| - 2}, y)</math> lub <math>\displaystyle (101^{|x| - 2}, y)</math>. Kolejne bity odgadujemy w
o <math>(001^{|x| - 2}, y)</math> lub <math>(101^{|x| - 2}, y)</math>. Kolejne bity odgadujemy w
analogiczny sposób -- łącznie zatem wykonamy algorytm dla <math>\displaystyle L_f\displaystyle O(|y|^k)</math>
analogiczny sposób -- łącznie zatem wykonamy algorytm dla <math>L_fO(|y|^k)</math>
razy. W ten sposób uzyskamy deterministycznty algorytm odwracający funkcję <math>\displaystyle f</math>
razy. W ten sposób uzyskamy deterministycznty algorytm odwracający funkcję <math>f</math>
w czasie wielomianowym.
w czasie wielomianowym.


Doszliśmy więc do sprzeczności z definicją funkcji
Doszliśmy więc do sprzeczności z definicją funkcji
jednokierunkowej, co oznacza, że istnienie funkcji jednokierunkowych implikuje
jednokierunkowej, co oznacza, że istnienie funkcji jednokierunkowych implikuje
nierówność <math>\displaystyle P \neq UP</math>.
nierówność <math>P \neq UP</math>.


Załóżmy teraz, że istnieje język <math>\displaystyle L \in UP - P</math>, rozpoznawany przez jednoznaczną
Załóżmy teraz, że istnieje język <math>L \in UP - P</math>, rozpoznawany przez jednoznaczną
maszynę <math>\displaystyle U</math>. Zdefiniujmy funkcję <math>\displaystyle f_U(w)</math> w następujący sposób:
maszynę <math>U</math>. Zdefiniujmy funkcję <math>f_U(w)</math> w następujący sposób:
* jeżeli <math>\displaystyle w</math> jest zakodowaną parą słów <math>\displaystyle \langle x, y \rangle</math> oraz <math>\displaystyle x</math>
* jeżeli <math>w</math> jest zakodowaną parą słów <math>\langle x, y \rangle</math> oraz <math>x</math> jest (jedynym) świadkiem przynależności słowa <math>y</math> do <math>L</math>, to
jest (jedynym) świadkiem przynależności słowa <math>\displaystyle y</math> do <math>\displaystyle L</math>, to


<math>\displaystyle f_U(w) = 1y</math>,
<math>f_U(w) = 1y</math>,
* w przeciwnym przypadku  
* w przeciwnym przypadku  


<math>\displaystyle f_U(w) = 0w</math>,
<math>f_U(w) = 0w</math>.


Widzimy, że pierwszy symbol wartości funkcji gwarantuje nam jej różnowartościowość.
Widzimy, że pierwszy symbol wartości funkcji gwarantuje nam jej różnowartościowość.
Spełniony jest również drugi warunek z definicji funkcji jednokierunkowej --
Spełniony jest również drugi warunek z definicji funkcji jednokierunkowej --
świadek dla słowa <math>\displaystyle y</math> nie może być nadmiernie długi (bo jego długość jest
świadek dla słowa <math>y</math> nie może być nadmiernie długi (bo jego długość jest
wielomianowo zależna od długości <math>\displaystyle y</math>), a zatem <math>\displaystyle f_U</math> nie może nadmiernie
wielomianowo zależna od długości <math>y</math>), a zatem <math>f_U</math> nie może nadmiernie
"skracać" słów. Funkcja <math>\displaystyle f_U</math> jest też obliczalna w czasie wielomianowym
"skracać" słów. Funkcja <math>f_U</math> jest też obliczalna w czasie wielomianowym
-- wystarczy deterministycznie zweryfikować świadka, tak jak zrobiłaby to maszyna
-- wystarczy deterministycznie zweryfikować świadka, tak jak zrobiłaby to maszyna
<math>\displaystyle U</math>. Pozostaje nam zatem tylko pokazanie, że funkcja odwrotna do
<math>U</math>. Pozostaje nam zatem tylko pokazanie, że funkcja odwrotna do
<math>\displaystyle d</math> nie jest obliczalna w czasie wielomianowym. Gdyby tak jednak było, to
<math>d</math> nie jest obliczalna w czasie wielomianowym. Gdyby tak jednak było, to
moglibyśmy rozpoznawać język <math>\displaystyle L</math> w czasie wielomianowym: Aby sprawdzić, czy
moglibyśmy rozpoznawać język <math>L</math> w czasie wielomianowym: aby sprawdzić, czy
<math>\displaystyle y \in L</math> wystarczy zastosować odwrotność funkcji <math>\displaystyle f_U</math> do słowa <math>\displaystyle 1y</math>; jeżeli
<math>y \in L</math> wystarczy zastosować odwrotność funkcji <math>f_U</math> do słowa <math>1y</math>; jeżeli
<math>\displaystyle y \notin L</math> to dostaniemy odpowiedź mówiącą, że <math>\displaystyle 1y</math> nie można odwrócić;
<math>y \notin L</math>, to dostaniemy odpowiedź mówiącą, że <math>1y</math> nie można odwrócić;
w przeciwnym przypadku otrzymamy świadka przynależności <math>\displaystyle y</math> do języka <math>\displaystyle L</math>.
w przeciwnym przypadku otrzymamy świadka przynależności <math>y</math> do języka <math>L</math>.
}}
}}


Na dzień dzisiejszy nie znamy oczywiście funkcji, o której wiedzielibyśmy, że
Na dzień dzisiejszy nie znamy oczywiście funkcji, o której wiedzielibyśmy, że
jest jednokierunkowa; istnienie takiej funkcji natychmiastowo implikuje przecież
jest jednokierunkowa; istnienie takiej funkcji natychmiastowo implikuje przecież
nierówność <math>\displaystyle P \neq NP</math>. Jest jednak kilku "kandydatów" na funkcje jednokierunkowe
nierówność <math>P \neq NP</math>. Jest jednak kilku "kandydatów" na funkcje jednokierunkowe, dla których nie znamy efektywnego algorytmu pozwalającego
-- to znaczy funkcji, dla których nie znamy efektywnego algorytmu pozwalającego
na ich odwrócenie. Jedną z takich funkcji jest <math>f_{MUL}</math>. Argumentami
na ich odwrócenie. Jedną z takich funkcji jest funkcja <math>\displaystyle f_{MUL}</math>. Argumentami
tej funkcji są dwie liczby pierwsze wraz ze swoimi certyfikatami pierwszości.
tej funkcji są dwie liczby pierwsze wraz ze swoimi certyfikatami pierwszości.
Wartością funkcji jest iloczyn tych dwóch liczb. Bardziej formalnie:
Wartością funkcji jest iloczyn tych dwóch liczb. Bardziej formalnie:
* jeżeli <math>\displaystyle w = \langle p, C(p), q, C(q) \rangle</math>, gdzie <math>\displaystyle p < q</math> a <math>\displaystyle C(p)</math> i
* jeżeli <math>w = \langle p, C(p), q, C(q) \rangle</math>, gdzie <math>p < q</math> a <math>C(p)</math> i <math>C(q)</math> są certyfikatami pierwszości odpowiednio dla <math>p</math> i <math>q</math>, to
<math>\displaystyle C(q)</math> to certyfikaty pierwszości odpowiednio dla <math>\displaystyle p</math> i <math>\displaystyle q</math>, to
 
<math>f_{MUL}(w) = 1 p \cdot q</math>,


<math>\displaystyle f_{MUL}(w) = 1 p \cdot q</math>
* w przeciwnym przypadku
* w przeciwnym przypadku


<math>\displaystyle f_{MUL}(w) = 0 w</math>
<math>f_{MUL}(w) = 0 w</math>.


Korzystamy tutaj z faktu, że możemy wymusić jednoznaczną reprezentację
Korzystamy tutaj z faktu, że możemy wymusić jednoznaczną reprezentację
certyfikatu pierwszości dla danej liczby, oraz że certyfikaty mają rozmiar
certyfikatu pierwszości dla danej liczby oraz że certyfikaty mają rozmiar
wielomianowo zależny od rozmiaru certyfikowanych liczb. <math>\displaystyle f_{MUL}</math> jest zatem
wielomianowo zależny od rozmiaru certyfikowanych liczb. <math>f_{MUL}</math> jest zatem
różnowartościowa i nie "skraca" nadmiernie słowa wejściowego.
różnowartościowa i nie "skraca" nadmiernie słowa wejściowego.


Linia 178: Linia 170:
jest na zagadnieniu z dziedziny teorii liczb -- problemie logarytmu dyskretnego.
jest na zagadnieniu z dziedziny teorii liczb -- problemie logarytmu dyskretnego.
Funkcję tą można zdefiniować w następujący sposób:
Funkcję tą można zdefiniować w następujący sposób:
* dla <math>\displaystyle w</math> postaci <math>\displaystyle \langle p, C(p), r, x \rangle</math>, gdzie <math>\displaystyle p</math> jest liczbą
* dla <math>w</math> postaci <math>\langle p, C(p), r, x \rangle</math>, gdzie <math>p</math> jest liczbą pierwszą, <math>C(p)</math> certyfikatem jej pierwszości, <math>r</math> jest najmniejszym generatorem grupy cyklicznej <math>\mathbb{Z}_p^\star</math>, a <math>x</math> jest liczbą naturalną z zakresu <math>[1, p-1]</math>
pierwszą, <math>\displaystyle C(p)</math> certyfikatem jej pierwszości, <math>\displaystyle r</math> jest najmniejszym
 
generatorem grupy cyklicznej <math>\displaystyle \mathbb{Z}_p^\star</math>, a <math>\displaystyle x</math> jest liczbą
<math>f_{EXP}(w) = 1 \langle p, r, r^x mod p)\rangle</math>
naturalną z zakresu <math>\displaystyle [1, p-1]\displaystyle f_{EXP}(w) = 1 \langle p, r, r^x mod p)\rangle</math>
 
* dla pozostałych <math>\displaystyle w\displaystyle f_{EXP}(w) = 0 w</math>
* dla pozostałych <math>w</math>


W tym przypadku aby odwrócić funkcję <math>\displaystyle f_{EXP}</math> musielibyśmy na podstawie
<math>f_{EXP}(w) = 0 w</math>.
liczb <math>\displaystyle p</math>, <math>\displaystyle r</math> i <math>\displaystyle r^x mod p</math> umieć obliczyć wartość <math>\displaystyle x</math>. Również dla tego,
znanego od wielu lat, problemu nie znamy wydajnego rozwiązania.


Jak zauważyliśmy we wprowadzeniu do tego rozdziału w kryptografii duża złożoność
W tym przypadku, aby odwrócić funkcję <math>f_{EXP}</math>, musielibyśmy na podstawie
liczb <math>p</math>, <math>r</math> i <math>r^x mod p</math> umieć obliczyć wartość <math>x</math>. Również dla tego,
znanego od wielu lat, problemu nie potrafimy przedstawić wydajnego rozwiązania.
 
Jak zauważyliśmy, we wprowadzeniu do tego rozdziału, w kryptografii duża złożoność
pesymistyczna próby zdekodowania zaszyfrowanej wiadomości nie jest własnością
pesymistyczna próby zdekodowania zaszyfrowanej wiadomości nie jest własnością
wystarczającą. Z tego powodu przytoczymy alternatywną definicję funkcji
wystarczającą. Z tego powodu przytoczymy alternatywną definicję funkcji
Linia 194: Linia 188:
że definicja ta jest istotnie różna od definicji podanej wcześniej.
że definicja ta jest istotnie różna od definicji podanej wcześniej.


{{definicja|||
{{definicja|1.7||
Niech <math>\displaystyle f: \{ 0, 1 \}^\star \rightarrow \{ 0, 1 \}^\star</math>. Mówimy, że <math>\displaystyle f</math> jest
Niech <math>f: \{ 0, 1 \}^\star \rightarrow \{ 0, 1 \}^\star</math>. Mówimy, że <math>f</math> jest
''funkcją jednokierunkową'' wtedy i tylko wtedy gdy:
''funkcją jednokierunkową'' wtedy i tylko wtedy, gdy:
* <math>\displaystyle f</math> jest obliczalna w czasie wielomianowym,
* <math>f</math> jest obliczalna w czasie wielomianowym,
* <math>\displaystyle f</math> nie jest stale równa <math>\displaystyle \epsilon</math> (słowu pustemu),
* <math>f</math> nie jest stale równa <math>\epsilon</math> (słowu pustemu),
* istnieje pewna stała <math>\displaystyle k > 1</math> taka, że <math>\displaystyle \forall_{x \in \{0, 1\}^\star}
* istnieje pewna stała <math>k > 1</math> taka, że <math>\forall_{x \in \{0, 1\}^\star} f(x) = \epsilon \vee |x|^{1/k} \leq f(x) \leq |x|^k</math>,
f(x) = \epsilon \vee |x|^{1/k} \leq f(x) \leq |x|^k</math>,
* jeżeli <math>x</math> i <math>y</math> są słowami nad alfabetem <math>\{ 0, 1 \}</math> i <math>f(x) = f(y)</math>, to <math>x = y</math> lub <math>f(x) = f(y) = \epsilon</math>,
* jeżeli <math>\displaystyle x</math> i <math>\displaystyle y</math> są słowami nad alfabetem <math>\displaystyle \{ 0, 1 \}</math> i <math>\displaystyle f(x) = f(y)</math>,
* dla każdej losowej maszyny Turinga <math>E</math> działającej w czasie wielomianowym, każdej liczby <math>l</math> i dostatecznie dużej liczby <math>n</math>, jeżeli <math>x</math> jest losowym słowem ze zbioru <math>\{ x': |x'| \leq n \wedge f(x') \neq \epsilon \}</math>, to
to <math>\displaystyle x = y</math> lub <math>\displaystyle f(x) = f(y) = \epsilon</math>,
* dla każdej losowej maszyny Turinga <math>\displaystyle E</math> działającej w czasie wielomianowym,
każdej liczby <math>\displaystyle l</math> i dostatecznie
dużej liczby <math>\displaystyle n</math>, jeżeli <math>\displaystyle x</math> jest losowym słowem ze zbioru
<math>\displaystyle \{ x': |x'| \leq n \wedge f(x') \neq \epsilon \}</math>, to


<math>\displaystyle Pr[E(f(x)) = x] \leq n^{-l}</math>
<math>Pr[E(f(x)) = x] \leq n^{-l}</math>.


}}
}}


W tej definicji zrezygnowaliśmy z wymagania o różnowartościowości funkcji;
W tej definicji zrezygnowaliśmy z wymagania o różnowartościowości funkcji;
zamiast tego dopuszczamy, aby różne słowa dawały jako wynik wartość <math>\displaystyle \epsilon</math>,
zamiast tego dopuszczamy, aby różne słowa dawały jako wynik wartość <math>\epsilon</math>,
którą możemy traktować jako odpowiedź mówiącą, że wejście jest nieprawidłowe;
którą możemy traktować jako odpowiedź mówiącą, że wejście jest nieprawidłowe;
dla przykładu przy adaptowaniu funkcji <math>\displaystyle f_{MUL}</math> do powyższej definicji,
dla przykładu przy adaptowaniu funkcji <math>f_{MUL}</math> do powyższej definicji,
w przypadku gdy <math>\displaystyle p</math> lub <math>\displaystyle q</math> nie będą liczbami pierwszymi, lub gdy <math>\displaystyle C(p)</math> lub
w przypadku gdy <math>p</math> lub <math>q</math> nie będą liczbami pierwszymi lub gdy <math>C(p)</math>, lub
<math>\displaystyle C(q)</math> nie będą odpowiednimi certyfikatami, funkcja zwróci wartość <math>\displaystyle \epsilon</math>.
<math>C(q)</math> nie będą odpowiednimi certyfikatami, funkcja zwróci wartość <math>\epsilon</math>.
Zauważmy, że w powyższej definicji interesuje nas tylko trudność odszyfrowania
Zauważmy, że w powyższej definicji interesuje nas tylko trudność odszyfrowania
wartości funkcji dla poprawnych wejść -- to znaczy w przypadku <math>\displaystyle f_{MUL}</math> dla
wartości funkcji dla poprawnych wejść -- to znaczy w przypadku <math>f_{MUL}</math> dla
par liczb, które są pierwsze i których pierwszość jest potwierdzana przez
par liczb, które są pierwsze i których pierwszość jest potwierdzana przez
<math>\displaystyle C(p)</math> i <math>\displaystyle C(q)</math>. Funkcje <math>\displaystyle f_{MUL}</math>
<math>C(p)</math> i <math>C(q)</math>. Funkcje <math>f_{MUL}</math>
jak i <math>\displaystyle f_{EXP}</math> -- po odpowiednim ich zmodyfikowaniu w sposób przedstawiony
jak i <math>f_{EXP}</math> -- po odpowiednim ich zmodyfikowaniu w sposób przedstawiony
powyżej -- są poważnymi "kandydatami" na funkcje jednokierunkowe również w
powyżej -- są poważnymi "kandydatami" na funkcje jednokierunkowe również w
sensie definicji opisanej w poprzednim paragrafie.
sensie definicji opisanej w poprzednim paragrafie.
Linia 229: Linia 218:
mogą się przydać w kryptografii. Otóż widzimy, że jedna ze stron -- zwyczajowo
mogą się przydać w kryptografii. Otóż widzimy, że jedna ze stron -- zwyczajowo
zwana Alicją -- może wydajnie zaszyfrować swoją wiadomość, na przykład używając
zwana Alicją -- może wydajnie zaszyfrować swoją wiadomość, na przykład używając
ją jako argument <math>\displaystyle x</math> do funkcji <math>\displaystyle f_{EXP}</math>. Niestety druga strona -- zazwyczaj
ją jako argument <math>x</math> do funkcji <math>f_{EXP}</math>. Niestety druga strona -- zazwyczaj
zwana Bob -- może mieć duże trudności z odszyfrowaniem wiadomości. W tej
o imieniu Bob -- może mieć duże trudności z odszyfrowaniem wiadomości. W tej
sytuacji fakt, że osoba podsłuchująca -- Cecylia -- niczego ciekawego się
sytuacji fakt, że osoba podsłuchująca -- Cecylia -- niczego ciekawego się
nie dowie, stanowi słabe pocieszenie.
nie dowie, stanowi słabe pocieszenie.
Linia 237: Linia 226:
ale również możliwość odebrania tej wiadomości, Bob musi posiadać pewną tajną
ale również możliwość odebrania tej wiadomości, Bob musi posiadać pewną tajną
wiedzę, pozwalającą na wydajne odwrócenie funkcji szyfrującej. Zdefiniujemy
wiedzę, pozwalającą na wydajne odwrócenie funkcji szyfrującej. Zdefiniujemy
teraz pewną modyfikację pojęcia funkcji jednokierunkowej, mającą szersze
teraz pewną modyfikację pojęcia funkcji jednokierunkowej mającą szersze
zastosowanie w kryptografii.
zastosowanie w kryptografii.


{{definicja|||
{{definicja|1.8||
Niech <math>\displaystyle f: \{ 0,1 \}^\star \times \{ 0,1 \}^\star \rightarrow \{ 0,1 \}^\star</math>.
Niech <math>f: \{ 0,1 \}^\star \times \{ 0,1 \}^\star \rightarrow \{ 0,1 \}^\star</math>.
Mówimy, że <math>\displaystyle f</math> jest ''funkcją z wytrychem'' wtedy i tylko wtedy gdy istnieje
Mówimy, że <math>f</math> jest ''funkcją z wytrychem'' wtedy i tylko wtedy gdy istnieje
losowa maszyna Turinga <math>\displaystyle G</math> oraz funkcja
losowa maszyna Turinga <math>G</math> oraz funkcja
<math>\displaystyle h:\{ 0,1 \}^\star \times \{ 0,1 \}^\star \rightarrow \{ 0,1 \}^\star</math> taka, że:
<math>h:\{ 0,1 \}^\star \times \{ 0,1 \}^\star \rightarrow \{ 0,1 \}^\star</math> taka, że:
* funkcje <math>\displaystyle f</math> i <math>\displaystyle h</math> są obliczalne w czasie wielomianowym,
* funkcje <math>f</math> i <math>h</math> są obliczalne w czasie wielomianowym,
* <math>\displaystyle G</math> oczekuje na wejściu słowa nad alfabetem <math>\displaystyle \{ 0, 1\}</math>, zwraca zakodowaną
* <math>G</math> oczekuje na wejściu słowa nad alfabetem <math>\{ 0, 1\}</math>, zwraca zakodowaną parę słów nad alfabetem <math>\{0, 1\}</math> i działa w czasie wielomianowym,
parę słów nad alfabetem <math>\displaystyle \{0, 1\}</math> i działa w czasie wielomianowym,
* istnieje stała <math>k > 1</math> taka, że jeżeli <math>\langle i, t \rangle</math> stanowi wynik działania maszyny <math>M</math> dla słowa <math>1^n</math>, natomiast <math>x</math> jest słowem o długości nie większej niż <math>n</math>, to <math>|\langle i, x \rangle |^{1/k} \leq |\langle t, f(i, x) \rangle | \leq |\langle i, x \rangle |^k</math>,  
* istnieje stała <math>\displaystyle k > 1</math> taka, że
* jeżeli <math>\langle i, t \rangle</math> stanowi wynik działania maszyny <math>M</math> dla słowa <math>1^n</math>, natomiast <math>x</math> i <math>y</math> są słowami o długości nie większej niż <math>n</math>, to  
jeżeli <math>\displaystyle \langle i, t \rangle</math> stanowi wynik działania maszyny <math>\displaystyle M</math> dla
słowa <math>\displaystyle 1^n</math>, natomiast <math>\displaystyle x</math> jest słowem o długości nie większej niż <math>\displaystyle n</math>, to
<math>\displaystyle |\langle i, x \rangle |^{1/k} \leq |\langle t, f(i, x) \rangle | \leq |\langle i, x \rangle |^k</math>,  
* jeżeli <math>\displaystyle \langle i, t \rangle</math> stanowi wynik działania maszyny <math>\displaystyle M</math> dla
słowa <math>\displaystyle 1^n</math>, natomiast <math>\displaystyle x</math> i <math>\displaystyle y</math> są słowami o długości nie większej niż <math>\displaystyle n</math>, to
<math>\displaystyle f(i,x) = f(i,y) \Rightarrow x=y</math>, 
* dla każdej losowej maszyny Turinga <math>\displaystyle E</math>, każdej liczby <math>\displaystyle l</math> i dostatecznie
dużej liczby <math>\displaystyle n</math>, jeżeli <math>\displaystyle \langle i, t \rangle</math> stanowi wynik działania
maszyny <math>\displaystyle M</math> dla słowa <math>\displaystyle 1^n</math>, <math>\displaystyle x</math> jest losowym słowem nad alfabetem <math>\displaystyle \{ 0, 1\}</math>
nie dłuższym niż <math>\displaystyle n</math>, to


<math>\displaystyle Pr[E(i, f(i, x)) = x] \leq n^{-l}</math>
<math>f(i,x) = f(i,y) \Rightarrow x=y</math>, 
* Dla każdego <math>\displaystyle n</math>, każdego słowa <math>\displaystyle x</math> nie dłuższego niż <math>\displaystyle n</math> i każdej pary
 
<math>\displaystyle \langle i, t \rangle</math> mogącej być wynikiem działania maszyny <math>\displaystyle G</math> dla słowa
* dla każdej losowej maszyny Turinga <math>E</math>, każdej liczby <math>l</math> i dostatecznie dużej liczby <math>n</math>, jeżeli <math>\langle i, t \rangle</math> stanowi wynik działania maszyny <math>M</math> dla słowa <math>1^n</math>, <math>x</math> jest losowym słowem nad alfabetem <math>\{ 0, 1\}</math> nie dłuższym niż <math>n</math>, to
wejściowego <math>\displaystyle 1^n\displaystyle h(t, f(i, x)) = x</math>
 
<math>Pr[E(i, f(i, x)) = x] \leq n^{-l}</math>,
 
* dla każdego <math>n</math>, każdego słowa <math>x</math> nie dłuższego niż <math>n</math> i każdej pary <math>\langle i, t \rangle</math> mogącej być wynikiem działania maszyny <math>G</math>, dla słowa wejściowego <math>1^nh(t, f(i, x)) = x</math>.


}}
}}
Linia 270: Linia 252:
kryptograficznych z kluczem publicznym. Sposób postępowania jest w tym przypadku
kryptograficznych z kluczem publicznym. Sposób postępowania jest w tym przypadku
następujący:
następujący:
* Bob ustala długość przekazywanych wiadomości (<math>\displaystyle n</math>) oraz parametr
* Bob ustala długość przekazywanych wiadomości (<math>n</math>) oraz parametr wyznaczający prawdopodobieństwo odszyfrowania pojedynczej wiadomości (<math>k</math>),
wyznaczający prawdopodobieństwo odszyfrowania pojedynczej wiadomości (<math>\displaystyle k</math>),
* Bob uruchamia maszynę <math>G</math> i otrzymuje parę słów <math>\langle i, t\rangle</math>. Słowo <math>i</math> staje się dostępnym dla wszystkich kluczem publicznym, natomiast <math>t</math> pozostaje tajemnicą znaną tylko Bobowi,
* Bob uruchamia maszynę <math>\displaystyle G</math> i otrzymuje parę słów <math>\displaystyle \langle i, t\rangle</math>.
* Alicja, chcąc wysłać wiadomość do Boba, używa znanego jej klucza publicznego <math>i</math>. Własności funkcji z wytrychem sprawiają, że odszyfrowanie wiadomości jest łatwe dla Boba, natomiast trudne dla osób trzecich nieznających klucza <math>t</math>.
Słowo <math>\displaystyle i</math> staje się dostępnym dla wszystkich kluczem publicznym, natomiast
<math>\displaystyle t</math> pozostaje tajemnicą znaną tylko Bobowi,
* Alicja, chcąc wysłać wiadomość do Boba, używa znanego jej klucza
publicznego <math>\displaystyle i</math>. Własności funkcji z wytrychem sprawiają, że odszyfrowanie
wiadomości jest łatwe dla Boba, natomiast trudne dla osób trzecich nie
znających klucza <math>\displaystyle t</math>.


Najbardziej znanym systemem kryptograficznym opartym na powyższej zasadzie
Najbardziej znanym systemem kryptograficznym opartym na powyższej zasadzie
Linia 284: Linia 260:
mówiącego, że RSA spełnia warunki określone w definicji funkcji z wytrychem.
mówiącego, że RSA spełnia warunki określone w definicji funkcji z wytrychem.


Prześledźmy teraz w jaki sposób zdefiniowane są <math>\displaystyle f</math>, <math>\displaystyle h</math> i <math>\displaystyle G</math> dla systemu RSA.
Prześledźmy teraz, w jaki sposób zdefiniowane są <math>f</math>, <math>h</math> i <math>G</math> dla systemu RSA.


Zadaniem maszyny <math>\displaystyle G</math> jest wygenerowanie pary kluczy. W tym celu losuje ona
Zadaniem maszyny <math>G</math> jest wygenerowanie pary kluczy. W tym celu losuje ona
dwie liczby pierwsze <math>\displaystyle p</math> i <math>\displaystyle q</math>, z których każda ma długość większą niż
dwie liczby pierwsze <math>p</math> i <math>q</math>, z których każda ma długość większą niż
<math>\displaystyle n / 2</math> (gdzie <math>\displaystyle n</math> to długość przekazywanych wiadomości). Następnie oblicza
<math>n / 2</math> (gdzie <math>n</math> to długość przekazywanych wiadomości). Następnie oblicza
ona liczbę <math>\displaystyle N = p \cdot q</math> oraz wartość funkcji Eulera dla tej liczby:
ona liczbę <math>N = p \cdot q</math> oraz wartość funkcji Eulera dla tej liczby:
<math>\displaystyle \phi(N) = (p-1)\cdot(q-1)</math>. W kolejnym kroku znajdowana jest dowolna liczba
<math>\phi(N) = (p-1)\cdot(q-1)</math>. W kolejnym kroku znajdywana jest dowolna liczba
<math>\displaystyle e</math> z zakresu <math>\displaystyle [2, N-2]</math>, względnie pierwsza z <math>\displaystyle \phi(N)</math>. Dla liczby <math>\displaystyle e</math>
<math>e</math> z zakresu <math>[2, N-2]</math>, względnie pierwsza z <math>\phi(N)</math>. Dla liczby <math>e</math>
znajdywana jest następnie liczba <math>\displaystyle d</math> z zakresu <math>\displaystyle [2, N-2]</math> taka, że
znajdywana jest następnie liczba <math>d</math> z zakresu <math>[2, N-2]</math> taka, że


<math>\displaystyle d \cdot e = 1 mod \phi(N)</math>
<math>d \cdot e = 1 mod \phi(N)</math>.


Istnienie takiej liczby spowodowane jest faktem, że <math>\displaystyle e</math> i <math>\displaystyle \phi(N)</math> są
Istnienie takiej liczby spowodowane jest faktem, że <math>e</math> i <math>\phi(N)</math> są
względnie pierwsze; liczbę <math>\displaystyle d</math> można efektywnie obliczyć z użyciem uogólnionego
względnie pierwsze; liczbę <math>d</math> można efektywnie obliczyć z użyciem uogólnionego
algorytmu Euklidesa.
algorytmu Euklidesa.


W tym momencie można już zdefiniować parę kluczy: Kluczem publicznym jest
W tym momencie można już zdefiniować parę kluczy: kluczem publicznym jest
para liczb <math>\displaystyle e</math> oraz <math>\displaystyle N</math>. Kluczem prywatnym jest para liczb <math>\displaystyle d</math> oraz <math>\displaystyle N</math>.
para liczb <math>e</math> oraz <math>N</math>; kluczem prywatnym jest para liczb <math>d</math> oraz <math>N</math>.
Szyfrowanie słowa <math>\displaystyle x</math> wygląda następująco:
Szyfrowanie słowa <math>x</math> wygląda następująco:


<math>\displaystyle f(\langle e, N \rangle, x) = x^e mod N</math>
<math>f(\langle e, N \rangle, x) = x^e mod N</math>,


przy czym wiadomość <math>\displaystyle x</math> traktujemy jako binarny zapis pewnej liczby naturalnej.
przy czym wiadomość <math>x</math> traktujemy jako binarny zapis pewnej liczby naturalnej.
Dekodowanie słowa <math>\displaystyle y</math> określone jest w praktycznie identyczny sposób:
Dekodowanie słowa <math>y</math> określone jest w praktycznie identyczny sposób:


<math>\displaystyle h(\langle d, N \rangle, y) = y^d mod N</math>
<math>h(\langle d, N \rangle, y) = y^d mod N</math>.


Wystarczy teraz przypomnieć sobie, że iloczyn <math>\displaystyle d \cdot e</math> jest postaci
Wystarczy teraz przypomnieć sobie, że iloczyn <math>d \cdot e</math> jest postaci
<math>\displaystyle k\cdot\phi(N) + 1</math>, dla pewnej liczby całkowitej <math>\displaystyle k</math>. W związku z tym
<math>k\cdot\phi(N) + 1</math>, dla pewnej liczby całkowitej <math>k</math>. W związku z tym


<math>\displaystyle h(\langle d, N \rangle, f(\langle e, N \rangle, x)) = (x^e)^d mod N =  
<math>h(\langle d, N \rangle, f(\langle e, N \rangle, x)) = (x^e)^d mod N =  
x^{k\cdot\phi(N) + 1} mod N = x^{k\cdot\phi(N)}\cdot x mod N = x</math>
x^{k\cdot\phi(N) + 1} mod N = x^{k\cdot\phi(N)}\cdot x mod N = x</math>.


Widzimy zatem, że funkcja <math>\displaystyle h</math> poprawnie dekoduje słowa zaszyfrowane z użyciem
Widzimy zatem, że funkcja <math>h</math> poprawnie dekoduje słowa zaszyfrowane z użyciem funkcji <math>f</math> -- Bob będzie zatem w stanie odtworzyć wiadomość wysłaną przez Alicję.
funkcji <math>\displaystyle f</math> -- Bob będzie zatem w stanie odtworzyć wiadomość wysłaną przez
Alicję.


==Systemy dowodów interaktywnych==
==Systemy dowodów interaktywnych==


W ostatnim fragmencie niniejszego kursu zajmiemy się klasą złożoności, będącą
W ostatnim fragmencie niniejszego kursu zajmiemy się klasą złożoności, będącą
uogólnieniem klas <math>\displaystyle NP</math> i <math>\displaystyle BPP</math>. W tym celu zdefiniujemy pojęcie ''systemu
uogólnieniem klas <math>NP</math> i <math>BPP</math>. W tym celu zdefiniujemy pojęcie ''systemu dowodów interaktywnych''.
dowodów interaktywnych''.


{{definicja|Systemem dowodów interaktywnych||
{{definicja|2.1||
nazywamy parę funkcji <math>\displaystyle V</math> oraz <math>\displaystyle P</math> o
Systemem dowodów interaktywnych nazywamy parę funkcji <math>V</math> oraz <math>P</math> o sygnaturach:
sygnaturach:


<math>\displaystyle V: \Sigma^\star \times \Sigma^\star \times \Sigma^\star \rightarrow
<math>V: \Sigma^\star \times \Sigma^\star \times \Sigma^\star \rightarrow
\Sigma^\star \cup \{ accept, reject \}\displaystyle P: \Sigma^\star \times \Sigma^\star\rightarrow
\Sigma^\star \cup \{ accept, reject \}P: \Sigma^\star \times \Sigma^\star\rightarrow
\Sigma^\star</math>
\Sigma^\star</math>


taką, że funkcja <math>\displaystyle V</math> jest obliczalna na maszynie Turinga.
taką, że funkcja <math>V</math> jest obliczalna na maszynie Turinga.
}}
}}


Działanie systemu
Działanie systemu dowodów interaktywnych polega na wymianie komunikatów między funkcjami <math>V</math> i <math>P</math>, przy czym funkcja <math>P</math> (z angielskiego ''prover'') stara się "przekonać"
dowodów interaktywnych polega na wymianie komunikatów między funkcjami <math>\displaystyle V</math> i
funkcję <math>V</math> (''verifier'') o tym, że słowo wejściowe należy do rozpatrywanego języka, natomiast ostateczna decyzja w tej sprawie należy do <math>V</math>.
<math>\displaystyle P</math>, przy czym funkcja <math>\displaystyle P</math> (z angielskiego ''prover'') stara się "przekonać"
funkcję <math>\displaystyle V</math> (''verifier'') o tym, że słowo wejściowe należy do rozpatrywanego
języka, natomiast ostateczna decyzja w tej sprawie należy do <math>\displaystyle V</math>.


Komunikacja odbywa się naprzemiennie: Funkcja <math>\displaystyle V</math> generuje wiadomość,
Komunikacja odbywa się naprzemiennie: funkcja <math>V</math> generuje wiadomość,
przekazywaną funkcji <math>\displaystyle P</math> jako argument; funkcja <math>\displaystyle P</math> z kolei generuje
przekazywaną funkcji <math>P</math> jako argument; funkcja <math>P</math> z kolei generuje odpowiedź przekazywaną funkcji <math>V</math> w następnej iteracji. Taka komunikacja odbywa się do momentu zaakceptowania lub odrzucenia słowa wejściowego przez funkcję <math>V</math>. W każdym kroku obie funkcje mają do dyspozycji zarówno słowo wejściowe, jak również pełną historię przekazanych dotychczas wiadomości.
odpowiedź przekazywaną funkcji <math>\displaystyle V</math> w następnej iteracji. Taka komunikacja
odbywa się do momentu zaakceptowania lub odrzucenia słowa wejściowego przez
funkcję <math>\displaystyle V</math>. W każdym kroku obie funkcje mają do dyspozycji zarówno słowo
wejściowe, jak również pełną historię przekazanych dotychczas wiadomości.


Określmy teraz, co dokładnie oznaczają argumenty funkcji <math>\displaystyle V</math> i <math>\displaystyle P</math>. Argumenty
Określmy teraz, co dokładnie oznaczają argumenty funkcji <math>V</math> i <math>P</math>. Argumenty funkcji <math>V</math> będziemy oznaczać w następujący sposób:
funkcji <math>\displaystyle V</math> będziemy oznaczać w następujący sposób:


<math>\displaystyle V(w, r, m_1 \# m_2 \# \ldots \# m_i)</math>
<math>V(w, r, m_1 \# m_2 \# \ldots \# m_i)</math>.


Mają one następujące znaczenie:
Mają one następujące znaczenie:
* <math>\displaystyle w</math> to słowo wejściowe,
* <math>w</math> to słowo wejściowe,
* <math>\displaystyle r</math> jest losowym ciągiem bitów,
* <math>r</math> jest losowym ciągiem bitów,
* <math>\displaystyle m_1 \# m_2 \# \ldots \# m_i</math> to konkatenacja dotychczasowych wiadomości,
* <math>m_1 \# m_2 \# \ldots \# m_i</math> to konkatenacja dotychczasowych wiadomości, które zostały przekazane w procesie komunikacji (wiadomości o indeksach nieparzystych wynikami działania funkcji <math>V</math>, natomiast wiadomości o indeksach parzystych wynikami działania funkcji <math>P</math>).
które zostały przekazane w procesie komunikacji (wiadomości o indeksach
nieparzystych sa wynikami działania funkcji <math>\displaystyle V</math>, natomiast wiadomości o
indeksach parzystych sa wynikami działania funkcji <math>\displaystyle P</math>).


Zwróćmy uwagę, że <math>\displaystyle V</math> ma do dyspozycji losowe słowo <math>\displaystyle r</math>; w praktyce oznacza to,
Zwróćmy uwagę, że <math>V</math> ma do dyspozycji losowe słowo <math>r</math>; w praktyce oznacza to,
że o funkcji <math>\displaystyle V</math> będziemy myśleć jako o pewnej losowej maszynie Turinga.
że o funkcji <math>V</math> będziemy myśleć jako o pewnej losowej maszynie Turinga.


Zakładamy, że zarówno <math>\displaystyle w</math> jak i <math>\displaystyle r</math> są stałe w kolejnych iteracjach; słowo <math>\displaystyle r</math>
Zakładamy, że zarówno <math>w</math> jak i <math>r</math> są stałe w kolejnych iteracjach; słowo <math>r</math>
jest zatem losowane jednokrotnie, przed rozpoczęciem procesu komunikacji. Warto
jest zatem losowane jednokrotnie, przed rozpoczęciem procesu komunikacji. Warto
też zauważyć, że słowa <math>\displaystyle w</math> i <math>\displaystyle r</math> całkowicie determinują działanie systemu.
też zauważyć, że słowa <math>w</math> i <math>r</math> całkowicie determinują działanie systemu.


Argumenty funkcji <math>\displaystyle P</math> będziemy oznaczać następująco:
Argumenty funkcji <math>P</math> będziemy oznaczać następująco:


<math>\displaystyle P(w, m_1 \# m_2 \# \ldots \# m_i)</math>
<math>P(w, m_1 \# m_2 \# \ldots \# m_i)</math>.


Ich znaczenie jest identyczne jak w przypadku argumentów funkcji <math>\displaystyle V</math>, nie ma
Ich znaczenie jest identyczne jak w przypadku argumentów funkcji <math>V</math>, nie ma wśród nich jednak słowa losowego.
wśród nich jednak słowa losowego.


Możemy w tym momencie zdefiniować klasę <math>\displaystyle IP</math>:
Możemy w tym momencie zdefiniować klasę <math>IP</math>:


{{definicja|||
{{definicja|2.2||
Niech <math>\displaystyle L \subseteq \Sigma^\star</math>. Mówimy, że <math>\displaystyle L \in IP</math> wtedy i tylko wtedy
Niech <math>L \subseteq \Sigma^\star</math>. Mówimy, że <math>L \in IP</math> wtedy i tylko wtedy, gdy istnieje system dowodów interaktywnych <math>(V, P)</math> oraz wielomiany <math>p(n)</math> i <math>q(n)</math> takie, że dla każdego słowa wejściowego <math>w</math> oraz losowego słowa <math>r</math> o długości <math>p(|x|)</math>:
gdy istnieje system dowodów interaktywnych <math>\displaystyle (V, P)</math> oraz wielomiany <math>\displaystyle p(n)</math> i
* system daje odpowiedź po co najwyżej <math>p(|x|)</math> krokach,
<math>\displaystyle q(n)</math> takie,
* w każdej iteracji czas działania maszyny obliczającej funkcję <math>V</math> jest ograniczony od góry przez <math>q(|x|)</math>,
że dla każdego słowa wejściowego <math>\displaystyle w</math> oraz losowego słowa <math>\displaystyle r</math> o długości
* długość każdej wiadomości <math>m_i</math> jest nie większa niż <math>p(|x|)</math>,
<math>\displaystyle p(|x|)</math>:
* jeżeli <math>w \in L</math>, to prawdopodobieństwo zaakceptowania słowa przez system wynosi co najmniej <math>2/3</math>,
* system daje odpowiedź po co najwyżej <math>\displaystyle p(|x|)</math> krokach,
* jeżeli <math>w \notin L</math> oraz <math>\bar P</math> jest dowolną funkcją o sygnaturze zgodnej z <math>P</math>, zwracającą wiadomości nie dłuższe niż <math>p(|x|)</math>, to system <math>(V, \bar P)</math> spełnia powyższe założenia na ilość iteracji, czas działania i długość wiadomości oraz akceptuje słowo <math>w</math> z prawdopodobieństwem nie większym niż <math>1/3</math>.
* w każdej iteracji czas działania maszyny obliczającej funkcję <math>\displaystyle V</math> jest
ograniczony od góry przez <math>\displaystyle q(|x|)</math>,
* długość każdej wiadomości <math>\displaystyle m_i</math> jest nie większa niż <math>\displaystyle p(|x|)</math>,
* jeżeli <math>\displaystyle w \in L</math> to prawdopodobieństwo zaakceptowania słowa przez system
wynosi co najmniej <math>\displaystyle 2/3</math>,
* jeżeli <math>\displaystyle w \notin L</math> oraz <math>\displaystyle \bar P</math> jest dowolną funkcją o sygnaturze zgodnej
z <math>\displaystyle P</math>, zwracającą wiadomości nie dłuższe niż <math>\displaystyle p(|x|)</math>, to system <math>\displaystyle (V, \bar P)</math>
spełnia powyższe założenia na ilość iteracji, czas działania i długość
wiadomości oraz akceptuje słowo <math>\displaystyle w</math> z prawdopodobieństwem nie większym niż
<math>\displaystyle 1/3</math>.


O systemie <math>\displaystyle (V, P)</math> mówimy, że rozpoznaje język <math>\displaystyle L</math> w czasie wielomianowym.
O systemie <math>(V, P)</math> mówimy, że rozpoznaje język <math>L</math> w czasie wielomianowym.
}}
}}


Innymi słowy jeżeli słowo <math>\displaystyle w</math> należy do języka, to <math>\displaystyle V</math> z dużym prawdopodobieństwem
Innymi słowy, jeżeli słowo <math>w</math> należy do języka, to <math>V</math> z dużym prawdopodobieństwem
da się przekonać o tej przynależności przez pewną ustaloną funkcję <math>\displaystyle P</math>. Jeżeli
da się przekonać o tej przynależności przez pewną ustaloną funkcję <math>P</math>. Jeżeli
jednak <math>\displaystyle w</math> nie należy do <math>\displaystyle L</math>, to <math>\displaystyle V</math> nie da się oszukać ''żadnej'' funkcji
jednak <math>w</math> nie należy do <math>L</math>, to <math>V</math> nie da się oszukać ''żadnej'' funkcji
<math>\displaystyle \bar P</math> ze zbyt dużym prawdopodobieństwem.
<math>\bar P</math> ze zbyt dużym prawdopodobieństwem.


{{uwaga|||
{{uwaga|2.3||
Zwróćmy jeszcze uwagę, że branie pod uwagę tylko takich funkcji <math>\displaystyle \bar P</math>, które
Zwróćmy jeszcze uwagę, że branie pod uwagę tylko takich funkcji <math>\bar P</math>, które
nie zwracają zbyt długich słów nie jest istotnym ograniczeniem; funkcja <math>\displaystyle V</math>
nie zwracają zbyt długich słów, nie jest istotnym ograniczeniem; funkcja <math>V</math>
może w każdym kroku sprawdzać, czy odpowiedź funkcji <math>\displaystyle \bar P</math> nie jest zbyt
może w każdym kroku sprawdzać, czy odpowiedź funkcji <math>\bar P</math> nie jest zbyt
długa i jeśli tak to odrzucać słowo. W dalszej części rozdziału będziemy
długa i jeśli tak, to odrzucać słowo. W dalszej części rozdziału będziemy
zakładali takie właśnie zachowanie funkcji <math>\displaystyle V</math>.
zakładali takie właśnie zachowanie funkcji <math>V</math>.
}}
}}


Widzimy zatem, że funkcja <math>\displaystyle V</math> musi być zabezpieczona przed oszustwami; jeżeli
Widzimy zatem, że funkcja <math>V</math> musi być zabezpieczona przed oszustwami; jeżeli <math>V</math> mogłaby zaufać funkcji <math>P</math>, to mogłaby rozwiązać każdy problem decyzyjny -- wystarczyłoby po prostu skorzystać z nieograniczonej mocy obliczeniowej <math>P</math>.
<math>\displaystyle V</math> mogłaby zaufać funkcji <math>\displaystyle P</math> to mogłaby rozwiązać każdy problem decyzyjny
W naszym przypadku jednak nie wystarczy, aby <math>P</math> tylko rozwiązała problem decyzyjny -- musi jeszcze przekonać <math>V</math> do swojego rozwiązania.
-- wystarczyłoby po prostu skorzystać z nieograniczonej mocy obliczeniowej <math>\displaystyle P</math>.
W naszym przypadku jednak nie wystarczy aby <math>\displaystyle P</math> tylko rozwiązała problem
decyzyjny -- musi jeszcze przekonać <math>\displaystyle V</math> do swojego rozwiązania.


{{przyklad|||
{{przyklad|2.4||
Rozważmy problem <math>\displaystyle NON-GRAPH-ISO</math>. Jest on zdefiniowany następująco:
Rozważmy problem <math>NON-GRAPH-ISO</math>. Jest on zdefiniowany następująco:


<math>\displaystyle NON-GRAPH-ISO = \{ \langle G, H \rangle: </math> grafy <math>\displaystyle G</math> i <math>\displaystyle H</math> nie są izomorficzne <math>\displaystyle \}</math>
<math>NON-GRAPH-ISO = \{ \langle G, H \rangle:</math> grafy <math>G</math> i <math>H</math> nie są izomorficzne <math>\}</math>.


Łatwo sie przekonać, że problem izomorfizmu grafów jest w klasie <math>\displaystyle NP</math> --
Łatwo sie przekonać, że problem izomorfizmu grafów jest w klasie <math>NP</math> -- wystarczy zgadnąć odpowiednią permutację wierzchołków, po czym zweryfikować ją w trywialny sposób. <math>NON-GRAPH-ISO</math> należy zatem do <math>coNP</math>. Nie jest jednak obecnie znana odpowiedź na pytanie o przynależność tego problemu do
wystarczy zgadnąć odpowiednią permutację wierzchołków, po czym zweryfikować
klasy <math>NP</math>. Pokażemy teraz, w jaki sposób można rozwiązać <math>NON-GRAPH-ISO</math> za pomocą systemów dowodów interaktywnych, pokazując przynależność tego problemu do klasy <math>IP</math>.
ją w trywialny sposób. <math>\displaystyle NON-GRAPH-ISO</math> należy zatem do <math>\displaystyle coNP</math>. Nie jest
jednak obecnie znana odpowiedź na pytanie o przynależność tego problemu do
klasy <math>\displaystyle NP</math>. Pokażemy teraz, w jaki sposób można rozwiązać <math>\displaystyle NON-GRAPH-ISO</math> za
pomocą systemów dowodów interaktywnych, pokazując przynależność tego problemu
do klasy <math>\displaystyle IP</math>.


System działa w prosty sposób: W kolejnych iteracjach funkcja <math>\displaystyle V</math> wybiera losowo
System działa w prosty sposób: W kolejnych iteracjach funkcja <math>V</math> wybiera losowo jeden z grafów, a następnie w losowy sposób permutuje jego wierzchołki. Taki
jeden z grafów, a następnie w losowy sposób permutuje jego wierzchołki. Taki
graf jest przekazywany jako wiadomość do funkcji <math>P</math>. Zadaniem funkcji <math>P</math> jest rozpoznanie, który z wyjściowych grafów został wylosowany i przekształcony przez <math>V</math>.
graf jest przekazywany jako wiadomość do funkcji <math>\displaystyle P</math>. Zadaniem funkcji <math>\displaystyle P</math>
jest rozpoznanie, który z wyjściowych grafów został wylosowany i przekształcony
przez <math>\displaystyle V</math>.
}}
}}


{{cwiczenie|||
{{cwiczenie|2.5||
Zdefiniuj, w jakich przypadkach <math>\displaystyle V</math> powinien zaakceptować, a w jakich
Zdefiniuj, w jakich przypadkach <math>V</math> powinien zaakceptować, a w jakich
odrzucić wejściową parę grafów. Oblicz, ile iteracji jest potrzebnych, aby
odrzucić wejściową parę grafów. Oblicz, ile iteracji jest potrzebnych, aby system rozpoznawał język <math>NON-GRAPH-ISO</math> w czasie wielomianowym zgodnie z wcześniejszą definicją.
system rozpoznawał język <math>\displaystyle NON-GRAPH-ISO</math> w czasie wielomianowym zgodnie z
wcześniejszą definicją.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Zachowanie <math>\displaystyle V</math> powinno być następujące: Jeżeli <math>\displaystyle P</math> pomyli się w odpowiedzi,
Zachowanie <math>V</math> powinno być następujące. Jeżeli <math>P</math> pomyli się w odpowiedzi, <math>V</math> powinno odrzucić parę grafów -- czyli stwierdzić, że są izomorficzne.
<math>\displaystyle V</math> powinno odrzucić parę grafów -- czyli stwierdzić, że są izomorficzne.
<math>V</math> powinno zaakceptować grafy -- czyli stwierdzić, że nie są izomorficzne -- jeżeli <math>P</math> dwukrotnie poprawnie odgadnie, który graf został wylosowany przez <math>V</math>. Pokażemy teraz, że system ten rozpoznaje <math>NON-GRAPH-ISO</math>. Załóżmy, że grafy wejściowe nie są izomorficzne. W tym przypadku łatwo wskazać funkcję <math>P</math>, która zawsze będzie udzielała prawidłowej odpowiedzi; prawdopodobieństwo akceptacji wyniesie zatem <math>1</math>. Pozostaje jeszcze tylko pokazać, że jeżeli grafy nie są izomorficzne, to <math>V</math> nie da się oszukać żadnej funkcji <math>\bar P</math>.
<math>\displaystyle V</math> powinno zaakceptować grafy -- czyli stwierdzić, że nie są izomorficzne --
Funkcja <math>\bar P</math> nie ma jednak żadnej możliwości sprawdzenia, który graf został wybrany. Niezależnie zatem jak się zachowa, prawdopodobieństwo udzielenia
jeżeli <math>\displaystyle P</math> dwukrotnie poprawnie odgadnie, który graf został wylosowany przez
dwóch kolejnych poprawnych odpowiedzi będzie nie większe niż <math>1/4</math>, co kończy dowód.
<math>\displaystyle V</math>. Pokażemy teraz, że system ten rozpoznaje <math>\displaystyle NON-GRAPH-ISO</math>. Załóżmy, że
grafy wejściowe nie są izomorficzne. W tym przypadku łatwo wskazać funkcję
<math>\displaystyle P</math>, która zawsze będzie udzielała prawidłowej odpowiedzi; prawdopodobieństwo
akceptacji wyniesie zatem <math>\displaystyle 1</math>. Pozostaje jeszcze tylko pokazać, że jeżeli grafy
nie są izomorficzne, to <math>\displaystyle V</math> nie da się oszukać żadnej funkcji <math>\displaystyle \bar P</math>.
Funkcja <math>\displaystyle \bar P</math> nie ma jednak żadnej możliwości sprawdzenia, który graf
został wybrany. Niezależnie zatem jak się zachowa, prawdopodobieństwo udzielenia
dwóch kolejnych poprawnych odpowiedzi będzie nie większe niż <math>\displaystyle 1/4</math>, co kończy
dowód.
</div></div>
</div></div>


{{cwiczenie|||
{{cwiczenie|2.6||
Pokaż, że klasa <math>\displaystyle BPP</math> jest zawarta w klasie <math>\displaystyle IP</math>.
Pokaż, że klasa <math>BPP</math> jest zawarta w klasie <math>IP</math>.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Weźmy dowolny problem z klasy <math>\displaystyle BPP</math> oraz program dla probabilistycznej maszyny
Weźmy dowolny problem z klasy <math>BPP</math> oraz program dla probabilistycznej maszyny
Turinga, rozwiązujący ten problem w czasie wielomianowym. Wystarczy teraz, by
Turinga, rozwiązujący ten problem w czasie wielomianowym. Wystarczy teraz, by
funkcja <math>\displaystyle V</math> po prostu wykonała ten program i udzieliła odpowiedzi bez angażowania
funkcja <math>V</math> po prostu wykonała ten program i udzieliła odpowiedzi bez angażowania
<math>\displaystyle P</math>.
<math>P</math>.
</div></div>
</div></div>


{{cwiczenie|||
{{cwiczenie|2.7||
Rozpatrzmy takie systemy dowodów interaktywnych, w których funkcje <math>\displaystyle V</math> nie
Rozpatrzmy takie systemy dowodów interaktywnych, w których funkcje <math>V</math> nie
zależą od argumentu <math>\displaystyle r</math> (słowa losowego). Jaką klasę języków rozpoznają takie
zależą od argumentu <math>r</math> (słowa losowego). Jaką klasę języków rozpoznają takie
systemy, przy założeniach o złożoności analogicznych jak w przypadku klasy <math>\displaystyle IP</math>?
systemy, przy założeniach o złożoności analogicznych jak w przypadku klasy <math>IP</math>?
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Zauważmy najpierw, że z tak określone protokoły komunikacyjne są w pełni
Zauważmy najpierw, że tak określone protokoły komunikacyjne są w pełni deterministyczne (w tym sensie, że pozbawione są losowości). Zatem dla ustalonego systemu <math>(V, P)</math> i ustalonego słowa wejściowego odpowiedź protokołu zawsze jest taka sama.
deterministyczne (w tym sensie, że pozbawione są losowości). Zatem dla
ustalonego systemu <math>\displaystyle (V, P)</math> i ustalonego słowa wejściowego odpowiedź protokołu
zawsze jest taka sama.


Łatwo się przekonać, że za pomocą opisanych powyżej systemów można rozpoznać
Łatwo się przekonać, że za pomocą opisanych powyżej systemów można rozpoznać dowolny język z klasy <math>NP</math>. Protokół wygląda w następujący sposób: dla zadanego
dowolny język z klasy <math>\displaystyle NP</math>. Protokół wygląda w następujący sposób: Dla zadanego
słowa wejściowego <math>w</math> funkcja <math>P</math> zwraca świadka jego przynależności do rozważanego języka. Funkcja <math>V</math> następnie weryfikuje świadka w sposób deterministyczny w czasie wielomianowym i na tej podstawie udziela odpowiedzi. Jest jasne, że w przypadku, gdy <math>w</math> należy do rozważanego języka, odpowiednia funkcja <math>P</math> jest w stanie przekonać <math>V</math> o tej przynależności -- ponieważ nie ma żadnych restrykcji na złożoność funkcji <math>P</math>, może ona po prostu rozważyć
słowa wejściowego <math>\displaystyle w</math> funkcja <math>\displaystyle P</math> zwraca świadka jego przynależności do
wszystkich możliwych kandydatów na świadków o pewnej ustalonej z góry długości. Ponadto jeśli <math>w</math> nie należy do rozważanego języka, to <math>V</math> jest w stanie wykryć każdą próbę oszustwa.
rozważanego języka. Funkcja <math>\displaystyle V</math> następnie weryfikuje świadka w sposób
deterministyczny w czasie wielomianowym i na tej podstawie udziela odpowiedzi.
Jest jasne, że w przypadku gdy <math>\displaystyle w</math> należy do rozważanego języka, odpowiednia
funkcja <math>\displaystyle P</math> jest w stanie przekonać <math>\displaystyle V</math> o tej przynależności -- ponieważ nie
ma żadnych restrykcji na złożoność funkcji <math>\displaystyle P</math>, może ona po prostu rozważyć
wszystkich możliwych kandydatów na świadków o pewnej ustalonej z góry długości.
Ponadto jeśli <math>\displaystyle w</math>
nie należy do rozważanego języka to <math>\displaystyle V</math> jest w stanie wykryć każdą próbę
oszustwa.


Pokażemy teraz, że każdy język rozpoznawalny przez systemy opisane w treści
Pokażemy teraz, że każdy język rozpoznawalny przez systemy opisane w treści zadania należy do <math>NP</math>. Ustalmy zatem pewien język <math>L</math> i rozpoznający go system <math>(V, P)</math>. Załóżmy bez straty ogólności, że system ten dla słowa wejściowego <math>w</math> wykonuje dokładnie <math>p(|w|)</math> kroków oraz że każda przekazywana wiadomość ma długość <math>p(|w|)</math>. Zdefiniujmy teraz niedeterministyczną maszynę Turinga
zadania należy do <math>\displaystyle NP</math>. Ustalmy zatem pewien język <math>\displaystyle L</math> i rozpoznający go
<math>M</math>, rozpoznającą język <math>L</math>. Załóżmy, że maszyna oprócz taśmy roboczej ma też (początkowo pustą) taśmę służącą do przechowywania kolejnych komunikatów. Działanie maszyny <math>M</math> będzie podzielone na fazy; w fazach nieparzystych maszyna będzie symulować działanie funkcji <math>V</math> -- to znaczy <math>M</math> przeczyta historię wysłanych dotychczas wiadomości i słowo wejściowe, i na tej podstawie dopisze kolejną wiadomość. W fazach parzystych maszyna <math>M</math> w sposób niedeterministyczny wygeneruje wiadomość o długości <math>p(|w|)</math> i dopisze ją na taśmę. W przypadku, gdy <math>w \in L</math> łatwo wskazać ścieżkę postępowania dla tej maszyny, która doprowadzi do akceptacji; będzie to ścieżka, w której wygenerowane w fazach parzystych wiadomości pokrywają się z odpowiedziami udzielanymi przez funkcję <math>P</math>. Rozważmy teraz przypadek <math>w \notin L</math>. Załóżmy nie wprost, że istnieje taka ścieżka postępowania maszyny <math>M</math>, która doprowadzi
system <math>\displaystyle (V, P)</math>. Załóżmy bez straty ogólności, że system ten dla słowa wejściowego
do akceptacji tego słowa. W takim przypadku możemy jednak utworzyć funkcję <math>\bar P</math>, która będzie zwracała wiadomości wygenerowane w fazach parzystych postępowania maszyny <math>M</math>. W tym przypadku funkcja <math>V</math> da się oszukać funkcji <math>\bar P</math> dla słowa <math>w</math> z prawdopodobieństwem równym 1 -- a zatem system <math>(V, P)</math> nie będzie rozpoznawał języka <math>L</math>, co jest sprzeczne z założeniem.
<math>\displaystyle w</math> wykonuje dokładnie <math>\displaystyle p(|w|)</math> kroków, oraz że każda przekazywana wiadomość
ma długość <math>\displaystyle p(|w|)</math>. Zdefiniujmy teraz niedeterministyczną maszynę Turinga
<math>\displaystyle M</math>, rozpoznającą język <math>\displaystyle L</math>. Załóżmy, że maszyna oprócz taśmy roboczej ma
też (początkowo pustą) taśmę służącą do przechowywania kolejnych komunikatów.
Działanie maszyny <math>\displaystyle M</math> będzie podzielone na fazy; w
fazach nieparzystych maszyna będzie symulować działanie funkcji <math>\displaystyle V</math> -- to
znaczy <math>\displaystyle M</math> przeczyta historię wysłanych dotychczas wiadomości i słowo wejściowe,
i na tej podstawie dopisze kolejną wiadomość. W fazach parzystych maszyna <math>\displaystyle M</math>
w sposób niedeterministyczny wygeneruje wiadomość o długości <math>\displaystyle p(|w|)</math> i dopisze
ją na taśmę. W przypadku, gdy <math>\displaystyle w \in L</math> łatwo wskazać ścieżkę postępowania dla
tej maszyny, która doprowadzi do akceptacji; będzie to ścieżka, w której
wygenerowane w fazach parzystych wiadomości pokrywają się z odpowiedziami
udzielanymi przez funkcję <math>\displaystyle P</math>. Rozważmy teraz przypadek <math>\displaystyle w \notin L</math>. Załóżmy
nie wprost, że istnieje taka ścieżka postępowania maszyny <math>\displaystyle M</math>, która doprowadzi
do akceptacji tego słowa. W takim przypadku możemy jednak utworzyć funkcję
<math>\displaystyle \bar P</math>, która będzie zwracała wiadomości wygenerowane w fazach parzystych
postępowania maszyny <math>\displaystyle M</math>. W tym przypadku funkcja <math>\displaystyle V</math> da się oszukać funkcji
<math>\displaystyle \bar P</math> dla słowa <math>\displaystyle w</math> z prawdopodobieństwem równym 1 -- a zatem system
<math>\displaystyle (V, P)</math> nie będzie rozpoznawał języka <math>\displaystyle L</math>, co jest sprzeczne z założeniem.


Pokazaliśmy zatem, że protokoły zdefiniowane w treści ćwiczenia rozpoznają
Pokazaliśmy zatem, że protokoły zdefiniowane w treści ćwiczenia rozpoznają klasę języków <math>NP</math>.
klasę języków <math>\displaystyle NP</math>.
</div></div>
</div></div>


Możemy w tym momencie przypuszczać, że klasa <math>\displaystyle IP</math> jest znacząco większa od
Możemy w tym momencie przypuszczać, że klasa <math>IP</math> jest znacząco większa od klasy <math>NP</math>. Nie wiemy obecnie, czy przypuszczenie to jest prawdziwe; przemawia jednak za nim poniższe twierdzenie.
klasy <math>\displaystyle NP</math>. Nie wiemy obecnie czy przypuszczenie to jest prawdziwe; przemawia
jednak za nim poniższe twierdzenie.


{{twierdzenie|||
{{twierdzenie|2.8||
<math>\displaystyle IP = PSPACE</math>
<math>IP = PSPACE</math>
}}
}}


{{dowod|||
{{dowod|||
Pokażemy najpierw fakt <math>\displaystyle IP \subseteq PSPACE</math>. W tym celu wybierzemy dowolny
problem z klasy <math>\displaystyle IP</math> i rozwiążemy go z użyciem wielomianowej ilości pamięci.


Załóżmy, że system <math>\displaystyle (V, P')</math> akceptuje wybrany język w czasie wielomianowym.
Pokażemy najpierw fakt <math>IP \subseteq PSPACE</math>. W tym celu wybierzemy dowolny problem z klasy <math>IP</math> i rozwiążemy go z użyciem wielomianowej ilości pamięci.


Ustalmy słowo <math>\displaystyle w</math>. Będziemy mówić, że ciąg wiadomości <math>\displaystyle m_1\#m_2\#\ldots\#m_i</math>
Załóżmy, że system <math>(V, P')</math> akceptuje wybrany język w czasie wielomianowym.
jest zgodny ze słowem losowym <math>\displaystyle r</math> jeżeli stanowi on historię wiadomości po
<math>\displaystyle i</math> iteracjach pewnego systemu <math>\displaystyle (V, P'')</math>, używającego słowa losowego <math>\displaystyle r</math>.
Warto zauważyć, że ciąg
wiadomości może być zgodny z wieloma słowami losowymi (na przykład ciąg pusty
jest zgodny z każdym słowem losowym), a słowo losowe może
być zgodne z różnymi ciągami wiadomości (w zależności od funkcji <math>\displaystyle P''</math>).


Zdefiniujmy teraz funkcję <math>\displaystyle P</math> w taki sposób, by miała ona następującą własność:
Ustalmy słowo <math>w</math>. Będziemy mówić, że ciąg wiadomości <math>m_1\#m_2\#\ldots\#m_i</math> jest zgodny ze słowem losowym <math>r</math>, jeżeli stanowi on historię wiadomości po
<math>i</math> iteracjach pewnego systemu <math>(V, P'')</math> używającego słowa losowego <math>r</math>.
Warto zauważyć, że ciąg wiadomości może być zgodny z wieloma słowami losowymi (na przykład ciąg pusty jest zgodny z każdym słowem losowym), a słowo losowe może być zgodne z różnymi ciągami wiadomości (w zależności od funkcji <math>P''</math>).


<math>\displaystyle \forall_w Pr((V, P)</math> akceptuje <math>\displaystyle w) = max_{P''} Pr((V, P'')</math> akceptuje <math>\displaystyle w)</math>
Zdefiniujmy teraz funkcję <math>P</math> w taki sposób, by miała ona następującą własność:


Funkcja <math>\displaystyle P</math> zatem dla każdego słowa wejściowego zachowuje się w najlepszy
<math>\forall_w Pr((V, P)</math> akceptuje <math>w) = max_{P''} Pr((V, P'')</math> akceptuje <math>w)</math>.
możliwy sposób. Jest ona dobrze zdefiniowana, gdyż dla każdego wejściowego
słowa zbiór prawdopodobieństw jest skończony -- przy ustalonym słowie <math>\displaystyle w</math>
wszystkie możliwe funkcje
<math>\displaystyle P''</math> można przypisać do skończonej liczby klas równoważności, w ramach których
system <math>\displaystyle (V, P)</math> zachowuje się identycznie (pamiętajmy, że w całym procesie
komunikacji funkcja <math>\displaystyle V</math> wykonuje co najwyżej skończoną, ustaloną dla danego
słowa wejściowego liczbę kroków).


Jest jasne, że <math>\displaystyle (V, P)</math> również akceptuje wybrany język w czasie wielomianowym
Funkcja <math>P</math> zatem dla każdego słowa wejściowego zachowuje się w najlepszy możliwy sposób. Jest ona dobrze zdefiniowana, gdyż dla każdego wejściowego
-- od tej pory będziemy się zatem zajmowali tym konkretnym systemem. Nasz
słowa zbiór prawdopodobieństw jest skończony -- przy ustalonym słowie <math>w</math> wszystkie możliwe funkcje <math>P''</math> można przypisać do skończonej liczby klas równoważności, w ramach których system <math>(V, P)</math> zachowuje się identycznie (pamiętajmy, że w całym procesie komunikacji funkcja <math>V</math> wykonuje co najwyżej skończoną, ustaloną dla danego słowa wejściowego liczbę kroków).
 
Jest jasne, że <math>(V, P)</math> również akceptuje wybrany język w czasie wielomianowym -- od tej pory będziemy się zatem zajmowali tym konkretnym systemem. Nasz
algorytm będzie dla każdego słowa wejściowego wprost obliczał prawdopodobieństwo
algorytm będzie dla każdego słowa wejściowego wprost obliczał prawdopodobieństwo
zaakceptowania go przez system <math>\displaystyle (V, P)</math>; tym samym, w zależności od wyniku,
zaakceptowania go przez system <math>(V, P)</math>; tym samym, w zależności od wyniku, będzie mógł określić, czy słowo wejściowe należy do języka. Dla uproszczenia
będzie mógł okreslić, czy słowo wejściowe należy do języka. Dla uproszczenia
założymy, że system <math>(V, P)</math> daje odpowiedzi po dokładnie <math>p(|x|)</math> krokach.
założymy, że system <math>\displaystyle (V, P)</math> daje odpowiedzi po dokładnie <math>\displaystyle p(|x|)</math> krokach.


Zdefiniujmy teraz funkcję, mierzącą prawdopodobieństwo akceptacji słowa przez
Zdefiniujmy teraz funkcję mierzącą prawdopodobieństwo akceptacji słowa przez
system <math>\displaystyle (V, P)</math> przy ustalonej częściowej historii komunikacji:
system <math>(V, P)</math> przy ustalonej częściowej historii komunikacji:


<math>\displaystyle N(m_1\#m_2\#\ldots\#m_i) = Pr(</math>słowo <math>\displaystyle w</math> zostanie zaakceptowane pod warunkiem,
<math>N(m_1\#m_2\#\ldots\#m_i) = Pr(</math>słowo <math>w</math> zostanie zaakceptowane pod warunkiem, że dotychczasowe komunikaty reprezentowane są przez <math>m_1\#m_2\#\ldots\#m_i)</math>.
że dotychczasowe komunikaty reprezentowane są przez <math>\displaystyle m_1\#m_2\#\ldots\#m_i)</math>


W przypadku, gdy nie ma słowa losowego zgodnego z <math>\displaystyle m_1\#m_2\#\ldots\#m_i</math>,
W przypadku, gdy nie ma słowa losowego zgodnego z <math>m_1\#m_2\#\ldots\#m_i</math>,
funkcji <math>\displaystyle N(m_1\#m_2\#\ldots\#m_i)</math> nadajemy wartość <math>\displaystyle 0</math>. Łatwo jest
funkcji <math>N(m_1\#m_2\#\ldots\#m_i)</math> nadajemy wartość <math>0</math>. Łatwo jest
obliczyć <math>\displaystyle N(m_1\#m_2\#\ldots\#m_{p(|x|)})</math>:
obliczyć <math>N(m_1\#m_2\#\ldots\#m_{p(|x|)})</math>:
* jeżeli <math>\displaystyle m_{p(|x|)} = accept</math> i <math>\displaystyle m_1\#m_2\#\ldots\#m_{p(|x|)}</math> jest zgodne
* jeżeli <math>m_{p(|x|)} = accept</math> i <math>m_1\#m_2 \#\ldots\#m_{p(|x|)}</math> jest zgodne z pewnym słowem losowym, to
z pewnym słowem losowym, to
 
<math>N(m_1\#m_2\#\ldots\#m_{p(|x|)}) = 1</math>,


<math>\displaystyle N(m_1\#m_2\#\ldots\#m_{p(|x|)}) = 1</math>
* w przeciwnym przypadku
* w przeciwnym przypadku


<math>\displaystyle N(m_1\#m_2\#\ldots\#m_{p(|x|)}) = 0</math>
<math>N(m_1\#m_2\#\ldots\#m_{p(|x|)}) = 0</math>.
 
Do obliczania wartości <math>N</math> dla mniejszej ilości kroków, możemy posłużyć się następującym wzorem rekurencyjnym:
* jeżeli <math>i</math> jest nieparzyste, to


Do obliczania wartości <math>\displaystyle N</math> dla mniejszej ilości kroków, możemy posłużyć się
<math>N(m_1\#m_2\#\ldots\#m_i) = \max_{m_{i+1}} N(m_1\#m_2\#\ldots\#m_{i+1})</math>,
następującym wzorem rekurencyjnym:
* jeżeli <math>\displaystyle i</math> jest nieparzyste, to


<math>\displaystyle N(m_1\#m_2\#\ldots\#m_i) = \max_{m_{i+1}} N(m_1\#m_2\#\ldots\#m_{i+1}) </math>
* jeżeli <math>i</math> jest parzyste, to
* jeżeli <math>\displaystyle i</math> jest parzyste, to


<math>\displaystyle N(m_1\#m_2\#\ldots\#m_i) = \sum_{m_{i+1}} Pr(m_{i+1}|m_1\#m_2\#\ldots\#m_i) \cdot N(m_1\#m_2\#\ldots\#m_{i+1}) </math>
<math>N(m_1\#m_2\#\ldots\#m_i) = \sum_{m_{i+1}} Pr(m_{i+1}|m_1\#m_2\#\ldots\#m_i) \cdot N(m_1\#m_2\#\ldots\#m_{i+1})</math>.


Wzór ten jest konsekwencją zachowania <math>\displaystyle P</math> i <math>\displaystyle V</math>: <math>\displaystyle P</math> w każdym kroku maksymalizuje
Wzór ten jest konsekwencją zachowania <math>P</math> i <math>V</math>: <math>P</math> w każdym kroku maksymalizuje
prawdopodobieństwo akceptacji, natomiast zachowanie <math>\displaystyle V</math> zależne jest od historii
prawdopodobieństwo akceptacji, natomiast zachowanie <math>V</math> zależne jest od historii wiadomości i słowa losowego.
wiadomości i słowa losowego.


W tym momencie wystarczą dwa spostrzeżenia; po pierwsze <math>\displaystyle N(\epsilon)</math> jest
W tym momencie wystarczą dwa spostrzeżenia. Po pierwsze, <math>N(\epsilon)</math> jest poszukiwanym przez nas prawdopodobieństwem zaakceptowania przez system <math>(V, P)</math> słowa <math>w</math>. Po drugie, <math>N(\epsilon)</math> jest obliczalne w pamięci wielomianowej:
poszukiwanym przez nas prawdopodobieństwem zaakceptowania przez system <math>\displaystyle (V, P)</math>
każde rekurencyjne wywołanie funkcji <math>N</math> powoduje sekwencyjne rozważenie wszystkich możliwych odpowiedzi, których długość jest jednak ograniczona od góry przez <math>p(|x|)</math>. Dodatkowo przy obliczeniach na poziomie zagłębienia <math>p(|x|)</math> należy rozważyć wszystkie możliwe słowa losowe i sprawdzić ich zgodność z aktualnie rozważanym ciągiem komunikatów. Wszystkie te operacje można wykonać
słowa <math>\displaystyle w</math>. Po drugie <math>\displaystyle N(\epsilon)</math> jest obliczalne w pamięci wielomianowej:
z użyciem <math>O(p(|x|)^2)</math> komórek pamięci.
Każde rekurencyjne wywołanie funkcji <math>\displaystyle N</math> powoduje sekwencyjne rozważenie wszystkich
możliwych odpowiedzi, których długość jest jednak ograniczona od góry przez
<math>\displaystyle p(|x|)</math>. Dodatkowo przy obliczeniach na poziomie zagłębienia <math>\displaystyle p(|x|)</math>
należy rozważyć wszystkie możliwe słowa losowe i sprawdzić ich zgodność z
aktualnie rozważanym ciągiem komunikatów. Wszystkie te operacje można wykonać
z użyciem <math>\displaystyle O(p(|x|)^2)</math> komórek pamięci.


Pokazaliśmy zatem, że <math>\displaystyle IP \subseteq PSPACE</math>.
Pokazaliśmy zatem, że <math>IP \subseteq PSPACE</math>.
}}


Dowód zawierania w drugą stronę odbywa się poprzez przedstawienie protokołu
Dowód zawierania w drugą stronę odbywa się poprzez przedstawienie protokołu
komunikacji dla problemu <math>\displaystyle QSAT</math>. Aby przybliżyć stosowaną w tym protokole
komunikacji dla problemu <math>QSAT</math>. Aby przybliżyć stosowaną w tym protokole technikę, zaprezentujemy najpierw dowód przynależności do klasy <math>IP</math> problemu <math>\#SAT(D)</math> będącego wersją decyzyjną problemu <math>\#SAT</math>:
technikę, zaprezentujemy najpierw dowód przynależności do klasy <math>\displaystyle IP</math> problemu
<math>\displaystyle \#SAT(D)</math>, będącego wersją decyzyjną problemu <math>\displaystyle \#SAT</math>:


{{definicja|||
{{definicja|2.9||
<math>\displaystyle \#SAT(D) = \{ \langle \phi, k \rangle:</math> liczba wartościowań spełniających dla
<math>\#SAT(D) = \{ \langle \phi, k \rangle:</math> liczba wartościowań spełniających dla
formuły <math>\displaystyle \phi</math> jest nie mniejsza niż <math>\displaystyle k \}</math>
formuły <math>\phi</math> jest nie mniejsza niż <math>k \}</math>.
}}
}}


Linia 623: Linia 496:
będziemy zastępować wielomianami w następujący sposób:
będziemy zastępować wielomianami w następujący sposób:
* zmienne formuły stają się zmiennymi wielomianu,
* zmienne formuły stają się zmiennymi wielomianu,
* wyrażenia typu <math>\displaystyle \neg x</math> zastępujemy przez <math>\displaystyle (1-x)</math>,
* wyrażenia typu <math>\neg x</math> zastępujemy przez <math>(1-x)</math>,
* wyrażenia typu <math>\displaystyle \alpha \wedge \beta</math> zastępujemy przez <math>\displaystyle \alpha \cdot \beta</math>,
* wyrażenia typu <math>\alpha \wedge \beta</math> zastępujemy przez <math>\alpha \cdot \beta</math>,
* wyrażenia typu <math>\displaystyle \alpha \vee \beta</math> zastępujemy przez <math>\displaystyle (1 - (1 - \alpha)\cdot(1 - \beta))</math>.
* wyrażenia typu <math>\alpha \vee \beta</math> zastępujemy przez <math>(1 - (1 - \alpha)\cdot(1 - \beta))</math>.


Dla uproszczenia założymy na razie, że wielomiany te określone są na liczbach
Dla uproszczenia założymy na razie, że wielomiany te określone są na liczbach
rzeczywistych.
rzeczywistych.


{{cwiczenie|||
{{cwiczenie|2.10||
Niech <math>\displaystyle \phi</math> będzie formułą z <math>\displaystyle m</math> zmiennymi, natomiast <math>\displaystyle W(x_1, \ldots, x_m)</math>
Niech <math>\phi</math> będzie formułą z <math>m</math> zmiennymi, natomiast <math>W(x_1, \ldots, x_m)</math>
wielomianem otrzymanych w sposób przedstawiony powyżej. Weźmy dowolne
wielomianem otrzymanych w sposób przedstawiony powyżej. Weźmy dowolne
wartościowanie zmiennych formuły <math>\displaystyle \phi</math> i podstawmy je do wielomianu <math>\displaystyle W</math>
wartościowanie zmiennych formuły <math>\phi</math> i podstawmy je do wielomianu <math>W</math> (to znaczy podstawmy 0, gdy zmienna jest wartościowana na "fałsz" i
(to znaczy podstawmy 0 gdy zmienna jest wartościowana na "fałsz" i
1 w przeciwnym przypadku). Pokaż, że wartość wielomianu <math>W</math> jest równa 1, gdy wybrane wartościowanie jest wartościowaniem spełniającym dla <math>\phi</math> oraz 0 w przeciwnym przypadku.
1 w przeciwnym przypadku). Pokaż, że wartość wielomianu <math>\displaystyle W</math> jest równa 1 gdy
wybrane wartościowanie jest wartościowaniem spełniającym dla <math>\displaystyle \phi</math> oraz
0 w przeciwnym przypadku.
}}
}}


Linia 646: Linia 516:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Indukcja będzie zdefiniowana ze względu na ilość literałów w formule. Niech
Indukcja będzie zdefiniowana ze względu na ilość literałów w formule. Niech
<math>\displaystyle \phi</math> będzie formułą z jednym literałem. Będzie ona zatem postaci <math>\displaystyle \phi = x</math>
<math>\phi</math> będzie formułą z jednym literałem. Będzie ona zatem postaci <math>\phi = x</math>
lub <math>\displaystyle \phi = \neg x</math>. Po zastosowaniu procesu arytmetyzacji, wielomian będzie
lub <math>\phi = \neg x</math>. Po zastosowaniu procesu arytmetyzacji wielomian będzie
miał postać odpowiednio <math>\displaystyle W(x) = x</math> lub <math>\displaystyle W(x) = (1 - x)</math>. Jest zatem jasne,
miał postać odpowiednio <math>W(x) = x</math> lub <math>W(x) = (1 - x)</math>. Jest zatem jasne,
że dla wartościowania zmiennej <math>\displaystyle x</math> na "fałsz" wartości wielomianów wynoszą
że dla wartościowania zmiennej <math>x</math> na "fałsz" wartości wielomianów wynoszą
odpowiednio 0 i 1, a przy wartościowaniu na "prawdę" odpowiednio 1 i 0
odpowiednio 0 i 1, a przy wartościowaniu na "prawdę" odpowiednio 1 i 0
-- spełnione są zatem wymagania opisane w treści ćwiczenia.
-- spełnione są zatem wymagania opisane w treści ćwiczenia.


Załóżmy teraz, że własność podana w treści jest spełniona dla wszystkich
Załóżmy teraz, że własność podana w treści jest spełniona dla wszystkich
formuł o długości nie większej niż <math>\displaystyle n-1</math>; pokażemy, że jest ona również spełniona
formuł o długości nie większej niż <math>n-1</math>; pokażemy, że jest ona również spełniona
dla formuł o długości <math>\displaystyle n</math>. Weźmy zatem formułę <math>\displaystyle \phi</math> o długości <math>\displaystyle n</math> i załóżmy,
dla formuł o długości <math>n</math>. Weźmy zatem formułę <math>\phi</math> o długości <math>n</math> i załóżmy,
że <math>\displaystyle \phi = \alpha \wedge \beta</math>. Wielomian
że <math>\phi = \alpha \wedge \beta</math>. Wielomian
<math>\displaystyle W</math> jest zatem postaci <math>\displaystyle W(x_1,\ldots,x_m) = W_\alpha(x_1,\ldots,x_m) *
<math>W</math> jest zatem postaci <math>W(x_1,\ldots,x_m) = W_\alpha(x_1,\ldots,x_m) *
W_\beta(x_1,\ldots,x_m)</math>. Niech <math>\displaystyle a_1,\ldots,a_m</math> będzie wartościowaniem
W_\beta(x_1,\ldots,x_m)</math>. Niech <math>a_1,\ldots,a_m</math> będzie wartościowaniem
spełniającym dla formuły <math>\displaystyle \phi</math>; jest ono zatem wartościowaniem spełniającym
spełniającym dla formuły <math>\phi</math>; jest ono zatem wartościowaniem spełniającym
dla <math>\displaystyle \alpha</math> i <math>\displaystyle \beta</math>. Formuły <math>\displaystyle \alpha</math> i <math>\displaystyle \beta</math> mają co najwyżej <math>\displaystyle n-1</math>
dla <math>\alpha</math> i <math>\beta</math>. Formuły <math>\alpha</math> i <math>\beta</math> mają co najwyżej <math>n-1</math>
literałów -- korzystając z założenia indukcyjnego możemy stwierdzić, że
literałów -- korzystając z założenia indukcyjnego, możemy stwierdzić, że:


<math>\displaystyle W_\alpha(a_1,\ldots,a_m) = W_\beta(a_1,\ldots,a_m) = 1</math>  
<math>W_\alpha(a_1,\ldots,a_m) = W_\beta(a_1,\ldots,a_m) = 1</math>.


W związku z tym
W związku z tym:


<math>\displaystyle W(a_1,\ldots,a_m) = 1</math>  
<math>W(a_1,\ldots,a_m) = 1</math>.


Załóżmy teraz, że <math>\displaystyle a_1,\ldots,a_m</math> nie jest wartościowaniem spełniającym
Załóżmy teraz, że <math>a_1,\ldots,a_m</math> nie jest wartościowaniem spełniającym
dla <math>\displaystyle \phi</math>. Nie jest zatem wartościowaniem spełniającym dla przynajmniej
dla <math>\phi</math>. Nie jest zatem wartościowaniem spełniającym dla przynajmniej
jednej z formuł <math>\displaystyle \alpha</math> lub <math>\displaystyle \beta</math>. W związku z tym zachodzi własnosć:
jednej z formuł <math>\alpha</math> lub <math>\beta</math>. W związku z tym zachodzi własność:


<math>\displaystyle W_\alpha(a_1,\ldots,a_m) = 0</math>  
<math>W_\alpha(a_1,\ldots,a_m) = 0</math>  


lub
lub


<math>\displaystyle W_\beta(a_1,\ldots,a_m) = 0</math>  
<math>W_\beta(a_1,\ldots,a_m) = 0</math>.


W konsekwencji  
W konsekwencji:


<math>\displaystyle W(a_1,\ldots,a_m) = 0</math>  
<math>W(a_1,\ldots,a_m) = 0</math>.


Dowód przypadku gdy <math>\displaystyle \phi = \alpha \vee \beta</math> jest analogiczny.  
Dowód przypadku, gdy <math>\phi = \alpha \vee \beta</math>, jest analogiczny.  
</div></div>
</div></div>


{{cwiczenie|||
{{cwiczenie|2.11||
Niech <math>\displaystyle n</math> oznacza liczbę -- niekoniecznie różnych -- literałów (zmiennych
Niech <math>n</math> oznacza liczbę -- niekoniecznie różnych -- literałów (zmiennych
i ich zaprzeczeń) w formule <math>\displaystyle \phi</math>. Pokaż, że stopień każdej zmiennej w
i ich zaprzeczeń) w formule <math>\phi</math>. Pokaż, że stopień każdej zmiennej w
wielomianie <math>\displaystyle W</math> jest nie większy niż <math>\displaystyle n</math>.
wielomianie <math>W</math> jest nie większy niż <math>n</math>.
}}
}}


Linia 699: Linia 569:


Załóżmy teraz, że własność podana w treści jest spełniona dla formuł o nie więcej niż
Załóżmy teraz, że własność podana w treści jest spełniona dla formuł o nie więcej niż
<math>\displaystyle n-1</math> literałach; pokażemy, że jest ona też spełniona dla formuł o <math>\displaystyle n</math>
<math>n-1</math> literałach; pokażemy, że jest ona też spełniona dla formuł o <math>n</math>
literałach. Weźmy formułę <math>\displaystyle \phi</math> o <math>\displaystyle n</math> literałach i załóżmy, że jest ona postaci
literałach. Weźmy formułę <math>\phi</math> o <math>n</math> literałach i załóżmy, że jest ona postaci
<math>\displaystyle \phi = \alpha \wedge \beta</math>. Oznaczmy długości formuł <math>\displaystyle \alpha</math> i <math>\displaystyle \beta</math> jako
<math>\phi = \alpha \wedge \beta</math>. Oznaczmy długości formuł <math>\alpha</math> i <math>\beta</math> jako
<math>\displaystyle l_\alpha</math> i <math>\displaystyle l_\beta</math>. Ustalmy też dowolną zmienną <math>\displaystyle x_i</math> występującą w formule
<math>l_\alpha</math> i <math>l_\beta</math>. Ustalmy też dowolną zmienną <math>x_i</math> występującą w formule
<math>\displaystyle \phi</math>. Z założenia indukcyjnego wiemy, że stopień tej zmiennej w wielomianach
<math>\phi</math>. Z założenia indukcyjnego wiemy, że stopień tej zmiennej w wielomianach
<math>\displaystyle W_\alpha</math> i <math>\displaystyle W_\beta</math> jest co najwyżej równy odpowiednio <math>\displaystyle l_\alpha</math> lub
<math>W_\alpha</math> i <math>W_\beta</math> jest co najwyżej równy odpowiednio <math>l_\alpha</math> lub
<math>\displaystyle l_\beta</math>. Wielomian otrzymany z formuły <math>\displaystyle \phi</math> jest postaci
<math>l_\beta</math>. Wielomian otrzymany z formuły <math>\phi</math> jest postaci
<math>\displaystyle W(x_1,\ldots,x_m) = W_\alpha(x_1,\ldots,x_m) * W_\beta(x_1,\ldots,x_m)</math>.
<math>W(x_1,\ldots,x_m) = W_\alpha(x_1,\ldots,x_m) * W_\beta(x_1,\ldots,x_m)</math>.
Stopień <math>\displaystyle W</math> jako wielomianu zmiennej <math>\displaystyle x_i</math> jest zatem równy co najwyżej
Stopień <math>W</math> jako wielomianu zmiennej <math>x_i</math> jest zatem równy co najwyżej
<math>\displaystyle l_\alpha + l_\beta</math> -- liczba ta jest równa ilości literałów w formule <math>\displaystyle \phi</math>.
<math>l_\alpha + l_\beta</math> -- liczba ta jest równa ilości literałów w formule <math>\phi</math>.


W przypadku, gdy <math>\displaystyle \phi = \alpha \vee \beta</math>, wielomian <math>\displaystyle W</math> jest postaci:
W przypadku, gdy <math>\phi = \alpha \vee \beta</math>, wielomian <math>W</math> jest postaci:


<math>\displaystyle W(\ldots) = 1 - (1 - W_\alpha(\ldots))\cdot(1 - W_\beta(\ldots))</math>  
<math>W(\ldots) = 1 - (1 - W_\alpha(\ldots))\cdot(1 - W_\beta(\ldots))</math>.


Po dokonaniu mnożenia otrzymamy:
Po dokonaniu mnożenia otrzymamy:


<math>\displaystyle W(\ldots) = W_\alpha (\ldots) + W_\beta (\ldots) - W_\alpha (\ldots) \cdot W_\beta(\ldots)</math>  
<math>W(\ldots) = W_\alpha (\ldots) + W_\beta (\ldots) - W_\alpha (\ldots) \cdot W_\beta(\ldots)</math>.


Jest zatem jasne, że stopień <math>\displaystyle W</math> jako zmiennej <math>\displaystyle x_i</math> jest nie większy niż
Jest zatem jasne, że stopień <math>W</math> jako zmiennej <math>x_i</math> jest nie większy niż
<math>\displaystyle l_\alpha + l_\beta</math>.
<math>l_\alpha + l_\beta</math>.


</div></div>
</div></div>


Zdefiniujmy teraz ciąg wielomianów <math>\displaystyle f_0, f_1, \ldots, f_m</math> w następujący
Zdefiniujmy teraz ciąg wielomianów <math>f_0, f_1, \ldots, f_m</math> w następujący
sposób:
sposób:
* <math>\displaystyle f_m</math> jest wielomianem otrzymanym z formuły <math>\displaystyle \phi</math> w wyniku procesu
* <math>f_m</math> jest wielomianem otrzymanym z formuły <math>\phi</math> w wyniku procesu arytmetyzacji,
arytmetyzacji,
* <math>f_i(x_1, x_2, \ldots, x_i) := f_{i+1}(x_1, x_2, \ldots, x_i, 0) +
* <math>\displaystyle f_i(x_1, x_2, \ldots, x_i) := f_{i+1}(x_1, x_2, \ldots, x_i, 0) +
f_{i+1}(x_1, x_2, \ldots, x_i, 1)</math>.
f_{i+1}(x_1, x_2, \ldots, x_i, 1)</math>.


Zauważmy, że ilość argumentów zmniejsza się w kolejnych funkcjach, a <math>\displaystyle f_0</math>
Zauważmy, że ilość argumentów zmniejsza się w kolejnych funkcjach, a <math>f_0</math>
nie posiada żadnych argumentów (czyli jest stałą). Funkcje te spełniają
nie posiada żadnych argumentów (czyli jest stałą). Funkcje te spełniają
następującą własność:
następującą własność:


<math>\displaystyle \forall_{a_1,a_2,\ldots,a_i \in \{0, 1\}} f_i(a_1, a_2, \ldots, a_i) =
<math>\forall_{a_1,a_2,\ldots,a_i \in \{0, 1\}} f_i(a_1, a_2, \ldots, a_i) =
\sum_{x_{i+1} \in \{0, 1\}} \ldots \sum_{x_{m} \in \{0, 1\}}
\sum_{x_{i+1} \in \{0, 1\}} \ldots \sum_{x_{m} \in \{0, 1\}}
f_m(a_1,a_2, \ldots, a_i, x_{i+1}, \ldots, x_m)</math>
f_m(a_1,a_2, \ldots, a_i, x_{i+1}, \ldots, x_m)</math>


Oznacza to, że jeżeli <math>\displaystyle a_1, \ldots, a_i</math> reprezentują pewne wartościowanie
Oznacza to, że jeżeli <math>a_1, \ldots, a_i</math> reprezentują pewne wartościowanie
zmiennych <math>\displaystyle x_1, \ldots, x_i</math>, to <math>\displaystyle f_i(a_1,\ldots,a_i)</math> wyznacza liczbę
zmiennych <math>x_1, \ldots, x_i</math>, to <math>f_i(a_1,\ldots,a_i)</math> wyznacza liczbę
wartościwoań spełniających formułę <math>\displaystyle \phi</math> rozpoczynających się od
wartościwoań spełniających formułę <math>\phi</math> rozpoczynających się od
<math>\displaystyle (a_1, \ldots, a_i)</math>. Oczywistym wnioskiem z powyższego spostrzeżenia jest to,
<math>(a_1, \ldots, a_i)</math>. Oczywistym wnioskiem z powyższego spostrzeżenia jest to,
że <math>\displaystyle f_0()</math> jest liczbą wszystkich wartościowań spełniających <math>\displaystyle \phi</math>.
że <math>f_0()</math> jest liczbą wszystkich wartościowań spełniających <math>\phi</math>.


Zauważmy jeszcze, że w wielomianach <math>\displaystyle f_i</math> zachowana jest własność, mówiąca że
Zauważmy jeszcze, że w wielomianach <math>f_i</math> zachowana jest własność, mówiąca że
każda zmienna występuje co najwyżej w stopniu <math>\displaystyle n</math>. Ilość wyrazów występujących
każda zmienna występuje co najwyżej w stopniu <math>n</math>. Ilość wyrazów występujących
w tych wielomianach może być jednak wykładnicza ze względu na długość
w tych wielomianach może być jednak wykładnicza ze względu na długość
formuły; z tego powodu obliczanie tych wielomianów może być procesem
formuły; z tego powodu obliczanie tych wielomianów może być procesem
czasochłonnym.
czasochłonnym.


Przedstawiany protokół komunikacyjny obliczanie wielomianów <math>\displaystyle f_0,\ldots,f_{m-1}</math>
Przedstawiany protokół komunikacyjny obliczanie wielomianów <math>f_0,\ldots,f_{m-1}</math>
zleca funkcji <math>\displaystyle P</math>. Ta następnie przekazuje funkcji <math>\displaystyle V</math> pewne informacje o
zleca funkcji <math>P</math>. Ta następnie przekazuje funkcji <math>V</math> pewne informacje o
wielomianach, na podstawie których <math>\displaystyle V</math> może z dużym prawdopodobieństwem
wielomianach, na podstawie których <math>V</math> może z dużym prawdopodobieństwem
rozstrzygnąć, czy <math>\displaystyle f_0,\ldots,f_{m-1}</math> zostały "uczciwie" obliczone zgodnie
rozstrzygnąć, czy <math>f_0,\ldots,f_{m-1}</math> zostały "uczciwie" obliczone zgodnie
z powyższą rekurencyjną procedurą, czy też <math>\displaystyle P</math> próbuje oszukać <math>\displaystyle V</math>.
z powyższą rekurencyjną procedurą, czy też <math>P</math> próbuje oszukać <math>V</math>.


Protokół nie operuje na liczbach rzeczywistych -- zamiast nich używamy ciała
Protokół nie operuje na liczbach rzeczywistych -- zamiast nich używamy ciała
<math>\displaystyle {\mathbb Z}_p</math>, gdzie <math>\displaystyle p</math> jest liczbą pierwszą większą niż <math>\displaystyle 2^n</math>. Wielomiany
<math>{\mathbb Z}_p</math>, gdzie <math>p</math> jest liczbą pierwszą większą niż <math>2^n</math>. Wielomiany
określone nad takim ciałem mają wiele cech wspólnych z wielomianami nad
określone nad takim ciałem mają wiele cech wspólnych z wielomianami nad
<math>\displaystyle {\mathbb R}</math> -- w szczególności wielomian jednej zmiennej o stopniu <math>\displaystyle n</math>,
<math>{\mathbb R}</math> -- w szczególności wielomian jednej zmiennej o stopniu <math>n</math>,
który nie jest stale równy 0, ma co najwyżej <math>\displaystyle n</math> pierwiastków. W rezultacie
który nie jest stale równy 0, ma co najwyżej <math>n</math> pierwiastków. W rezultacie
dwa różne wielomiany stopnia nie większego niż <math>\displaystyle n</math> mogą być równe w co
dwa różne wielomiany stopnia nie większego niż <math>n</math> mogą być równe w co
najwyżej <math>\displaystyle n</math> punktach.
najwyżej <math>n</math> punktach.


W tym momencie jesteśmy gotowi do przedstawienia protokołu dla <math>\displaystyle \#SAT(D)</math>:
W tym momencie jesteśmy gotowi do przedstawienia protokołu dla <math>\#SAT(D)</math>:
* Krok 1 (P): Znajdź liczbę pierwszą <math>\displaystyle p</math> z przedziału <math>\displaystyle [2^n, 2^{n+1}]</math> oraz
* Krok 1 (P): Znajdź liczbę pierwszą <math>p</math> z przedziału <math>[2^n, 2^{n+1}]</math> oraz jej certyfikat pierwszości (taka liczba na pewno istnieje -- wynika to z twierdzenia Bertranda--Czebyszewa). Prześlij je jako wiadomość.
jej certyfikat pierwszości (taka liczba na pewno istnieje -- wynika to z
* Krok 2 (V): Sprawdź poprawność liczby <math>p</math>, odrzuć słowo wejściowe, jeśli <math>p</math> lub jej certyfikat są nieprawidłowe.
twierdzenia Bertranda-Czebyszewa). Prześlij je jako wiadomość.
* Krok 3 (P): Oblicz <math>f_0()</math> i prześlij jako wiadomość.
* Krok 2 (V): Sprawdź poprawność liczby <math>\displaystyle p</math>, odrzuć słowo wejściowe jeśli
* Krok 4 (V): Sprawdź, czy <math>f_0() \geq k</math> -- jeśli nie to odrzuć słowo wejściowe.
<math>\displaystyle p</math> lub jej certyfikat są nieprawidłowe,
* Krok 5 (P): Oblicz <math>f_1(z)</math> (wielomian ze zmienną <math>z</math>) i prześlij jego współczynniki jako wiadomość.
* Krok 3 (P): Oblicz <math>\displaystyle f_0()</math> i prześlij jako wiadomośc,
* Krok 6 (V): Sprawdź, czy <math>f_0() = f_1(0) + f_1(1)</math>. Wylosuj dowolną liczbę <math>r_1</math> z <math>{\mathbb Z}_p</math> i prześlij ją jako wiadomość,
* Krok 4 (V): Sprawdź, czy <math>\displaystyle f_0() \geq k</math> -- jeśli nie to odrzuć słowo
* Krok 7 (P): Oblicz <math>f_2(r_1, z)</math> (to też jest wielomian z jedną zmienną <math>z</math>) i prześlij jego współczynniki jako wiadomość.
wejściowe,
* Krok 8 (V): Sprawdź, czy <math>f_1(r_1)=f_2(r_1,0)+f_2(r_1,1)</math>. Wylosuj dowolną liczbę <math>r_2</math> z <math>{\mathbb Z}_p</math> i prześlij ją jako wiadomość.
* Krok 5 (P): Oblicz <math>\displaystyle f_1(z)</math> (wielomian ze zmienną <math>\displaystyle z</math>) i prześlij jego
* <math>\cdots</math>
współczynniki jako wiadomość,
* Krok <math>2m + 4</math> (V): Sprawdź, czy <math>f_{m-1}(r_1, \ldots, r_{m-1})=f_m(r_1,\ldots,r_{m-1},0)+f_m(r_1,\ldots,r_{m-1},1)</math>. Sprawdź, czy <math>f_m(r_1,\ldots,r_{m-1},z)</math> jest wielomianem otrzymanym przez arytmetyzację formuły <math>\phi</math> i podstawienie <math>r_1,\ldots,r_{m-1}</math> jako pierwszych <math>m-1</math> argumentów otrzymanego wielomianu. Jeżeli tak, to zaakceptuj słowo wejściowe, w przeciwnym przypadku odrzuć je.
* Krok 6 (V): Sprawdź, czy <math>\displaystyle f_0() = f_1(0) + f_1(1)</math>. Wylosuj dowolną
liczbę <math>\displaystyle r_1</math> z <math>\displaystyle {\mathbb Z}_p</math> i prześlij ją jako wiadomość,
* Krok 7 (P): Oblicz <math>\displaystyle f_2(r_1, z)</math> (to też jest wielomian z jedną zmienną
<math>\displaystyle z</math>) i prześlij jego współczynniki jako wiadomość,
* Krok 8 (V): Sprawdź, czy <math>\displaystyle f_1(r_1)=f_2(r_1,0)+f_2(r_1,1)</math>. Wylosuj
dowolną liczbę <math>\displaystyle r_2</math> z <math>\displaystyle {\mathbb Z}_p</math> i prześlij ją jako wiadomość,
* <math>\displaystyle \cdots</math>
* Krok <math>\displaystyle 2m + 4</math> (V): Sprawdź, czy
<math>\displaystyle f_{m-1}(r_1, \ldots, r_{m-1})=f_m(r_1,\ldots,r_{m-1},0)+f_m(r_1,\ldots,r_{m-1},1)</math>.
Sprawdź, czy <math>\displaystyle f_m(r_1,\ldots,r_{m-1},z)</math> jest wielomianem otrzymanym przez
arytmetyzację formuły <math>\displaystyle \phi</math> i podstawienie <math>\displaystyle r_1,\ldots,r_{m-1}</math> jako
pierwszych <math>\displaystyle m-1</math> argumentów otrzymanego wielomianu. Jeżeli tak, to zaakceptuj
słowo wejściowe, w przeciwnym przypadku je odrzuć.


W przypadku gdy słowo wejściowe należy do <math>\displaystyle \#SAT(D)</math> jest jasne, że funkcja <math>\displaystyle P</math>
W przypadku, gdy słowo wejściowe należy do <math>\#SAT(D)</math>, jest jasne, że funkcja <math>P</math>,
postępująca zgodnie z powyższym protokołem zawsze przekona <math>\displaystyle V</math> o tej
postępująca zgodnie z powyższym protokołem, zawsze przekona <math>V</math> o tej
przynależności. Popatrzmy teraz, co się stanie, gdy słowo wejściowe nie należy
przynależności. Popatrzmy teraz, co się stanie, gdy słowo wejściowe nie należy
do <math>\displaystyle \#SAT(D)</math>; w tym przypadku wartość <math>\displaystyle f_0()</math> podana przez <math>\displaystyle \bar P</math> będzie
do <math>\#SAT(D)</math>; w tym przypadku wartość <math>f_0()</math> podana przez <math>\bar P</math> będzie
musiała się różnić od wartości prawdziwej (oznaczmy ją jako <math>\displaystyle \bar {f_0}()</math>).
musiała się różnić od wartości prawdziwej (oznaczmy ją jako <math>\bar {f_0}()</math>).
W związku z tym przynajmniej jedna z wartości <math>\displaystyle f_1(0)</math> lub <math>\displaystyle f_1(1)</math> będzie
W związku z tym przynajmniej jedna z wartości <math>f_1(0)</math> lub <math>f_1(1)</math> będzie
różna od oczekiwanej -- <math>\displaystyle \bar {f_1}(0)</math> lub <math>\displaystyle \bar {f_1}(1)</math> -- a co za tym
różna od oczekiwanej -- <math>\bar {f_1}(0)</math> lub <math>\bar {f_1}(1)</math> -- a co za tym
idzie wielomian <math>\displaystyle f_1(z)</math> będzie różny od <math>\displaystyle \bar {f_1}(z)</math>. Pokażemy teraz fakt,
idzie wielomian <math>f_1(z)</math> będzie różny od <math>\bar {f_1}(z)</math>. Pokażemy teraz fakt
będący sednem naszego dowodu: Jeżeli wielomian <math>\displaystyle f_i(r_1,r_2,\ldots,r_{i-1},z)</math>
będący sednem naszego dowodu: jeżeli wielomian <math>f_i(r_1,r_2,\ldots,r_{i-1},z)</math>
jest różny od wielomianu <math>\displaystyle \bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math>, to z dużym
jest różny od wielomianu <math>\bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math>, to z dużym
prawdopodobieństwem również <math>\displaystyle f_{i+1}(r_1,r_2,\ldots,r_i,z)</math> będzie różny od
prawdopodobieństwem również <math>f_{i+1}(r_1,r_2,\ldots,r_i,z)</math> będzie różny od
<math>\displaystyle \bar {f_{i+1}}(r_1,r_2,\ldots,r_i,z)</math>. Zauważmy, że jesli <math>\displaystyle r_i</math> zostanie
<math>\bar {f_{i+1}}(r_1,r_2,\ldots,r_i,z)</math>. Zauważmy, że jesli <math>r_i</math> zostanie
wylosowane w taki sposób, że <math>\displaystyle f_i(r_1,\ldots,r_i)=\bar {f_i}(r_1,\ldots,r_i)</math>,
wylosowane w taki sposób, że <math>f_i(r_1,\ldots,r_i)=\bar {f_i}(r_1,\ldots,r_i)</math>,
to <math>\displaystyle \bar P</math> w kolejnym kroku będzie mógł zwrócić wielomian
to <math>\bar P</math> w kolejnym kroku będzie mógł zwrócić wielomian
<math>\displaystyle \bar {f_{i+1}} (r_1, \ldots,r_i,z)</math> -- a zatem skutecznie oszuka <math>\displaystyle V</math>. Aby tak
<math>\bar {f_{i+1}} (r_1, \ldots,r_i,z)</math> -- a zatem skutecznie oszuka <math>V</math>. Aby tak
się jednak stało wylosowana wartość <math>\displaystyle r_i</math> musi być jednym z punktów, w których
się jednak stało wylosowana wartość <math>r_i</math> musi być jednym z punktów, w których
<math>\displaystyle \bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math> i <math>\displaystyle \bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math>
<math>\bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math> i <math>\bar {f_i}(r_1,r_2,\ldots,r_{i-1},z)</math>
są równe. Prawdopodobieństwo takiego zdarzenia to co najwyżej <math>\displaystyle n/{2^n}</math>. Jeżeli
są równe. Prawdopodobieństwo takiego zdarzenia to co najwyżej <math>n/{2^n}</math>. Jeżeli
<math>\displaystyle f_i(r_1,\ldots,r_i)\neq \bar {f_i}(r_1,\ldots,r_i)</math>, to niewątpliwie
<math>f_i(r_1,\ldots,r_i)\neq \bar {f_i}(r_1,\ldots,r_i)</math>, to niewątpliwie
<math>\displaystyle f_{i+1}(r_1,\ldots,r_i,0) \neq \bar {f_{i+1}}(r_1,\ldots,r_i,0)</math> lub
<math>f_{i+1}(r_1,\ldots,r_i,0) \neq \bar {f_{i+1}}(r_1,\ldots,r_i,0)</math> lub
<math>\displaystyle f_{i+1}(r_1,\ldots,r_i,1) \neq \bar {f_{i+1}}(r_1,\ldots,r_i,1)</math> -- a co za
<math>f_{i+1}(r_1,\ldots,r_i,1) \neq \bar {f_{i+1}}(r_1,\ldots,r_i,1)</math> -- a co za
tym idzie wielomian <math>\displaystyle f_{i+1}(r_1,\ldots,r_i,z)</math> będzie różny od wielomianu
tym idzie wielomian <math>f_{i+1}(r_1,\ldots,r_i,z)</math> będzie różny od wielomianu
<math>\displaystyle \bar {f_{i+1}}(r_1,\ldots,r_i,z)</math>.
<math>\bar {f_{i+1}}(r_1,\ldots,r_i,z)</math>.


Widzimy więc, że prawdopodobieństwo zdarzenia, w którym
Widzimy więc, że prawdopodobieństwo zdarzenia, w którym
<math>\displaystyle f_m(r_1,\ldots,r_{m-1},z)</math> jest równy <math>\displaystyle \bar {f_m}(r_1,\ldots,r_{m-1},z)</math> jest
<math>f_m(r_1,\ldots,r_{m-1},z)</math> jest równy <math>\bar {f_m}(r_1,\ldots,r_{m-1},z)</math> jest
ograniczone od góry przez wyrażenie <math>\displaystyle m \cdot n / {2^n}</math>, co z kolei jest nie
ograniczone od góry przez wyrażenie <math>m \cdot n / {2^n}</math>, co z kolei jest nie
większe niż <math>\displaystyle n^2 / {2^n}</math>. <math>\displaystyle V</math> jest w stanie wykryć niezgodność tych wielomianów
większe niż <math>n^2 / {2^n}</math>. <math>V</math> jest w stanie wykryć niezgodność tych wielomianów
w czasie wielomianowym w sposób deterministyczny -- a zatem <math>\displaystyle n^2 / {2^n}</math> jest
w czasie wielomianowym w sposób deterministyczny -- a zatem <math>n^2 / {2^n}</math> jest
górnym ograniczeniem na prawdopodobieństwo zaakceptowania przez <math>\displaystyle V</math> słowa
górnym ograniczeniem na prawdopodobieństwo zaakceptowania przez <math>V</math> słowa
spoza <math>\displaystyle \#SAT(D)</math>.
spoza <math>\#SAT(D)</math>.


W tym momencie wystarczy już tylko zauważyć, że <math>\displaystyle n^2 / {2^n}</math> jest mniejsze od
W tym momencie wystarczy już tylko zauważyć, że <math>n^2 / {2^n}</math> jest mniejsze od
<math>\displaystyle 1/3</math> dla każdego <math>\displaystyle n \geq 8</math>; protokół będziemy zatem stosować dla formuł o co
<math>1/3</math> dla każdego <math>n \geq 8</math>; protokół będziemy zatem stosować dla formuł o co
najmniej 8 literałach. Pozostałe mogą zostać stablicowane przez <math>\displaystyle V</math> i rozstrzygane
najmniej 8 literałach. Pozostałe mogą zostać stablicowane przez <math>V</math> i rozstrzygane
w czasie stałym, bez angażowania <math>\displaystyle P</math>.
w czasie stałym, bez angażowania <math>P</math>.


Powyższy protokół pokazuje zatem przynależność <math>\displaystyle \#SAT(D)</math> do klasy <math>\displaystyle IP</math>.
Powyższy protokół pokazuje zatem przynależność <math>\#SAT(D)</math> do klasy <math>IP</math>.


Powróćmy teraz do problemu <math>\displaystyle QSAT</math>. Możemy myśleć o kwantyfikatorach jako o
Powróćmy teraz do problemu <math>QSAT</math>. Możemy myśleć o kwantyfikatorach jako o
pewnych transformacjach wykonywanych na zarytmetyzowanej formule logicznej,
pewnych transformacjach wykonywanych na zarytmetyzowanej formule logicznej,
przedstawiając ten proces schematycznie jako:
przedstawiając ten proces schematycznie jako:


<math>\displaystyle {Q_1}_{x_1} {Q_2}_{x_2} \ldots {Q_m}_{x_m} \langle \phi \rangle</math>
<math>{Q_1}_{x_1} {Q_2}_{x_2} \ldots {Q_m}_{x_m} \langle \phi \rangle</math>,


gdzie <math>\displaystyle Q_i \in \{ \exists, \forall \}</math>, natomiast <math>\displaystyle \langle \phi \rangle</math> to
gdzie <math>Q_i \in \{ \exists, \forall \}</math>, natomiast <math>\langle \phi \rangle</math> to
formuła <math>\displaystyle \phi</math> przekształcona w procesie arytmetyzacji. Operacje <math>\displaystyle Q_i</math> definiujemy
formuła <math>\phi</math> przekształcona w procesie arytmetyzacji. Operacje <math>Q_i</math> definiujemy
następująco:
następująco:
* <math>\displaystyle {Q_i}_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = W(x_1,x_2,\ldots,0,\ldots,x_m) \cdot
* <math>{Q_i}_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = W(x_1,x_2,\ldots,0,\ldots,x_m) \cdot
W(x_1,x_2,\ldots,1,\ldots,x_m)</math> gdy <math>\displaystyle Q_i = \forall</math>,
W(x_1,x_2,\ldots,1,\ldots,x_m)</math> gdy <math>Q_i = \forall</math>,
* <math>\displaystyle {Q_i}_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = 1 - (1 - W(x_1,x_2,\ldots,0,\ldots,x_m)) \cdot
* <math>{Q_i}_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = 1 - (1 - W(x_1,x_2,\ldots,0,\ldots,x_m)) \cdot
(1 - W(x_1,x_2,\ldots,1,\ldots,x_m))</math> gdy <math>\displaystyle Q_i = \exists</math>.
(1 - W(x_1,x_2,\ldots,1,\ldots,x_m)), \mbox{ gdy }Q_i = \exists</math>.


Możemy w tym momencie spróbować powtórzyć poprzedni dowód, to znaczy zdefiniować
Możemy w tym momencie spróbować powtórzyć poprzedni dowód, to znaczy zdefiniować
ciąg wielomianów <math>\displaystyle f_0,f_1,\ldots,f_m</math> tak, aby <math>\displaystyle f_m</math> był zarytmetyzowaną formułą
ciąg wielomianów <math>f_0,f_1,\ldots,f_m</math> tak, aby <math>f_m</math> był zarytmetyzowaną formułą
<math>\displaystyle \phi</math>, a <math>\displaystyle f_{i-1} = {Q_i}_{x_i} f_i</math>. Niestety w tym przypadku wielomiany w
<math>\phi</math>, a <math>f_{i-1} = {Q_i}_{x_i} f_i</math>. Niestety w tym przypadku wielomiany w
kolejnych krokach są mnożone, a nie dodawane -- w związku z tym stopnie zmiennych
kolejnych krokach są mnożone, a nie dodawane -- w związku z tym stopnie zmiennych
w kolejnych wielomianach mogą rosnąć eksponencjalnie; nie będziemy zatem w
w kolejnych wielomianach mogą rosnąć eksponencjalnie; nie będziemy zatem w
Linia 852: Linia 708:
następującej operacji:
następującej operacji:


<math>\displaystyle R_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = x_i \cdot W(x_1,x_2,\ldots,1,\ldots,x_m)
<math>R_{x_i} W(x_1,x_2,\ldots,x_i,\ldots,x_m) = x_i \cdot W(x_1,x_2,\ldots,1,\ldots,x_m)
+ (1 - x_i) \cdot W(x_1,x_2,\ldots,0,\ldots,x_m)</math>
+ (1 - x_i) \cdot W(x_1,x_2,\ldots,0,\ldots,x_m)</math>.


Wielomian otrzymany w wyniku takiej transformacji ma następujące cechy:
Wielomian otrzymany w wyniku takiej transformacji ma następujące cechy:
* jest liniowy ze względu na <math>\displaystyle x_i</math>,
* jest liniowy ze względu na <math>x_i</math>,
* maksymalne stopnie pozostałych zmiennych pozostają takie same,
* maksymalne stopnie pozostałych zmiennych pozostają takie same,
* nowy wielomian daje takie same wyniki co wyjściowy dla argumentów Boole'owskich
* nowy wielomian daje takie same wyniki co wyjściowy dla argumentów Boole'owskich (to znaczy dla liczb 0 i 1).
(to znaczy dla liczb 0 i 1).


Zmodyfikowana procedura postępowania będzie wyglądała następująco:
Zmodyfikowana procedura postępowania będzie wyglądała następująco:


<math>\displaystyle {Q_1}_{x_1} R_{x_1} {Q_2}_{x_2} R_{x_1} R_{x_2} {Q_3}_{x_3} \ldots
<math>{Q_1}_{x_1} R_{x_1} {Q_2}_{x_2} R_{x_1} R_{x_2} {Q_3}_{x_3} \ldots
{Q_m}_{x_m} R_{x_1} \ldots R_{x_m} \langle \phi \rangle</math>
{Q_m}_{x_m} R_{x_1} \ldots R_{x_m} \langle \phi \rangle</math>.


Zauważmy, że <math>\displaystyle R</math> nie zmienia ilości zmiennych wielomianu, natomiast operacje
Zauważmy, że <math>R</math> nie zmienia ilości zmiennych wielomianu, natomiast operacje
<math>\displaystyle Q_i</math> zmniejszają liczbę o 1.
<math>Q_i</math> zmniejszają liczbę o 1.
Liczbę transformacji oznaczymy jako <math>\displaystyle k</math> -- będzie ona kwadratowo zależna od
Liczbę transformacji oznaczymy jako <math>k</math> -- będzie ona kwadratowo zależna od
liczby zmiennych <math>\displaystyle m</math>. W tym momencie możemy już zdefiniować ciąg wielomianów
liczby zmiennych <math>m</math>. W tym momencie możemy już zdefiniować ciąg wielomianów
<math>\displaystyle f_0,f_1,\ldots,f_k</math>: <math>\displaystyle f_k</math> będzie zarytmetyzowaną formułą <math>\displaystyle \phi</math>, natomiast
<math>f_0,f_1,\ldots,f_k</math>: <math>f_k</math> będzie zarytmetyzowaną formułą <math>\phi</math>, natomiast
<math>\displaystyle f_{i-1}</math> będzie otrzymywany z <math>\displaystyle f_i</math> za pomocą odpowiedniej transformacji
<math>f_{i-1}</math> będzie otrzymywany z <math>f_i</math> za pomocą odpowiedniej transformacji
<math>\displaystyle Q_j</math> lub <math>\displaystyle R</math>. Ze względu na stosowanie <math>\displaystyle R</math> stopień każdej zmiennej w tych
<math>Q_j</math> lub <math>R</math>. Ze względu na stosowanie <math>R</math> stopień każdej zmiennej w tych
wielomianach jest ograniczony przez liczbę literałów w <math>\displaystyle \phi</math> (oznaczaną
wielomianach jest ograniczony przez liczbę literałów w <math>\phi</math> (oznaczaną
ponownie jako <math>\displaystyle n</math>). Podobnie jak wcześniej, <math>\displaystyle f_0()</math> będzie szukanym przez nas
ponownie jako <math>n</math>). Podobnie jak wcześniej, <math>f_0()</math> będzie szukanym przez nas
wynikiem; wielomiany ponownie będą określone nad pewnym skończonym ciałem
wynikiem; wielomiany ponownie będą określone nad pewnym skończonym ciałem
<math>\displaystyle {\mathbb Z}_p</math> -- tym razem jednak wystarczy nam dowolna liczba pierwsza <math>\displaystyle p</math>
<math>{\mathbb Z}_p</math> -- tym razem jednak wystarczy nam dowolna liczba pierwsza <math>p</math>
większa niż <math>\displaystyle n^4</math>. Taką liczbę <math>\displaystyle V</math> może znaleźć samodzielnie, dla uproszczenia
większa niż <math>n^4</math>. Taką liczbę <math>V</math> może znaleźć samodzielnie, dla uproszczenia
jednak założymy, że otrzymana zostanie ona tak samo jak <math>\displaystyle p</math> w protokole dla
jednak założymy, że otrzymana zostanie ona tak samo jak <math>p</math> w protokole dla
<math>\displaystyle \#SAT(D)</math>.
<math>\#SAT(D)</math>.
Właściwy protokół będzie oparty na tej samej zasadzie, co poprzednio: <math>\displaystyle P</math>
Właściwy protokół będzie oparty na tej samej zasadzie co poprzednio: <math>P</math>
wypisze wartość <math>\displaystyle f_0()</math>, po czym będzie wypisywała pewne zawężenia wielomianów
wypisze wartość <math>f_0()</math>, po czym będzie wypisywała pewne zawężenia wielomianów
<math>\displaystyle f_1, \ldots, f_k</math>; <math>\displaystyle V</math> będzie sprawdzała, czy kolejne wielomiany nie są sprzeczne
<math>f_1, \ldots, f_k</math>; <math>V</math> będzie sprawdzała, czy kolejne wielomiany nie są sprzeczne
z poprzednimi (czyli również z <math>\displaystyle f_0</math>), a na końcu samodzielnie obliczy
z poprzednimi (czyli również z <math>f_0</math>), a na końcu samodzielnie obliczy
zawężenie wielomianu <math>\displaystyle \bar {f_k}</math> i porówna je z wielomianem otrzymanym od <math>\displaystyle P</math>.
zawężenie wielomianu <math>\bar {f_k}</math> i porówna je z wielomianem otrzymanym od <math>P</math>.
Ponownie jeśli <math>\displaystyle P</math> skłamie przy podawaniu wartości <math>\displaystyle f_0()</math>, prawdopodobieństwo
Ponownie, jeśli <math>P</math> skłamie przy podawaniu wartości <math>f_0()</math>, prawdopodobieństwo
tego, że uda jej się to kłamstwo zamaskować, będzie nieduże.
tego, że uda jej się to kłamstwo zamaskować, będzie nieduże.
Popatrzmy teraz jak wygląda pojedynczy krok protokołu: Oznaczmy <math>\displaystyle i</math>-tą
Popatrzmy teraz jak wygląda pojedynczy krok protokołu. W tym celu oznaczmy <math>i</math>-tą
transformację jako <math>\displaystyle {S_i}_{y_i}</math>. Załóżmy bez utraty ogólności, że <math>\displaystyle {y_i} = x_1</math>,
transformację jako <math>{S_i}_{y_i}</math>. Załóżmy bez utraty ogólności, że <math>{y_i} = x_1</math>,
natomiast <math>\displaystyle y_{i-1} = x_2</math> -- założenie to ma na celu jedynie uproszczenie
natomiast <math>y_{i-1} = x_2</math> -- założenie to ma na celu jedynie uproszczenie
indeksowania. Podobnie jak w przypadku <math>\displaystyle \#SAT(D)\displaystyle V</math> dysponuje współczynnikami
indeksowania. Podobnie jak w przypadku <math>\#SAT(D)V</math> dysponuje współczynnikami
<math>\displaystyle f_{i-1}</math> jako wielomianu zmiennej <math>\displaystyle {x_2}</math>, gdzie za
<math>f_{i-1}</math> jako wielomianu zmiennej <math>{x_2}</math>, gdzie za
pozostałe zmienne zostały podstawione pewne wylosowane uprzednio stałe. Jeżeli
pozostałe zmienne zostały podstawione pewne wylosowane uprzednio stałe. Jeżeli
operacja <math>\displaystyle S_i</math> jest kwantyfikatorem, to protokół zachowuje się praktycznie identycznie
operacja <math>S_i</math> jest kwantyfikatorem, to protokół zachowuje się praktycznie identycznie
jak w poprzednim dowodzie; w tym przypadku <math>\displaystyle V</math> ma do dyspozycji wielomian
jak w poprzednim dowodzie; w tym przypadku <math>V</math> ma do dyspozycji wielomian
<math>\displaystyle f_{i-1}(x_2,r_3,r_4,\ldots,r_s)</math>, losuje liczbę <math>\displaystyle r_2</math> i prosi <math>\displaystyle P</math> o przesłanie
<math>f_{i-1}(x_2,r_3,r_4,\ldots,r_s)</math>, losuje liczbę <math>r_2</math> i prosi <math>P</math> o przesłanie
współczynników <math>\displaystyle f_i(x_1,r_2,\ldots,r_s)</math>. Jeżeli wielomian
współczynników <math>f_i(x_1,r_2,\ldots,r_s)</math>. Jeżeli wielomian
<math>\displaystyle f_{i-1}(x_2,r_3,r_4,\ldots,r_s)</math> nie jest prawidłowy -- czyli gdy funkcja <math>\displaystyle P</math> próbuje
<math>f_{i-1}(x_2,r_3,r_4,\ldots,r_s)</math> nie jest prawidłowy -- czyli gdy funkcja <math>P</math> próbuje
oszukać <math>\displaystyle V</math> i nie udało jej się jeszcze "zatrzeć śladów oszustwa" --
oszukać <math>V</math> i nie udało jej się jeszcze "zatrzeć śladów oszustwa" --
to prawdopodobieństwo, że wielomian <math>\displaystyle f_i(x_1,r_2,\ldots,r_s)</math> będzie prawidłowy
to prawdopodobieństwo, że wielomian <math>f_i(x_1,r_2,\ldots,r_s)</math> będzie prawidłowy,
będzie równe co najwyżej <math>\displaystyle n/{n^4}</math>, czyli <math>\displaystyle 1/{n^3}</math>.
wyniesie co najwyżej <math>n/{n^4}</math>, czyli <math>1/{n^3}</math>.
Rozpatrzmy teraz przypadek, gdy <math>\displaystyle S_i = R</math>. <math>\displaystyle V</math> ma do dyspozycji wielomian
Rozpatrzmy teraz przypadek, gdy <math>S_i = R</math>. <math>V</math> ma do dyspozycji wielomian
<math>\displaystyle f_{i-1}(r_1,x_2,r_3,\ldots,r_s)</math>. W pierwszej kolejności <math>\displaystyle V</math> losuje pewną
<math>f_{i-1}(r_1,x_2,r_3,\ldots,r_s)</math>. W pierwszej kolejności <math>V</math> losuje pewną
liczbę <math>\displaystyle {r'}_2</math>, po czym prosi <math>\displaystyle P</math> o przesłanie współczynników wielomianu
liczbę <math>{r'}_2</math>, po czym prosi <math>P</math> o przesłanie współczynników wielomianu
<math>\displaystyle f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Następnie <math>\displaystyle V</math> sprawdza, czy podstawienie
<math>f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Następnie <math>V</math> sprawdza, czy podstawienie
<math>\displaystyle {r'}_2</math> do pierwszego z tych wielomianów daje ten sam wynik, co podstawienie <math>\displaystyle r_1</math>
<math>{r'}_2</math> do pierwszego z tych wielomianów daje ten sam wynik, co podstawienie <math>r_1</math>
do drugiego. Ponownie argumentujemy, że jeśli wielomian <math>\displaystyle f_{i-1}(r_1,x_2,r_3,\ldots,r_s)</math>
do drugiego. Ponownie argumentujemy, że jeśli wielomian <math>f_{i-1}(r_1,x_2,r_3,\ldots,r_s)</math>
był nieprawidłowy -- czyli różny od "wzorcowego" wielomianu
był nieprawidłowy -- czyli różny od "wzorcowego" wielomianu
<math>\displaystyle \bar {f_{i-1}}(r_1,x_2,r_3,\ldots,r_s)</math> -- to prawdopodobieństwo, że dla
<math>\bar {f_{i-1}}(r_1,x_2,r_3,\ldots,r_s)</math> -- to prawdopodobieństwo, że dla
wylosowanej wartości <math>\displaystyle {r'}_2</math> zachodzi
wylosowanej wartości <math>{r'}_2</math> zachodzi
<math>\displaystyle f_{i-1}(r_1,{r'}_2,r_3,\ldots,r_s) = \bar {f_{i-1}}(r_1,{r'}_2,r_3,\ldots,r_s)</math>
<math>f_{i-1}(r_1,{r'}_2,r_3,\ldots,r_s) = \bar {f_{i-1}}(r_1,{r'}_2,r_3,\ldots,r_s)</math>
jest nie większe niż <math>\displaystyle 1/{n^3}</math>. W związku z tym wielomian
jest nie większe niż <math>1/{n^3}</math>. W związku z tym wielomian
<math>\displaystyle f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> będzie poprawny z prawdopodobieństwem co
<math>f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> będzie poprawny z prawdopodobieństwem co
najwyżej równym <math>\displaystyle 1/{n^3}</math>. W następnym kroku <math>\displaystyle P</math> przesyła współczynniki wielomianu
najwyżej równym <math>1/{n^3}</math>. W następnym kroku <math>P</math> przesyła współczynniki wielomianu
<math>\displaystyle f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Zauważmy, że <math>\displaystyle V</math> jest w stanie samodzielnie
<math>f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Zauważmy, że <math>V</math> jest w stanie samodzielnie
sprawdzić, czy wielomian <math>\displaystyle f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> został otrzymany z
sprawdzić, czy wielomian <math>f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> został otrzymany z
<math>\displaystyle f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math> w wyniku transformacji <math>\displaystyle R</math> -- transformacja ta
<math>f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math> w wyniku transformacji <math>R</math> -- transformacja ta
jest przecież jednoznacznie określona. Jeżeli założymy zatem, że wielomian
jest przecież jednoznacznie określona. Jeżeli założymy zatem, że wielomian
<math>\displaystyle f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> jest nieprawidłowy, to nieprawidłowy musi
<math>f_{i-1}(x_1,{r'}_2,r_3,\ldots,r_s)</math> jest nieprawidłowy, to nieprawidłowy musi
być też wielomian <math>\displaystyle f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Reasumując -- prawdopodobieństwo,
być też wielomian <math>f_i(x_1,{r'}_2,r_3,\ldots,r_s)</math>. Reasumując -- prawdopodobieństwo,
że w kroku odpowiadającym pewnej transformacji <math>\displaystyle R</math> funkcji <math>\displaystyle V</math> uda się
że w kroku odpowiadającym pewnej transformacji <math>R</math> funkcji <math>V</math> uda się
skutecznie "zatrzeć ślad" po wcześniejszym oszustwie jest nie większe niż
skutecznie "zatrzeć ślad" po wcześniejszym oszustwie, jest nie większe niż
<math>\displaystyle 1/{n^3}</math>.
<math>1/{n^3}</math>.


{{uwaga|||
{{uwaga|2.12||
Zauważmy, że w trakcie działania protokołu losujemy <math>\displaystyle k</math> liczb; jest zatem
Zauważmy, że w trakcie działania protokołu losujemy <math>k</math> liczb; jest zatem
możliwe (i pewne), że w tym procesie <math>\displaystyle V</math> będzie podstawiać w miejsce tej
możliwe (i pewne), że w tym procesie <math>V</math> będzie podstawiać w miejsce tej
samej zmiennej różne wylosowane liczby. Dla przykładu -- powyżej wylosowaliśmy
samej zmiennej różne wylosowane liczby. Dla przykładu -- powyżej wylosowaliśmy
liczbę <math>\displaystyle {r'}_2</math>; być może jednak już wcześniej dokonywaliśmy innej operacji na
liczbę <math>{r'}_2</math>; być może jednak już wcześniej dokonywaliśmy innej operacji na
zmiennej <math>\displaystyle x_2</math> i wylosowaliśmy inną liczbę <math>\displaystyle r_2</math>. Widzimy zatem, że pewne
zmiennej <math>x_2</math> i wylosowaliśmy inną liczbę <math>r_2</math>. Widzimy zatem, że pewne
wylosowane wartości zostają w tym procesie "zapomniane" i na ich miejsce
wylosowane wartości zostają w tym procesie "zapomniane" i na ich miejsce
losowane są nowe. Oczywiście wyniki nowych losowań powinny być niezależne od
losowane są nowe. Oczywiście wyniki nowych losowań powinny być niezależne od
poprzednich -- inaczej <math>\displaystyle P</math> mógłby osiągnąć większe prawdopodobieństwo skutecznego
poprzednich -- inaczej <math>P</math> mógłby osiągnąć większe prawdopodobieństwo skutecznego
oszukania <math>\displaystyle V</math>.
oszukania <math>V</math>.
}}
}}


Jak zauważyliśmy wcześniej, liczba wykonywanych transformacji <math>\displaystyle k</math> jest
Jak zauważyliśmy wcześniej, liczba wykonywanych transformacji <math>k</math> jest
kwadratowo zależna od <math>\displaystyle m</math>; w szczególności natychmiastowe jest oszacowanie
kwadratowo zależna od <math>m</math>; w szczególności natychmiastowe jest oszacowanie
<math>\displaystyle k < (m+1)^2</math>. W związku z tym prawdopodobieństwo, że <math>\displaystyle V</math> zaakceptuje słowo
<math>k < (m+1)^2</math>. W związku z tym prawdopodobieństwo, że <math>V</math> zaakceptuje słowo
wejściowe nie należące do <math>\displaystyle QSAT</math> jest nie większe niż <math>\displaystyle (m+1)^2/{n^3}</math>, co
wejściowe nienależące do <math>QSAT</math> jest nie większe niż <math>(m+1)^2/{n^3}</math>, co
z kolei jest nie większe niż <math>\displaystyle (n+1)^2/{n^3} = O(1/n)</math>. Ponownie zatem <math>\displaystyle V</math>
z kolei jest nie większe niż <math>(n+1)^2/{n^3} = O(1/n)</math>. Ponownie zatem <math>V</math>
musi "stablicować" wyniki dla pewnej skończonej liczby formuł (w tym przypadku
musi "stablicować" wyniki dla pewnej skończonej liczby formuł (w tym przypadku
stablicowane muszą zostać formuły o co najwyżej 4 literałach), a dla reszty
stablicowane muszą zostać formuły o co najwyżej 4 literałach), a dla reszty
protokół będzie dawał prawidłowe wyniki z wymaganym prawdopodobieństwem.
protokół będzie dawał prawidłowe wyniki z wymaganym prawdopodobieństwem.


Powyższy protokół pokazuje więc przynależność <math>\displaystyle QSAT</math> do klasy <math>\displaystyle IP</math>. W tym
Powyższy protokół pokazuje więc przynależność <math>QSAT</math> do klasy <math>IP</math>. W tym
momencie wystarczy zauważyć, że klasa <math>\displaystyle IP</math> jest domknięta ze względu na redukcje
momencie wystarczy zauważyć, że klasa <math>IP</math> jest domknięta ze względu na redukcje
wielomianowe; jeśli <math>\displaystyle L_1</math> redukuje się do <math>\displaystyle L_2</math> oraz znamy protokół rozwiązujący
wielomianowe; jeśli <math>L_1</math> redukuje się do <math>L_2</math> oraz znamy protokół rozwiązujący
<math>\displaystyle L_2</math>, to <math>\displaystyle V</math> może w pierwszym kroku dokonać redukcji, po czym postępować
<math>L_2</math>, to <math>V</math> może w pierwszym kroku dokonać redukcji, po czym postępować
zgodnie z protokołem dla <math>\displaystyle L_2</math>. Korzystając z faktu, że <math>\displaystyle QSAT</math> jest
zgodnie z protokołem dla <math>L_2</math>. Korzystając z faktu, że <math>QSAT</math> jest
problemem <math>\displaystyle PSPACE</math>-zupełnym, stwierdzamy, że każdy problem z klasy <math>\displaystyle PSPACE</math>
problemem <math>PSPACE</math>-zupełnym, stwierdzamy, że każdy problem z klasy <math>PSPACE</math>
zawarty jest w klasie <math>\displaystyle IP</math>.
zawarty jest w klasie <math>IP</math>.
}}


{{cwiczenie|||
{{cwiczenie|2.13||
Wyjaśnij, czemu w protokole <math>\displaystyle \#SAT(D)</math> potrzebowaliśmy ciała o co najmniej
Wyjaśnij, czemu w protokole <math>\#SAT(D)</math> potrzebowaliśmy ciała o co najmniej
<math>\displaystyle 2^n</math> elementach.
<math>2^n</math> elementach.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Widzimy, że aby spełnić wymagania dotyczące prawdopodobieństwa zaakceptowania
Widzimy, że aby spełnić wymagania dotyczące prawdopodobieństwa zaakceptowania
słowa spoza języka, wystarczy ciało o wielkości <math>\displaystyle n^3</math>. W przypadku <math>\displaystyle \#SAT(D)</math>
słowa spoza języka, wystarczy ciało o wielkości <math>n^3</math>. W przypadku <math>\#SAT(D)</math>
ciało <math>\displaystyle {\mathbb Z}_p</math> służy nam jednak nie tylko jako dostarczyciel dużej
ciało <math>{\mathbb Z}_p</math> służy nam jednak nie tylko jako dostarczyciel dużej
przestrzeni prawdobodobieństwa, lecz również do zliczania ilości spełniających
przestrzeni prawdopodobieństwa, lecz również do zliczania ilości spełniających
wartościowań dla zadanej formuły logicznej. Z tego powodu potrzebujemy co
wartościowań dla zadanej formuły logicznej. Z tego powodu potrzebujemy co
najmniej <math>\displaystyle 2^m</math> liczb -- co oznacza, że w zdegenerowanym przypadku gdy
najmniej <math>2^m</math> liczb -- co oznacza, że w zdegenerowanym przypadku, gdy
każda zmienna jest używana w dokładnie jednym literale wymagane ciało musi mieć
każda zmienna jest używana w dokładnie jednym literale wymagane ciało musi mieć
liczność
liczność
nie mniejszą niż <math>\displaystyle 2^n</math>.
nie mniejszą niż <math>2^n</math>.
</div></div>
</div></div>
==Testy końcowe==

Aktualna wersja na dzień 11:00, 5 wrz 2023

Funkcje jednokierunkowe

W dotychczasowych rozważaniach naszym celem było znalezienie możliwie efektywnego rozwiązania dla zadanych problemów; nadmierna złożoność problemu była przez nas traktowana jako cecha niepożądana, utrudniająca nam zadanie. W tym rozdziale nasze podejście będzie odmienne; duża złożoność będzie dla nas cechą bardzo cenną. Będzie nas przy tym, w mniejszym niż dotychczas stopniu, interesować złożoność pesymistyczna -- w końcu nie satysfakcjonuje nas "gwarancja" mówiąca, że "jeżeli osoba podsłuchująca będzie miała pecha, to odszyfrowanie wiadomości będzie dla niej zadaniem czasochłonnym". Wolelibyśmy, żeby odszyfrowywanie wiadomości przez osoby nieuprawnione było czasochłonne, praktycznie zawsze -- tak, by próba podsłuchiwania dawała szansę sukcesu bardzo bliską zeru. Duża pesymistyczna złożoność nie będzie zatem warunkiem wystarczającym bycia dobrym kryptosystemem; przyda nam się jednak w charakterze warunku koniecznego.

Definicja 1.1

Niech f:{0,1}{0,1}. Mówimy, że f jest funkcją jednokierunkową wtedy i tylko wtedy, gdy:

  • f jest różnowartościowa,
  • istnieje pewna stała k>1 taka, że x{0,1}|x|1/kf(x)|x|k,
  • f jest obliczalna w czasie wielomianowym (czyli należy do klasy FP),
  • nie istnieje wielomianowy algorytm obliczający odwrotność funkcji f -- czyli znajdujący dla słowa y słowo x, takie że f(x)=y lub stwierdzający, że takie słowo nie istnieje.

Warto zauważyć, że powyższa definicja niejawnie zakłada prawdziwość zdania PNP.

Ćwiczenie 1.2

Niech f spełnia pierwsze trzy warunki podane w definicji funkcji jednokierunkowej. Pokaż, że obliczanie odwrotności funkcji f jest problemem z klasy FNP.

Rozwiązanie

Z drugiej strony nierówność PNP wcale nie gwaratuje istnienia funkcji jednokierunkowych; jak się okazuje istnienie tego typu funkcji jest ściśle powiązane z pewną klasą złożoności, którą przedstawiamy poniżej.

Definicja 1.3

Jednoznaczną maszyną Turinga nazywamy niedeterministyczną maszynę Turinga taką, że dla każdego słowa wejściowego x istnieje co najwyżej jedna akceptująca ścieżka obliczeń.

Definicja 1.4

Klasa UP to klasa problemów rozstrzygalnych za pomocą jednoznacznych maszyn Turinga w czasie wielomianowym.

Uwaga 1.5

Klasę UP, podobnie jak klasę NP, można zdefiniować z użyciem pojęcia świadka:

LUPp(x)wielomianLPnw{0,1}n[wL(!v{0,1}p(n)w,vL)][wL(¬v{0,1}p(n)w,vL)].

W językach z klasy UL każde słowo ma dokładnie jednego świadka. Dowód równoważności powyższych definicji jest analogiczny jak w przypadku klasy NP.

Jest jasne, że PUPNP -- maszyny deterministyczne są specjalnymi przypadkami maszyn jednoznacznych. Dość powszechny jest pogląd, że obie powyższe relacje zawierania są właściwe (to znaczy nie zachodzi równość).

Pokażemy teraz bardzo ciekawy związek pomiędzy klasą UP a funkcjami jednokierunkowymi.

Twierdzenie 1.6

Funkcje jednokierunkowe istnieją wtedy i tylko wtedy, gdy UPP.

Dowód

Zaczniemy od dowodu w kierunku . Załóżmy, że istnieje pewna funkcja jednokierunkowa f. Możemy wtedy zdefiniować następujący język:

Lf={(x,y):zf(z)=yzx},

przy czym mówimy, że zx wtedy i tylko wtedy, gdy

  • |z||y| lub
  • |z|=|y| i w porządku leksykograficznym z występuje nie później niż x.

Łatwo można zauważyć, że LfUP - maszyna rozwiązująca ten problem najpierw "zgaduje" słowo z o wielkości nie większej niż |y|k, po czym sprawdza, czy w ustalonym porządku występuje ono nie później niż x i czy zachodzi f(z)=y. Z własności funkcji jednokierunkowych -- konkretnie z różnowartościowości -- wynika, że maszyna ta ma co najwyżej jedną akceptującą ścieżkę postępowania.

Chcemy teraz pokazać, że LfP. Załóżmy zatem nie wprost, że istnieje jakiś wielomianowy algorytm rozwiązujący Lf. Wykorzystamy go teraz do obliczenia odwrotności funkcji f w czasie wielomianowym. W pierwszym kroku zapytamy algorytm, czy (1|y|k,y)Lf (przez 1|y|k oznaczamy tutaj ciąg |y|k symboli 1) - jeżeli otrzymamy odpowiedź NIE, to korzystając z definicji funkcji jednokierunkowej, możemy od razu stwierdzić, że nie istnieje słowo x takie, że f(x)=y. Jeżeli otrzymamy odpowiedź TAK, to z użyciem co najwyżej |y|k1 zapytań do naszego algorytmu jesteśmy w stanie ustalić długość szukanego słowa x (pytamy kolejno o (1|y|k1,y), (1|y|k2,y), itd., aż do momentu, gdy uzyskamy odpowiedź NIE). Gdy znamy już długość słowa x pozostaje nam tylko obliczyć kolejne jego bity. Pierwszy bit otrzymamy, pytając o parę (01|x|1,y) -- odpowiedź "tak" oznacza, że pierwszym bitem jest 0. Aby uzyskać drugi bit zapytamy -- w zależności od pierwszej odpowiedzi -- o (001|x|2,y) lub (101|x|2,y). Kolejne bity odgadujemy w analogiczny sposób -- łącznie zatem wykonamy algorytm dla LfO(|y|k) razy. W ten sposób uzyskamy deterministycznty algorytm odwracający funkcję f w czasie wielomianowym.

Doszliśmy więc do sprzeczności z definicją funkcji jednokierunkowej, co oznacza, że istnienie funkcji jednokierunkowych implikuje nierówność PUP.

Załóżmy teraz, że istnieje język LUPP, rozpoznawany przez jednoznaczną maszynę U. Zdefiniujmy funkcję fU(w) w następujący sposób:

  • jeżeli w jest zakodowaną parą słów x,y oraz x jest (jedynym) świadkiem przynależności słowa y do L, to

fU(w)=1y,

  • w przeciwnym przypadku

fU(w)=0w.

Widzimy, że pierwszy symbol wartości funkcji gwarantuje nam jej różnowartościowość. Spełniony jest również drugi warunek z definicji funkcji jednokierunkowej -- świadek dla słowa y nie może być nadmiernie długi (bo jego długość jest wielomianowo zależna od długości y), a zatem fU nie może nadmiernie "skracać" słów. Funkcja fU jest też obliczalna w czasie wielomianowym -- wystarczy deterministycznie zweryfikować świadka, tak jak zrobiłaby to maszyna U. Pozostaje nam zatem tylko pokazanie, że funkcja odwrotna do d nie jest obliczalna w czasie wielomianowym. Gdyby tak jednak było, to moglibyśmy rozpoznawać język L w czasie wielomianowym: aby sprawdzić, czy yL wystarczy zastosować odwrotność funkcji fU do słowa 1y; jeżeli yL, to dostaniemy odpowiedź mówiącą, że 1y nie można odwrócić; w przeciwnym przypadku otrzymamy świadka przynależności y do języka L.

Na dzień dzisiejszy nie znamy oczywiście funkcji, o której wiedzielibyśmy, że jest jednokierunkowa; istnienie takiej funkcji natychmiastowo implikuje przecież nierówność PNP. Jest jednak kilku "kandydatów" na funkcje jednokierunkowe, dla których nie znamy efektywnego algorytmu pozwalającego na ich odwrócenie. Jedną z takich funkcji jest fMUL. Argumentami tej funkcji są dwie liczby pierwsze wraz ze swoimi certyfikatami pierwszości. Wartością funkcji jest iloczyn tych dwóch liczb. Bardziej formalnie:

  • jeżeli w=p,C(p),q,C(q), gdzie p<q a C(p) i C(q) są certyfikatami pierwszości odpowiednio dla p i q, to

fMUL(w)=1pq,

  • w przeciwnym przypadku

fMUL(w)=0w.

Korzystamy tutaj z faktu, że możemy wymusić jednoznaczną reprezentację certyfikatu pierwszości dla danej liczby oraz że certyfikaty mają rozmiar wielomianowo zależny od rozmiaru certyfikowanych liczb. fMUL jest zatem różnowartościowa i nie "skraca" nadmiernie słowa wejściowego.

Łatwo zauważyć, gdzie tkwi trudność w odwracaniu tej funkcji -- nie znamy efektywnego algorytmu potrafiącego faktoryzować iloczyn dwóch liczb pierwszych; znane nam obecnie algorytmy stają się niepraktyczne już przy iloczynach liczb pierwszych o długości kilkuset bitów.

Drugi ze znanych nam "kandydatów na funkcję jednokierunkową" również oparty jest na zagadnieniu z dziedziny teorii liczb -- problemie logarytmu dyskretnego. Funkcję tą można zdefiniować w następujący sposób:

  • dla w postaci p,C(p),r,x, gdzie p jest liczbą pierwszą, C(p) certyfikatem jej pierwszości, r jest najmniejszym generatorem grupy cyklicznej p, a x jest liczbą naturalną z zakresu [1,p1]

fEXP(w)=1p,r,rxmodp)

  • dla pozostałych w

fEXP(w)=0w.

W tym przypadku, aby odwrócić funkcję fEXP, musielibyśmy na podstawie liczb p, r i rxmodp umieć obliczyć wartość x. Również dla tego, znanego od wielu lat, problemu nie potrafimy przedstawić wydajnego rozwiązania.

Jak zauważyliśmy, we wprowadzeniu do tego rozdziału, w kryptografii duża złożoność pesymistyczna próby zdekodowania zaszyfrowanej wiadomości nie jest własnością wystarczającą. Z tego powodu przytoczymy alternatywną definicję funkcji jednokierunkowych, lepiej odwzorowującą nasze oczekiwania. Należy pamiętać, że definicja ta jest istotnie różna od definicji podanej wcześniej.

Definicja 1.7

Niech f:{0,1}{0,1}. Mówimy, że f jest funkcją jednokierunkową wtedy i tylko wtedy, gdy:

  • f jest obliczalna w czasie wielomianowym,
  • f nie jest stale równa ϵ (słowu pustemu),
  • istnieje pewna stała k>1 taka, że x{0,1}f(x)=ϵ|x|1/kf(x)|x|k,
  • jeżeli x i y są słowami nad alfabetem {0,1} i f(x)=f(y), to x=y lub f(x)=f(y)=ϵ,
  • dla każdej losowej maszyny Turinga E działającej w czasie wielomianowym, każdej liczby l i dostatecznie dużej liczby n, jeżeli x jest losowym słowem ze zbioru {x:|x|nf(x)ϵ}, to

Pr[E(f(x))=x]nl.

W tej definicji zrezygnowaliśmy z wymagania o różnowartościowości funkcji; zamiast tego dopuszczamy, aby różne słowa dawały jako wynik wartość ϵ, którą możemy traktować jako odpowiedź mówiącą, że wejście jest nieprawidłowe; dla przykładu przy adaptowaniu funkcji fMUL do powyższej definicji, w przypadku gdy p lub q nie będą liczbami pierwszymi lub gdy C(p), lub C(q) nie będą odpowiednimi certyfikatami, funkcja zwróci wartość ϵ. Zauważmy, że w powyższej definicji interesuje nas tylko trudność odszyfrowania wartości funkcji dla poprawnych wejść -- to znaczy w przypadku fMUL dla par liczb, które są pierwsze i których pierwszość jest potwierdzana przez C(p) i C(q). Funkcje fMUL jak i fEXP -- po odpowiednim ich zmodyfikowaniu w sposób przedstawiony powyżej -- są poważnymi "kandydatami" na funkcje jednokierunkowe również w sensie definicji opisanej w poprzednim paragrafie.

Warto się w tym momencie zastanowić, w jaki sposób funkcje jednokierunkowe mogą się przydać w kryptografii. Otóż widzimy, że jedna ze stron -- zwyczajowo zwana Alicją -- może wydajnie zaszyfrować swoją wiadomość, na przykład używając ją jako argument x do funkcji fEXP. Niestety druga strona -- zazwyczaj o imieniu Bob -- może mieć duże trudności z odszyfrowaniem wiadomości. W tej sytuacji fakt, że osoba podsłuchująca -- Cecylia -- niczego ciekawego się nie dowie, stanowi słabe pocieszenie.

Widzimy zatem, że aby zapewnić poufność komunikacji pochodzącej od Alicji, ale również możliwość odebrania tej wiadomości, Bob musi posiadać pewną tajną wiedzę, pozwalającą na wydajne odwrócenie funkcji szyfrującej. Zdefiniujemy teraz pewną modyfikację pojęcia funkcji jednokierunkowej mającą szersze zastosowanie w kryptografii.

Definicja 1.8

Niech f:{0,1}×{0,1}{0,1}. Mówimy, że f jest funkcją z wytrychem wtedy i tylko wtedy gdy istnieje losowa maszyna Turinga G oraz funkcja h:{0,1}×{0,1}{0,1} taka, że:

  • funkcje f i h są obliczalne w czasie wielomianowym,
  • G oczekuje na wejściu słowa nad alfabetem {0,1}, zwraca zakodowaną parę słów nad alfabetem {0,1} i działa w czasie wielomianowym,
  • istnieje stała k>1 taka, że jeżeli i,t stanowi wynik działania maszyny M dla słowa 1n, natomiast x jest słowem o długości nie większej niż n, to |i,x|1/k|t,f(i,x)||i,x|k,
  • jeżeli i,t stanowi wynik działania maszyny M dla słowa 1n, natomiast x i y są słowami o długości nie większej niż n, to

f(i,x)=f(i,y)x=y,

  • dla każdej losowej maszyny Turinga E, każdej liczby l i dostatecznie dużej liczby n, jeżeli i,t stanowi wynik działania maszyny M dla słowa 1n, x jest losowym słowem nad alfabetem {0,1} nie dłuższym niż n, to

Pr[E(i,f(i,x))=x]nl,

  • dla każdego n, każdego słowa x nie dłuższego niż n i każdej pary i,t mogącej być wynikiem działania maszyny G, dla słowa wejściowego 1nh(t,f(i,x))=x.

Funkcje z wytrychem mogą zostać wykorzystane w celu stworzenia systemów kryptograficznych z kluczem publicznym. Sposób postępowania jest w tym przypadku następujący:

  • Bob ustala długość przekazywanych wiadomości (n) oraz parametr wyznaczający prawdopodobieństwo odszyfrowania pojedynczej wiadomości (k),
  • Bob uruchamia maszynę G i otrzymuje parę słów i,t. Słowo i staje się dostępnym dla wszystkich kluczem publicznym, natomiast t pozostaje tajemnicą znaną tylko Bobowi,
  • Alicja, chcąc wysłać wiadomość do Boba, używa znanego jej klucza publicznego i. Własności funkcji z wytrychem sprawiają, że odszyfrowanie wiadomości jest łatwe dla Boba, natomiast trudne dla osób trzecich nieznających klucza t.

Najbardziej znanym systemem kryptograficznym opartym na powyższej zasadzie jest system RSA. Pamiętajmy przy tym, że nie znamy formalnego dowodu, mówiącego, że RSA spełnia warunki określone w definicji funkcji z wytrychem.

Prześledźmy teraz, w jaki sposób zdefiniowane są f, h i G dla systemu RSA.

Zadaniem maszyny G jest wygenerowanie pary kluczy. W tym celu losuje ona dwie liczby pierwsze p i q, z których każda ma długość większą niż n/2 (gdzie n to długość przekazywanych wiadomości). Następnie oblicza ona liczbę N=pq oraz wartość funkcji Eulera dla tej liczby: ϕ(N)=(p1)(q1). W kolejnym kroku znajdywana jest dowolna liczba e z zakresu [2,N2], względnie pierwsza z ϕ(N). Dla liczby e znajdywana jest następnie liczba d z zakresu [2,N2] taka, że

de=1modϕ(N).

Istnienie takiej liczby spowodowane jest faktem, że e i ϕ(N) są względnie pierwsze; liczbę d można efektywnie obliczyć z użyciem uogólnionego algorytmu Euklidesa.

W tym momencie można już zdefiniować parę kluczy: kluczem publicznym jest para liczb e oraz N; kluczem prywatnym jest para liczb d oraz N. Szyfrowanie słowa x wygląda następująco:

f(e,N,x)=xemodN,

przy czym wiadomość x traktujemy jako binarny zapis pewnej liczby naturalnej. Dekodowanie słowa y określone jest w praktycznie identyczny sposób:

h(d,N,y)=ydmodN.

Wystarczy teraz przypomnieć sobie, że iloczyn de jest postaci kϕ(N)+1, dla pewnej liczby całkowitej k. W związku z tym

h(d,N,f(e,N,x))=(xe)dmodN=xkϕ(N)+1modN=xkϕ(N)xmodN=x.

Widzimy zatem, że funkcja h poprawnie dekoduje słowa zaszyfrowane z użyciem funkcji f -- Bob będzie zatem w stanie odtworzyć wiadomość wysłaną przez Alicję.

Systemy dowodów interaktywnych

W ostatnim fragmencie niniejszego kursu zajmiemy się klasą złożoności, będącą uogólnieniem klas NP i BPP. W tym celu zdefiniujemy pojęcie systemu dowodów interaktywnych.

Definicja 2.1

Systemem dowodów interaktywnych nazywamy parę funkcji V oraz P o sygnaturach:

V:Σ×Σ×ΣΣ{accept,reject}P:Σ×ΣΣ

taką, że funkcja V jest obliczalna na maszynie Turinga.

Działanie systemu dowodów interaktywnych polega na wymianie komunikatów między funkcjami V i P, przy czym funkcja P (z angielskiego prover) stara się "przekonać" funkcję V (verifier) o tym, że słowo wejściowe należy do rozpatrywanego języka, natomiast ostateczna decyzja w tej sprawie należy do V.

Komunikacja odbywa się naprzemiennie: funkcja V generuje wiadomość, przekazywaną funkcji P jako argument; funkcja P z kolei generuje odpowiedź przekazywaną funkcji V w następnej iteracji. Taka komunikacja odbywa się do momentu zaakceptowania lub odrzucenia słowa wejściowego przez funkcję V. W każdym kroku obie funkcje mają do dyspozycji zarówno słowo wejściowe, jak również pełną historię przekazanych dotychczas wiadomości.

Określmy teraz, co dokładnie oznaczają argumenty funkcji V i P. Argumenty funkcji V będziemy oznaczać w następujący sposób:

V(w,r,m1#m2##mi).

Mają one następujące znaczenie:

  • w to słowo wejściowe,
  • r jest losowym ciągiem bitów,
  • m1#m2##mi to konkatenacja dotychczasowych wiadomości, które zostały przekazane w procesie komunikacji (wiadomości o indeksach nieparzystych są wynikami działania funkcji V, natomiast wiadomości o indeksach parzystych są wynikami działania funkcji P).

Zwróćmy uwagę, że V ma do dyspozycji losowe słowo r; w praktyce oznacza to, że o funkcji V będziemy myśleć jako o pewnej losowej maszynie Turinga.

Zakładamy, że zarówno w jak i r są stałe w kolejnych iteracjach; słowo r jest zatem losowane jednokrotnie, przed rozpoczęciem procesu komunikacji. Warto też zauważyć, że słowa w i r całkowicie determinują działanie systemu.

Argumenty funkcji P będziemy oznaczać następująco:

P(w,m1#m2##mi).

Ich znaczenie jest identyczne jak w przypadku argumentów funkcji V, nie ma wśród nich jednak słowa losowego.

Możemy w tym momencie zdefiniować klasę IP:

Definicja 2.2

Niech LΣ. Mówimy, że LIP wtedy i tylko wtedy, gdy istnieje system dowodów interaktywnych (V,P) oraz wielomiany p(n) i q(n) takie, że dla każdego słowa wejściowego w oraz losowego słowa r o długości p(|x|):

  • system daje odpowiedź po co najwyżej p(|x|) krokach,
  • w każdej iteracji czas działania maszyny obliczającej funkcję V jest ograniczony od góry przez q(|x|),
  • długość każdej wiadomości mi jest nie większa niż p(|x|),
  • jeżeli wL, to prawdopodobieństwo zaakceptowania słowa przez system wynosi co najmniej 2/3,
  • jeżeli wL oraz P¯ jest dowolną funkcją o sygnaturze zgodnej z P, zwracającą wiadomości nie dłuższe niż p(|x|), to system (V,P¯) spełnia powyższe założenia na ilość iteracji, czas działania i długość wiadomości oraz akceptuje słowo w z prawdopodobieństwem nie większym niż 1/3.

O systemie (V,P) mówimy, że rozpoznaje język L w czasie wielomianowym.

Innymi słowy, jeżeli słowo w należy do języka, to V z dużym prawdopodobieństwem da się przekonać o tej przynależności przez pewną ustaloną funkcję P. Jeżeli jednak w nie należy do L, to V nie da się oszukać żadnej funkcji P¯ ze zbyt dużym prawdopodobieństwem.

Uwaga 2.3

Zwróćmy jeszcze uwagę, że branie pod uwagę tylko takich funkcji P¯, które nie zwracają zbyt długich słów, nie jest istotnym ograniczeniem; funkcja V może w każdym kroku sprawdzać, czy odpowiedź funkcji P¯ nie jest zbyt długa i jeśli tak, to odrzucać słowo. W dalszej części rozdziału będziemy zakładali takie właśnie zachowanie funkcji V.

Widzimy zatem, że funkcja V musi być zabezpieczona przed oszustwami; jeżeli V mogłaby zaufać funkcji P, to mogłaby rozwiązać każdy problem decyzyjny -- wystarczyłoby po prostu skorzystać z nieograniczonej mocy obliczeniowej P. W naszym przypadku jednak nie wystarczy, aby P tylko rozwiązała problem decyzyjny -- musi jeszcze przekonać V do swojego rozwiązania.

Przykład 2.4

Rozważmy problem NONGRAPHISO. Jest on zdefiniowany następująco:

NONGRAPHISO={G,H: grafy G i H nie są izomorficzne }.

Łatwo sie przekonać, że problem izomorfizmu grafów jest w klasie NP -- wystarczy zgadnąć odpowiednią permutację wierzchołków, po czym zweryfikować ją w trywialny sposób. NONGRAPHISO należy zatem do coNP. Nie jest jednak obecnie znana odpowiedź na pytanie o przynależność tego problemu do klasy NP. Pokażemy teraz, w jaki sposób można rozwiązać NONGRAPHISO za pomocą systemów dowodów interaktywnych, pokazując przynależność tego problemu do klasy IP.

System działa w prosty sposób: W kolejnych iteracjach funkcja V wybiera losowo jeden z grafów, a następnie w losowy sposób permutuje jego wierzchołki. Taki graf jest przekazywany jako wiadomość do funkcji P. Zadaniem funkcji P jest rozpoznanie, który z wyjściowych grafów został wylosowany i przekształcony przez V.

Ćwiczenie 2.5

Zdefiniuj, w jakich przypadkach V powinien zaakceptować, a w jakich odrzucić wejściową parę grafów. Oblicz, ile iteracji jest potrzebnych, aby system rozpoznawał język NONGRAPHISO w czasie wielomianowym zgodnie z wcześniejszą definicją.

Rozwiązanie

Ćwiczenie 2.6

Pokaż, że klasa BPP jest zawarta w klasie IP.

Rozwiązanie

Ćwiczenie 2.7

Rozpatrzmy takie systemy dowodów interaktywnych, w których funkcje V nie zależą od argumentu r (słowa losowego). Jaką klasę języków rozpoznają takie systemy, przy założeniach o złożoności analogicznych jak w przypadku klasy IP?

Rozwiązanie

Możemy w tym momencie przypuszczać, że klasa IP jest znacząco większa od klasy NP. Nie wiemy obecnie, czy przypuszczenie to jest prawdziwe; przemawia jednak za nim poniższe twierdzenie.

Twierdzenie 2.8

IP=PSPACE

Dowód

Pokażemy najpierw fakt IPPSPACE. W tym celu wybierzemy dowolny problem z klasy IP i rozwiążemy go z użyciem wielomianowej ilości pamięci.

Załóżmy, że system (V,P) akceptuje wybrany język w czasie wielomianowym.

Ustalmy słowo w. Będziemy mówić, że ciąg wiadomości m1#m2##mi jest zgodny ze słowem losowym r, jeżeli stanowi on historię wiadomości po i iteracjach pewnego systemu (V,P) używającego słowa losowego r. Warto zauważyć, że ciąg wiadomości może być zgodny z wieloma słowami losowymi (na przykład ciąg pusty jest zgodny z każdym słowem losowym), a słowo losowe może być zgodne z różnymi ciągami wiadomości (w zależności od funkcji P).

Zdefiniujmy teraz funkcję P w taki sposób, by miała ona następującą własność:

wPr((V,P) akceptuje w)=maxPPr((V,P) akceptuje w).

Funkcja P zatem dla każdego słowa wejściowego zachowuje się w najlepszy możliwy sposób. Jest ona dobrze zdefiniowana, gdyż dla każdego wejściowego słowa zbiór prawdopodobieństw jest skończony -- przy ustalonym słowie w wszystkie możliwe funkcje P można przypisać do skończonej liczby klas równoważności, w ramach których system (V,P) zachowuje się identycznie (pamiętajmy, że w całym procesie komunikacji funkcja V wykonuje co najwyżej skończoną, ustaloną dla danego słowa wejściowego liczbę kroków).

Jest jasne, że (V,P) również akceptuje wybrany język w czasie wielomianowym -- od tej pory będziemy się zatem zajmowali tym konkretnym systemem. Nasz algorytm będzie dla każdego słowa wejściowego wprost obliczał prawdopodobieństwo zaakceptowania go przez system (V,P); tym samym, w zależności od wyniku, będzie mógł określić, czy słowo wejściowe należy do języka. Dla uproszczenia założymy, że system (V,P) daje odpowiedzi po dokładnie p(|x|) krokach.

Zdefiniujmy teraz funkcję mierzącą prawdopodobieństwo akceptacji słowa przez system (V,P) przy ustalonej częściowej historii komunikacji:

N(m1#m2##mi)=Pr(słowo w zostanie zaakceptowane pod warunkiem, że dotychczasowe komunikaty reprezentowane są przez m1#m2##mi).

W przypadku, gdy nie ma słowa losowego zgodnego z m1#m2##mi, funkcji N(m1#m2##mi) nadajemy wartość 0. Łatwo jest obliczyć N(m1#m2##mp(|x|)):

  • jeżeli mp(|x|)=accept i m1#m2##mp(|x|) jest zgodne z pewnym słowem losowym, to

N(m1#m2##mp(|x|))=1,

  • w przeciwnym przypadku

N(m1#m2##mp(|x|))=0.

Do obliczania wartości N dla mniejszej ilości kroków, możemy posłużyć się następującym wzorem rekurencyjnym:

  • jeżeli i jest nieparzyste, to

N(m1#m2##mi)=maxmi+1N(m1#m2##mi+1),

  • jeżeli i jest parzyste, to

N(m1#m2##mi)=mi+1Pr(mi+1|m1#m2##mi)N(m1#m2##mi+1).

Wzór ten jest konsekwencją zachowania P i V: P w każdym kroku maksymalizuje prawdopodobieństwo akceptacji, natomiast zachowanie V zależne jest od historii wiadomości i słowa losowego.

W tym momencie wystarczą dwa spostrzeżenia. Po pierwsze, N(ϵ) jest poszukiwanym przez nas prawdopodobieństwem zaakceptowania przez system (V,P) słowa w. Po drugie, N(ϵ) jest obliczalne w pamięci wielomianowej: każde rekurencyjne wywołanie funkcji N powoduje sekwencyjne rozważenie wszystkich możliwych odpowiedzi, których długość jest jednak ograniczona od góry przez p(|x|). Dodatkowo przy obliczeniach na poziomie zagłębienia p(|x|) należy rozważyć wszystkie możliwe słowa losowe i sprawdzić ich zgodność z aktualnie rozważanym ciągiem komunikatów. Wszystkie te operacje można wykonać z użyciem O(p(|x|)2) komórek pamięci.

Pokazaliśmy zatem, że IPPSPACE.

Dowód zawierania w drugą stronę odbywa się poprzez przedstawienie protokołu komunikacji dla problemu QSAT. Aby przybliżyć stosowaną w tym protokole technikę, zaprezentujemy najpierw dowód przynależności do klasy IP problemu #SAT(D) będącego wersją decyzyjną problemu #SAT:

Definicja 2.9

#SAT(D)={ϕ,k: liczba wartościowań spełniających dla formuły ϕ jest nie mniejsza niż k}.

W dowodzie posłużymy się techniką zwaną arytmetyzacją; formuły logiczne będziemy zastępować wielomianami w następujący sposób:

  • zmienne formuły stają się zmiennymi wielomianu,
  • wyrażenia typu ¬x zastępujemy przez (1x),
  • wyrażenia typu αβ zastępujemy przez αβ,
  • wyrażenia typu αβ zastępujemy przez (1(1α)(1β)).

Dla uproszczenia założymy na razie, że wielomiany te określone są na liczbach rzeczywistych.

Ćwiczenie 2.10

Niech ϕ będzie formułą z m zmiennymi, natomiast W(x1,,xm) wielomianem otrzymanych w sposób przedstawiony powyżej. Weźmy dowolne wartościowanie zmiennych formuły ϕ i podstawmy je do wielomianu W (to znaczy podstawmy 0, gdy zmienna jest wartościowana na "fałsz" i 1 w przeciwnym przypadku). Pokaż, że wartość wielomianu W jest równa 1, gdy wybrane wartościowanie jest wartościowaniem spełniającym dla ϕ oraz 0 w przeciwnym przypadku.

Wskazówka
Rozwiązanie

Ćwiczenie 2.11

Niech n oznacza liczbę -- niekoniecznie różnych -- literałów (zmiennych i ich zaprzeczeń) w formule ϕ. Pokaż, że stopień każdej zmiennej w wielomianie W jest nie większy niż n.

Rozwiązanie

Zdefiniujmy teraz ciąg wielomianów f0,f1,,fm w następujący sposób:

  • fm jest wielomianem otrzymanym z formuły ϕ w wyniku procesu arytmetyzacji,
  • fi(x1,x2,,xi):=fi+1(x1,x2,,xi,0)+fi+1(x1,x2,,xi,1).

Zauważmy, że ilość argumentów zmniejsza się w kolejnych funkcjach, a f0 nie posiada żadnych argumentów (czyli jest stałą). Funkcje te spełniają następującą własność:

a1,a2,,ai{0,1}fi(a1,a2,,ai)=xi+1{0,1}xm{0,1}fm(a1,a2,,ai,xi+1,,xm)

Oznacza to, że jeżeli a1,,ai reprezentują pewne wartościowanie zmiennych x1,,xi, to fi(a1,,ai) wyznacza liczbę wartościwoań spełniających formułę ϕ rozpoczynających się od (a1,,ai). Oczywistym wnioskiem z powyższego spostrzeżenia jest to, że f0() jest liczbą wszystkich wartościowań spełniających ϕ.

Zauważmy jeszcze, że w wielomianach fi zachowana jest własność, mówiąca że każda zmienna występuje co najwyżej w stopniu n. Ilość wyrazów występujących w tych wielomianach może być jednak wykładnicza ze względu na długość formuły; z tego powodu obliczanie tych wielomianów może być procesem czasochłonnym.

Przedstawiany protokół komunikacyjny obliczanie wielomianów f0,,fm1 zleca funkcji P. Ta następnie przekazuje funkcji V pewne informacje o wielomianach, na podstawie których V może z dużym prawdopodobieństwem rozstrzygnąć, czy f0,,fm1 zostały "uczciwie" obliczone zgodnie z powyższą rekurencyjną procedurą, czy też P próbuje oszukać V.

Protokół nie operuje na liczbach rzeczywistych -- zamiast nich używamy ciała p, gdzie p jest liczbą pierwszą większą niż 2n. Wielomiany określone nad takim ciałem mają wiele cech wspólnych z wielomianami nad -- w szczególności wielomian jednej zmiennej o stopniu n, który nie jest stale równy 0, ma co najwyżej n pierwiastków. W rezultacie dwa różne wielomiany stopnia nie większego niż n mogą być równe w co najwyżej n punktach.

W tym momencie jesteśmy gotowi do przedstawienia protokołu dla #SAT(D):

  • Krok 1 (P): Znajdź liczbę pierwszą p z przedziału [2n,2n+1] oraz jej certyfikat pierwszości (taka liczba na pewno istnieje -- wynika to z twierdzenia Bertranda--Czebyszewa). Prześlij je jako wiadomość.
  • Krok 2 (V): Sprawdź poprawność liczby p, odrzuć słowo wejściowe, jeśli p lub jej certyfikat są nieprawidłowe.
  • Krok 3 (P): Oblicz f0() i prześlij jako wiadomość.
  • Krok 4 (V): Sprawdź, czy f0()k -- jeśli nie to odrzuć słowo wejściowe.
  • Krok 5 (P): Oblicz f1(z) (wielomian ze zmienną z) i prześlij jego współczynniki jako wiadomość.
  • Krok 6 (V): Sprawdź, czy f0()=f1(0)+f1(1). Wylosuj dowolną liczbę r1 z p i prześlij ją jako wiadomość,
  • Krok 7 (P): Oblicz f2(r1,z) (to też jest wielomian z jedną zmienną z) i prześlij jego współczynniki jako wiadomość.
  • Krok 8 (V): Sprawdź, czy f1(r1)=f2(r1,0)+f2(r1,1). Wylosuj dowolną liczbę r2 z p i prześlij ją jako wiadomość.
  • Krok 2m+4 (V): Sprawdź, czy fm1(r1,,rm1)=fm(r1,,rm1,0)+fm(r1,,rm1,1). Sprawdź, czy fm(r1,,rm1,z) jest wielomianem otrzymanym przez arytmetyzację formuły ϕ i podstawienie r1,,rm1 jako pierwszych m1 argumentów otrzymanego wielomianu. Jeżeli tak, to zaakceptuj słowo wejściowe, w przeciwnym przypadku odrzuć je.

W przypadku, gdy słowo wejściowe należy do #SAT(D), jest jasne, że funkcja P, postępująca zgodnie z powyższym protokołem, zawsze przekona V o tej przynależności. Popatrzmy teraz, co się stanie, gdy słowo wejściowe nie należy do #SAT(D); w tym przypadku wartość f0() podana przez P¯ będzie musiała się różnić od wartości prawdziwej (oznaczmy ją jako f0¯()). W związku z tym przynajmniej jedna z wartości f1(0) lub f1(1) będzie różna od oczekiwanej -- f1¯(0) lub f1¯(1) -- a co za tym idzie wielomian f1(z) będzie różny od f1¯(z). Pokażemy teraz fakt będący sednem naszego dowodu: jeżeli wielomian fi(r1,r2,,ri1,z) jest różny od wielomianu fi¯(r1,r2,,ri1,z), to z dużym prawdopodobieństwem również fi+1(r1,r2,,ri,z) będzie różny od fi+1¯(r1,r2,,ri,z). Zauważmy, że jesli ri zostanie wylosowane w taki sposób, że fi(r1,,ri)=fi¯(r1,,ri), to P¯ w kolejnym kroku będzie mógł zwrócić wielomian fi+1¯(r1,,ri,z) -- a zatem skutecznie oszuka V. Aby tak się jednak stało wylosowana wartość ri musi być jednym z punktów, w których fi¯(r1,r2,,ri1,z) i fi¯(r1,r2,,ri1,z) są równe. Prawdopodobieństwo takiego zdarzenia to co najwyżej n/2n. Jeżeli fi(r1,,ri)fi¯(r1,,ri), to niewątpliwie fi+1(r1,,ri,0)fi+1¯(r1,,ri,0) lub fi+1(r1,,ri,1)fi+1¯(r1,,ri,1) -- a co za tym idzie wielomian fi+1(r1,,ri,z) będzie różny od wielomianu fi+1¯(r1,,ri,z).

Widzimy więc, że prawdopodobieństwo zdarzenia, w którym fm(r1,,rm1,z) jest równy fm¯(r1,,rm1,z) jest ograniczone od góry przez wyrażenie mn/2n, co z kolei jest nie większe niż n2/2n. V jest w stanie wykryć niezgodność tych wielomianów w czasie wielomianowym w sposób deterministyczny -- a zatem n2/2n jest górnym ograniczeniem na prawdopodobieństwo zaakceptowania przez V słowa spoza #SAT(D).

W tym momencie wystarczy już tylko zauważyć, że n2/2n jest mniejsze od 1/3 dla każdego n8; protokół będziemy zatem stosować dla formuł o co najmniej 8 literałach. Pozostałe mogą zostać stablicowane przez V i rozstrzygane w czasie stałym, bez angażowania P.

Powyższy protokół pokazuje zatem przynależność #SAT(D) do klasy IP.

Powróćmy teraz do problemu QSAT. Możemy myśleć o kwantyfikatorach jako o pewnych transformacjach wykonywanych na zarytmetyzowanej formule logicznej, przedstawiając ten proces schematycznie jako:

Q1x1Q2x2Qmxmϕ,

gdzie Qi{,}, natomiast ϕ to formuła ϕ przekształcona w procesie arytmetyzacji. Operacje Qi definiujemy następująco:

  • QixiW(x1,x2,,xi,,xm)=W(x1,x2,,0,,xm)W(x1,x2,,1,,xm) gdy Qi=,
  • QixiW(x1,x2,,xi,,xm)=1(1W(x1,x2,,0,,xm))(1W(x1,x2,,1,,xm)), gdy Qi=.

Możemy w tym momencie spróbować powtórzyć poprzedni dowód, to znaczy zdefiniować ciąg wielomianów f0,f1,,fm tak, aby fm był zarytmetyzowaną formułą ϕ, a fi1=Qixifi. Niestety w tym przypadku wielomiany w kolejnych krokach są mnożone, a nie dodawane -- w związku z tym stopnie zmiennych w kolejnych wielomianach mogą rosnąć eksponencjalnie; nie będziemy zatem w stanie wypisać współczynników nawet po zawężeniu do jednej zmiennej.

Aby temu zaradzić, będziemy "po drodze" przekształcać wielomiany z użyciem następującej operacji:

RxiW(x1,x2,,xi,,xm)=xiW(x1,x2,,1,,xm)+(1xi)W(x1,x2,,0,,xm).

Wielomian otrzymany w wyniku takiej transformacji ma następujące cechy:

  • jest liniowy ze względu na xi,
  • maksymalne stopnie pozostałych zmiennych pozostają takie same,
  • nowy wielomian daje takie same wyniki co wyjściowy dla argumentów Boole'owskich (to znaczy dla liczb 0 i 1).

Zmodyfikowana procedura postępowania będzie wyglądała następująco:

Q1x1Rx1Q2x2Rx1Rx2Q3x3QmxmRx1Rxmϕ.

Zauważmy, że R nie zmienia ilości zmiennych wielomianu, natomiast operacje Qi zmniejszają tę liczbę o 1. Liczbę transformacji oznaczymy jako k -- będzie ona kwadratowo zależna od liczby zmiennych m. W tym momencie możemy już zdefiniować ciąg wielomianów f0,f1,,fk: fk będzie zarytmetyzowaną formułą ϕ, natomiast fi1 będzie otrzymywany z fi za pomocą odpowiedniej transformacji Qj lub R. Ze względu na stosowanie R stopień każdej zmiennej w tych wielomianach jest ograniczony przez liczbę literałów w ϕ (oznaczaną ponownie jako n). Podobnie jak wcześniej, f0() będzie szukanym przez nas wynikiem; wielomiany ponownie będą określone nad pewnym skończonym ciałem p -- tym razem jednak wystarczy nam dowolna liczba pierwsza p większa niż n4. Taką liczbę V może znaleźć samodzielnie, dla uproszczenia jednak założymy, że otrzymana zostanie ona tak samo jak p w protokole dla #SAT(D). Właściwy protokół będzie oparty na tej samej zasadzie co poprzednio: P wypisze wartość f0(), po czym będzie wypisywała pewne zawężenia wielomianów f1,,fk; V będzie sprawdzała, czy kolejne wielomiany nie są sprzeczne z poprzednimi (czyli również z f0), a na końcu samodzielnie obliczy zawężenie wielomianu fk¯ i porówna je z wielomianem otrzymanym od P. Ponownie, jeśli P skłamie przy podawaniu wartości f0(), prawdopodobieństwo tego, że uda jej się to kłamstwo zamaskować, będzie nieduże. Popatrzmy teraz jak wygląda pojedynczy krok protokołu. W tym celu oznaczmy i-tą transformację jako Siyi. Załóżmy bez utraty ogólności, że yi=x1, natomiast yi1=x2 -- założenie to ma na celu jedynie uproszczenie indeksowania. Podobnie jak w przypadku #SAT(D)V dysponuje współczynnikami fi1 jako wielomianu zmiennej x2, gdzie za pozostałe zmienne zostały podstawione pewne wylosowane uprzednio stałe. Jeżeli operacja Si jest kwantyfikatorem, to protokół zachowuje się praktycznie identycznie jak w poprzednim dowodzie; w tym przypadku V ma do dyspozycji wielomian fi1(x2,r3,r4,,rs), losuje liczbę r2 i prosi P o przesłanie współczynników fi(x1,r2,,rs). Jeżeli wielomian fi1(x2,r3,r4,,rs) nie jest prawidłowy -- czyli gdy funkcja P próbuje oszukać V i nie udało jej się jeszcze "zatrzeć śladów oszustwa" -- to prawdopodobieństwo, że wielomian fi(x1,r2,,rs) będzie prawidłowy, wyniesie co najwyżej n/n4, czyli 1/n3. Rozpatrzmy teraz przypadek, gdy Si=R. V ma do dyspozycji wielomian fi1(r1,x2,r3,,rs). W pierwszej kolejności V losuje pewną liczbę r2, po czym prosi P o przesłanie współczynników wielomianu fi1(x1,r2,r3,,rs). Następnie V sprawdza, czy podstawienie r2 do pierwszego z tych wielomianów daje ten sam wynik, co podstawienie r1 do drugiego. Ponownie argumentujemy, że jeśli wielomian fi1(r1,x2,r3,,rs) był nieprawidłowy -- czyli różny od "wzorcowego" wielomianu fi1¯(r1,x2,r3,,rs) -- to prawdopodobieństwo, że dla wylosowanej wartości r2 zachodzi fi1(r1,r2,r3,,rs)=fi1¯(r1,r2,r3,,rs) jest nie większe niż 1/n3. W związku z tym wielomian fi1(x1,r2,r3,,rs) będzie poprawny z prawdopodobieństwem co najwyżej równym 1/n3. W następnym kroku P przesyła współczynniki wielomianu fi(x1,r2,r3,,rs). Zauważmy, że V jest w stanie samodzielnie sprawdzić, czy wielomian fi1(x1,r2,r3,,rs) został otrzymany z fi(x1,r2,r3,,rs) w wyniku transformacji R -- transformacja ta jest przecież jednoznacznie określona. Jeżeli założymy zatem, że wielomian fi1(x1,r2,r3,,rs) jest nieprawidłowy, to nieprawidłowy musi być też wielomian fi(x1,r2,r3,,rs). Reasumując -- prawdopodobieństwo, że w kroku odpowiadającym pewnej transformacji R funkcji V uda się skutecznie "zatrzeć ślad" po wcześniejszym oszustwie, jest nie większe niż 1/n3.

Uwaga 2.12

Zauważmy, że w trakcie działania protokołu losujemy k liczb; jest zatem możliwe (i pewne), że w tym procesie V będzie podstawiać w miejsce tej samej zmiennej różne wylosowane liczby. Dla przykładu -- powyżej wylosowaliśmy liczbę r2; być może jednak już wcześniej dokonywaliśmy innej operacji na zmiennej x2 i wylosowaliśmy inną liczbę r2. Widzimy zatem, że pewne wylosowane wartości zostają w tym procesie "zapomniane" i na ich miejsce losowane są nowe. Oczywiście wyniki nowych losowań powinny być niezależne od poprzednich -- inaczej P mógłby osiągnąć większe prawdopodobieństwo skutecznego oszukania V.

Jak zauważyliśmy wcześniej, liczba wykonywanych transformacji k jest kwadratowo zależna od m; w szczególności natychmiastowe jest oszacowanie k<(m+1)2. W związku z tym prawdopodobieństwo, że V zaakceptuje słowo wejściowe nienależące do QSAT jest nie większe niż (m+1)2/n3, co z kolei jest nie większe niż (n+1)2/n3=O(1/n). Ponownie zatem V musi "stablicować" wyniki dla pewnej skończonej liczby formuł (w tym przypadku stablicowane muszą zostać formuły o co najwyżej 4 literałach), a dla reszty protokół będzie dawał prawidłowe wyniki z wymaganym prawdopodobieństwem.

Powyższy protokół pokazuje więc przynależność QSAT do klasy IP. W tym momencie wystarczy zauważyć, że klasa IP jest domknięta ze względu na redukcje wielomianowe; jeśli L1 redukuje się do L2 oraz znamy protokół rozwiązujący L2, to V może w pierwszym kroku dokonać redukcji, po czym postępować zgodnie z protokołem dla L2. Korzystając z faktu, że QSAT jest problemem PSPACE-zupełnym, stwierdzamy, że każdy problem z klasy PSPACE zawarty jest w klasie IP.

Ćwiczenie 2.13

Wyjaśnij, czemu w protokole #SAT(D) potrzebowaliśmy ciała o co najmniej 2n elementach.

Rozwiązanie

Testy końcowe