Brulion this version for your eyes only Dowód poprawnośći algorytmu Winograda. 1. Wprowadzenie. 2. Algorytm

Podobne dokumenty
1 Zbiory i działania na zbiorach.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

1 Macierze i wyznaczniki

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Macierzowe algorytmy równoległe

Programowanie dynamiczne

Macierze. Rozdział Działania na macierzach

Wstęp do Programowania potok funkcyjny

Poprawność semantyczna

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Podstawy Informatyki. Algorytmy i ich poprawność

15. Macierze. Definicja Macierzy. Definicja Delty Kroneckera. Definicja Macierzy Kwadratowej. Definicja Macierzy Jednostkowej

Indukcja matematyczna

Rozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

macierze jednostkowe (identyczności) macierze diagonalne, które na przekątnej mają same

Macierz o wymiarach m n. a 21. a 22. A =

5 Wyznaczniki. 5.1 Definicja i podstawowe własności. MIMUW 5. Wyznaczniki 25

Wykład 2. Poprawność algorytmów

13 Układy równań liniowych

Luty 2001 Algorytmy (7) 2000/2001

Wyk lad 5 W lasności wyznaczników. Macierz odwrotna

1 Elementy logiki i teorii mnogości

Języki programowania zasady ich tworzenia

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Układy równań i nierówności liniowych

Algebra abstrakcyjna

Indukcja matematyczna, zasada minimum i maksimum. 17 lutego 2017

