Algorytm Strassena
Algorytm Strassena to metoda stosowana do mnożenia macierzy, nazwana na cześć swojego wynalazcy, Volkera Strassena. W porównaniu do tradycyjnych metod, jest on szybszy i bardziej efektywny przy przetwarzaniu dużych macierzy, jednak dla bardzo dużych macierzy działa wolniej niż najszybsza znana obecnie metoda, czyli algorytm Coppersmitha-Winograda.
Algorytm został zaprezentowany w 1969 roku. Choć jego wydajność była tylko nieznacznie lepsza od klasycznej metody, jako pierwszy wskazał, że tradycyjne podejście do mnożenia macierzy nie jest optymalne. To odkrycie zainicjowało poszukiwania jeszcze bardziej efektywnych algorytmów, co doprowadziło do powstania algorytmu Coppersmitha-Winograda w 1987 roku.
Działanie algorytmu
Rozważmy dwie macierze kwadratowe A oraz B, które są elementami pierścienia R. Celem jest obliczenie macierzy C, która spełnia równanie:
C = A * B, gdzie A, B, C należą do R2n × 2n.
W przypadku, gdy macierze A i B nie mają rozmiaru 2n × 2n, uzupełniamy brakujące kolumny i wiersze zerami. Następnie dzielimy macierze A, B i C na mniejsze macierze o równych wymiarach:
- A = [A1,1, A1,2; A2,1, A2,2]
- B = [B1,1, B1,2; B2,1, B2,2]
- C = [C1,1, C1,2; C2,1, C2,2]
gdzie:
Ai,j, Bi,j, Ci,j ∈ R2n−1 × 2n−1.
Przykładowo, macierz C1,1 oblicza się jako:
C1,1 = A1,1 * B1,1 + A1,2 * B2,1.
W ten sposób, pomimo że używamy osiem mnożeń, nie redukujemy ich liczby, co daje nam wyniki porównywalne z tymi z klasycznego mnożenia macierzy.
Definiujemy nowe macierze w następujący sposób:
- M1 := (A1,1 + A2,2)(B1,1 + B2,2)
- M2 := (A2,1 + A2,2)B1,1
- M3 := A1,1(B1,2 − B2,2)
- M4 := A2,2(B2,1 − B1,1)
- M5 := (A1,1 + A1,2)B2,2
- M6 := (A2,1 − A1,1)(B1,1 + B1,2)
- M7 := (A1,2 − A2,2)(B2,1 + B2,2)
Te macierze są następnie używane do obliczenia macierzy Ci,j w oparciu o Mk, co pozwala wyeliminować jedno z mnożeń w algorytmie:
- C1,1 = M1 + M4 − M5 + M7
- C1,2 = M3 + M5
- C2,1 = M2 + M4
- C2,2 = M1 − M2 + M3 + M6
Cały proces podziału powtarzamy n razy, aż do momentu, gdy podmacierze staną się liczbami (elementami pierścienia R).
W praktyce algorytm Strassena przekształca standardową metodę mnożenia macierzy do mniejszych podmacierzy, dla których jego zastosowanie jest bardziej efektywne. Efektywność algorytmu Strassena może się różnić w zależności od implementacji oraz używanego sprzętu.
Złożoność obliczeniowa
Standardowa metoda mnożenia macierzy charakteryzuje się złożonością obliczeniową rzędu θ(n3), ponieważ wymaga 8 rekurencyjnych operacji mnożenia. W przypadku algorytmu Strassena, dzięki zastosowaniu innego podejścia, potrzebne są jedynie 7 rekurencyjnych mnożeń oraz θ(n2) operacji dodawania lub odejmowania. W rezultacie osiągamy złożoność obliczeniową θ(nlg 7), co w przybliżeniu daje θ(n2,81).
Implementacja algorytmu w języku C
W tej sekcji można by było przedstawić przykładowy kod źródłowy implementujący algorytm Strassena w języku C.
Bibliografia
Volker Strassen, Gaussian Elimination is not Optimal, Numer. Math. 13, s. 354–356, 1969.
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Wprowadzenie do algorytmów, wyd. siódme, Wydawnictwa Naukowo-Techniczne, s. 751–758, Warszawa 2005.