Algorytmy probabilistyczne

Transkrypt

Algorytmy probabilistyczne
Algorytmy probabilistyczne
Wykład 1
Tomasz Krawczyk
[email protected]
Kraków, semestr zimowy 20015/16
testowanie równania AB = C
Wejście: Trzy macierze kwadratowe A, B, C rozmiaru n × n,
Wyjście: TAK wtedy i tylko wtedy, gdy AB = C .
testowanie równania AB = C
Wejście: Trzy macierze kwadratowe A, B, C rozmiaru n × n,
Wyjście: TAK wtedy i tylko wtedy, gdy AB = C .
◮
O(n3 ) - trywialnie,
testowanie równania AB = C
Wejście: Trzy macierze kwadratowe A, B, C rozmiaru n × n,
Wyjście: TAK wtedy i tylko wtedy, gdy AB = C .
◮
O(n3 ) - trywialnie,
◮
O(nω ), gdzie ω to czas mnożenia macierzy,
testowanie równania AB = C
Wejście: Trzy macierze kwadratowe A, B, C rozmiaru n × n,
Wyjście: TAK wtedy i tylko wtedy, gdy AB = C .
◮
O(n3 ) - trywialnie,
◮
O(nω ), gdzie ω to czas mnożenia macierzy,
◮
Czy można szybciej?
testowanie równania AB = C
- podejście probabilistyczne
Algorytm MatrixMultiplicationTest:
◮
wylosuj wektor r ∈ {0, 1}n ,
◮
oblicz y = A(Br ) oraz z = Cr ,
◮
zwróć TAK jeżeli y = z, NIE w przeciwnym przypadku.
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
◮ jeżeli AB 6= C to algorytm może się mylić, w tym przypadku:
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
◮ jeżeli AB 6= C to algorytm może się mylić, w tym przypadku:
◮
macierz D = AB − C ma elementy niezerowe,
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
◮ jeżeli AB 6= C to algorytm może się mylić, w tym przypadku:
◮
macierz D = AB − C ma elementy niezerowe,
◮
załóżmy, że elementy niezerowe są w wierszu pierwszym
d = (d1 , ..., dn ) macierzy C ; dodatkowo załóżmy, że d1 6= 0,
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
◮ jeżeli AB 6= C to algorytm może się mylić, w tym przypadku:
◮
macierz D = AB − C ma elementy niezerowe,
◮
załóżmy, że elementy niezerowe są w wierszu pierwszym
d = (d1 , ..., dn ) macierzy C ; dodatkowo załóżmy, że d1 6= 0,
◮
elementy x oraz z są równe na pierwszej współrzędnej wtedy i
tylko wtedy, gdy
d1 r1 = −(d2 · r2 + . . . + dn · rn ),
testowanie równania AB = C
(algorytm probabilistyczny)
◮ jeżeli AB = C to algorytm zwróci zawsze odpowiedź TAK,
◮ jeżeli AB 6= C to algorytm może się mylić, w tym przypadku:
◮
macierz D = AB − C ma elementy niezerowe,
◮
załóżmy, że elementy niezerowe są w wierszu pierwszym
d = (d1 , ..., dn ) macierzy C ; dodatkowo załóżmy, że d1 6= 0,
◮
elementy x oraz z są równe na pierwszej współrzędnej wtedy i
tylko wtedy, gdy
d1 r1 = −(d2 · r2 + . . . + dn · rn ),
◮
zakładając, że wartość r1 jest losowana na końcu, powyższa
równość jest spełniona z prawdopodobieństwem nie większym
od 12 .
testowanie równania AB = C
◮
(podejście probabilistyczne)
Algorytm MatrixMultiplicationTest działa w czasie O(n2 ),
testowanie równania AB = C
(podejście probabilistyczne)
◮
Algorytm MatrixMultiplicationTest działa w czasie O(n2 ),
◮
w przypadku, gdy AB = C algorytm zawsze zwraca poprawną
odpowiedź, w p.p. daje złą odpowiedź z prawdopodobieństwem nie
większym niż 21 ,
testowanie równania AB = C
(podejście probabilistyczne)
◮
Algorytm MatrixMultiplicationTest działa w czasie O(n2 ),
◮
w przypadku, gdy AB = C algorytm zawsze zwraca poprawną
odpowiedź, w p.p. daje złą odpowiedź z prawdopodobieństwem nie
większym niż 21 ,
◮
prawdowpodobieństwo pomyłki możemy ograniczyć do ( 21 )k
wykonując algorytm k razy.
MatrixMultiplicationTest
W analizie powyższego algorytmu skorzystaliśmy z zasady decyzji
odłożonych – w przypadku gdy algorytm wykonuje niezależnie wyboru
losowych wartości, przyjmujemy zazwyczaj, że wartości te są losowane w
kolejności, która ułatwia analizę algorytmu probabilistycznego.
algorytmy probabilistyczne (randomizowane)
Input
Algorytm probabilistyczny
Losowe bity
Output
algorytmy probabilistyczne (randomizowane)
Input
Algorytm probabilistyczny
Output
Losowe bity
◮
na wejściu dodatkowo źródło losowych danych (sposób działania
algorytmu jest różny nawet dla tych samych danych wejściowych),
algorytmy probabilistyczne (randomizowane)
Input
Algorytm probabilistyczny
Output
Losowe bity
◮
na wejściu dodatkowo źródło losowych danych (sposób działania
algorytmu jest różny nawet dla tych samych danych wejściowych),
◮
CEL: skonstruować algorytm i pokazać, że działa ’zadowalająco’, np.
◮
◮
zawsze zwraca poprawną odpowiedź w oczekiwanym czasie
wielomianowym,
z bardzo dużym prawdopodobieństwem działa w czasie
wielomianowym, i.t.d.
analiza probabilistyczna algorytmów deterministycznych
Uwaga: Nie należy mylić analizy probabilistycznej (tzw. analiza czasu
oczekiwanego) algorytmu deterministycznego z algorytmem probabilistycznym.
W analizie czasu oczekiwanego działania algorytmu zazwyczaj zakładamy, że
każde wejście ω jest jednakowo prawdopodobne i badamy wartość oczekiwaną
zmiennej losowej X zdefiniowanej nastepująco:
X (ω)
−
ilość operacji wykonanych przez algorytm
deterministyczny na wejściu ω.
algorytmy probabilistyczne - przestrzeń zdarzeń
W przypadku algorytmów probabilistycznych dla ustalonego wejścia
przestrzenią zdarzeń jest zbiór wszystkich możliwych ‘wykonań’ algorytmu,
zależący od losowych bitów z których korzysta algorytm.
Często przestrzeń zdarzeń jest taka sama dla każdego wejścia.
(Rand)QuickSort’a
Wejście: Ciąg parami różnych liczb elementów S = (S1 , ..., Sn ),
Wyjście: Permutacja π elementów S taka, że Sπ(1) 6 ... 6 Sπ(n) .
Algorytm (Rand)QuickSort:
◮
wybierz pierwszy element x (wybierz losowo element x, każdy
z jednakowym prawdopodobieństwem) z ciągu S,
◮
wykonaj algorytm podziału dzielący ciąg S na dwa podzbiory
S1 oraz S2 takie, że S1 < x < S2 ,
◮
wywołaj rekurencyjnie algorytm dla ciągów S1 oraz S2
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
k1
k1
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
k1
k2
k1
k2
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
k1
k2
k1
k3
k2
k3
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
k1
k2
k1
k3
k2
k3
◮ algorytm deterministyczny - dla ustalonego wejścia jedno drzewo,
QuickSort
Działanie algorytmu (probabilistycznego i deterministycznego) QuickSort może
być wizualizowane za pomocą drzew binarnych: Elementy piwotujące dla
procedur partycjonowania są korzeniami odpowiednich poddrzew.
Bez straty ogólności możemy przyjąć, że sortujemy zbiór liczb {1, . . . , n}.
k1
k2
k1
k3
k2
k3
◮ algorytm deterministyczny - dla ustalonego wejścia jedno drzewo,
◮ algorytm probabilistyczny - dla ustalonego wejścia każde ‘poprawne’
drzewo jest możliwe.
analiza probabilistyczna deterministycznego QuickSort’a
◮
Ωn - zbiór wszystkich permutacji n−elementowych,
◮
każda permutacja ω jest jednakowo prawdopodobna, czyli
P(ω) =
1
,
n!
RandQuickSort – analiza
◮
ustalamy permutację wejściową,
◮
ustalamy przestrzeń możliwych zdarzeń eksperymentu:
Ωn - wszystkie ‘poprawne’ drzewa obliczeń algorytmu
RandQuickSort,
Zadanie
Określ prawdopodobieństwo P(ω) każdego zdarzenia ω ∈ Ωn .
Przekonaj się, że rozkład prawdopodobieństwa nie zależy od danych
wejściowych.
RandQuickSort – analiza
Dla każdej pary elementów i, j w S pytamy, czy były one porównywane.
◮
Wprowadźmy zmienną losową:
1 elementy i oraz j były porównywane,
Xij =
0 w przeciwnym przypadku.
RandQuickSort – analiza
Dla każdej pary elementów i, j w S pytamy, czy były one porównywane.
◮
Wprowadźmy zmienną losową:
1 elementy i oraz j były porównywane,
Xij =
0 w przeciwnym przypadku.
◮
Oczekiwana liczba porównań wykonana przez QuickSort, to wartość
oczekiwana zmiennej losowej
X =
n X
n
X
Xij ,
i=1 j=i+1
czyli:
n X
n
n X
n
X
X
Xij ) =
E (Xij ),
E (X ) = E (
i=1 j=i+1
i=1 j=i+1
przy czym druga równość wynika z liniowości wartości oczekiwanej.
RandQuickSort – analiza
Wartość E (Xij ) jest równa P(Xij = 1).
Obserwacje:
◮ Xij (ω) = 1 tylko dla tych drzew ω, w których i jest przodkiem j bądź j
jest przodkiem i,
RandQuickSort – analiza
Wartość E (Xij ) jest równa P(Xij = 1).
Obserwacje:
◮ Xij (ω) = 1 tylko dla tych drzew ω, w których i jest przodkiem j bądź j
jest przodkiem i,
◮ od momentu, gdy x taki, że i < x < j został wybrany jako piwot, i oraz j
nie będą już porównane (i jest w lewym poddrzewie x, j w prawym)
RandQuickSort – analiza
Wartość E (Xij ) jest równa P(Xij = 1).
Obserwacje:
◮ Xij (ω) = 1 tylko dla tych drzew ω, w których i jest przodkiem j bądź j
jest przodkiem i,
◮ od momentu, gdy x taki, że i < x < j został wybrany jako piwot, i oraz j
nie będą już porównane (i jest w lewym poddrzewie x, j w prawym)
◮ Xij = 0 wtedy i tylko wtedy, gdy i < x < j został wybrany wcześniej jako
piwot niż i i j.
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
◮ zdarzenia Ai dla i = 1, ..., n − |I | + 1 są rozłączne i tworzą układ zupełny
zdarzeń,
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
◮ zdarzenia Ai dla i = 1, ..., n − |I | + 1 są rozłączne i tworzą układ zupełny
zdarzeń,
◮ P(Xij = 1) =
Pn−|I |+1
k=1
P(Xij = 1|Ak ) · P(Ak ),
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
◮ zdarzenia Ai dla i = 1, ..., n − |I | + 1 są rozłączne i tworzą układ zupełny
zdarzeń,
◮ P(Xij = 1) =
Pn−|I |+1
k=1
P(Xij = 1|Ak ) · P(Ak ),
◮ P(Xij = 1|Ak ) = P(i bądź j wybrano jako pierwszy| Ak ),
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
◮ zdarzenia Ai dla i = 1, ..., n − |I | + 1 są rozłączne i tworzą układ zupełny
zdarzeń,
◮ P(Xij = 1) =
Pn−|I |+1
P(Xij = 1|Ak ) · P(Ak ),
Pn−|I |+1
2
j−i +1
k=1
◮ P(Xij = 1|Ak ) = P(i bądź j wybrano jako pierwszy| Ak ),
◮ P(Xij = 1) =
k=1
· P(Ak ) =
2
.
j−i +1
RandQuickSort – analiza
Niech I = {i, . . . , j}. Wtedy |I | = j − i + 1.
◮ Ak - zdarzenie, że w k−tym kroku po raz pierwszy wybrano element ze
zbioru I ,
◮ zdarzenia Ai dla i = 1, ..., n − |I | + 1 są rozłączne i tworzą układ zupełny
zdarzeń,
◮ P(Xij = 1) =
Pn−|I |+1
P(Xij = 1|Ak ) · P(Ak ),
Pn−|I |+1
2
j−i +1
k=1
◮ P(Xij = 1|Ak ) = P(i bądź j wybrano jako pierwszy| Ak ),
◮ P(Xij = 1) =
k=1
· P(Ak ) =
2
.
j−i +1
P
Pn P
2
i <j E (Xij ) =
i =1
i <j j−i +1 6
Pn Pn 1
6 2 i =1 k=1 k 6 nHn = 2n(log n + O(1)).
◮ E (Xn ) =
MIN-CUT - minimalne cięcie w multigrafie
Wejście: Multigraf G=(V,E),
Wyjście: Minimalny przekrój (cięcie) w G (przekrój to zbiór
krawędzi, którego usunięcie rozspójnia graf).
MIN-CUT - minimalne cięcie w multigrafie
Wejście: Multigraf G=(V,E),
Wyjście: Minimalny przekrój (cięcie) w G (przekrój to zbiór
krawędzi, którego usunięcie rozspójnia graf).
MIN-CUT - minimalne cięcie w multigrafie
Wejście: Multigraf G=(V,E),
Wyjście: Minimalny przekrój (cięcie) w G (przekrój to zbiór
krawędzi, którego usunięcie rozspójnia graf).
MIN-CUT - minimalne cięcie w multigrafie
Wejście: Multigraf G=(V,E),
Wyjście: Minimalny przekrój (cięcie) w G (przekrój to zbiór
krawędzi, którego usunięcie rozspójnia graf).
MIN-CUT - minimalne cięcie w multigrafie
Wejście: Multigraf G=(V,E),
Wyjście: Minimalny przekrój (cięcie) w G (przekrój to zbiór
krawędzi, którego usunięcie rozspójnia graf).
Rozmiar minimalnego cięcia - 2.
MIN-CUT - algorytmy deterministyczne
Przez minimialne s − t cięcie w grafie G rozumiemy minimalne
cięcie, które rozspójnia graf w taki sposób, że wierzchołki s oraz t
znajdują się w różnych składowych spójnych.
MIN-CUT - algorytmy deterministyczne
Przez minimialne s − t cięcie w grafie G rozumiemy minimalne
cięcie, które rozspójnia graf w taki sposób, że wierzchołki s oraz t
znajdują się w różnych składowych spójnych.
Zadanie
Pokaż, jak znaleźć minimalne s − t cięcie w grafie G wykorzystując
n − 1 krotnie algorytm znajdowania maksymalnego przepływu w
sieci.
MIN-CUT - algorytmy deterministyczne
Rezultaty:
2
◮ O(nm log( n )) - algorytm znajdowania maksymalnego przepływu w
m
sieciach, Goldberg, Tarjan’ 88,
2
◮ (n − 1) × O(nm log( n )) - algorytm dla MIN-CUT polegający na
m
(n − 1)−krotnym wywołaniu algorytmu dla MIN-s-t-CUT (s−dowolny,
ustalony; t przyjmuje wszystkie wartości ze zbioru V \ {s}), Gomory, Hu
’61,
2
◮ problem MIN-CUT może być zrealizowany w czasie O(nm log( n )), Hao,
m
Orlin’94,
◮ O(n2 log O(1) n) - algorytm probabilistyczny Kargera.
MIN-CUT - podejście probabilistyczne
Probabilistyczny algorytm Contract dla problemu MIN-CUT,
Karger ’92:
1. wylosuj krawędź e = (u, v ) z G ,
2. ‘ściągnij’ krawędź e zachowując krawędzie wielokrotne ale
usuwając pętle (jeżeli istniały krawędzie (u, x) oraz (v , x) to
zachowujemy obie),
3. powtarzaj 1. i 2. dopóki graf ma więcej niż dwa wierzchołki,
4. wypisz powstałe krawędzie jako MIN-CUT.
Contract - przykład
3
4
1
6
2
5
Contract - przykład
3
4
e
1
6
2
5
Contract - przykład
3
4
e
1
6
2
5
3
1
6
2, 4
5
Contract - przykład
3
4
e
1
6
2
5
3
1
e
2, 4
5
6
Contract - przykład
3
4
3
e
1
6
2
2, 4
5
3
1
e
2, 4
5
1
6
5, 6
Contract - przykład
3
4
3
e
1
6
2
2, 4
5
3
1
e
2, 4
5
e
1
6
5, 6
Contract - przykład
3
4
3
e
1
6
2
e
1
5
2, 4
5, 6
2, 3, 4
5, 6
3
1
e
2, 4
5
6
1
Contract - przykład
1
2, 3, 4
5, 6
Contract - przykład
1
e
2, 3, 4
5, 6
Contract - przykład
1
e
2, 3, 4
1
2, 3, 4, 5, 6
5, 6
Contract - przykład
Obserwacja:
◮ W każdym etapie działania algorytmu cięcie w grafie zredukowanym jest
również cięciem w grafie wyjściowym.
◮ Algorytm zwraca cięcie minimalne C w.t.w., gdy w żadnym kroku nie
została ściągnieta krawędź z C .
Contract - przykład
Obserwacja:
◮ W każdym etapie działania algorytmu cięcie w grafie zredukowanym jest
również cięciem w grafie wyjściowym.
◮ Algorytm zwraca cięcie minimalne C w.t.w., gdy w żadnym kroku nie
została ściągnieta krawędź z C .
3
3
1
6
2, 4
5
4
1
6
2
5
Contract - przykład
Obserwacja:
◮ W każdym etapie działania algorytmu cięcie w grafie zredukowanym jest
również cięciem w grafie wyjściowym.
◮ Algorytm zwraca cięcie minimalne C w.t.w., gdy w żadnym kroku nie
została ściągnieta krawędź z C .
3
3
1
6
2, 4
5
4
1
6
2
5
Contract – analiza
Analiza:
◮
Zdarzenie elementarne ω, ściągnięcie kolejno krawędzi
e1 , . . . , en−2 ,
◮
Niech |ei | będzie liczbą krawędzi w grafie po ściągnięciu
e1 , . . . , ei , wtedy
P(ω) =
1
1
1
·
· ... ·
.
|E | |e1 |
|en−2 |
Contract
Analiza:
◮ ustalmy minimalne cięcie C w G . Niech |C | = k,
◮ liczba krawędzi w grafie G , e(G ) ≥
kn
,
2
◮ po każdej iteracji stopień dowolnego wierzchołka grafu zredukowanego
jest większy od k,
◮ algorytm zwróci inne cięcie niż C wtedy i tylko wtedy, gdy któraś krawędź
z C zostanie ściągnięta w pewnym kroku algorytmu,
◮ niech A będzie zdarzeniem, że algorytm znajdzie C (w każdym kroku
algorytmu wybierana jest krawędź spoza C ),
◮ P(A) =?
Contract
Analiza:
◮ Ai − zdarzenie, że w i−tym kroku nie wybrano krawędzi z C ,
◮ P(A) = P(A1 ∩ . . . ∩ An−2 ) = P(
◮ ze wzoru łańcuchowego:
P(
Tn−2
i =1
Ai )
=
Tn−2
i =1
Ai ),
P(A1 ) · P(A2 |A1 ) · ·P(A3 |A1 ∩ A2 )·
· . . . · P(An−2 |A1 ∩ . . . ∩ An−3 ),
Contract
Analiza:
◮ Ai - zdarzenie, że w i-tym kroku losujemy krawędź spoza C ,
◮ P(A1 ) =
e(G )−k
e(G )
= 1−
k
e(G )
≥ 1 − n2 ,
◮ po ściągnięciu krawędzi spoza C , każdy graf ma co najmniej
krawędzi, stąd:
P(A2 |A1 ) ≥ 1 −
◮ podobnie P(Ai |A1 ∩ . . . ∩ Ai −1 ) =
2
,
n−1
e(Gi −1 )−k
e(Gi −1 )
≥1−
2
,
n−i +1
◮ ostatecznie, ze wzoru łańcuchowego otrzymujemy:
P(A) ≥
n−2
Y
(1 −
i =1
2
2
)=
.
n−i +1
n(n − 1)
(n−1)k
2
Contract
Podsumowanie:
◮ prawdopodobieństwo błędu dla MIN-CUT jest ograniczone przez
1
1 − n
2
◮ jeżeli powtórzymy eksperyment a
n
2
prawdopodobieństwo błędu do
1
1 − n
2
!
.
razy, zmniejszymy
!a(n)
2
≃
1
ea
◮ dla a = ln n prawdopodobieństwo błędu jest ograniczone przez
1
.
n
klasyfikacja algorytmów probabilistycznych
Algorytmy probabilistyczne dzielimy na algorytmy typu:
◮ LAS VEGAS, które zawsze zwracają poprawną odpowiedź, (QuickSort)
◮ MONTE CARLO, które mogą dać odpowiedź błędną z pewnym
prawdopodobieństwem, (Contract). Dla problemów decyzyjnych wyróżnia
się algorytmy Monte Carlo:
◮
z jednostronnym błędem (MatrixMultiplicationTest)
◮
z dwustronnym błędem.

Podobne dokumenty