Złożoność obliczeniowa/Wykład 10: Algorytmy probabilistyczne

From Studia Informatyczne

Algorytmy probabilistyczne

  • probabilistyczne klasy złożoności,
  • rozpoznawanie liczb pierwszych.

Spis treści

Probabilistyczne klasy złożoności

W tym module podejmujemy próbę teoretycznej analizy obliczeń, w których pojawia się losowość. Rozpoczynamy od wprowadzenia losowości do naszego modelu obliczeń.

Załóżmy, że \displaystyle M jest zwykłą niedeterministyczną maszyną Turinga. Przypomnijmy, że \displaystyle M ma podczas każdego kroku obliczeń możliwość wyboru wielu ścieżek obliczeń. W pojęciu akceptacji słowa bierzemy pod uwagę zachowanie \displaystyle M na wszystkich jej ścieżkach. Taka konstrukcja sprawia, że niedeterministyczny model obliczeń jest przydatny z czysto teoretycznego punktu widzenia, albowiem w praktyce takich maszyn zbudować nie umiemy.

Prosty pomysł, który pozwala zaadaptować ideę wielu możliwości, polega właśnie na losowaniu. Bez straty ogólności przyjmijmy, że na każdym kroku maszyna \displaystyle M wybiera spośród dwóch możliwości wyboru ścieżki. Wyobraźmy sobie, że maszyna \displaystyle M może rzucić monetą i na podstawie wyniku wybrać jedną z dwóch ścieżek. Prawidłową realizację takiego losowania i problemy jakie się z tym wiążą omówimy w dalszej części. W tym momencie jest dla nas najważniejsze, że jest to podejście jak najbardziej praktyczne.

Opisaną powyżej maszynę Turinga \displaystyle M nazywamy probabilistyczną. Maszyna probabilistyczna akceptuje słowo wejściowe \displaystyle x wtedy, gdy dojdzie do stanu akceptującego. Ponieważ na każdym kroku dokonuje ona losowania, to akceptacja odbywa się z pewnym prawdopodobieństwem. Podobnie jest z odrzucaniem słowa wejściowego:

Definicja 1.1.

Dla probabilistycznej maszyny Turinga \displaystyle M i słowa wejściowego \displaystyle x definiujemy \displaystyle P_M(x) jako prawdopodobieństwo, że maszyna \displaystyle M zaakceptuje słowo \displaystyle x.

Powyższe prawdopodobieństwo jest obliczane w sposób naturalny, na podstawie analizy możliwych ścieżek obliczeń.

Zauważmy, że maszyna deterministyczna jest szczególnym przypadkiem maszyny probabilistycznej -- to po prostu maszyna probabilistyczna, która nie wykonuje rzutów monetą w żadnym kroku (lub nie mają one wpływu na wynik obliczeń). Dla konkretnej maszyny deterministycznej \displaystyle M, jej języka \displaystyle L=L(M) i słowa wejściowego \displaystyle x zachodzi zatem:

  • \displaystyle x\in L \Rightarrow P_M(x)=1
  • \displaystyle x\notin L \Rightarrow P_M(x)=0

Naszym obiektem zainteresowania jest powiązanie prawdopodobieństwa akceptacji słowa z jego przynależnością do konkretnego języka \displaystyle L. W ten sposób będziemy mogli używać maszyny probabilistycznej do akceptowania \displaystyle L podobnie jak maszyny deterministycznej. Nie będziemy wymagać tak ścisłej zależności pomiędzy przynależnością do języka a prawdopodobieństwem akceptacji jak podana powyżej. Dzięki rozluźnieniu warunków okaże się, że łatwiej znaleźć maszynę probabilistyczną dla pewnych języków. Jednocześnie jednak rezygnując z determinizmu, badanie przynależności słowa do języka będzie wymagać szczególnej uwagi. Będzie bowiem dochodzić do sytuacji, że maszyna probabilistyczna będzie się mylić.

Błąd maszyny probabilistycznej \displaystyle M może być dwojakiego rodzaju. Ustalmy \displaystyle L. Jeśli \displaystyle x\in L to \displaystyle M akceptuje \displaystyle x z prawdopodobieństwem \displaystyle P_M(x). Jeśli nie jest ono równe 1, to może się okazać, że \displaystyle M odrzuci \displaystyle x. Mówimy wtedy o fałszywej odpowiedzi negatywnej. Maszyna odrzuca poprawne słowo z języka \displaystyle L!

W drugim przypadku \displaystyle x\notin L i \displaystyle M akceptuje \displaystyle x z prawdopodobieństwem \displaystyle P_M(x). Jeśli nie jest ono równe 0, to może się okazać, że \displaystyle M zaakceptuje \displaystyle x. Mówimy wtedy o fałszywej odpowiedzi pozytywnej. Maszyna akceptuje słowo spoza języka \displaystyle L!

Na pierwszy rzut oka taka maszyna może wydawać się bezużyteczna. Jeśli jednak jej omylność uda nam się okiełznać, to może to dać bardzo interesujące efekty praktyczne.

Za sztandarowy przykład służy problem decyzyjny rozpoznawania liczb pierwszych. Mimo, iż od niedawna znany jest algorytm deterministyczny, to w praktyce używa się właśnie (znacznie starszych) metod probabilistycznych, gdyż są zdecydowanie szybsze, a prawdopodobieństwo błędu jest z praktycznego punktu widzenia zaniedbywalne. W literaturze można znaleźć w tym miejscu często odwołanie do faktu, że każdy algorytm deterministyczny w praktyce działa na komputerze, w którym może wystąpić błąd natury fizycznej lub inne zdarzenie losowe, stąd w praktyce prawdziwego determinizmu nie ma. Rozpoznawaniem pierwszości zajmiemy się precyzyjnie w następnym rozdziale.

