// Matrix Strassen Multiplication func strassenMultiply(matrix1: Matrix, matrix2: Matrix) -> Matrix { precondition(matrix1.columns == matrix2.columns, "Two matrices can only be matrix multiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R") // Transform to square matrix let maxColumns = Swift.max(matrix1.rows, matrix1.columns, matrix2.rows, matrix2.columns) let pwr2 = nextPowerOfTwo(num: maxColumns) var sqrMatrix1 = Matrix(rows: pwr2, columns: pwr2) var sqrMatrix2 = Matrix(rows: pwr2, columns: pwr2) // fill square matrix 1 with values for i in 0.. Int { // formula for next power of 2 return Int(pow(2,(ceil(log2(Double(num)))))) } // Multiply Matrices Using Strassen Formula func strassenFormula(matrix1: Matrix, matrix2: Matrix) -> Matrix { precondition(matrix1.rows == matrix1.columns && matrix2.rows == matrix2.columns, "Matrices need to be square") guard matrix1.rows > 1 && matrix2.rows > 1 else { return matrix1 * matrix2 } let rowHalf = matrix1.rows / 2 // Strassen Formula https://www.geeksforgeeks.org/easy-way-remember-strassens-matrix-equation/ // p1 = a(f-h) p2 = (a+b)h // p2 = (c+d)e p4 = d(g-e) // p5 = (a+d)(e+h) p6 = (b-d)(g+h) // p7 = (a-c)(e+f) |a b| x |e f| = |(p5+p4-p2+p6) (p1+p2)| |c d| |g h| |(p3+p4) (p1+p5-p3-p7)| Matrix 1 Matrix 2 Result // create empty matrices for a, b, c, d, e, f, g, h var a = Matrix(rows: rowHalf, columns: rowHalf) var b = Matrix(rows: rowHalf, columns: rowHalf) var c = Matrix(rows: rowHalf, columns: rowHalf) var d = Matrix(rows: rowHalf, columns: rowHalf) var e = Matrix(rows: rowHalf, columns: rowHalf) var f = Matrix(rows: rowHalf, columns: rowHalf) var g = Matrix(rows: rowHalf, columns: rowHalf) var h = Matrix(rows: rowHalf, columns: rowHalf) // fill the matrices with values for i in 0..