Złożoność obliczeniowa/Wykład 10: Algorytmy probabilistyczne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu - "<div class="thumb t(.*)"><div style="width:(.*)px;"> <flash>file=(.*)\.swf\|width=(.*)\|height=(.*)<\/flash> <div\.thumbcaption>(.*)<\/div><\/div><\/div>" na "$4x$5px|thumb|$1|$6"
m Zastępowanie tekstu – „<math> ” na „<math>”
 
(Nie pokazano 6 pośrednich wersji utworzonych przez tego samego użytkownika)
Linia 9: Linia 9:
do naszego modelu obliczeń.
do naszego modelu obliczeń.


Załóżmy, że <math>\displaystyle M</math> jest zwykłą niedeterministyczną maszyną Turinga.
Załóżmy, że <math>M</math> jest zwykłą niedeterministyczną maszyną Turinga.
Przypomnijmy, że <math>\displaystyle M</math> ma podczas każdego kroku obliczeń możliwość
Przypomnijmy, że <math>M</math> ma podczas każdego kroku obliczeń możliwość
wyboru wielu ścieżek obliczeń. W pojęciu akceptacji słowa bierzemy
wyboru wielu ścieżek obliczeń. W pojęciu akceptacji słowa bierzemy
pod uwagę zachowanie <math>\displaystyle M</math> na wszystkich jej ścieżkach. Taka konstrukcja
pod uwagę zachowanie <math>M</math> na wszystkich jej ścieżkach. Taka konstrukcja
sprawia, że niedeterministyczny model obliczeń jest przydatny z
sprawia, że niedeterministyczny model obliczeń jest przydatny z
czysto teoretycznego punktu widzenia, albowiem w praktyce takich
czysto teoretycznego punktu widzenia, albowiem w praktyce takich
Linia 19: Linia 19:
Prosty pomysł, który pozwala zaadaptować ideę wielu możliwości,
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
polega właśnie na losowaniu. Bez straty ogólności przyjmijmy, że na
każdym kroku maszyna <math>\displaystyle M</math> wybiera spośród dwóch możliwości wyboru
każdym kroku maszyna <math>M</math> wybiera spośród dwóch możliwości wyboru
ścieżki. Wyobraźmy sobie, że maszyna <math>\displaystyle M</math> może rzucić monetą i na
ścieżki. Wyobraźmy sobie, że maszyna <math>M</math> może rzucić monetą i na
podstawie wyniku wybrać jedną z dwóch ścieżek. Prawidłową realizację
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
takiego losowania i problemy jakie się z tym wiążą omówimy w dalszej
Linia 26: Linia 26:
podejście jak najbardziej praktyczne.
podejście jak najbardziej praktyczne.


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


{{definicja|1.1.||
{{definicja|1.1.||
Dla probabilistycznej maszyny Turinga <math>\displaystyle M</math> i słowa wejściowego <math>\displaystyle x</math>
Dla probabilistycznej maszyny Turinga <math>M</math> i słowa wejściowego <math>x</math>
definiujemy <math>\displaystyle P_M(x)</math> jako prawdopodobieństwo, że maszyna <math>\displaystyle M</math>
definiujemy <math>P_M(x)</math> jako prawdopodobieństwo, że maszyna <math>M</math>
zaakceptuje słowo <math>\displaystyle x</math>.
zaakceptuje słowo <math>x</math>.
}}
}}


Linia 46: Linia 46:
która nie wykonuje rzutów monetą w żadnym kroku (lub nie mają one
która nie wykonuje rzutów monetą w żadnym kroku (lub nie mają one
wpływu na wynik obliczeń). Dla konkretnej maszyny deterministycznej
wpływu na wynik obliczeń). Dla konkretnej maszyny deterministycznej
<math>\displaystyle M</math>, jej języka <math>\displaystyle L=L(M)</math> i słowa wejściowego <math>\displaystyle x</math> zachodzi zatem:
<math>M</math>, jej języka <math>L=L(M)</math> i słowa wejściowego <math>x</math> zachodzi zatem:
* <math>\displaystyle x\in L \Rightarrow P_M(x)=1</math>
* <math>x\in L \Rightarrow P_M(x)=1</math>
* <math>\displaystyle x\notin L \Rightarrow P_M(x)=0</math>
* <math>x\notin L \Rightarrow P_M(x)=0</math>


Naszym obiektem zainteresowania jest powiązanie prawdopodobieństwa
Naszym obiektem zainteresowania jest powiązanie prawdopodobieństwa
akceptacji słowa z jego przynależnością do konkretnego języka <math>\displaystyle L</math>. W
akceptacji słowa z jego przynależnością do konkretnego języka <math>L</math>. W
ten sposób będziemy mogli używać maszyny probabilistycznej do
ten sposób będziemy mogli używać maszyny probabilistycznej do
akceptowania <math>\displaystyle L</math> podobnie jak maszyny deterministycznej. Nie
akceptowania <math>L</math> podobnie jak maszyny deterministycznej. Nie
będziemy wymagać tak ścisłej zależności pomiędzy przynależnością do
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
języka a prawdopodobieństwem akceptacji jak podana powyżej. Dzięki
Linia 62: Linia 62:
maszyna probabilistyczna będzie się ''mylić''.
maszyna probabilistyczna będzie się ''mylić''.


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


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