Kolejnym krokiem naszej analizy jest wprowadzenie probabilistycznych klas złożoności. Za podstawową z nich można uznać:

Definicja 1.2.[Klasa \displaystyle \textbf{RP}]]

Klasa \displaystyle \textbf{RP} (ang. Randomized Polynomial) to klasa tych języków \displaystyle L, dla których istnieje maszyna probabilistyczna \displaystyle M, działająca w czasie wielomianowym, o następującej własności:

  • \displaystyle x \in L \Rightarrow P_M(x) \geq { 1 \over 2 },
  • \displaystyle x \notin L \Rightarrow P_M(x) = 0.

Innymi słowy, maszyna nie daje fałszywych odpowiedzi pozytywnych, a prawdopodobieństwo fałszywej odpowiedzi negatywnej wynosi co najwyżej \displaystyle 1\over2. Co dla Nas oznacza to w praktyce?

Wyobraźmy sobie, że mamy język \displaystyle L z klasy \displaystyle \textbf{RP} i maszynę \displaystyle M dla niego. Uruchamiamy \displaystyle M na \displaystyle x. Maszyna działa w czasie wielomianowym. Gdy dostajemy odpowiedź ""TAK"" to jest super, bo nie daje ona fałszywych odpowiedzi pozytywnych, więc słowo na pewno należy do \displaystyle L.

Gdy otrzymujemy odpowiedź ""NIE"" to mamy kłopot. Maszyna mogła bowiem dać fałszywą odpowiedź negatywną z prawdopodobieństwem ograniczonym z góry przez \displaystyle 1\over2. W tym momencie wykonujemy jednak genialny w swojej prostocie manewr - uruchamiamy \displaystyle M jeszcze raz!

W idealnej sytuacji obliczenie wykonane za drugim razem jest kompletnie niezależne od pierwszego. Gdy otrzymamy odpowiedź ""TAK"" to po kłopocie. Gdy ponownie ""NIE"" to próba nie poszła na marne, gdyż prawdopodobieństwo błędu jest teraz ograniczone z góry przez \displaystyle 1\over4.

W tym miejscu dokładnie widać dlaczego odwoływaliśmy się wcześniej do zastosowań praktycznych. Jeśli bowiem powtórzymy próbę 100 razy, to prawdopodobieństwo błędu nie przekracza \displaystyle 1\over2^{100} co jest według prostego szacunku równie prawdopodobne, co trafienie komputera przez spadający meteoryt podczas obliczeń. W tym momencie możemy przerwać powtarzanie i uznać, że odpowiedź brzmi ""NIE"". Aby trochę ostudzić zapał zwróćmy uwagę, że niezależność kolejnych obliczeń i wiążąca się z tym niezależność losowych wyborów jest istotnym wyzwaniem praktycznym, do czego jeszcze wrócimy.

Monte Carlo
Enlarge
Monte Carlo

Algorytmy o powyższej własności są też nazywane algorytmami Monte Carlo od słynnego kasyna w Monaco, którego odwiedzanie wiąże się z procesem losowania i powtarzania kolejnych prób aż do upragnionego skutku w postaci wygranej. Algorytmy Monte Carlo to określenie na szerszą klasę metod, w których określone jest prawdopodobieństwo błędu.

Poniższy fakt jest dosyć zaskakujący. Okazuje się, że stała \displaystyle 1\over2 w definicji klasy \displaystyle \textbf{RP} nie ma żadnego znaczenia i wystarczy nam, żeby była dodatnia:

Ćwiczenie 1.3.

Pokaż, że stała \displaystyle 1\over2 w definicji klasy \displaystyle \textbf{RP} może zostać zamieniona na dowolną stałą z przedziału \displaystyle (0,1] lub nawet zależeć od \displaystyle x poprzez \displaystyle 1\over p(|x|), gdzie \displaystyle p jest wielomianem.

Wskazówka

Posłuż się wielokrotnym powtarzaniem obliczeń.

Rozwiązanie

Załóżmy, że dla \displaystyle x\in L mamy \displaystyle P_M(x)\geq\alpha. Załóżmy \displaystyle \alpha < {1\over2}. Jak uzyskać prawdopodobieństwo przynajmniej \displaystyle 1\over2? Konstruujemy maszynę \displaystyle M', która działa poprzez uruchomienie maszyny \displaystyle M kolejno \displaystyle k razy. Jeśli za którymkolwiek razem dostaniemy odpowiedź ""TAK"" to kończymy obliczenia dając odpowiedź ""TAK"", w przeciwnym wypadku dajemy odpowiedź ""NIE"".

Jak zmieniły się prawdopodobieństwa? Jeśli \displaystyle x\notin L to \displaystyle P_{M'}(x)=0, gdyż w tym przypadku maszyna \displaystyle M nigdy nie popełnia błędu i w każdym z \displaystyle k powtórzeń da odpowiedź ""NIE"".

Jeśli \displaystyle x\in L, to aby \displaystyle M' dała odpowiedź ""NIE"", maszyna \displaystyle M musi \displaystyle k razy dać odpowiedź ""NIE"". Ponieważ są to obliczenia niezależne, stąd \displaystyle P_{M'}(x)\geq 1-(1-\alpha)^k.

Jeśli chcemy, aby \displaystyle 1-(1-\alpha)^k\geq{1\over2}, to \displaystyle k\geq\lceil - 1/ log \displaystyle  (1-\alpha) \rceil. Jeśli zatem \displaystyle \alpha jest dowolną stałą z przedziału \displaystyle (0,{1\over2}) to \displaystyle k również jest stałą i mamy gotowe rozwiązanie polegające na stałej ilości powtórzeń obliczeń.

