Złożoność obliczeniowa/Wykład 15: Kryptografia a złożoność

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Uwaga: przekonwertowane latex2mediawiki; prawdopodobnie trzeba wprowadzić poprawki

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, gdyż utrudniająca nasze 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

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

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 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

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

Uwaga

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

Funkcje jednokierunkowe istnieją 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 już 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 -- to znaczy funkcji, dla których nie znamy efektywnego algorytmu pozwalającego na ich odwrócenie. Jedną z takich funkcji jest funkcja 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) to certyfikaty 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 wfEXP(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 znamy 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

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 zwana 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

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 nie znają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 znajdowana 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 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 sa wynikami działania funkcji V, natomiast wiadomości o indeksach parzystych sa 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

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

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

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

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

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

Rozwiązanie

Ćwiczenie

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

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ł okreslić, 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

#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

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

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śc,
  • 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 je odrzuć.

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: 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 będzie równe 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

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 nie należą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

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

Rozwiązanie