Na pierwszy rzut oka taka maszyna może wydawać się bezużyteczna.
Na pierwszy rzut oka taka maszyna może wydawać się bezużyteczna.
Linia 92: Linia 92:
klas złożoności. Za podstawową z nich można uznać:
klas złożoności. Za podstawową z nich można uznać:


{{definicja|1.2.[Klasa <math>\displaystyle \textbf{RP}</math>]]||
{{definicja|1.2.[Klasa <math>\textbf{RP}</math>]]||


Klasa <math>\displaystyle \textbf{RP}</math> (ang. Randomized Polynomial) to klasa tych języków
Klasa <math>\textbf{RP}</math> (ang. Randomized Polynomial) to klasa tych języków
<math>\displaystyle L</math>, dla których istnieje maszyna probabilistyczna <math>\displaystyle M</math>, działająca w
<math>L</math>, dla których istnieje maszyna probabilistyczna <math>M</math>, działająca w
czasie wielomianowym, o następującej własności:
czasie wielomianowym, o następującej własności:
* <math>\displaystyle x \in L \Rightarrow P_M(x) \geq { 1 \over 2 }</math>,
* <math>x \in L \Rightarrow P_M(x) \geq { 1 \over 2 }</math>,
* <math>\displaystyle x \notin L \Rightarrow P_M(x) = 0</math>.
* <math>x \notin L \Rightarrow P_M(x) = 0</math>.


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


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


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


Linia 122: Linia 122:
""TAK"" to po kłopocie. Gdy ponownie ""NIE"" to próba nie
""TAK"" to po kłopocie. Gdy ponownie ""NIE"" to próba nie
poszła na marne, gdyż prawdopodobieństwo błędu jest teraz
poszła na marne, gdyż prawdopodobieństwo błędu jest teraz
ograniczone z góry przez <math>\displaystyle 1\over4</math>.
ograniczone z góry przez <math>1\over4</math>.


W tym miejscu dokładnie widać dlaczego odwoływaliśmy się wcześniej
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,
do zastosowań praktycznych. Jeśli bowiem powtórzymy próbę 100 razy,
to prawdopodobieństwo błędu nie przekracza <math>\displaystyle 1\over2^{100}</math> co jest
to prawdopodobieństwo błędu nie przekracza <math>1\over2^{100}</math> co jest
według prostego szacunku równie prawdopodobne, co trafienie
według prostego szacunku równie prawdopodobne, co trafienie
komputera przez spadający meteoryt podczas obliczeń. W tym momencie
komputera przez spadający meteoryt podczas obliczeń. W tym momencie
Linia 143: Linia 143:


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


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


Linia 157: Linia 157:


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


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


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


Jeśli chcemy, aby <math>\displaystyle 1-(1-\alpha)^k\geq{1\over2}</math>, to <math>\displaystyle k\geq\lceil - 1/ </math> log <math>\displaystyle  (1-\alpha) \rceil</math>. Jeśli zatem <math>\displaystyle \alpha</math> jest dowolną stałą z przedziału <math>\displaystyle (0,{1\over2})</math> to <math>\displaystyle k</math> również jest stałą i mamy gotowe rozwiązanie polegające na stałej ilości powtórzeń obliczeń.
Jeśli chcemy, aby <math>1-(1-\alpha)^k\geq{1\over2}</math>, to <math>k\geq\lceil - 1/</math> log <math>(1-\alpha) \rceil</math>. Jeśli zatem <math>\alpha</math> jest dowolną stałą z przedziału <math>(0,{1\over2})</math> to <math>k</math> 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 <math>\displaystyle P_M(x)\geq 1/p(|x|)</math> to <math>\displaystyle k</math> będzie funkcją <math>\displaystyle |x|</math>, więc musimysprawdzić, czy nie wymagamy zbyt dużej liczby powtórzeń - maszyna <math>\displaystyle M'</math> musi bowiem działać w czasie wielomianowym od <math>\displaystyle |x|</math>. Okazuje się jednak, że gdy <math>\displaystyle p</math> jest wielomianem, to potrzebne <math>\displaystyle k</math> jest funkcją wielomianową od <math>\displaystyle |x|</math>, dokładnie tak jak tego potrzebujemy (poniższe własności wynikają z asymptotycznego zachowania się wyrażenia):
Jeśli natomiast jeszcze bardziej rozluźnimy warunki dopuszczając, aby <math>P_M(x)\geq 1/p(|x|)</math> to <math>k</math> będzie funkcją <math>|x|</math>, więc musimysprawdzić, czy nie wymagamy zbyt dużej liczby powtórzeń - maszyna <math>M'</math> musi bowiem działać w czasie wielomianowym od <math>|x|</math>. Okazuje się jednak, że gdy <math>p</math> jest wielomianem, to potrzebne <math>k</math> jest funkcją wielomianową od <math>|x|</math>, dokładnie tak jak tego potrzebujemy (poniższe własności wynikają z asymptotycznego zachowania się wyrażenia):


<center><math>\displaystyle k \approx - \frac{1}{\mbox{log}\displaystyle  \left(1- \frac{1}{ p(|x|)}\right)} \approx p(|x|).</math></center>
<center><math>k \approx - \frac{1}{\mbox{log} \left(1- \frac{1}{ p(|x|)}\right)} \approx p(|x|)</math></center>


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


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


{{cwiczenie|1.4.||
{{cwiczenie|1.4.||
Pokaż, że <math>\displaystyle \textbf{RP}\subseteq\textbf{NP}</math>.
Pokaż, że <math>\textbf{RP}\subseteq\textbf{NP}</math>.
}}
}}


Linia 188: Linia 188:


<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">   
Gdy język <math>\displaystyle L</math> należy do <math>\displaystyle \textbf{RP}</math>, to istnieje dla niego maszyna
Gdy język <math>L</math> należy do <math>\textbf{RP}</math>, to istnieje dla niego maszyna
probabilistyczna <math>\displaystyle M</math>. Definiując maszynę probabilistyczną
probabilistyczna <math>M</math>. Definiując maszynę probabilistyczną
powiedzieliśmy, że jest to maszyna niedeterministyczna, która
powiedzieliśmy, że jest to maszyna niedeterministyczna, która
potrafi losować i na tej podstawie wybierać ścieżkę, którą
potrafi losować i na tej podstawie wybierać ścieżkę, którą
Linia 195: Linia 195:
i wybieraniu, to zauważymy, że drzewo obliczeń maszyny
i wybieraniu, to zauważymy, że drzewo obliczeń maszyny
probabilistycznej to drzewo obliczeń maszyny niedeterministycznej.
probabilistycznej to drzewo obliczeń maszyny niedeterministycznej.
Traktujemy od tej pory <math>\displaystyle M</math> jako maszynę niedeterministyczną.
Traktujemy od tej pory <math>M</math> jako maszynę niedeterministyczną.
Pokażemy, że <math>\displaystyle L=L(M)</math>.
Pokażemy, że <math>L=L(M)</math>.


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


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


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


{{definicja|1.5. [Klasa <math>\displaystyle \textbf{coRP}</math>]||
{{definicja|1.5. [Klasa <math>\textbf{coRP}</math>]||


Klasa <math>\displaystyle \textbf{coRP}</math> to klasa tych języków
Klasa <math>\textbf{coRP}</math> to klasa tych języków
<math>\displaystyle L</math>, dla których istnieje maszyna probabilistyczna <math>\displaystyle M</math>, działająca w
<math>L</math>, dla których istnieje maszyna probabilistyczna <math>M</math>, działająca w
czasie wielomianowym, o następującej własności:
czasie wielomianowym, o następującej własności:
* <math>\displaystyle x \in L \Rightarrow P_M(x) = 1</math>.
* <math>x \in L \Rightarrow P_M(x) = 1</math>.
* <math>\displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }</math>,
* <math>x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }</math>,


}}
}}