Jeśli natomiast jeszcze bardziej rozluźnimy warunki dopuszczając, aby \displaystyle P_M(x)\geq 1/p(|x|) to \displaystyle k będzie funkcją \displaystyle |x|, więc musimysprawdzić, czy nie wymagamy zbyt dużej liczby powtórzeń - maszyna \displaystyle M' musi bowiem działać w czasie wielomianowym od \displaystyle |x|. Okazuje się jednak, że gdy \displaystyle p jest wielomianem, to potrzebne \displaystyle k jest funkcją wielomianową od \displaystyle |x|, dokładnie tak jak tego potrzebujemy (poniższe własności wynikają z asymptotycznego zachowania się wyrażenia):

\displaystyle k \approx - \frac{1}{\mbox{log}\displaystyle  \left(1- \frac{1}{ p(|x|)}\right)} \approx p(|x|).

Zaznaczyliśmy już wcześniej, że maszyna probabilistyczna stanowi uogólnienie maszyny deterministycznej, stąd \displaystyle \textbf{P}\subseteq\textbf{RP}. Jak zwykle ani o tym, ani o poniższym zawieraniu nie wiemy czy jest ścisłe:

Ćwiczenie 1.4.

Pokaż, że \displaystyle \textbf{RP}\subseteq\textbf{NP}.

Wskazówka

Porównaj własności maszyn, które wprowadzają powyższe klasy.

Rozwiązanie

Gdy język \displaystyle L należy do \displaystyle \textbf{RP}, to istnieje dla niego maszyna probabilistyczna \displaystyle M. Definiując maszynę probabilistyczną powiedzieliśmy, że jest to maszyna niedeterministyczna, która potrafi losować i na tej podstawie wybierać ścieżkę, którą kontynuuje obliczenia. Gdy zapomnimy na chwilę o powyższym losowaniu i wybieraniu, to zauważymy, że drzewo obliczeń maszyny probabilistycznej to drzewo obliczeń maszyny niedeterministycznej. Traktujemy od tej pory \displaystyle M jako maszynę niedeterministyczną. Pokażemy, że \displaystyle L=L(M).

Jeśli \displaystyle x\in L, to z definicji \displaystyle \textbf{RP} mamy \displaystyle P_M(x) \geq {1\over2}, czyli prawdopodobieństwo akceptacji jest niezerowe. Stąd wiemy, że istnieje przynajmniej jedna ścieżka obliczeń w \displaystyle M, na której \displaystyle x jest akceptowane, stąd \displaystyle x\in L(M).

Jeśli \displaystyle x\notin L, to \displaystyle P_M(x) = 0, czyli prawdopodobieństwo akceptacji jest zerowe. Stąd wiemy, że na żadnej ścieżce obliczeń w \displaystyle M nie da się dojść do stanu akceptującego, stąd \displaystyle x\notin L(M).

Maszyny z klasy \displaystyle \textbf{RP} w swojej definicji posiadają pewną asymetrię. Określa się również ich błąd jako jednostronny (ang. one-sided error). Gdy rozważymy klasę komplementarną \displaystyle \textbf{coRP}, to otrzymamy symetryczne własności maszyn. Ich błąd w dalszym ciągu jest jednostronny, lecz tym razem maszyny nie dają fałszywych odpowiedzi negatywnych, czyli gdy maszyna z klasy \displaystyle \textbf{coRP} daje odpowiedź ""NIE"" to słowo na pewno do języka nie należy. Natomiast prawdopodobieństwo fałszywej odpowiedzi pozytywnej jest ograniczone przez \displaystyle 1\over2. Wszystkie własności są dualne, w szczególności \displaystyle \textbf{coRP}\subseteq\textbf{coNP}.

Definicja 1.5. [Klasa \displaystyle \textbf{coRP}]

Klasa \displaystyle \textbf{coRP} to klasa tych języków \displaystyle L, dla których istnieje maszyna probabilistyczna \displaystyle M, działająca w czasie wielomianowym, o następującej własności:

  • \displaystyle x \in L \Rightarrow P_M(x) = 1.
  • \displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 },

Klasa \displaystyle \textbf{ZPP}

Odpowiedź na pytanie, czy \displaystyle \textbf{RP}=\textbf{coRP} nie jest znana. Bez tej odpowiedzi możemy jednak rozważyć klasę \displaystyle \textbf{RP} \cap \textbf{coRP}. Problemy, które znajdują się w tej klasie posiadają dwa algorytmy Monte Carlo z błędami jednostronnymi, ale różnymi. Możemy zatem uruchomić je jednocześnie. Działamy tak długo, aż otrzymamy od przynajmniej jednego z nich odpowiedź, która jest z całą pewnością dobra (może to być zarówno ""TAK"" jak i ""NIE""), a następnie zwracamy ją jako wynik.

Taka konstrukcja powoduje, że nasz algorytm zawsze da odpowiedź poprawną, jednak jego czas działania jest dla nas nieokreślony. Możemy jedynie policzyć czas oczekiwany, który okazuje się być wielomianowy. Prawdopodobieństwo, że trzeba będzie dokonać \displaystyle k prób obu algorytmów wynosi \displaystyle 2^{-k}, czyli maleje wykładniczo.

Las Vegas
Enlarge
Las Vegas

Algorytmy o powyższej własności również doczekały się swojej nazwy i są określane jako algorytmy Las Vegas. Dla takich algorytmów wiemy, że zawsze dają poprawną odpowiedź, jednak ich czas działania określamy z pewnym prawdopodobieństwem. Nawiązuje to do słynnego miasta, w którym nigdy nie przegrywamy, jednak nie wiadomo jak długo będziemy grać.

