# Strassen's Algorithm
> Volker Strassen. Gaussian elimination is not optimal. Numerische Mathematik,
> 14(3):3543 356, 1969.
<https://link.springer.com/article/10.1007/BF02165411>
$
T(n) =
7(n/2) + \Theta\left(n^2\right) =
\Theta\left(n^{\lg7}\right) =
O\left(n^{2.81}\right)
$
- [[divide-and-conquer]], but make the [[recursion]] tree less "bushy".
```python
S01 = B12 - B22
S02 = A11 + A12
S03 = A21 + A22
S04 = B21 - B11
S05 = A11 + A22
S06 = B11 + B22
S07 = A12 - A22
S08 = B21 + B22
S09 = A11 - A21
S10 = B11 + B12
P1 = A11 * S01 = A11 * B12 - A11 * B22
P2 = S02 * B22 = A11 * B22 + A12 * B22
P3 = S03 * B11 = A21 * B11 + A22 * B11
P4 = A22 * S04 = A22 * B21 - A22 * B11
P5 = S05 * S06 = A11 * B11 + A11 * B22 + A22 * B11 + A22 * B22
P6 = S07 * S08 = A12 * B21 + A12 * B22 - A22 * B21 - A22 * B22
P7 = S09 * S10 = A11 * B11 + A11 * B12 - A21 * B11 - A21 * B12
C11 = P5 + P4 - P2 + P6
C12 = P1 + P2
C21 = P3 + P4
C22 = P5 + P1 - P3 - P7
```
- Strassen's method can be helpful for large [[matrix|matrices]], but they tend
to be sparse, in that case sparse methods work better.