Skip to content

Commit a928ebd

Browse files
committed
docs: explain Strassen's algorithm complexity in docstrings
Expand actual_strassen() docstring to describe the divide-and-conquer approach (7 recursive multiplications instead of 8) and note time complexity O(n^log2(7)) ~= O(n^2.807) vs O(n^3) for naive matrix multiplication, plus space complexity O(n^2). Also expand strassen() docstring to explain the padding/trimming wrapper logic. No behavior changes; all existing doctests pass.
1 parent c0db072 commit a928ebd

1 file changed

Lines changed: 20 additions & 0 deletions

File tree

divide_and_conquer/strassen_matrix_multiplication.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,19 @@ def actual_strassen(matrix_a: list, matrix_b: list) -> list:
7575
"""
7676
Recursive function to calculate the product of two matrices, using the Strassen
7777
Algorithm. It only supports square matrices of any size that is a power of 2.
78+
79+
Strassen's algorithm reduces the number of recursive multiplications needed to
80+
multiply two n x n matrices from the 8 required by the naive divide-and-conquer
81+
approach down to 7, at the cost of a few extra matrix additions/subtractions
82+
(which are cheaper, O(n^2), operations). Each matrix is split into four
83+
(n/2) x (n/2) quadrants, 7 products of quadrant combinations are computed
84+
recursively, and those products are combined with additions/subtractions to
85+
form the four quadrants of the result.
86+
87+
Time complexity: O(n^log2(7)) ~= O(n^2.807), an improvement over the O(n^3) of
88+
the standard/naive matrix multiplication algorithm.
89+
Space complexity: O(n^2) for storing the intermediate quadrant matrices, plus
90+
O(log n) recursion stack depth.
7891
"""
7992
if matrix_dimensions(matrix_a) == (2, 2):
8093
return default_matrix_multiplication(matrix_a, matrix_b)
@@ -106,6 +119,13 @@ def actual_strassen(matrix_a: list, matrix_b: list) -> list:
106119

107120
def strassen(matrix1: list, matrix2: list) -> list:
108121
"""
122+
Multiplies two matrices using Strassen's algorithm, which runs in
123+
O(n^log2(7)) ~= O(n^2.807) time, compared to O(n^3) for naive matrix
124+
multiplication. This implementation pads both input matrices with zeros
125+
until they are square matrices whose dimension is a power of 2 (required
126+
by the divide-and-conquer recursion in actual_strassen), performs the
127+
multiplication, then trims the padding back off the result.
128+
109129
>>> strassen([[2,1,3],[3,4,6],[1,4,2],[7,6,7]], [[4,2,3,4],[2,1,1,1],[8,6,4,2]])
110130
[[34, 23, 19, 15], [68, 46, 37, 28], [28, 18, 15, 12], [96, 62, 55, 48]]
111131
>>> strassen([[3,7,5,6,9],[1,5,3,7,8],[1,4,4,5,7]], [[2,4],[5,2],[1,7],[5,5],[7,8]])

0 commit comments

Comments
 (0)