Definicja 1.6. [Klasa \displaystyle \textbf{ZPP}]

Klasa \displaystyle \textbf{ZPP} (ang. Zero-error Probabilistic Polynomial) to klasa tych języków \displaystyle L, dla których istnieje maszyna probabilistyczna \displaystyle M działająca w oczekiwanym czasie wielomianowym, która akceptuje \displaystyle L nie popełniając błędu.

Nietrudno pokazać, że \displaystyle \textbf{ZPP}=\textbf{RP}\cap\textbf{coRP}. W niektórych zastosowaniach znacznie cenniejsza od czasu działania jest absolutna poprawność odpowiedzi, stąd algorytmy Las Vegas również znajdują swoje zastosowanie w praktyce.

Klasa \displaystyle \textbf{PP}

Rozważając kolejne klasy zrezygnujemy z jednostronności błędu, która występowała w \displaystyle \textbf{RP}.

Definicja 1.7. [Klasa \displaystyle \textbf{PP}]

Klasa \displaystyle \textbf{PP} (ang. Probabilistic Polynomial) to klasa tych języków \displaystyle L, dla których istnieje maszyna probabilistyczna \displaystyle M działająca w czasie wielomianowym o następującej własności:

  • \displaystyle x \in L \Rightarrow P_M(x) > { 1 \over 2 },
  • \displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }.

Ponieważ występujące w definicji prawdopodobieństwo błędu może być dowolnie bliskie \displaystyle 1\over2, to skutecznie utrudnia to wydedukowanie prawidłowej odpowiedzi na podstawie wyniku losowych obliczeń maszyny. Może się bowiem zdarzyć, że prawdopodobieństwo różni się od \displaystyle 1\over2 tylko o \displaystyle 1\over2^{p(n)}, gdzie \displaystyle p jest wielomianem. Dzieje się tak wtedy, gdy przewaga liczby ścieżek akceptujących nad odrzucającymi poprawne słowo jest stała.

Jeśli chcielibyśmy powtarzać kolejne wywołania maszyny, tak jak to się zrobiliśmy w przypadku klasy \displaystyle \textbf{RP} to w sytuacji odchylenia \displaystyle 1\over2^{p(n)} będziemy musieli wykonać wykładniczą liczbę powtórzeń, aby uzyskać prawdopodobieństwo błędu ograniczone przez \displaystyle 1\over4. Prześledzimy to dokładnie w następnym rozdziale, w którym rozważana klasa będzie mieć prawdopodobieństwo błędu oddalone od \displaystyle 1\over2 o stałą.

Taka sytuacja sprawia, że odpowiedź maszyny z klasy \displaystyle \textbf{PP} przypominać może rzut monetą o bardzo niewielkim odchyleniu od symetrii. Zwróćmy uwagę, że w sytuacji granicznej, gdy oba prawdopodobieństwa występujące w definicji są dokładnie równe \displaystyle 1\over2, to maszyna nie różni się niczym od pojedynczego rzutu monetą, który nie niesie żadnej informacji o języku \displaystyle L. To wszystko sprawia, że maszyny z klasy \displaystyle \textbf{PP} nie są atrakcyjne w praktycznych obliczeniach.

Dzięki rozluźnieniu warunków możemy jednak udowodnić więcej o samej klasie:

Ćwiczenie 1.8.

Udowodnij, że \displaystyle \textbf{NP}\subseteq\textbf{PP}

Wskazówka

Skonstruuj maszynę odpowiednią dla klasy \displaystyle \textbf{PP} na podstawie maszyny dla klasy \displaystyle \textbf{NP}.

Rozwiązanie

<flash>file=ZO-10-0.swf|width=300|height=300</flash>

Konstrukcja maszyny\displaystyle M'.

Weźmy dowolny język \displaystyle L z \displaystyle \textbf{NP} i maszynę \displaystyle M, która go akceptuje. Skonstruujemy maszynę probabilistyczną \displaystyle M' z klasy \displaystyle \textbf{PP}, która akceptuje \displaystyle L. Dodajemy nowy stan początkowy, z którego w sposób losowy wychodzimy albo do stanu akceptującego, albo do normalnego obliczenia maszyny \displaystyle M. W każdym z niedeterministycznych wyborów \displaystyle M rzucamy monetą dokonując wyboru ścieżki (rysunek Konstrukcja maszyny).

