Złożoność obliczeniowa/Wykład 10: Algorytmy probabilistyczne: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „<math> ” na „<math>” |
||
(Nie pokazano 20 wersji utworzonych przez 3 użytkowników) | |||
Linia 9: | Linia 9: | ||
do naszego modelu obliczeń. | do naszego modelu obliczeń. | ||
Załóżmy, że <math> | Załóżmy, że <math>M</math> jest zwykłą niedeterministyczną maszyną Turinga. | ||
Przypomnijmy, że <math> | 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> | 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> | 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> | ś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> | Opisaną powyżej maszynę Turinga <math>M</math> nazywamy | ||
''probabilistyczną''. Maszyna probabilistyczna akceptuje słowo | ''probabilistyczną''. Maszyna probabilistyczna akceptuje słowo | ||
wejściowe <math> | 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> | Dla probabilistycznej maszyny Turinga <math>M</math> i słowa wejściowego <math>x</math> | ||
definiujemy <math> | definiujemy <math>P_M(x)</math> jako prawdopodobieństwo, że maszyna <math>M</math> | ||
zaakceptuje słowo <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> | <math>M</math>, jej języka <math>L=L(M)</math> i słowa wejściowego <math>x</math> zachodzi zatem: | ||
* <math> | * <math>x\in L \Rightarrow P_M(x)=1</math> | ||
* <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> | 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> | 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> | Błąd maszyny probabilistycznej <math>M</math> może być dwojakiego rodzaju. | ||
Ustalmy <math> | Ustalmy <math>L</math>. Jeśli <math>x\in L</math> to <math>M</math> akceptuje <math>x</math> z | ||
prawdopodobieństwem <math> | prawdopodobieństwem <math>P_M(x)</math>. Jeśli nie jest ono równe 1, to może | ||
się okazać, że <math> | 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> | odpowiedzi negatywnej''. Maszyna odrzuca poprawne słowo z języka <math>L</math>! | ||
W drugim przypadku <math> | W drugim przypadku <math>x\notin L</math> i <math>M</math> akceptuje <math>x</math> z | ||
prawdopodobieństwem <math> | prawdopodobieństwem <math>P_M(x)</math>. Jeśli nie jest ono równe 0, to może | ||
się okazać, że <math> | 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> | 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> | {{definicja|1.2.[Klasa <math>\textbf{RP}</math>]]|| | ||
Klasa <math> | Klasa <math>\textbf{RP}</math> (ang. Randomized Polynomial) to klasa tych języków | ||
<math> | <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> | * <math>x \in L \Rightarrow P_M(x) \geq { 1 \over 2 }</math>, | ||
* <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> | najwyżej <math>1\over2</math>. Co dla Nas oznacza to w praktyce? | ||
Wyobraźmy sobie, że mamy język <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> | 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> | 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> | ograniczonym z góry przez <math>1\over2</math>. W tym momencie wykonujemy | ||
jednak genialny w swojej prostocie manewr - uruchamiamy <math> | 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> | 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> | 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> | <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> | 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> | zamieniona na dowolną stałą z przedziału <math>(0,1]</math> lub nawet zależeć | ||
od <math> | 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> | 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> | {1\over2}</math>. Jak uzyskać prawdopodobieństwo przynajmniej <math>1\over2</math>? | ||
Konstruujemy maszynę <math> | Konstruujemy maszynę <math>M'</math>, która działa poprzez uruchomienie maszyny | ||
<math> | <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> | 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> | 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> | 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> | 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> | <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> | <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> | 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> | Gdy język <math>L</math> należy do <math>\textbf{RP}</math>, to istnieje dla niego maszyna | ||
probabilistyczna <math> | 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> | Traktujemy od tej pory <math>M</math> jako maszynę niedeterministyczną. | ||
Pokażemy, że <math> | Pokażemy, że <math>L=L(M)</math>. | ||
Jeśli <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> | 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> | 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> | <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> | <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> | pozytywnej jest ograniczone przez <math>1\over2</math>. Wszystkie własności są | ||
dualne, w szczególności <math> | dualne, w szczególności <math>\textbf{coRP}\subseteq\textbf{coNP}</math>. | ||
{{definicja|1.5. [Klasa <math> | {{definicja|1.5. [Klasa <math>\textbf{coRP}</math>]|| | ||
Klasa <math> | Klasa <math>\textbf{coRP}</math> to klasa tych języków | ||
<math> | <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> | * <math>x \in L \Rightarrow P_M(x) = 1</math>. | ||
* <math> | * <math>x \notin L \Rightarrow P_M(x) \leq { 1 \over 2 }</math>, | ||
}} | }} | ||
===Klasa <math> | ===Klasa <math>\textbf{ZPP}</math>=== | ||
Odpowiedź na pytanie, czy <math> | Odpowiedź na pytanie, czy <math>\textbf{RP}=\textbf{coRP}</math> nie jest znana. Bez | ||
tej odpowiedzi możemy jednak rozważyć klasę <math> | 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> | wielomianowy. Prawdopodobieństwo, że trzeba będzie dokonać <math>k</math> prób | ||
obu algorytmów wynosi <math> | 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> | {{definicja|1.6. [Klasa <math>\textbf{ZPP}</math>]|| | ||
Klasa <math> | Klasa <math>\textbf{ZPP}</math> (ang. Zero-error Probabilistic Polynomial) to klasa | ||
tych języków <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> | 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> | 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> | ===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> | występowała w <math>\textbf{RP}</math>. | ||
{{definicja|1.7. [Klasa <math> | {{definicja|1.7. [Klasa <math>\textbf{PP}</math>]|| | ||
Klasa <math> | Klasa <math>\textbf{PP}</math> (ang. Probabilistic Polynomial) to klasa tych | ||
języków <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> | * <math>x \in L \Rightarrow P_M(x) > { 1 \over 2 }</math>, | ||
* <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> | 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> | <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> | się zrobiliśmy w przypadku klasy <math>\textbf{RP}</math> to w sytuacji odchylenia | ||
<math> | <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> | <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> | <math>1\over2</math> o stałą. | ||
Taka sytuacja sprawia, że odpowiedź maszyny z klasy <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> | <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> | monetą, który nie niesie żadnej informacji o języku <math>L</math>. To wszystko | ||
sprawia, że maszyny z klasy <math> | 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> | 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> | Skonstruuj maszynę odpowiednią dla klasy <math>\textbf{PP}</math> na podstawie | ||
maszyny dla klasy <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>M'</math>.]] | |||
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>M'</math> z klasy | |||
Weźmy dowolny język <math> | <math>\textbf{PP}</math>, która akceptuje <math>L</math>. Dodajemy nowy stan początkowy, z | ||
akceptuje. Skonstruujemy maszynę probabilistyczną <math> | |||
<math> | |||
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> | do normalnego obliczenia maszyny <math>M</math>. W każdym z | ||
niedeterministycznych wyborów <math> | niedeterministycznych wyborów <math>M</math> rzucamy monetą dokonując wyboru | ||
ścieżki ([ | ścieżki (rysunek [http://osilek.mimuw.edu.pl/images/b/bc/ZO-10-0.swf Konstrukcja maszyny]). | ||
Jeśli <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> | 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 335: | Linia 333: | ||
{{definicja|1.9.|| | {{definicja|1.9.|| | ||
Problem MAJSAT:<br> | Problem MAJSAT:<br> | ||
Wejście: formuła logiczna <math> | 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> | Wyjście: czy większość spośród możliwych <math>2^n</math> wartościowań spełnia | ||
<math> | <math>\phi</math>? | ||
}} | }} | ||
{{cwiczenie|1.10|| | {{cwiczenie|1.10|| | ||
Pokaż, że MAJSAT należy do <math> | Pokaż, że MAJSAT należy do <math>\textbf{PP}</math>. | ||
}} | }} | ||
Linia 350: | 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> | 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> | każdego z jednakowym prawdopodobieństwem <math>1\over2^n</math>. Rozważmy formułę | ||
<math> | <math>\phi</math> (kodowaną przez słowo <math>x</math>) z <math>n</math> zmiennymi. Oznaczmy liczbę | ||
wartościowań spełniających <math> | 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> | <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> | <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> | MAJSAT jest nawet problemem zupełnym dla klasy <math>\textbf{PP}</math>. Nie wiemy | ||
o nim natomiast czy należy do <math> | o nim natomiast czy należy do <math>\textbf{NP}</math>. To pokazuje, jak silna | ||
jest klasa <math> | jest klasa <math>\textbf{PP}</math> -- maszyn akceptujących większością. | ||
===Klasa <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> | {{definicja|1.11 [Klasa <math>\textbf{BPP}</math>]|| | ||
Klasa <math> | Klasa <math>\textbf{BPP}</math> (ang. Bounded-error Probabilistic Polynomial) to | ||
klasa tych języków <math> | klasa tych języków <math>L</math>, dla których istnieje maszyna | ||
probabilistyczna <math> | probabilistyczna <math>M</math> działająca w czasie wielomianowym o | ||
następującej własności: | następującej własności: | ||
* <math> | * <math>x \in L \Rightarrow P_M(x) \geq { 3 \over 4 }</math>, | ||
* <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> | się pomiędzy klasami <math>\textbf{NP}</math> i <math>\textbf{BPP}</math> w żadną stronę. Klasa | ||
<math> | <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> | 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> | tej klasy jest ograniczone dla obu przypadków przez <math>1\over4</math>. | ||
Podobnie jak dla klasy <math> | Podobnie jak dla klasy <math>\textbf{RP}</math> ta stała może zostać wybrana | ||
dowolnie z przedziału <math> | dowolnie z przedziału <math>(0,{1\over2})</math>, lecz jest to fakt | ||
trudniejszy: | trudniejszy: | ||
{{twierdzenie|1.12|| | {{twierdzenie|1.12|| | ||
Niech <math> | Niech <math>\alpha\in(0,{1\over2})</math>. Dla dowolnej maszyny | ||
probabilistycznej <math> | probabilistycznej <math>M</math> działającej w czasie wielomianowym, o | ||
prawdopodobieństwie błędu ograniczonym przez <math> | prawdopodobieństwie błędu ograniczonym przez <math>{1\over2}-\alpha</math>, | ||
istnieje równoważna wielomianowa maszyna probabilistyczna <math> | istnieje równoważna wielomianowa maszyna probabilistyczna <math>M'</math> o | ||
prawdopodobieństwie błędu ograniczonym przez <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> | Mamy do dyspozycji maszynę <math>M</math>, która wykazuje skłonność do | ||
częstszego akceptowania słów z języka <math> | częstszego akceptowania słów z języka <math>L</math> niż spoza niego. Dla słowa | ||
<math> | <math>x\in L</math> prawdopodobieństwo akceptacji wynosi <math>{1\over2}+\alpha</math> a | ||
odrzucenia <math> | odrzucenia <math>{1\over2}-\alpha</math>. Przewaga prawdopodobieństwa wynosi | ||
<math> | <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> | Maszyna <math>M'</math> dla słowa wejściowego <math>x</math> wykonuje <math>2k+1</math> iteracji | ||
maszyny <math> | 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> | 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> | 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> | przyjmującymi wartości 1 i 0 z prawdopodobieństwem odpowiednio <math>p</math> | ||
oraz <math> | oraz <math>1-p</math>, natomiast <math>X=\sum_{i=1}^n{x_i}</math>. Wówczas dla | ||
<math> | <math>0\leq\theta\leq1</math> zachodzi: | ||
<center><math> | <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> | losowej <math>X</math> od jej wartości oczekiwanej maleje wykładniczo od | ||
wartości odchylenia. | wartości odchylenia. | ||
Załóżmy, że <math> | Załóżmy, że <math>x\in L</math>. Wiemy, że <math>P_M(x)\geq {1\over2}+\alpha</math>. Nasze | ||
zmienne losowe <math> | zmienne losowe <math>x_i</math> to wyniki kolejnych obliczeń <math>M</math> na słowie <math>x</math>, | ||
prawdopodobieństwo <math> | 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> | <math>\theta={\alpha\over{1\over2}+\alpha}</math>. Z nierówności Chernoffa | ||
mamy, że <math> | mamy, że <math>P(X\leq{n\over2})\leq e^{-2\alpha^2k}</math> (asymptotycznie). | ||
Wprost z definicji maszyny <math> | Wprost z definicji maszyny <math>M'</math> wiemy, że akceptuje ona, gdy ponad | ||
połowa wywołań <math> | połowa wywołań <math>M</math> zakończy się akceptacją, czyli wtedy, gdy | ||
<math> | <math>X>{n\over2}</math>. Jest to zdarzenie przeciwne do <math>X\leq{n\over2}</math>, | ||
zatem <math> | zatem <math>P_{M'}(x)\geq 1 - e^{-2\alpha^2k}</math>. Gdy podstawimy | ||
<math> | <math>k=\lceil{p(n) \mbox{ln} 2 \over2\alpha^2}\rceil</math>, to otrzymamy | ||
wykładnicze małe prawdopodobieństwo błędu <math> | wykładnicze małe prawdopodobieństwo błędu <math>1\over2^{p(n)}</math>. Maszyna | ||
<math> | <math>M'</math> wykonuje tylko wielomianową liczbę powtórzeń. Przypadek | ||
<math> | <math>x\notin L</math> jest analogiczny. | ||
}} | }} | ||
[[File:ZO-10-1.mp4|250x250px|thumb|right|Probabilistyczne klasy złożoności]] | |||
<!-- [width<nowiki>=</nowiki>10cm]{ZO-10-1-rys.jpg} | <!-- [width<nowiki>=</nowiki>10cm]{ZO-10-1-rys.jpg} | ||
Probabilistyczne klasy złożoności --> | Probabilistyczne klasy złożoności --> | ||
Podobnie jak dla klasy <math> | Podobnie jak dla klasy <math>\textbf{RP}</math> stała <math>\alpha</math> może być równa nawet | ||
<math> | <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> | 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> | <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 | ||
akceptowalne w praktyce. | akceptowalne w praktyce. | ||
[ | Animacja [http://osilek.mimuw.edu.pl/images/9/9b/ZO-10-1.swf Probabilistyczne klasy złożoności] podsumowuje poznane wcześniej klasy złożoności i | ||
relacje pomiędzy nimi: | relacje pomiędzy nimi: | ||
Linia 476: | 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> | 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> | 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> | 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 495: | 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> | Na wejściu dana jest liczba naturalna <math>n</math>. Jedna iteracja algorytmu przedstawia się następująco: | ||
{{algorytm||| | {{algorytm||| | ||
Przedstaw <math> | Przedstaw <math>n-1</math> jako <math>2^sd</math>, d - nieparzysta | ||
Wybierz losową liczbę <math>a</math> z przedziału <math>[1, n - 1]</math> | |||
Wybierz losową liczbę <math> | '''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''' | ||
'''if''' <math> | |||
mod <math> | |||
wszystkich <math> | |||
'''return'''""NIE"" | '''return'''""NIE"" | ||
'''else''' | '''else''' | ||
'''return'''""TAK"" | '''return'''""TAK"" | ||
'''end if''' | '''end if''' | ||
}} | }} | ||
Gdy przypatrzymy się algorytmowi, to widzimy, że kluczem do sukcesu jest wylosowanie właściwej liczby <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> | 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> | 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> | 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> | Jeśli <math>n</math> jest pierwsza, | ||
to oczywiście świadek <math> | 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> | 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> | 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> | * <math>x \in L</math> (<math>n</math> pierwsza) <math>\Rightarrow P_M(x)=1</math>, | ||
* <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> | 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> | 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> | 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> | Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa <math>a</math> przebiega | ||
przedział o wielkości <math> | 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 550: | 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> | 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 556: | 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> | 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 585: | Linia 576: | ||
{{cwiczenie|4.1.|| | {{cwiczenie|4.1.|| | ||
Uzasadnij, że klasy <math> | Uzasadnij, że klasy <math>\textbf{BPP}</math> oraz <math>\textbf{PP}</math> są zamknięte na | ||
dopełnienie. | dopełnienie. | ||
}} | }} | ||
Linia 594: | 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> | 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> | jest on akceptowany przez maszynę probabilistyczną <math>M</math>. Rozważmy | ||
<math> | <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> | która będzie dla niego odpowiednia, to <math>M</math> z odwróconymi | ||
odpowiedziami, którą oznaczamy przez <math> | odpowiedziami, którą oznaczamy przez <math>M'</math>. | ||
Jeśli <math> | 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> | {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> | 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 | ||
{1\over2}</math>, stąd <math> | klasy <math>\textbf{PP}</math>. | ||
klasy <math> | |||
</div></div> | </div></div> | ||
{{cwiczenie|4.2.|| | {{cwiczenie|4.2.|| | ||
Pokaż, że <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> | Skonstruuj maszynę odpowiednią dla <math>\textbf{PSPACE}</math> na podstawie | ||
maszyny dla klasy <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> | 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> | 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> | 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> | 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> | Pokaż, że jeśli <math>\textbf{NP}\subseteq\textbf{BPP}</math>, to <math>\textbf{RP}=\textbf{NP}</math> | ||
}} | }} | ||
Linia 637: | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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 jest zwykłą niedeterministyczną maszyną Turinga. Przypomnijmy, że ma podczas każdego kroku obliczeń możliwość wyboru wielu ścieżek obliczeń. W pojęciu akceptacji słowa bierzemy pod uwagę zachowanie 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 wybiera spośród dwóch możliwości wyboru ścieżki. Wyobraźmy sobie, że maszyna 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 nazywamy probabilistyczną. Maszyna probabilistyczna akceptuje słowo wejściowe 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 i słowa wejściowego definiujemy jako prawdopodobieństwo, że maszyna zaakceptuje słowo .
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 , jej języka i słowa wejściowego zachodzi zatem:
Naszym obiektem zainteresowania jest powiązanie prawdopodobieństwa akceptacji słowa z jego przynależnością do konkretnego języka . W ten sposób będziemy mogli używać maszyny probabilistycznej do akceptowania 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 może być dwojakiego rodzaju. Ustalmy . Jeśli to akceptuje z prawdopodobieństwem . Jeśli nie jest ono równe 1, to może się okazać, że odrzuci . Mówimy wtedy o fałszywej odpowiedzi negatywnej. Maszyna odrzuca poprawne słowo z języka !
W drugim przypadku i akceptuje z prawdopodobieństwem . Jeśli nie jest ono równe 0, to może się okazać, że zaakceptuje . Mówimy wtedy o fałszywej odpowiedzi pozytywnej. Maszyna akceptuje słowo spoza języka !
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 ]]
Klasa (ang. Randomized Polynomial) to klasa tych języków , dla których istnieje maszyna probabilistyczna , działająca w czasie wielomianowym, o następującej własności:
- ,
- .
Innymi słowy, maszyna nie daje fałszywych odpowiedzi pozytywnych, a prawdopodobieństwo fałszywej odpowiedzi negatywnej wynosi co najwyżej . Co dla Nas oznacza to w praktyce?
Wyobraźmy sobie, że mamy język z klasy i maszynę dla niego. Uruchamiamy na . 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 .
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 . W tym momencie wykonujemy jednak genialny w swojej prostocie manewr - uruchamiamy 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 .
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 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.

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 w definicji klasy nie ma żadnego znaczenia i wystarczy nam, żeby była dodatnia:
Ćwiczenie 1.3.
Pokaż, że stała w definicji klasy może zostać zamieniona na dowolną stałą z przedziału lub nawet zależeć od poprzez , gdzie jest wielomianem.
Zaznaczyliśmy już wcześniej, że maszyna probabilistyczna stanowi uogólnienie maszyny deterministycznej, stąd . Jak zwykle ani o tym, ani o poniższym zawieraniu nie wiemy czy jest ścisłe:
Ćwiczenie 1.4.
Pokaż, że .
Maszyny z klasy 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ą , 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 daje odpowiedź ""NIE"" to słowo na pewno do języka nie należy. Natomiast prawdopodobieństwo fałszywej odpowiedzi pozytywnej jest ograniczone przez . Wszystkie własności są dualne, w szczególności .
Definicja 1.5. [Klasa ]
Klasa to klasa tych języków , dla których istnieje maszyna probabilistyczna , działająca w czasie wielomianowym, o następującej własności:
- .
- ,
Klasa
Odpowiedź na pytanie, czy nie jest znana. Bez tej odpowiedzi możemy jednak rozważyć klasę . 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ć prób obu algorytmów wynosi , czyli maleje wykładniczo.

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 ]
Klasa (ang. Zero-error Probabilistic Polynomial) to klasa tych języków , dla których istnieje maszyna probabilistyczna działająca w oczekiwanym czasie wielomianowym, która akceptuje nie popełniając błędu.
Nietrudno pokazać, że . 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
Rozważając kolejne klasy zrezygnujemy z jednostronności błędu, która występowała w .
Definicja 1.7. [Klasa ]
Klasa (ang. Probabilistic Polynomial) to klasa tych języków , dla których istnieje maszyna probabilistyczna działająca w czasie wielomianowym o następującej własności:
- ,
- .
Ponieważ występujące w definicji prawdopodobieństwo błędu może być dowolnie bliskie , 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 tylko o , gdzie 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 to w sytuacji odchylenia będziemy musieli wykonać wykładniczą liczbę powtórzeń, aby uzyskać prawdopodobieństwo błędu ograniczone przez . Prześledzimy to dokładnie w następnym rozdziale, w którym rozważana klasa będzie mieć prawdopodobieństwo błędu oddalone od o stałą.
Taka sytuacja sprawia, że odpowiedź maszyny z klasy 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 , to maszyna nie różni się niczym od pojedynczego rzutu monetą, który nie niesie żadnej informacji o języku . To wszystko sprawia, że maszyny z klasy 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
Rozważmy następujący problem:
Definicja 1.9.
Problem MAJSAT:
Wejście: formuła logiczna jak dla SAT o zmiennych
Wyjście: czy większość spośród możliwych wartościowań spełnia
?
Ćwiczenie 1.10
Pokaż, że MAJSAT należy do .
MAJSAT jest nawet problemem zupełnym dla klasy . Nie wiemy o nim natomiast czy należy do . To pokazuje, jak silna jest klasa -- maszyn akceptujących większością.
Klasa
W tym rozdziale prezentujemy najszerszą z klas, która odpowiada praktycznym obliczeniom losowym:.
Definicja 1.11 [Klasa ]
Klasa (ang. Bounded-error Probabilistic Polynomial) to klasa tych języków , dla których istnieje maszyna probabilistyczna działająca w czasie wielomianowym o następującej własności:
- ,
- .
Niecodziennym faktem jest, że nie wiadomo nic na temat zawierania się pomiędzy klasami i w żadną stronę. Klasa zawiera w sobie natomiast oraz , co wynika wprost z definicji.
Patrząc na definicję klasy 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 . Podobnie jak dla klasy ta stała może zostać wybrana dowolnie z przedziału , lecz jest to fakt trudniejszy:
Twierdzenie 1.12
Niech . Dla dowolnej maszyny probabilistycznej działającej w czasie wielomianowym, o prawdopodobieństwie błędu ograniczonym przez , istnieje równoważna wielomianowa maszyna probabilistyczna o prawdopodobieństwie błędu ograniczonym przez , gdzie jest wielomianem.
Dowód
Mamy do dyspozycji maszynę , która wykazuje skłonność do częstszego akceptowania słów z języka niż spoza niego. Dla słowa prawdopodobieństwo akceptacji wynosi a odrzucenia . Przewaga prawdopodobieństwa wynosi , więc możemy mieć nadzieje, że przy odpowiednio dużej liczbie prób zdarzenie bardziej prawdopodobne będzie pojawiać się częściej.
Maszyna dla słowa wejściowego wykonuje iteracji maszyny . Następnie daje taką odpowiedź, która występowała najczęściej. Policzmy jak prawdopodobieństwo błędu popełnianego przez maszynę zależy od .
Oprzemy dowód twierdzenia na nierówności Chernoffa znanej z rachunku prawdopodobieństwa:
Niech , dla będą niezależnymi zmiennymi losowymi przyjmującymi wartości 1 i 0 z prawdopodobieństwem odpowiednio oraz , natomiast . Wówczas dla zachodzi:
Innymi słowy, prawdopodobieństwo odchylenia binarnej zmiennej losowej od jej wartości oczekiwanej maleje wykładniczo od wartości odchylenia.
Załóżmy, że . Wiemy, że . Nasze zmienne losowe to wyniki kolejnych obliczeń na słowie , prawdopodobieństwo wynosi , natomiast - liczba prób jest równa . Weźmy . Z nierówności Chernoffa mamy, że (asymptotycznie).
Wprost z definicji maszyny wiemy, że akceptuje ona, gdy ponad połowa wywołań zakończy się akceptacją, czyli wtedy, gdy . Jest to zdarzenie przeciwne do , zatem . Gdy podstawimy , to otrzymamy wykładnicze małe prawdopodobieństwo błędu . Maszyna wykonuje tylko wielomianową liczbę powtórzeń. Przypadek jest analogiczny.

Podobnie jak dla klasy stała może być równa nawet 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 . Stwierdziliśmy, że dla maszyn z tej klasy prawdopodobieństwo błędu może być ograniczone przez . 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 . 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 . 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 , 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 . Jedna iteracja algorytmu przedstawia się następująco:
Algorytm
Przedstaw jako , d - nieparzysta Wybierz losową liczbę z przedziału if mod i mod dla wszystkich then return""NIE"" else return""TAK"" end if
Gdy przypatrzymy się algorytmowi, to widzimy, że kluczem do sukcesu jest wylosowanie właściwej liczby , która poświadcza złożoność . W takim przypadku algorytm się nie myli - można bowiem udowodnić (patrz kurs Matematyki Dyskretnej), że sprawdzany warunek implikuje złożoność liczby .
Jeśli 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 , których liczba jest liniowa względem , czyli wykładnicza względem rozmiaru wejścia, które tradycyjnie zapisujemy binarnie.
Jeśli jest pierwsza, to oczywiście świadek nie istnieje. Poniższe twierdzenie, które przedstawiamy bez dowodu, stanowi teoretyczną podstawę analizy probabilistycznej algorytmu:
Twierdzenie 2.1.
Jeśli jest nieparzystą liczbą złożoną, to przynajmniej spośród możliwych wartości świadczą o złożoności .
Jeśli poprzez oznaczymy maszynę realizującą pojedynczy test Millera-Rabina, a poprzez język PRIMES, to nasze dotychczasowe uwagi możemy podsumować w sposób następujący:
- ( pierwsza) ,
- ( złożona) .
Spełnione są zatem założenia algorytmu z klasy . Gdy otrzymujemy odpowiedź ""NIE"", to liczba jest złożona, gdy otrzymujemy odpowiedź ""TAK"", to liczba jest pierwsza z prawdopodobieństwem błędu . Gdy wykonamy 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 , czyli wykładniczo małym.
Co interesujące, Miller przedstawił ten test w wersji deterministycznej, w której podstawa przebiega przedział o wielkości ln . 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 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 , czy 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 oraz są zamknięte na dopełnienie.
Ćwiczenie 4.2.
Pokaż, że
Ćwiczenie 4.3.
Pokaż, że jeśli , to