===Klasa <math>\displaystyle \textbf{ZPP}</math>===
===Klasa <math>\textbf{ZPP}</math>===


Odpowiedź na pytanie, czy <math>\displaystyle \textbf{RP}=\textbf{coRP}</math> nie jest znana. Bez
Odpowiedź na pytanie, czy <math>\textbf{RP}=\textbf{coRP}</math> nie jest znana. Bez
tej odpowiedzi możemy jednak rozważyć klasę <math>\displaystyle \textbf{RP} \cap
tej odpowiedzi możemy jednak rozważyć klasę <math>\textbf{RP} \cap
\textbf{coRP}</math>. Problemy, które znajdują się w tej klasie posiadają dwa
\textbf{coRP}</math>. Problemy, które znajdują się w tej klasie posiadają dwa
algorytmy Monte Carlo z błędami jednostronnymi, ale różnymi. Możemy
algorytmy Monte Carlo z błędami jednostronnymi, ale różnymi. Możemy
Linia 238: Linia 238:
poprawną, jednak jego czas działania jest dla nas nieokreślony.
poprawną, jednak jego czas działania jest dla nas nieokreślony.
Możemy jedynie policzyć czas oczekiwany, który okazuje się być
Możemy jedynie policzyć czas oczekiwany, który okazuje się być
wielomianowy. Prawdopodobieństwo, że trzeba będzie dokonać <math>\displaystyle k</math> prób
wielomianowy. Prawdopodobieństwo, że trzeba będzie dokonać <math>k</math> prób
obu algorytmów wynosi <math>\displaystyle 2^{-k}</math>, czyli maleje wykładniczo.
obu algorytmów wynosi <math>2^{-k}</math>, czyli maleje wykładniczo.


[[grafika:ZO-10-Las-Vegas.jpg|thumb|right||Las Vegas]]
[[grafika:ZO-10-Las-Vegas.jpg|thumb|right||Las Vegas]]
Linia 249: Linia 249:
będziemy grać.
będziemy grać.