Jeśli \displaystyle x\in L, to można łatwo sprawdzić, że \displaystyle P_{M'}(x)>{1\over2}. Jest tak dlatego, gdyż \displaystyle 1\over2 pochodzi od nowo dodanej ścieżki, a maszyna \displaystyle M przynajmniej na jednej ze swoich ścieżek również zaakceptuje \displaystyle x.

Jeśli natomiast \displaystyle x\notin L, to jedyny sposób akceptacji jest poprzez nowo dodaną ścieżkę akceptującą, gdyż maszyna \displaystyle M na żadnej ścieżce nie akceptuje \displaystyle x. Stąd \displaystyle P_{M'}(x)={1\over2}.

Rozważmy następujący problem:

Definicja 1.9.

Problem MAJSAT:
Wejście: formuła logiczna \displaystyle \phi jak dla SAT o \displaystyle n zmiennych
Wyjście: czy większość spośród możliwych \displaystyle 2^n wartościowań spełnia \displaystyle \phi?

Ćwiczenie 1.10

Pokaż, że MAJSAT należy do \displaystyle \textbf{PP}.

Wskazówka

Skonstruuj maszynę, która rozważa wszystkie wartościowania zmiennych formuły.

Rozwiązanie

Konstruujemy maszynę probabilistyczną \displaystyle M, która w swoim drzewie obliczeń rozważa wszystkie możliwości wartościowań i dochodzi do każdego z jednakowym prawdopodobieństwem \displaystyle 1\over2^n. Rozważmy formułę \displaystyle \phi (kodowaną przez słowo \displaystyle x) z \displaystyle n zmiennymi. Oznaczmy liczbę wartościowań spełniających \displaystyle \phi poprzez \displaystyle s. Gdy \displaystyle x\in L, to \displaystyle s>2^{n-1}, zatem \displaystyle P_M(x)={s\over 2^n}>{1\over2}. Jeśli natomiast \displaystyle x\notin L, to \displaystyle s\leq2^{n-1}, zatem \displaystyle P_M(x)={s\over 2^n}\leq{1\over2}.

MAJSAT jest nawet problemem zupełnym dla klasy \displaystyle \textbf{PP}. Nie wiemy o nim natomiast czy należy do \displaystyle \textbf{NP}. To pokazuje, jak silna jest klasa \displaystyle \textbf{PP} -- maszyn akceptujących większością.

Klasa \displaystyle \textbf{BPP}

W tym rozdziale prezentujemy najszerszą z klas, która odpowiada praktycznym obliczeniom losowym:.

Definicja 1.11 [Klasa \displaystyle \textbf{BPP}]

Klasa \displaystyle \textbf{BPP} (ang. Bounded-error Probabilistic Polynomial) to klasa tych języków \displaystyle L, dla których istnieje maszyna probabilistyczna \displaystyle M działająca w czasie wielomianowym o następującej własności:

  • \displaystyle x \in L \Rightarrow P_M(x) \geq { 3 \over 4 },
  • \displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 4 }.

Niecodziennym faktem jest, że nie wiadomo nic na temat zawierania się pomiędzy klasami \displaystyle \textbf{NP} i \displaystyle \textbf{BPP} w żadną stronę. Klasa \displaystyle \textbf{BPP} zawiera w sobie natomiast \displaystyle \textbf{RP} oraz \displaystyle \textbf{coRP}, co wynika wprost z definicji.

Patrząc na definicję klasy \displaystyle \textbf{BPP} możemy w sposób równoważny powiedzieć, że prawdopodobieństwo popełnienia błędu przez maszynę z tej klasy jest ograniczone dla obu przypadków przez \displaystyle 1\over4. Podobnie jak dla klasy \displaystyle \textbf{RP} ta stała może zostać wybrana dowolnie z przedziału \displaystyle (0,{1\over2}), lecz jest to fakt trudniejszy:

Twierdzenie 1.12

Niech \displaystyle \alpha\in(0,{1\over2}). Dla dowolnej maszyny probabilistycznej \displaystyle M działającej w czasie wielomianowym, o prawdopodobieństwie błędu ograniczonym przez \displaystyle {1\over2}-\alpha, istnieje równoważna wielomianowa maszyna probabilistyczna \displaystyle M' o prawdopodobieństwie błędu ograniczonym przez \displaystyle 1\over2^{p(n)}, gdzie \displaystyle p jest wielomianem.

Dowód

Mamy do dyspozycji maszynę \displaystyle M, która wykazuje skłonność do częstszego akceptowania słów z języka \displaystyle L niż spoza niego. Dla słowa \displaystyle x\in L prawdopodobieństwo akceptacji wynosi \displaystyle {1\over2}+\alpha a odrzucenia \displaystyle {1\over2}-\alpha. Przewaga prawdopodobieństwa wynosi \displaystyle 2\alpha, więc możemy mieć nadzieje, że przy odpowiednio dużej liczbie prób zdarzenie bardziej prawdopodobne będzie pojawiać się częściej.

Maszyna \displaystyle M' dla słowa wejściowego \displaystyle x wykonuje \displaystyle 2k+1 iteracji maszyny \displaystyle M. Następnie daje taką odpowiedź, która występowała najczęściej. Policzmy jak prawdopodobieństwo błędu popełnianego przez maszynę \displaystyle M' zależy od \displaystyle k.

Oprzemy dowód twierdzenia na nierówności Chernoffa znanej z rachunku prawdopodobieństwa:

Niech \displaystyle x_i, dla \displaystyle i=1\ldots n będą niezależnymi zmiennymi losowymi przyjmującymi wartości 1 i 0 z prawdopodobieństwem odpowiednio \displaystyle p oraz \displaystyle 1-p, natomiast \displaystyle X=\sum_{i=1}^n{x_i}. Wówczas dla \displaystyle 0\leq\theta\leq1 zachodzi:

\displaystyle P(X\leq (1-\theta)pn)\leq e^{-{\theta^2\over2}pn}.

Innymi słowy, prawdopodobieństwo odchylenia binarnej zmiennej losowej \displaystyle X od jej wartości oczekiwanej maleje wykładniczo od wartości odchylenia.

Załóżmy, że \displaystyle x\in L. Wiemy, że \displaystyle P_M(x)\geq {1\over2}+\alpha. Nasze zmienne losowe \displaystyle x_i to wyniki kolejnych obliczeń \displaystyle M na słowie \displaystyle x, prawdopodobieństwo \displaystyle p wynosi \displaystyle {1\over2}+\alpha, natomiast \displaystyle n - liczba prób jest równa \displaystyle 2k+1. Weźmy \displaystyle \theta={\alpha\over{1\over2}+\alpha}. Z nierówności Chernoffa mamy, że \displaystyle P(X\leq{n\over2})\leq e^{-2\alpha^2k} (asymptotycznie).

Wprost z definicji maszyny \displaystyle M' wiemy, że akceptuje ona, gdy ponad połowa wywołań \displaystyle M zakończy się akceptacją, czyli wtedy, gdy \displaystyle X>{n\over2}. Jest to zdarzenie przeciwne do \displaystyle X\leq{n\over2}, zatem \displaystyle P_{M'}(x)\geq 1 - e^{-2\alpha^2k}. Gdy podstawimy \displaystyle k=\lceil{p(n) \mbox{ln} \displaystyle  2 \over2\alpha^2}\rceil, to otrzymamy wykładnicze małe prawdopodobieństwo błędu \displaystyle 1\over2^{p(n)}. Maszyna \displaystyle M' wykonuje tylko wielomianową liczbę powtórzeń. Przypadek \displaystyle x\notin L jest analogiczny.