det[a 1,..., A i,..., A j,..., A n ] + det[a 1,..., ka j,..., A j,..., A n ] Dowód Udowodniliśmy, że: det[a 1,..., A i + ka j,..., A j,...

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Obliczenia iteracyjne

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Metody iteracyjne rozwiązywania układów równań liniowych (5.3) Normy wektorów i macierzy (5.3.1) Niech. x i. i =1

0 + 0 = 0, = 1, = 1, = 0.

Wyk lad 7 Metoda eliminacji Gaussa. Wzory Cramera

Analiza funkcjonalna 1.

Macierze - obliczanie wyznacznika macierzy z użyciem permutacji

RACHUNEK MACIERZOWY. METODY OBLICZENIOWE Budownictwo, studia I stopnia, semestr 6. Instytut L-5, Wydział Inżynierii Lądowej, Politechnika Krakowska

Baza w jądrze i baza obrazu ( )

Poprawność algorytmów

Definicja macierzy Typy i właściwości macierzy Działania na macierzach Wyznacznik macierzy Macierz odwrotna Normy macierzy RACHUNEK MACIERZOWY

Maria Romanowska UDOWODNIJ, ŻE... PRZYKŁADOWE ZADANIA MATURALNE Z MATEMATYKI

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Wstęp do informatyki Ćwiczenia. Piotr Fulmański

Wyk lad 4 Macierz odwrotna i twierdzenie Cramera

Zaawansowane metody numeryczne

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

a 11 a a 1n a 21 a a 2n... a m1 a m2... a mn a 1j a 2j R i = , C j =

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

O MACIERZACH I UKŁADACH RÓWNAŃ

Pokazać, że wyżej zdefiniowana struktura algebraiczna jest przestrzenią wektorową nad ciałem

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Treści programowe. Matematyka. Efekty kształcenia. Literatura. Terminy wykładów i ćwiczeń. Warunki zaliczenia. tnij.org/ktrabka

Obliczenia naukowe Wykład nr 8

DB Algebra liniowa semestr zimowy 2018

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

ALGEBRA LINIOWA Z ELEMENTAMI GEOMETRII ANALITYCZNEJ

Wykład 4. Informatyka Stosowana. Magdalena Alama-Bućko. 25 marca Magdalena Alama-Bućko Wykład 4 25 marca / 25

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Ekoenergetyka Matematyka 1. Wykład 3.

Wyszukiwanie. Wyszukiwanie binarne

Met Me ody numer yczne Wykład ykład Dr inż. Mic hał ha Łanc Łan zon Instyt Ins ut Elektr Elektr echn iki echn i Elektrot Elektr echn olo echn

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Zastosowania wyznaczników

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

Podstawy Programowania

Wyznaczniki. Mirosław Sobolewski. Wydział Matematyki, Informatyki i Mechaniki UW. 6. Wykład z algebry liniowej Warszawa, listopad 2013

ALGEBRA LINIOWA. Wykład 2. Analityka gospodarcza, sem. 1. Wydział Zarządzania i Ekonomii Politechnika Gdańska

1 Działania na zbiorach

1 Określenie pierścienia

3 Przestrzenie liniowe

F t+ := s>t. F s = F t.

1 Podstawowe oznaczenia

Analiza matematyczna i algebra liniowa Macierze

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Analiza numeryczna Kurs INP002009W. Wykłady 6 i 7 Rozwiązywanie układów równań liniowych. Karol Tarnowski A-1 p.

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Podstawy Programowania C++

3. Wykład Układy równań liniowych.

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykład 10. Twierdzenie o pełności systemu aksjomatycznego KRZ

O pewnych związkach teorii modeli z teorią reprezentacji

Algebra Liniowa 2 (INF, TIN), MAP1152 Lista zadań

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Przykładowe zadania z teorii liczb

Zajmijmy się najpierw pierwszym równaniem. Zapiszmy je w postaci trygonometrycznej, podstawiając z = r(cos ϕ + i sin ϕ).

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Algorytmy i struktury danych

5. Rozwiązywanie układów równań liniowych

GRUPA ĆWICZENIOWA (ZAKREŚL ODPOWIEDNIĄ): MG8 MG13 MB13 MD13 BT13

Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.

Odczyt danych z klawiatury Operatory w Javie

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Transkrypt:

SpecVer & LEM 12 projects XX 2013 1 10 1 Dombrova Research Brulion this version for your eyes only Dowód poprawnośći algorytmu Winograda Andrzej Salwicki salwicki@mimuw.edu.pl Dabrowa Leśna Streszczenie. Przedstawiamy algorytm Winograda i wód jego poprawności. 1. Wprowadzenie Algorytm Winograda może być przydatny w obliczaniu iloczynu macierzy kwadratowych, szczególnie gdy elementami macierzy są obiekty reprezentujące jakieś ciało inne od ciała liczb rzeczywistych. Tzn. w przypadku gdy dane ciało C jest zaimplementowane w programie przez klasę C. Drugim i ważniejszym powodem skreślenia tej notatki jest potrzeba zwrócenia uwagi na znikomą przydatność asercji i tzw. programowania przez kontrakt ang. design by contract. Asercje są przydatne jako notatki, ale nie stanowią rozwiązania problemu zapewnienia poprawności algorytmu. Zapraszam czytania, zwłaszcza rozdziału Dowód poprawności. 2. Algorytm W tym rozdziale pojawiają się dwa warunki: warunek wstepny Precondition, warunek końcowy Postcondition oraz algorytm algorytm Winograda. Jak się upewnić, że algorytm jest poprawny ze względu na warunek poczatkowy i warunek końcowy? W literaturze proponowane są dwa podejścia: uwodnij częściową porawność sprawdzając pewne niezmienniki jest to tzw. metoda Floyda- Hoare a,

2 G. Mirkowska & A. Salwicki / Dowód procedury Winograd wykonaj pewną liczbę obliczeń testowych i zaufaj, że w trakcie eksploatacji algorytmu nie okaże się, że jest on niepoprawny. W obliczeniach testowych można w trakcie obliczeń sprawdzać wcześniej wstawione warunki asercje. Czy rzeczywiście są one pomocne? W następnym rozdziale pokażemy inną drogę - drogę wodzenia lematów i w końcu twierdzenia o poprawności całkowitej algorytmu Winograda względem warunku początkowego Precondition i warunku końcowego Postcondition. 1: signal Niezgoda; 2: unit W inograd : procedurea, B : array_of array_of real; output C : array_of array_of real; Precondition: wymagaj by A i B były macierzami kwadratowymi rozmiaru n x n Postcondition: zapewnij, że obliczona macierz C jest produktem macierzy A i B, C = A * B 3: var i, j, k, n, m : integer, W, V : array_of real, p : boolean, s : real; 4: begin { ustalić czy macierze moga być mnożone tzn. czy ilość wierszy w A = ilosc kolumn w B? } { ustalić czy n jest parzyste? } { obliczyc preprocessing } { dynamiczne sprawdzanie precondition } 5: if lowera lowerb or lowera 1 or uppera upperb then 6: raise Niezgoda 7: fi; 8: i := uppera; 9: j := lowera; 10: n := i-j+1; 11: for l := j to i 12: if loweral lowerbl or loweral 1 or upperal upperbl or upperal uppera then 13: raise Niezgoda 14: fi; 15: Assertion sprawdzono: macierze są kwadratowe, rozmiaru n x n { można mnożyć } 16: p := n mod 2 = 0; 17: m := n div 2; 18: array W dim1 : n; 19: array V dim1 : n; 20: array C dim1 : n; 21: for i := 1 to n 22: array Ci dim1 : n 23:

G. Mirkowska & A. Salwicki / Dowód procedury Winograd 3 { obliczanie "preprocessingu"} 24: for j:= 1 to n 25: s:=0; 26: for i := 1 to m 27: s := A[j, 2 i 1] A[j, 2 i] + s; 28: 29: W[j] := s; 30: Assertion 1: Dla każdego j, 1 j n, W j = A j,2i 1 A j,2i 31: for j:= 1 to n 32: s:=0; 33: for i := 1 to m 34: s := B[2*i-1,j] * B[2*i,j] +s; 35: 36: V[j] := s; 37: Assertion 2: Dla każdego j, 1 j n, V j = B 2i 1,j B 2 i,j {obliczanie iloczynu macierzy } 38: for i := 1 to n 39: for j := 1 to n 40: s:= 0; 41: for k := 1 to m 42: s:= A[i,2*k-1]+B[2*k,j] * B[2*k-1,j]+A[i,2*k] +s; 43: Assertion 3: 1 i n, 1 j n, s = A i,2k 1 + B 2k,j B 2 k 1,j + A i,2k 44: C[i, j] := s W [i] V [j]; Assertion 4: 1 i n, 1 j n C i,j = 2 A i,k B k,j 45: if not p then 46: C[i, j] := C[i, j] + A[i, n] B[n, j]; { poprawiamy - gdy n jest nieparzyste } 47: fi; 48: { j } 49: { i } Assertion 5: Dla każdych wartości i, j, 1 i n, 1 j n, C i,j = n A i,k B k,j 50: endw inograd;

4 G. Mirkowska & A. Salwicki / Dowód procedury Winograd 3. Dowód poprawności Naszym zadaniem jest wykazać nastepującą implikację Precondition [Algorytm Winograda]Postcondition co się czyta tak: jeśli dane spełniaja warunek wstępny to algorytm Winograda kończy obliczenia nie sygnalizujac błędu i wyniki spełniaja warunek końcowy. Sprawdzenie czy warunek wstępny jest spełniony przez dane może być w części wykonane przez kompilator. Kompilator może sprawdzić czy parametry aktualne sa tablicami dwuwymiarowymi. Druga część warunku, że rozmiary tablic są równe n n nie może być sprawdzona przed wywołaniem procedury Winograd, nie może też być uwodniona. Wobec tego wykonywanie procedury rozpoczynamy od dynamicznego sprawdzania kształtu i rozmiaru tablic 1. Można rozważać czy nie dałoby się uwodnić, o programie stosującym procedurę Winograd, że warunek wstępny jest spełniony za każdym razem gdy procedura Winograd jest wywoływana w naszym programie. Ale czy można zagwarantować, że każdy program stosujący algorytm Winograda będzie sprawdzał warunek wstępny? lub go wodził? Lepiej więc zostawić sprawdzanie warunku wstępnego procedurze Winograd. Do algorytmu Winograd wstawiliśmy asercje. Mają one za zadanie: 1. umożliwić sygnalizację naruszenia warunku asercji w trakcie wykonywania programu, 2. ułatwić argumentację na rzecz tezy o poprawności algorytmu. W tym przypadku trudno mówić o dynamiczej weryfikacji: ażeby sprawdzić warunek wyliczony w asercji trzeba powtórzyć obliczenia to niewiele nam daje. Ponadto, tu uwaga natury ogólnej, zamiana asercji na instrukcję warunkową if warunek_asercji then wrzuć_ wyjątek fi zapewnia tylko tyle, że podczas wykonywania algorytmu zostanie zasygnalizowany błąd. Nie mamy nawet gwarancji, że zdarzy się to zawsze gdy program zawiera błędy. Natomiast asercje możemy zastąpić lematami i uwodnić je Lemat 1. Dla każdego j, 1 j n, i m = n 2 zachodzi for i := 1 to m K : s := A[j, 2 i 1] A[j, 2 i] + s; W [j] := s; W j = A j,2i 1 A j,2i 1 W loglanie 82 dwuwymiarowej tablicy możemy nadać kształt trójkatny, wstęgowy i oczywiście kształt kwadratowy

G. Mirkowska & A. Salwicki / Dowód procedury Winograd 5 Lemat 2. Dla każdego j, 1 j n, i m = n 2 zachodzi for i := 1 to m V j = B 2i 1,j B 2i,j s := B[2 i 1, j] B[2 i, j] + s; V [j] := s; Kolejny lemat Lemat 3. 1 i n, 1 j n for k:= 1 to m s := A[i, 2 k 1] + B[2 k, j] B[2 k 1, j] + A[i, 2 k] + s; s = A i,2k 1 + B 2k,j B 2k 1,j + A i,2k Lemat 4. Przy założeniu, że tablice A i B są macierzami kwadratowymi rozmiaru n x n i że zachodzą lematy 1 oraz 2, prawdziwa jest nastepująca formuła algorytmiczna 1 i n, 1 j n for k := 1 to m s := A[i, 2 k 1] + B[2 k, j] B[2 k 1, j] + A[i, 2 k] + s; C[i, j] := s W [i] V [j]; s = 2 A i,k B k,j

6 G. Mirkowska & A. Salwicki / Dowód procedury Winograd Lemat 5. Z prawdziwości lematów 1 i 2 wynika, że następująca formuła jest prawdziwa for i := 1 to n od for j := 1 to n od for k:= 1 to m s := A[i, 2 k 1] + B[2 k, j] B[2 k 1, j] + A[i, 2 k] + s; C[i, j] := s W [i] V [j]; if not p then fi; C[i, j] := C[i, j] + A[i, n] B[n, j] 4. Dowody lematów 4.1. Dowód lematu 1 1 i n, 1 j n C i,j = n A i,k B k,j W wodzie wykorzystujemy następującą własność programów for: niech napis ωi oznacza wyrażenie arytmetyczne zmienna i może, ale nie musi, w nim wystepować s := 0 for i := 1 to n n s = ωi od s := ωi + s i=0 Pozostaje skorzystać z aksjomatu instrukcji przypisania n s = ωi {W [j] := s} W j = i=0 Dowody lematów 2 i 3 przebiegają pobnie. n ωi i=0

G. Mirkowska & A. Salwicki / Dowód procedury Winograd 7 4.2. Dowód lematu 4 Należy uwodnić s = A i,2k 1 + B 2k,j B 2 k 1,j + A i,2k s W [i] V [j] = Rozwińmy mnożenie i zastosujmy rozdzielność mnożenia wzgledem dawania A i,2k 1 + B 2k,j B 2 k 1,j + A i,2k 2 [A i,2k 1 B 2 k 1,j + A i,2k 1 A i,2k + B 2k,j B 2k 1,j + B 2k,j A i,2k ] = = A i,2k 1 B 2 k 1,j + Skorzystamy z lematów 1 oraz 2 A i,2k 1 A i,2k + B 2k,j B 2k 1,j + =1 A i,k B k,j B 2k,j A i,2k A i,2k 1 + B 2k,j B 2 k 1,j + A i,2k W [i] V [j] = A i,2k 1 B 2 k 1,j + B 2k,j A i,2k Wykorzystujemy przemienność mnożenia i łączność dawania A i,2k 1 B 2 k 1,j + B 2k,j A i,2k = 2 A i,k B k,j 4.3. Dowód lematu 5 Trzeba wykazać, że s = 2 A i,k B k,j if not p then C[i, j] := C[i, j] + A[i, n] B[n, j] fi; s = n A i,k B k,j Pamiętamy, że p= n mod 2 =0. Jeżeli n jest liczbą parzystą to 2n 2 = n. n C i,j = A i,k B k,j W przeciwnym przypadku tzn. gdy not p sumowanie zakonczyło się dla k = n 1. Trzeba więc dać wartość A[i, n] B[n, j]

8 G. Mirkowska & A. Salwicki / Dowód procedury Winograd 5. Uwagi końcowe 1. Zauważ, że algorytm ten pozwala mnożyć macierze liczb zespolonych,... Zmieńmy nagłówek procedury unit Winograd_Generic: procedure type T, function addx,y:t:t, function multx,y:t:t, function subtx,y:t:t, A, B: array_of array_of T, output C: array_of array_of T; i odpowiednio w treści procedury zapiszmy addu,v zamiast u+v, multu,v zmiast u*v, subtu,v zamiast u-v., Nasz warunek wstępny przybiera teraz inną postać Precondition: Argumenty procedury Winograd_Generic spełniaja następujące warunki 1. pierwszy argument jest nazwą klasy, 2. kolejne trzy argumenty są nazwami funkcji, dwuargumentowych ze zbioru T obiektów typu T w zbiór T, 3. następne dwa argumenty to nazwy tablic kwadratowych jednakowego rozmiaru n x n, 4. ostatni argument także jest nazwą tablicy, tablica ta zostanie przekazana wywołującemu procedurę Winograd_Generic, 5. zbiór T obiektów klasy T wraz z operacjami add, mult i subt jest pierścieniem. Postcondition: Algorytm zwraca tablicę C obiektów typu T, taką, że dla każdych i, j, 1 i n, 1 j n C i,j = add n k=0 multa i,k, B k,j

G. Mirkowska & A. Salwicki / Dowód procedury Winograd 9 Poprzednia wersja wodu lematu 1 Niech j będzie liczbą naturalną taką, że 1 j n, niech m = n 2. Wykażemy, po wykonaniu instrukcji ujętych w nawiasy zachodzi warunek W j = A j,2i 1 A j,2i. Przypadek m = 0. Jesli m jest równe zero to na mocy aksjomatu instrukcji for for i := 1 to 0 K od α α mamy równoważną jej formułę, { W [j] := s; } W j = A j,2i 1 A j,2i czyli { W [j] := s; } W j = A j,2i 1 A j,2i Jeśli dwukrotnie zastosujemy aksjomat instrukcji przypisania to otrzymamy najpierw a potem { } s = A j,2i 1 A j,2i 0 = A j,2i 1 A j,2i Równocześnie z własności sumy Σ wyrażenie po prawej znaku = ma wartość zero, co kończy analizę przypadku m = 0 ponieważ wszystkie te formuły sa sobie równoważne. Krok indukcyjny Załóżmy, że nasz lemat zachodzi dla wartości m równej k. Wykażemy, że zachodzi on też dla m = k + 1. Rozważmy formułę for i := 1 to k + 1 k+1 W j = A j,2i 1 A j,2i s := A[j, 2 i 1] A[j, 2 i] + s; W [j] := s; Wykorzystamy inny aksjomat instrukcji for.

10 G. Mirkowska & A. Salwicki / Dowód procedury Winograd {for i := 1 to n + 1 K od } α {for i := 1 to n K i := n + 1; K} α Z założenia indukcyjnego wiemy, że for i := 1 to k s := A[j, 2 i 1] A[j, 2 i] + s; s = k A j,2i 1 A j,2i Pozostaje wykazania, że k k+1 s = A j,2i 1 A j,2i {i := k + 1; s := A[j, 2 i 1] A[j, 2 i] + s}s = A j,2i 1 A j,2i... UZUPEŁNIJ!