{{definicja|1.6. [Klasa <math>\displaystyle \textbf{ZPP}</math>]||
{{definicja|1.6. [Klasa <math>\textbf{ZPP}</math>]||


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


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


===Klasa <math>\displaystyle \textbf{PP}</math>===
===Klasa <math>\textbf{PP}</math>===


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


{{definicja|1.7. [Klasa <math>\displaystyle \textbf{PP}</math>]||
{{definicja|1.7. [Klasa <math>\textbf{PP}</math>]||


Klasa <math>\displaystyle \textbf{PP}</math> (ang. Probabilistic Polynomial) to klasa tych
Klasa <math>\textbf{PP}</math> (ang. Probabilistic Polynomial) to klasa tych
języków <math>\displaystyle L</math>, dla których istnieje maszyna probabilistyczna <math>\displaystyle M</math>
języków <math>L</math>, dla których istnieje maszyna probabilistyczna <math>M</math>
działająca w czasie wielomianowym o następującej własności:
działająca w czasie wielomianowym o następującej własności:
* <math>\displaystyle x \in L \Rightarrow P_M(x) > { 1 \over 2 }</math>,
* <math>x \in L \Rightarrow P_M(x) > { 1 \over 2 }</math>,
* <math>\displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }</math>.
* <math>x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }</math>.


}}
}}


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


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


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


Linia 306: Linia 306:


{{cwiczenie|1.8.||
{{cwiczenie|1.8.||
Udowodnij, że <math>\displaystyle \textbf{NP}\subseteq\textbf{PP}</math>
Udowodnij, że <math>\textbf{NP}\subseteq\textbf{PP}</math>
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </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">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Skonstruuj maszynę odpowiednią dla klasy <math>\displaystyle \textbf{PP}</math> na podstawie
Skonstruuj maszynę odpowiednią dla klasy <math>\textbf{PP}</math> na podstawie
maszyny dla klasy <math>\displaystyle \textbf{NP}</math>.
maszyny dla klasy <math>\textbf{NP}</math>.
</div></div>
</div></div>


<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">   
[[File:ZO-10-0.svg|300x300px|thumb|right|Konstrukcja maszyny<math>\displaystyle M'</math>.]]
[[File:ZO-10-0.svg|300x300px|thumb|right|Konstrukcja maszyny<math>M'</math>.]]
Weźmy dowolny język <math>\displaystyle L</math> z <math>\displaystyle \textbf{NP}</math> i maszynę <math>\displaystyle M</math>, która go
Weźmy dowolny język <math>L</math> z <math>\textbf{NP}</math> i maszynę <math>M</math>, która go
akceptuje. Skonstruujemy maszynę probabilistyczną <math>\displaystyle M'</math> z klasy
akceptuje. Skonstruujemy maszynę probabilistyczną <math>M'</math> z klasy
<math>\displaystyle \textbf{PP}</math>, która akceptuje <math>\displaystyle L</math>. Dodajemy nowy stan początkowy, z
<math>\textbf{PP}</math>, która akceptuje <math>L</math>. Dodajemy nowy stan początkowy, z
którego w sposób losowy wychodzimy albo do stanu akceptującego, albo
którego w sposób losowy wychodzimy albo do stanu akceptującego, albo
do normalnego obliczenia maszyny <math>\displaystyle M</math>. W każdym z
do normalnego obliczenia maszyny <math>M</math>. W każdym z
niedeterministycznych wyborów <math>\displaystyle M</math> rzucamy monetą dokonując wyboru
niedeterministycznych wyborów <math>M</math> rzucamy monetą dokonując wyboru
ścieżki (rysunek [http://osilek.mimuw.edu.pl/images/b/bc/ZO-10-0.swf Konstrukcja maszyny]).
ścieżki (rysunek [http://osilek.mimuw.edu.pl/images/b/bc/ZO-10-0.swf Konstrukcja maszyny]).


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


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


Linia 333: Linia 333:
{{definicja|1.9.||
{{definicja|1.9.||
Problem MAJSAT:<br>
Problem MAJSAT:<br>
Wejście: formuła logiczna <math>\displaystyle \phi</math> jak dla SAT o <math>\displaystyle n</math> zmiennych<br>
Wejście: formuła logiczna <math>\phi</math> jak dla SAT o <math>n</math> zmiennych<br>
Wyjście: czy większość spośród możliwych <math>\displaystyle 2^n</math> wartościowań spełnia
Wyjście: czy większość spośród możliwych <math>2^n</math> wartościowań spełnia
<math>\displaystyle \phi</math>?
<math>\phi</math>?
}}
}}


{{cwiczenie|1.10||
{{cwiczenie|1.10||
Pokaż, że MAJSAT należy do <math>\displaystyle \textbf{PP}</math>.
Pokaż, że MAJSAT należy do <math>\textbf{PP}</math>.
}}
}}


Linia 348: Linia 348:


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


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


===Klasa <math>\displaystyle \textbf{BPP}</math>===
===Klasa <math>\textbf{BPP}</math>===


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


{{definicja|1.11 [Klasa <math>\displaystyle \textbf{BPP}</math>]||
{{definicja|1.11 [Klasa <math>\textbf{BPP}</math>]||


Klasa <math>\displaystyle \textbf{BPP}</math> (ang. Bounded-error Probabilistic Polynomial) to
Klasa <math>\textbf{BPP}</math> (ang. Bounded-error Probabilistic Polynomial) to
klasa tych języków <math>\displaystyle L</math>, dla których istnieje maszyna
klasa tych języków <math>L</math>, dla których istnieje maszyna
probabilistyczna <math>\displaystyle M</math> działająca w czasie wielomianowym o
probabilistyczna <math>M</math> działająca w czasie wielomianowym o
następującej własności:
następującej własności:
* <math>\displaystyle x \in L \Rightarrow P_M(x) \geq { 3 \over 4 }</math>,
* <math>x \in L \Rightarrow P_M(x) \geq { 3 \over 4 }</math>,
* <math>\displaystyle x \notin L \Rightarrow P_M(x) \leq { 1 \over 4 }</math>.
* <math>x \notin L \Rightarrow P_M(x) \leq { 1 \over 4 }</math>.


}}
}}


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


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


{{twierdzenie|1.12||
{{twierdzenie|1.12||


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


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


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


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


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


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


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


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


Linia 446: Linia 446:
Probabilistyczne klasy złożoności -->
Probabilistyczne klasy złożoności -->


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


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


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


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


Jak wymaga tego klasa <math>\displaystyle \textbf{coRP}</math>, odpowiedź negatywna jest zawsze prawdziwa, natomiast mogą
Jak wymaga tego klasa <math>\textbf{coRP}</math>, odpowiedź negatywna jest zawsze prawdziwa, natomiast mogą
występować fałszywe odpowiedzi pozytywne. Poprzez odpowiednio dużą
występować fałszywe odpowiedzi pozytywne. Poprzez odpowiednio dużą
liczbę iteracji prawdopodobieństwo takiego faktu można uczynić
liczbę iteracji prawdopodobieństwo takiego faktu można uczynić
Linia 490: Linia 490:
Poniżej prezentujemy najbardziej znany z testów probabilistycznych odkryty niezależnie przez
Poniżej prezentujemy najbardziej znany z testów probabilistycznych odkryty niezależnie przez
Gary'ego Millera i Michaela Rabina około roku 1975.
Gary'ego Millera i Michaela Rabina około roku 1975.
Na wejściu dana jest liczba naturalna <math>\displaystyle n</math>. Jedna iteracja algorytmu przedstawia się następująco:
Na wejściu dana jest liczba naturalna <math>n</math>. Jedna iteracja algorytmu przedstawia się następująco:


{{algorytm|||
{{algorytm|||
  Przedstaw <math>\displaystyle n-1</math> jako <math>\displaystyle 2^sd</math>, d - nieparzysta  
  Przedstaw <math>n-1</math> jako <math>2^sd</math>, d - nieparzysta  
  Wybierz losową liczbę <math>\displaystyle a</math> z przedziału <math>\displaystyle [1, n - 1]</math>  
  Wybierz losową liczbę <math>a</math> z przedziału <math>[1, n - 1]</math>  
  '''if''' <math>\displaystyle a^d </math> mod  <math>\displaystyle  n \neq 1</math> i <math>\displaystyle a^{2^rd} </math>  mod  <math>\displaystyle  n\neq -1</math> dla wszystkich <math>\displaystyle r\in[0, s - 1]</math>  '''then'''
  '''if''' <math>a^d </math> mod  <math> n \neq 1</math> i <math>a^{2^rd}</math>  mod  <math>n\neq -1</math> dla wszystkich <math>r\in[0, s - 1]</math>  '''then'''
   '''return'''""NIE""  
   '''return'''""NIE""  
  '''else'''  
  '''else'''  
Linia 503: Linia 503:
}}
}}


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


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


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


{{twierdzenie|2.1.||
{{twierdzenie|2.1.||
Jeśli <math>\displaystyle n</math> jest nieparzystą liczbą złożoną, to przynajmniej <math>\displaystyle 3\over 4</math> spośród możliwych wartości <math>\displaystyle a</math> świadczą o złożoności <math>\displaystyle n</math>.
Jeśli <math>n</math> jest nieparzystą liczbą złożoną, to przynajmniej <math>3\over 4</math> spośród możliwych wartości <math>a</math> świadczą o złożoności <math>n</math>.
}}
}}


Jeśli poprzez <math>\displaystyle M</math> oznaczymy maszynę realizującą pojedynczy test Millera-Rabina, a poprzez <math>\displaystyle L</math> język PRIMES, to nasze dotychczasowe uwagi możemy podsumować
Jeśli poprzez <math>M</math> oznaczymy maszynę realizującą pojedynczy test Millera-Rabina, a poprzez <math>L</math> język PRIMES, to nasze dotychczasowe uwagi możemy podsumować
w sposób następujący:
w sposób następujący:
* <math>\displaystyle x\in L</math> (<math>\displaystyle n</math> pierwsza) <math>\displaystyle \Rightarrow\displaystyle P_M(x)=1</math>,
* <math>x \in L</math> (<math>n</math> pierwsza) <math>\Rightarrow P_M(x)=1</math>,
* <math>\displaystyle x\notin L</math> (<math>\displaystyle n</math> złożona) <math>\displaystyle \Rightarrow\displaystyle P_M(x)\leq {1\over4}</math>.
* <math>x \notin L</math> (<math>n</math> złożona) <math>\Rightarrow P_M(x)\leq {1\over4}</math>.


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


Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa <math>\displaystyle a</math> przebiega
Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa <math>a</math> przebiega
przedział o wielkości <math>\displaystyle O( </math> ln <math>\displaystyle  ^2(n))</math>. Stąd potrzebna liczba iteracji testu jest wielomianowa.
przedział o wielkości <math>O(</math> ln <math>^2(n))</math>. 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.
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".
Ten fakt sprawia, że test Millera-Rabina jest w pewnym sensie "zabezpieczony podwójnie".
Linia 541: Linia 541:


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


Mając do dyspozycji źródło idealne moglibyśmy z powodzeniem używać
Mając do dyspozycji źródło idealne moglibyśmy z powodzeniem używać
algorytmów z klasy <math>\displaystyle \textbf{RP}</math>, czy <math>\displaystyle \textbf{BPP}</math> w praktycznych
algorytmów z klasy <math>\textbf{RP}</math>, czy <math>\textbf{BPP}</math> w praktycznych
zastosowaniach. Niestety nie jest znane idealne fizyczne źródło
zastosowaniach. Niestety nie jest znane idealne fizyczne źródło
bitów losowych. Choć istnieją lepsze i gorsze metody generowania
bitów losowych. Choć istnieją lepsze i gorsze metody generowania
Linia 576: Linia 576:


{{cwiczenie|4.1.||
{{cwiczenie|4.1.||
Uzasadnij, że klasy <math>\displaystyle \textbf{BPP}</math> oraz <math>\displaystyle \textbf{PP}</math> są zamknięte na
Uzasadnij, że klasy <math>\textbf{BPP}</math> oraz <math>\textbf{PP}</math> są zamknięte na
dopełnienie.
dopełnienie.
}}
}}
Linia 585: Linia 585:


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


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


Przypadek klasy <math>\displaystyle \textbf{PP}</math> jest analogiczny. Weźmy <math>\displaystyle L\in\textbf{PP}</math> i maszynę <math>\displaystyle M</math> dla niego. Załóżmy, że maszyna <math>\displaystyle M</math> 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 <math>\displaystyle \overline{L}</math> jest akceptowany przez <math>\displaystyle M'</math>, która ponownie jest maszyną <math>\displaystyle M</math> z odwróconymi odpowiedziami. Jeśli <math>\displaystyle x\in\overline{L}</math>, to <math>\displaystyle x\notin L</math>, zatem <math>\displaystyle P_M(x)<{1\over2}</math>, stąd <math>\displaystyle P_{M'}(x)>{1\over2}</math>. Podobnie jeśli <math>\displaystyle x\notin\overline{L}</math>, to <math>\displaystyle x\in L</math>, zatem <math>\displaystyle P_M(x)>{1\over2}</math>, stąd <math>\displaystyle P_{M'}(x)<{1\over2}</math>. Maszyna <math>\displaystyle M'</math> spełnia zatem warunki
Przypadek klasy <math>\textbf{PP}</math> jest analogiczny. Weźmy <math>L\in\textbf{PP}</math> i maszynę <math>M</math> dla niego. Załóżmy, że maszyna <math>M</math> 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 <math>\overline{L}</math> jest akceptowany przez <math>M'</math>, która ponownie jest maszyną <math>M</math> z odwróconymi odpowiedziami. Jeśli <math>x\in\overline{L}</math>, to <math>x\notin L</math>, zatem <math>P_M(x)<{1\over2}</math>, stąd <math>P_{M'}(x)>{1\over2}</math>. Podobnie jeśli <math>x\notin\overline{L}</math>, to <math>x\in L</math>, zatem <math>P_M(x)>{1\over2}</math>, stąd <math>P_{M'}(x)<{1\over2}</math>. Maszyna <math>M'</math> spełnia zatem warunki
klasy <math>\displaystyle \textbf{PP}</math>.
klasy <math>\textbf{PP}</math>.


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


{{cwiczenie|4.2.||
{{cwiczenie|4.2.||
Pokaż, że <math>\displaystyle \textbf{PP}\subseteq\textbf{PSPACE}</math>
Pokaż, że <math>\textbf{PP}\subseteq\textbf{PSPACE}</math>
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </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">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Skonstruuj maszynę odpowiednią dla <math>\displaystyle \textbf{PSPACE}</math> na podstawie
Skonstruuj maszynę odpowiednią dla <math>\textbf{PSPACE}</math> na podstawie
maszyny dla klasy <math>\displaystyle \textbf{PP}</math>
maszyny dla klasy <math>\textbf{PP}</math>
</div></div>
</div></div>


<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 język <math>\displaystyle L\in\textbf{PP}</math> i maszynę probabilistyczną <math>\displaystyle M</math> dla niego. Maszyna działa w czasie wielomianowym, więc potencjalna liczba wszystkich ścieżek jest wykładnicza. Możemy jednak zastosować
Weźmy język <math>L\in\textbf{PP}</math> i maszynę probabilistyczną <math>M</math> 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
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ę <math>\displaystyle M'</math> z klasy <math>\displaystyle \textbf{PSPACE}</math>. Musimy jedynie pamiętać wektor kolejnych wyborów (również długości wielomianowej), aby móc wygenerować następny z nich.
konstruujemy maszynę <math>M'</math> z klasy <math>\textbf{PSPACE}</math>. 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 <math>\displaystyle x</math> zliczamy ile spośród ścieżek obliczeń <math>\displaystyle M</math> jest akceptujących. Jeśli więcej niż połowa, to akceptujemy słowo, w przeciwnym wypadku odrzucamy.
Dla słowa wejściowego <math>x</math> zliczamy ile spośród ścieżek obliczeń <math>M</math> jest akceptujących. Jeśli więcej niż połowa, to akceptujemy słowo, w przeciwnym wypadku odrzucamy.


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


{{cwiczenie|4.3.||
{{cwiczenie|4.3.||
Pokaż, że jeśli <math>\displaystyle \textbf{NP}\subseteq\textbf{BPP}</math>, to <math>\displaystyle \textbf{RP}=\textbf{NP}</math>
Pokaż, że jeśli <math>\textbf{NP}\subseteq\textbf{BPP}</math>, to <math>\textbf{RP}=\textbf{NP}</math>
}}
}}


Linia 627: Linia 627:


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


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


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


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


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


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


Jeśli natomiast <math>\displaystyle \phi</math> 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 <math>\displaystyle n</math> wyborów wartościowań <math>\displaystyle x_i</math> nie popełnić błędu. Prawdopodobieństwo zdarzenia przeciwnego (czyli przynajmniej jeden błąd) może być ograniczone przez <math>\displaystyle n{1\over 2n}={1\over2}</math>, zatem <math>\displaystyle P_{M'}(x)\geq{1\over2}</math>. Stąd nasz algorytm spełnia warunki klasy <math>\displaystyle \textbf{RP}</math>.
Jeśli natomiast <math>\phi</math> 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 <math>n</math> wyborów wartościowań <math>x_i</math> nie popełnić błędu. Prawdopodobieństwo zdarzenia przeciwnego (czyli przynajmniej jeden błąd) może być ograniczone przez <math>n{1\over 2n}={1\over2}</math>, zatem <math>P_{M'}(x)\geq{1\over2}</math>. Stąd nasz algorytm spełnia warunki klasy <math>\textbf{RP}</math>.
</div></div>
</div></div>


==Testy końcowe==
==Testy końcowe==

Aktualna wersja na dzień 22:10, 11 wrz 2023

Algorytmy probabilistyczne

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

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 M jest zwykłą niedeterministyczną maszyną Turinga. Przypomnijmy, że M ma podczas każdego kroku obliczeń możliwość wyboru wielu ścieżek obliczeń. W pojęciu akceptacji słowa bierzemy pod uwagę zachowanie 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 M wybiera spośród dwóch możliwości wyboru ścieżki. Wyobraźmy sobie, że maszyna 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 M nazywamy probabilistyczną. Maszyna probabilistyczna akceptuje słowo wejściowe 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 M i słowa wejściowego x definiujemy PM(x) jako prawdopodobieństwo, że maszyna M zaakceptuje słowo 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 M, jej języka L=L(M) i słowa wejściowego x zachodzi zatem:

  • xLPM(x)=1
  • xLPM(x)=0

Naszym obiektem zainteresowania jest powiązanie prawdopodobieństwa akceptacji słowa z jego przynależnością do konkretnego języka L. W ten sposób będziemy mogli używać maszyny probabilistycznej do akceptowania 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 M może być dwojakiego rodzaju. Ustalmy L. Jeśli xL to M akceptuje x z prawdopodobieństwem PM(x). Jeśli nie jest ono równe 1, to może się okazać, że M odrzuci x. Mówimy wtedy o fałszywej odpowiedzi negatywnej. Maszyna odrzuca poprawne słowo z języka L!

W drugim przypadku xL i M akceptuje x z prawdopodobieństwem PM(x). Jeśli nie jest ono równe 0, to może się okazać, że M zaakceptuje x. Mówimy wtedy o fałszywej odpowiedzi pozytywnej. Maszyna akceptuje słowo spoza języka 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 RP]]

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

  • xLPM(x)12,
  • xLPM(x)=0.

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

Wyobraźmy sobie, że mamy język L z klasy RP i maszynę M dla niego. Uruchamiamy M na 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 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 12. W tym momencie wykonujemy jednak genialny w swojej prostocie manewr - uruchamiamy 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 14.

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

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 12 w definicji klasy RP nie ma żadnego znaczenia i wystarczy nam, żeby była dodatnia:

Ćwiczenie 1.3.

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

Wskazówka
Rozwiązanie

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

Ćwiczenie 1.4.

Pokaż, że RPNP.

Wskazówka
Rozwiązanie

Maszyny z klasy 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ą 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 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 12. Wszystkie własności są dualne, w szczególności coRPcoNP.

Definicja 1.5. [Klasa coRP]

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

  • xLPM(x)=1.
  • xLPM(x)12,

Klasa ZPP

Odpowiedź na pytanie, czy RP=coRP nie jest znana. Bez tej odpowiedzi możemy jednak rozważyć klasę RPcoRP. 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ć k prób obu algorytmów wynosi 2k, czyli maleje wykładniczo.

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

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

Nietrudno pokazać, że ZPP=RPcoRP. 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 PP

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

Definicja 1.7. [Klasa PP]

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

  • xLPM(x)>12,
  • xLPM(x)12.

Ponieważ występujące w definicji prawdopodobieństwo błędu może być dowolnie bliskie 12, 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 12 tylko o 12p(n), gdzie 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 RP to w sytuacji odchylenia 12p(n) będziemy musieli wykonać wykładniczą liczbę powtórzeń, aby uzyskać prawdopodobieństwo błędu ograniczone przez 14. Prześledzimy to dokładnie w następnym rozdziale, w którym rozważana klasa będzie mieć prawdopodobieństwo błędu oddalone od 12 o stałą.

Taka sytuacja sprawia, że odpowiedź maszyny z klasy 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 12, to maszyna nie różni się niczym od pojedynczego rzutu monetą, który nie niesie żadnej informacji o języku L. To wszystko sprawia, że maszyny z klasy 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 NPPP

Wskazówka
Rozwiązanie

Rozważmy następujący problem:

Definicja 1.9.

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

Ćwiczenie 1.10

Pokaż, że MAJSAT należy do PP.

Wskazówka
Rozwiązanie

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

Klasa BPP

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

Definicja 1.11 [Klasa BPP]

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

  • xLPM(x)34,
  • xLPM(x)14.

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

Patrząc na definicję klasy 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 14. Podobnie jak dla klasy RP ta stała może zostać wybrana dowolnie z przedziału (0,12), lecz jest to fakt trudniejszy:

Twierdzenie 1.12

Niech α(0,12). Dla dowolnej maszyny probabilistycznej M działającej w czasie wielomianowym, o prawdopodobieństwie błędu ograniczonym przez 12α, istnieje równoważna wielomianowa maszyna probabilistyczna M o prawdopodobieństwie błędu ograniczonym przez 12p(n), gdzie p jest wielomianem.

Dowód

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

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

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

Niech xi, dla i=1n będą niezależnymi zmiennymi losowymi przyjmującymi wartości 1 i 0 z prawdopodobieństwem odpowiednio p oraz 1p, natomiast X=i=1nxi. Wówczas dla 0θ1 zachodzi:

P(X(1θ)pn)eθ22pn

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

Załóżmy, że xL. Wiemy, że PM(x)12+α. Nasze zmienne losowe xi to wyniki kolejnych obliczeń M na słowie x, prawdopodobieństwo p wynosi 12+α, natomiast n - liczba prób jest równa 2k+1. Weźmy θ=α12+α. Z nierówności Chernoffa mamy, że P(Xn2)e2α2k (asymptotycznie).

Wprost z definicji maszyny M wiemy, że akceptuje ona, gdy ponad połowa wywołań M zakończy się akceptacją, czyli wtedy, gdy X>n2. Jest to zdarzenie przeciwne do Xn2, zatem PM(x)1e2α2k. Gdy podstawimy k=p(n)ln22α2, to otrzymamy wykładnicze małe prawdopodobieństwo błędu 12p(n). Maszyna M wykonuje tylko wielomianową liczbę powtórzeń. Przypadek xL jest analogiczny.

Probabilistyczne klasy złożoności

Podobnie jak dla klasy RP stała α może być równa nawet 1p(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 PP. Stwierdziliśmy, że dla maszyn z tej klasy prawdopodobieństwo błędu może być ograniczone przez 1212p(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 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 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 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 n. Jedna iteracja algorytmu przedstawia się następująco:

Algorytm


Przedstaw n1 jako 2sd, d - nieparzysta 
Wybierz losową liczbę a z przedziału [1,n1] 
if ad mod  n1 i a2rd  mod  n1 dla wszystkich r[0,s1]  then
  return""NIE"" 
else 
  return""TAK"" 
end if


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

Jeśli 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 a, których liczba jest liniowa względem n, czyli wykładnicza względem rozmiaru wejścia, które tradycyjnie zapisujemy binarnie.

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

Twierdzenie 2.1.

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

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

  • xL (n pierwsza) PM(x)=1,
  • xL (n złożona) PM(x)14.

Spełnione są zatem założenia algorytmu z klasy coRP. Gdy otrzymujemy odpowiedź ""NIE"", to liczba jest złożona, gdy otrzymujemy odpowiedź ""TAK"", to liczba jest pierwsza z prawdopodobieństwem błędu 14. Gdy wykonamy 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 14k, czyli wykładniczo małym.

Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa a przebiega przedział o wielkości O( ln 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 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 RP, czy 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 BPP oraz PP są zamknięte na dopełnienie.

Wskazówka
Rozwiązanie

Ćwiczenie 4.2.

Pokaż, że PPPSPACE

Wskazówka
Rozwiązanie

Ćwiczenie 4.3.

Pokaż, że jeśli NPBPP, to RP=NP

Wskazówka
Rozwiązanie

Testy końcowe