image:End_of_proof.gif


Probabilistyczne klasy złożoności

Podobnie jak dla klasy \displaystyle \textbf{RP} stała \displaystyle \alpha może być równa nawet \displaystyle {1\over p(n)} i dalej pozwoli nam to uzyskać ten sam efekt wykładniczego ograniczenia popełnianego błędu przy zachowaniu wielomianowej liczby powtórzeń.

Powróćmy na chwilę do klasy \displaystyle \textbf{PP}. Stwierdziliśmy, że dla maszyn z tej klasy prawdopodobieństwo błędu może być ograniczone przez \displaystyle {1\over2}-{1\over2^{p(n)}}. Gdy przyjrzymy się dowodowi powyższego twierdzenia, to zauważymy, że aby uzyskać ten sam efekt musielibyśmy dokonać wykładniczej liczby powtórzonych obliczeń, co nie jest akceptowalne w praktyce.

Animacja Probabilistyczne klasy złożoności podsumowuje poznane wcześniej klasy złożoności i relacje pomiędzy nimi:

Rozpoznawanie liczb pierwszych

Zaznaczyliśmy na początku, że algorytmy probabilistyczne okazały się bardzo przydatne przy rozpoznawaniu liczb pierwszych. Mimo, iż w 2002 roku Agrawal, Kayal oraz Saxena odkryli wielomianowy algorytm deterministyczny dla tego problemu, wciąż używane są metody probabilistyczne, gdyż są znacznie szybsze, a prawdopodobieństwo błędu, który mogą popełnić, jest bardzo niewielkie.

Problem stwierdzenia czy liczba jest pierwsza oznaczany jest przez PRIMES. W sposób oczywisty jest to problem z klasy \displaystyle \textbf{coNP}. Dzieje się tak ze względu na fakt, że łatwo jest poświadczyć, iż liczba nie jest pierwsza, poprzez podanie jej dzielników.

Podobnie, choć nie z tej samej przyczyny, znane metody probabilistyczne opierają się na algorytmach z klasy \displaystyle \textbf{coRP}. Opierają się one na poświadczeniu złożoności liczby, które nie polega jednak na podawaniu jej dzielników (problem faktoryzacji jest bowiem dużo trudniejszy).

Jak wymaga tego klasa \displaystyle \textbf{coRP}, odpowiedź negatywna jest zawsze prawdziwa, natomiast mogą występować fałszywe odpowiedzi pozytywne. Poprzez odpowiednio dużą liczbę iteracji prawdopodobieństwo takiego faktu można uczynić dowolnie małym. Podsumowując, probabilistyczne testy pierwszości mogą popełnić błąd oceniając liczbę złożoną jako pierwszą.

Test Millera-Rabina

Poniżej prezentujemy najbardziej znany z testów probabilistycznych odkryty niezależnie przez Gary'ego Millera i Michaela Rabina około roku 1975. Na wejściu dana jest liczba naturalna \displaystyle n. Jedna iteracja algorytmu przedstawia się następująco:

Algorytm


Przedstaw \displaystyle n-1 jako \displaystyle 2^sd, d - nieparzysta 
Wybierz losową liczbę \displaystyle a z przedziału \displaystyle [1, n - 1] 
if \displaystyle a^d mod  \displaystyle   n \neq 1 i \displaystyle a^{2^rd}  mod  \displaystyle  n\neq -1 dla wszystkich \displaystyle r\in[0, s - 1]  then
  return""NIE"" 
else 
  return""TAK"" 
end if


Gdy przypatrzymy się algorytmowi, to widzimy, że kluczem do sukcesu jest wylosowanie właściwej liczby \displaystyle a, która poświadcza złożoność \displaystyle n. W takim przypadku algorytm się nie myli - można bowiem udowodnić (patrz kurs Matematyki Dyskretnej), że sprawdzany warunek implikuje złożoność liczby \displaystyle n.

Jeśli \displaystyle a nie świadczy złożoności, to możemy spróbować wylosować je jeszcze raz. Niestety nie możemy spróbować wszystkich możliwych wartości \displaystyle a, których liczba jest liniowa względem \displaystyle n, czyli wykładnicza względem rozmiaru wejścia, które tradycyjnie zapisujemy binarnie.

Jeśli \displaystyle n jest pierwsza, to oczywiście świadek \displaystyle a nie istnieje. Poniższe twierdzenie, które przedstawiamy bez dowodu, stanowi teoretyczną podstawę analizy probabilistycznej algorytmu:

Twierdzenie 2.1.

Jeśli \displaystyle n jest nieparzystą liczbą złożoną, to przynajmniej \displaystyle 3\over 4 spośród możliwych wartości \displaystyle a świadczą o złożoności \displaystyle n.

Jeśli poprzez \displaystyle M oznaczymy maszynę realizującą pojedynczy test Millera-Rabina, a poprzez \displaystyle L język PRIMES, to nasze dotychczasowe uwagi możemy podsumować w sposób następujący:

  • \displaystyle x\in L (\displaystyle n pierwsza) \displaystyle \Rightarrow\displaystyle P_M(x)=1,
  • \displaystyle x\notin L (\displaystyle n złożona) \displaystyle \Rightarrow\displaystyle P_M(x)\leq {1\over4}.

Spełnione są zatem założenia algorytmu z klasy \displaystyle \textbf{coRP}. Gdy otrzymujemy odpowiedź ""NIE"", to liczba jest złożona, gdy otrzymujemy odpowiedź ""TAK"", to liczba jest pierwsza z prawdopodobieństwem błędu \displaystyle 1\over4. Gdy wykonamy \displaystyle k iteracji, to gdy w którymkolwiek momencie otrzymamy odpowiedź ""NIE"", to liczba jest złożona, w przeciwnym razie jest pierwsza z prawdopodobieństwem błędu ograniczonym przez \displaystyle 1\over4^k, czyli wykładniczo małym.

Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa \displaystyle a przebiega przedział o wielkości \displaystyle O( ln \displaystyle  ^2(n)). Stąd potrzebna liczba iteracji testu jest wielomianowa. Nie ma jednak dowodu, że takie postępowanie jest prawidłowe. Poprawność tego podejścia wynika jednak z rozszerzonej hipotezy Riemanna. Ten fakt sprawia, że test Millera-Rabina jest w pewnym sensie "zabezpieczony podwójnie".

Generowanie bitów losowych

Kluczowym elementem praktycznych realizacji opisywanych do tej pory algorytmów probabilistycznych jest losowanie. Okazuje się, że teoretycznie prosty rzut monetą to bardzo wymagający problem praktyczny.

Generowanie bitów losowych w teorii, to zadanie polegające na obliczeniu ciągu \displaystyle n bitów tak, aby każdy z ciągów był jednakowo prawdopodobny, czyli aby każdy bit zachowywał się jak niezależna próba losowa. Źródło, które generuje taki ciąg nazywamy idealnym.

Mając do dyspozycji źródło idealne moglibyśmy z powodzeniem używać algorytmów z klasy \displaystyle \textbf{RP}, czy \displaystyle \textbf{BPP} w praktycznych zastosowaniach. Niestety nie jest znane idealne fizyczne źródło bitów losowych. Choć istnieją lepsze i gorsze metody generowania losowych bitów, to każdy proces fizyczny wykazuje tendencję do uzależnienia kolejnych wartości od wcześniej występujących, co zaburza pożądaną przez nas niezależność.

Idealne źródło bitów losowych jest także symetryczne, to znaczy prawdopodobieństwo 0 i 1 w każdym kroku jest jednakowe. Tę własność można jednak stosunkowo łatwo uzyskać, przez grupowanie kolejnych prób.

W praktyce często stosuje się generatory bitów pseudolosowych, które generują ciągi bitów "nieprzewidywalnych". Zwykle jednak rozpoczynają one obliczenia od ziarna złożonego z niewielkiej liczby bitów, co z teoretycznego punktu widzenia jest dyskwalifikujące.

W literaturze wyróżnia się także źródła lekko losowe, które dosyć dobrze opisują dostępne w praktyce wysoce losowe zjawiska fizyczne. Nie jest niestety znana metoda symulowania przy ich pomocy idealnych źródeł losowych. Mogą one być jednak zastosowane do symulowania znanych nam algorytmów losowych z wielomianowym wzrostem czasu. Powyższy temat znajduje osobne miejsce w analizie teoretycznej algorytmów probabilistycznych.

Ćwiczenia dodatkowe

Ćwiczenie 4.1.

Uzasadnij, że klasy \displaystyle \textbf{BPP} oraz \displaystyle \textbf{PP} są zamknięte na dopełnienie.

Wskazówka

Rozważ dopełnienie języka z odpowiedniej klasy.

Rozwiązanie

Przeprowadźmy najpierw dowód dla klasy \displaystyle \textbf{BPP}. Weźmy dowolny język \displaystyle L\in\textbf{BPP}. Załóżmy, że jest on akceptowany przez maszynę probabilistyczną \displaystyle M. Rozważmy \displaystyle \overline{L} i pokażmy, że należy on do \displaystyle \textbf{BPP}. Maszyna, która będzie dla niego odpowiednia, to \displaystyle M z odwróconymi odpowiedziami, którą oznaczamy przez \displaystyle M'.

Jeśli \displaystyle x\in\overline{L}, to \displaystyle x\notin L, zatem \displaystyle P_M(x)\leq {1\over4}, stąd \displaystyle P_{M'}(x) \geq {3\over4}. Podobnie jeśli \displaystyle x\notin\overline{L}, to \displaystyle x\in L, zatem \displaystyle P_M(x)\geq{3\over4},stąd \displaystyle P_{M'}(x) \leq {1\over4}. Maszyna \displaystyle M' spełnia zatem warunki klasy \displaystyle \textbf{BPP}.

Przypadek klasy \displaystyle \textbf{PP} jest analogiczny. Weźmy \displaystyle L\in\textbf{PP} i maszynę \displaystyle M dla niego. Załóżmy, że maszyna \displaystyle M dla każdego wejścia nie posiada remisu w liczbie ścieżek akceptujących i odrzucających (zapewniamy to prostą modyfikacją nie zmieniającą języka maszyny). Pokażmy, że \displaystyle \overline{L} jest akceptowany przez \displaystyle M', która ponownie jest maszyną \displaystyle M z odwróconymi odpowiedziami. Jeśli \displaystyle x\in\overline{L}, to \displaystyle x\notin L, zatem \displaystyle P_M(x)<{1\over2}, stąd \displaystyle P_{M'}(x)>{1\over2}. Podobnie jeśli \displaystyle x\notin\overline{L}, to \displaystyle x\in L, zatem \displaystyle P_M(x)>{1\over2}, stąd \displaystyle P_{M'}(x)<{1\over2}. Maszyna \displaystyle M' spełnia zatem warunki

klasy \displaystyle \textbf{PP}.

Ćwiczenie 4.2.

Pokaż, że \displaystyle \textbf{PP}\subseteq\textbf{PSPACE}

Wskazówka

Skonstruuj maszynę odpowiednią dla \displaystyle \textbf{PSPACE} na podstawie maszyny dla klasy \displaystyle \textbf{PP}

Rozwiązanie

Weźmy język \displaystyle L\in\textbf{PP} i maszynę probabilistyczną \displaystyle M dla niego. Maszyna działa w czasie wielomianowym, więc potencjalna liczba wszystkich ścieżek jest wykładnicza. Możemy jednak zastosować standardowy zabieg polegający na analizie każdej ścieżki obliczeń (długości wielomianowej) w tej samej pamięci - w ten sposób konstruujemy maszynę \displaystyle M' z klasy \displaystyle \textbf{PSPACE}. Musimy jedynie pamiętać wektor kolejnych wyborów (również długości wielomianowej), aby móc wygenerować następny z nich.

Dla słowa wejściowego \displaystyle x zliczamy ile spośród ścieżek obliczeń \displaystyle M jest akceptujących. Jeśli więcej niż połowa, to akceptujemy słowo, w przeciwnym wypadku odrzucamy.

Pokażmy, że maszyna \displaystyle M' akceptuje język \displaystyle L. Jeśli \displaystyle x\in L, to \displaystyle P_M(x)>{1\over2}, stąd ponad połowa ścieżek \displaystyle M akceptuje \displaystyle x, więc również \displaystyle M' zaakceptuje \displaystyle x. Podobnie jeśli \displaystyle x\notin L, to \displaystyle P_M(x)\leq{1\over2}, stąd co najwyżej połowa ścieżek \displaystyle M akceptuje \displaystyle x, więc \displaystyle M' odrzuci \displaystyle x.

Ćwiczenie 4.3.

Pokaż, że jeśli \displaystyle \textbf{NP}\subseteq\textbf{BPP}, to \displaystyle \textbf{RP}=\textbf{NP}

Wskazówka

Posłuż się problemem SAT.

Rozwiązanie

Jeśli \displaystyle \textbf{NP}\subseteq\textbf{BPP}, to SAT należy do \displaystyle \textbf{BPP}. Pokażmy, że wtedy SAT należy do \displaystyle \textbf{RP}, a ponieważ jest zupełny dla \displaystyle \textbf{NP}, to stąd otrzymamy, że \displaystyle \textbf{NP}\subseteq\textbf{RP} (zawieranie się w drugą stronę jest prawdziwe zawsze).

Weźmy maszynę probabilistyczną \displaystyle M z klasy \displaystyle \textbf{BPP} dla SAT. Na jej podstawie skonstruujemy maszynę \displaystyle M' dla SAT, ale z klasy \displaystyle \textbf{RP}.

Ustalmy formułę wejściową \displaystyle \phi o \displaystyle n zmiennych. Maszyna \displaystyle M' będzie w pierwszej części próbować obliczyć wartościowanie spełniające \displaystyle \phi przy pomocy maszyny \displaystyle M. Będziemy używać wersji \displaystyle M, która ma prawdopodobieństwo błędu ograniczone przez \displaystyle 1 \over {2n}, co możemy uczynić na podstawie omawianego już twierdzenia o ograniczaniu prawdopodobieństwa błędu dla klasy BPP.

Maszyna \displaystyle M' rozpoczyna działanie od sprawdzenia (przy pomocy \displaystyle M), czy \displaystyle \phi jest spełnialna. Jeśli odpowiedź brzmi ""NIE"", to \displaystyle M' również odrzuca. Następnie kolejno ustalamy wartości zmiennych \displaystyle x_i. Rozpoczynamy od \displaystyle x_1 ustawionego na 0. Uruchamiamy algorytm \displaystyle M dla formuły \displaystyle \phi z tak ustalonym \displaystyle x_1. Jeśli \displaystyle M twierdzi, że jest ona spełnialna, to pozostawiamy \displaystyle x_1=0, w przeciwnym wypadku wybieramy \displaystyle x_1=1. Postępujemy tak, ustalając wartości wszystkich zmiennych.

W drugiej fazie działania \displaystyle M' sprawdzamy bezpośrednio, czy \displaystyle \phi na tak obliczonym wartościowaniu okazuje się być spełnialna i jeśli tak to \displaystyle M' ostatecznie akceptuje, a w przeciwnym wypadku odrzuca.

Przejdźmy do analizy \displaystyle M'. Jeśli formuła \displaystyle \phi (kodowana przez \displaystyle x)nie jest spełnialna, to \displaystyle P_{M'}(x)=0, gdyż bez względu na wszystko, w drugiej fazie swojego działania \displaystyle M' sprawdza czy dostała poprawne wartościowanie.

Jeśli natomiast \displaystyle \phi jest spełnialna, to obliczmy z jakim prawdopodobieństwem na końcu znajdziemy poprawne wartościowanie, które spowoduje akceptację. Aby nam się udało, to musimy podczas każdego z \displaystyle n wyborów wartościowań \displaystyle x_i nie popełnić błędu. Prawdopodobieństwo zdarzenia przeciwnego (czyli przynajmniej jeden błąd) może być ograniczone przez \displaystyle n{1\over 2n}={1\over2}, zatem \displaystyle P_{M'}(x)\geq{1\over2}. Stąd nasz algorytm spełnia warunki klasy \displaystyle \textbf{RP}.

Testy końcowe