Last week there was a lot of excitement when DeepMind’s AlphaTensor discovered some new algorithms for doing matrix multiplication. Implementing these algorithms in Python should have been a trivial task but I could not find any source code. After a great deal of effort I was able to write some code to demonstrate at least one of the new algorithms.
If you download the PDF from the Nature article you will find the algorithm for multiplying 4 × 4 matrices in modular arithmetic (Z2) with 47 multiplications on page 12 and the algorithm for multiplying 4 × 5 by 5 × 5 matrices in standard arithmetic with 76 multiplications on page 13.
I was unable to implement the algorithm for multiplying 4×4 matrices because they used modular arithmetic. Now there is nothing complicated about modular arithmetic but I just could not figure out how it applied to the equations they provided. Fortunately the other algorithm used standard arithmetic so there was nothing difficult about that. It was tedious to copy their equations because they provided them in an image file. I had to use OCR to convert the image of the equations to text. Since there are 76 multiplications for the 4 × 5 by 5 × 5 matrices it was a lot of work.
The 76 multiplications are:
H1 = a3,2 * (-b2,1 - b2,5 - b3,1)
H2 = (a2,2 + a2,5 - a3,5) * (-b2,5 - b5,1)
H3 = (-a3,1 - a4,1 + a4,2) * (-b1,1 + b2,5)
H4 = (a1,2 + a1,4 + a3,4) * (-b2,5 - b4,1)
H5 = (a1,5 + a2,2 + a2,5) * (-b2,4 + b5,1)
H6 = (-a2,2 - a2,5 - a4,5) * (b2,3 + b5,1)
H7 = (-a1,1 + a4,1 - a4,2) * (b1,1 + b2,4)
H8 = (a3,2 - a3,3 - a4,3) * (-b2,3 + b3,1)
H9 = (-a1,2 - a1,4 + a4,4) * (b2,3 + b4,1)
H10 = (a2,2 + a2,5) * b5,1
H11 = (-a2,1 - a4,1 + a4,2) * (-b1,1 + b2,2)
H12 = (a4,1 - a4,2) * b1,1
H13 = (a1,2 + a1,4 + a2,4) * (b2,2 + b4,1)
H14 = (a1,3 - a3,2 + a3,3) * (b2,4 + b3,1)
H15 = (-a1,2 - a1,4) * b4,1
H16 = (-a3,2 + a3,3) * b3,1
H17 = (a1,2 + a1,4 - a2,1 + a2,2 - a2,3 + a2,4 - a3,2 + a3,3 - a4,1 + a4,2) * b2,2
H18 = a2,1 * (b1,1 + b1,2 + b5,2)
H19 = -a2,3 * (b3,1 + b3,2 + b5,2)
H20 = (-a1,5 + a2,1 + a2,3 - a2,5) * (-b1,1 - b1,2 + b1,4 - b5,2)
H21 = (a2,1 + a2,3 - a2,5) * b5,2
H22 = (a1,3 - a1,4 - a2,4) * (b1,1 + b1,2 - b1,4 - b3,1 - b3,2 + b3,4 + b4,4)
H23 = a1,3 * (-b3,1 + b3,4 + b4,4)
H24 = a1,5 * (-b4,4 - b5,1 + b5,4)
H25 = -a1,1 * (b1,1 - b1,4)
H26 = (-a1,3 + a1,4 + a1,5) * b4,4
H27 = (a1,3 - a3,1 + a3,3) * (b1,1 - b1,4 + b1,5 + b3,5)
H28 = -a3,4 * (-b3,5 - b4,1 - b4,5)
H29 = a3,1 * (b1,1 + b1,5 + b3,5)
H30 = (a3,1 - a3,3 + a3,4) * b3,5
H31 = (-a1,4 - a1,5 - a3,4) * (-b4,4 - b5,1 + b5,4 - b5,5)
H32 = (a2,1 + a4,1 + a4,4) * (b1,3 - b4,1 - b4,2 - b4,3)
H33 = a4,3 * (-b3,1 - b3,3)
H34 = a4,4 * (-b1,3 + b4,1 + b4,3)
H35 = -a4,5 * (b1,3 + b5,1 + b5,3)
H36 = (a2,3 - a2,5 - a4,5) * (b3,1 + b3,2 + b3,3 + b5,2)
H37 = (-a4,1 - a4,4 + a4,5) * b1,3
H38 = (-a2,3 - a3,1 + a3,3 - a3,4) * (b3,5 + b4,1 + b4,2 + b4,5)
H39 = (-a3,1 - a4,1 - a4,4 + a4,5) * (b1,3 + b5,1 + b5,3 + b5,5)
H40 = (-a1,3 + a1,4 + a1,5 - a4,4) * (-b3,1 - b3,3 + b3,4 + b4,4)
H41 = (-a1,1 + a4,1 - a4,5) * (b1,3 + b3,1 + b3,3 - b3,4 + b5,1 + b5,3 - b5,4)
H42 = (-a2,1 + a2,5 - a3,5) * (-b1,1 - b1,2 - b1,5 + b4,1 + b4,2 + b4,5 - b5,2)
H43 = a2,4 * (b4,1 + b4,2)
H44 = (a2,3 + a3,2 - a3,3) * (b2,2 - b3,1)
H45 = (-a3,3 + a3,4 - a4,3) * (b3,5 + b4,1 + b4,3 + b4,5 + b5,1 + b5,3 + b5,5)
H46 = -a3,5 * (-b5,1 -b5,5)
H47 = (a2,1 - a2,5 - a3,1 + a3,5) * (b1,1 + b1,2 + b1,5 - b4,1 - b4,2 - b4,5)
H48 = (-a2,3 + a3,3) * (b2,2 + b3,2 + b3,5 + b4,1 + b4,2 + b4,5)
H49 = (-a1,1 - a1,3 + a1,4 + a1,5 - a2,1 - a2,3 + a2,4 + a2,5) * (-b1,1 - b1,2 + b1,4)
H50 = (-a1,4 - a2,4) * (b2,2 - b3,1 - b3,2 + b3,4 - b4,2 + b4,4)
H51 = a2,2 * (b2,1 + b2,2 - b5,1)
H52 = a4,2 * (b1,1 + b2,1 + b2,3)
H53 = -a1,2 * (-b2,1 + b2,4 + b4,1)
H54 = (a1,2 + a1,4 - a2,2 - a2,5 - a3,2 + a3,3 - a4,2 + a4,3 - a4,4 - a4,5) * b2,3
H55 = (a1,4 - a4,4) * (-b2,3 + b3,1 + b3,3 - b3,4 + b4,3 - b4,4)
H56 = (a1,1 - a1,5 - a4,1 + a4,5) * (b3,1 + b3,3 - b3,4 + b5,1 + b5,3 - b5,4)
H57 = (-a3,1 - a4,1) * (-b1,3 - b1,5 - b2,5 - b5,1 - b5,3 - b5,5)
H58 = (-a1,4 - a1,5 - a3,4 - a3,5) * (-b5,1 + b5,4 - b5,5)
H59 = (-a3,3 + a3,4 - a4,3 + a4,4) * (b4,1 + b4,3 + b4,5 + b5,1 + b5,3 + b5,5)
H60 = (a2,5 + a4,5) * (b2,3 - b3,1 - b3,2 - b3,3 - b5,2 - b5,3)
H61 = (a1,4 + a3,4) * (b1,1 - b1,4 + b1,5 - b2,5 - b4,4 + b4,5 - b5,1 + b5,4 - b5,5)
H62 = (a2,1 + a4,1) * (b1,2 + b1,3 + b2,2 - b4,1 - b4,2 - b4,3)
H63 = (-a3,3 - a4,3) * (-b2,3 - b3,3 - b3,5 - b4,1 - b4,3 - b4,5)
H64 = (a1,1 - a1,3 - a1,4 + a3,1 - a3,3 - a3,4) * (b1,1 - b1,4 + b1,5)
H65 = (-a1,1 + a4,1) * (-b1,3 + b1,4 + b2,4 - b5,1 - b5,3 + b5,4)
H66 = (a1,1 - a1,2 + a1,3 - a1,5 - a2,2 - a2,5 - a3,2 + a3,3 - a4,1 + a4,2) * b2,4
H67 = (a2,5 - a3,5) * (b1,1 + b1,2 + b1,5 - b2,5 - b4,1 - b4,2 - b4,5 + b5,2 + b5,5)
H68 = (a1,1 + a1,3 - a1,4 - a1,5 - a4,1 - a4,3 + a4,4 + a4,5) * (-b3,1 - b3,3 + b3,4)
H69 = (-a1,3 + a1,4 - a2,3 + a2,4) * (-b2,4 - b3,1 - b3,2 + b3,4 - b5,2 + b5,4)
H70 = (a2,3 - a2,5 + a4,3 - a4,5) * (-b3,1 - b3,2 - b3,3)
H71 = (-a3,1 + a3,3 - a3,4 + a3,5 - a4,1 + a4,3 - a4,4 + a4,5) * (-b5,1 - b5,3 - b5,5)
H72 = (-a2,1 - a2,4 - a4,1 - a4,4) * (b4,1 + b4,2 + b4,3)
H73 = (a1,3 - a1,4 - a1,5 + a2,3 - a2,4 - a2,5) * (b1,1 + b1,2 - b1,4 + b2,4 + b5,2 - b5,4)
H74 = (a2,1 - a2,3 + a2,4 - a3,1 + a3,3 - a3,4) * (b4,1 + b4,2 + b4,5)
H75 = - (a1,2 + a1,4 - a2,2 - a2,5 - a3,1 + a3,2 + a3,4 + a3,5 - a4,1 + a4,2) * b2,5
H76 = (a1,3 + a3,3) * (-b1,1 + b1,4 - b1,5 + b2,4 + b3,4 - b3,5)
These calculations are used to get the numbers for the 4×5 matrix that is the result of the multiplication:
C1,1 = -H10 + H12 + H14 - H15 - H16 + H53 + H5 - H66 - H7
C2,1 = H10 + H11 - H12 + H13 + H15 + H16 - H17 - H44 + H51
C3,1 = H10 - H12 + H15 + H16 - H1 + H2 + H3 - H4 + H75
C4,1 = -H10 + H12 - H15 - H16 + H52 + H54 - H6 - H8 + H9
C1,2 = H13 + H15 + H20 + H21 - H22 + H23 + H25 - H43 + H49 + H50
C2,2 = -H11 + H12 - H13 - H15 - H16 + H17 + H18 - H19 - H21 + H43 + H44
C3,2 = -H16 - H19 - H21 - H28 - H29 - H38 + H42 + H44 - H47 + H48
C4,2 = H11 - H12 - H18 + H21 - H32 + H33 - H34 - H36 + H62 - H70
C1,3 = H15 + H23 + H24 + H34 - H37 + H40 - H41 + H55 - H56 - H9
C2,3 = -H10 + H19 + H32 + H35 + H36 + H37 - H43 - H60 - H6 - H72
C3,3 = -H16 - H28 + H33 + H37 - H39 + H45 - H46 + H63 - H71 - H8
C4,3 = H10 + H15 + H16 - H33 + H34 - H35 - H37 - H54 + H6 + H8 - H9
C1,4 = -H10 + H12 + H14 - H16 + H23 + H24 + H25 + H26 + H5 - H66 - H7
C2,4 = H10 + H18 - H19 + H20 - H22 - H24 - H26 - H5 - H69 + H73
C3,4 = -H14 + H16 - H23 - H26 + H27 + H29 + H31 + H46 - H58 + H76
C4,4 = H12 + H25 + H26 - H33 - H35 - H40 + H41 + H65 - H68 - H7
C1,5 = H15 + H24 + H25 + H27 - H28 + H30 + H31 - H4 + H61 + H64
C2,5 = -H10 - H18 - H2 - H30 - H38 + H42 - H43 + H46 + H67 + H74
C3,5 = -H10 + H12 - H15 + H28 + H29 - H2 - H30 - H3 + H46 + H4 - H75
C4,5 = -H12 - H29 + H30 - H34 + H35 + H39 + H3 - H45 + H57 + H59
The following Python code is an implementation of this algorithm using 76 multiplications to get 20 numbers for the matrix:
import numpy as np
# 4x5 matrix
A = [[3, -1, 7, 3, 9],
[-2, 2, -2, 7, 5],
[-5, 9, 3, 3, 5],
[-2, 6, 6, 3, 7]]
# 5x5 matrix
B = [[1, 1, 0, 4, 0],
[0, 0, 0, 1, 2],
[1, 2, 1, 1, 3],
[4, 0, 2, 0, 3],
[0, 4, 0,1, 0]]
print(np.matrix(A))
print('----------')
print("The Rank of Matrix A: ", np.linalg.matrix_rank(A))
print('----------')
print(np.matrix(B))
print('----------')
print("The Rank of Matrix B: ", np.linalg.matrix_rank(B))
print('----------')
#print(np.dot(A,B))
def AlphaTensor4x5by5x5(A, B):
H1 = np.array(A) [2,1] * (-np.array(B) [1,0] - np.array(B) [1,4] - np.array(B) [2,0])
H2 = (np.array(A) [1,1] + np.array(A) [1,4] - np.array(A) [2,4]) * (-np.array(B) [1,4] - np.array(B) [4,0])
H3 = (-np.array(A) [2,0] - np.array(A) [3,0] + np.array(A) [3,1]) * (-np.array(B) [0,0] + np.array(B) [1,4])
H4 = (np.array(A) [0,1] + np.array(A) [0,3] + np.array(A) [2,3]) * (-np.array(B) [1,4] - np.array(B) [3,0])
H5 = (np.array(A) [0,4] + np.array(A) [1,1] + np.array(A) [1,4]) * (-np.array(B) [1,3] + np.array(B) [4,0])
H6 = (-np.array(A) [1,1] - np.array(A) [1,4] - np.array(A) [3,4]) * (np.array(B) [1,2] + np.array(B) [4,0])
H7 = (-np.array(A) [0,0] + np.array(A) [3,0] - np.array(A) [3,1]) * (np.array(B) [0,0] + np.array(B) [1,3])
H8 = (np.array(A) [2,1] - np.array(A) [2,2] - np.array(A) [3,2]) * (-np.array(B) [1,2] + np.array(B) [2,0])
H9 = (-np.array(A) [0,1] - np.array(A) [0,3] + np.array(A) [3,3]) * (np.array(B) [1,2] + np.array(B) [3,0])
H10 = (np.array(A) [1,1] + np.array(A) [1,4]) * np.array(B) [4,0]
H11 = (-np.array(A) [1,0] - np.array(A) [3,0] + np.array(A) [3,1]) * (-np.array(B) [0,0] + np.array(B) [1,1])
H12 = (np.array(A) [3,0] - np.array(A) [3,1]) * np.array(B) [0,0]
H13 = (np.array(A) [0,1] + np.array(A) [0,3] + np.array(A) [1,3]) * (np.array(B) [1,1] + np.array(B) [3,0])
H14 = (np.array(A) [0,2] - np.array(A) [2,1] + np.array(A) [2,2]) * (np.array(B) [1,3] + np.array(B) [2,0])
H15 = (-np.array(A) [0,1] - np.array(A) [0,3]) * np.array(B) [3,0]
H16 = (-np.array(A) [2,1] + np.array(A) [2,2]) * np.array(B) [2,0]
H17 = (np.array(A) [0,1] + np.array(A) [0,3] - np.array(A) [1,0] + np.array(A) [1,1] - np.array(A) [1,2] + np.array(A) [1,3] - np.array(A) [2,1] + np.array(A) [2,2] - np.array(A) [3,0] + np.array(A) [3,1]) * np.array(B) [1,1]
H18 = np.array(A) [1,0] * (np.array(B) [0,0] + np.array(B) [0,1] + np.array(B) [4,1])
H19 = -np.array(A) [1,2] * (np.array(B) [2,0] + np.array(B) [2,1] + np.array(B) [4,1])
H20 = (-np.array(A) [0,4] + np.array(A) [1,0] + np.array(A) [1,2] - np.array(A) [1,4]) * (-np.array(B) [0,0] - np.array(B) [0,1] + np.array(B) [0,3] - np.array(B) [4,1])
H21 = (np.array(A) [1,0] + np.array(A) [1,2] - np.array(A) [1,4]) * np.array(B) [4,1]
H22 = (np.array(A) [0,2] - np.array(A) [0,3] - np.array(A) [1,3]) * (np.array(B) [0,0] + np.array(B) [0,1] - np.array(B) [0,3] - np.array(B) [2,0] - np.array(B) [2,1] + np.array(B) [2,3] + np.array(B) [3,3])
H23 = np.array(A) [0,2] * (-np.array(B) [2,0] + np.array(B) [2,3] + np.array(B) [3,3])
H24 = np.array(A) [0,4] * (-np.array(B) [3,3] - np.array(B) [4,0] + np.array(B) [4,3])
H25 = -np.array(A) [0,0] * (np.array(B) [0,0] - np.array(B) [0,3])
H26 = (-np.array(A) [0,2] + np.array(A) [0,3] + np.array(A) [0,4]) * np.array(B) [3,3]
H27 = (np.array(A) [0,2] - np.array(A) [2,0] + np.array(A) [2,2]) * (np.array(B) [0,0] - np.array(B) [0,3] + np.array(B) [0,4] + np.array(B) [2,4])
H28 = -np.array(A) [2,3] * (-np.array(B) [2,4] - np.array(B) [3,0] - np.array(B) [3,4])
H29 = np.array(A) [2,0] * (np.array(B) [0,0] + np.array(B) [0,4] + np.array(B) [2,4])
H30 = (np.array(A) [2,0] - np.array(A) [2,2] + np.array(A) [2,3]) * np.array(B) [2,4]
H31 = (-np.array(A) [0,3] - np.array(A) [0,4] - np.array(A) [2,3]) * (-np.array(B) [3,3] - np.array(B) [4,0] + np.array(B) [4,3] - np.array(B) [4,4])
H32 = (np.array(A) [1,0] + np.array(A) [3,0] + np.array(A) [3,3]) * (np.array(B) [0,2] - np.array(B) [3,0] - np.array(B) [3,1] - np.array(B) [3,2])
H33 = np.array(A) [3,2] * (-np.array(B) [2,0] - np.array(B) [2,2])
H34 = np.array(A) [3,3] * (-np.array(B) [0,2] + np.array(B) [3,0] + np.array(B) [3,2])
H35 = -np.array(A) [3,4] * (np.array(B) [0,2] + np.array(B) [4,0] + np.array(B) [4,2])
H36 = (np.array(A) [1,2] - np.array(A) [1,4] - np.array(A) [3,4]) * (np.array(B) [2,0] + np.array(B) [2,1] + np.array(B) [2,2] + np.array(B) [4,1])
H37 = (-np.array(A) [3,0] - np.array(A) [3,3] + np.array(A) [3,4]) * np.array(B) [0,2]
H38 = (-np.array(A) [1,2] - np.array(A) [2,0] + np.array(A) [2,2] - np.array(A) [2,3]) * (np.array(B) [2,4] + np.array(B) [3,0] + np.array(B) [3,1] + np.array(B) [3,4])
H39 = (-np.array(A) [2,0] - np.array(A) [3,0] - np.array(A) [3,3] + np.array(A) [3,4]) * (np.array(B) [0,2] + np.array(B) [4,0] + np.array(B) [4,2] + np.array(B) [4,4])
H40 = (-np.array(A) [0,2] + np.array(A) [0,3] + np.array(A) [0,4] - np.array(A) [3,3]) * (-np.array(B) [2,0] - np.array(B) [2,2] + np.array(B) [2,3] + np.array(B) [3,3])
H41 = (-np.array(A) [0,0] + np.array(A) [3,0] - np.array(A) [3,4]) * (np.array(B) [0,2] + np.array(B) [2,0] + np.array(B) [2,2] - np.array(B) [2,3] + np.array(B) [4,0] + np.array(B) [4,2] - np.array(B) [4,3])
H42 = (-np.array(A) [1,0] + np.array(A) [1,4] - np.array(A) [2,4]) * (-np.array(B) [0,0] - np.array(B) [0,1] - np.array(B) [0,4] + np.array(B) [3,0] + np.array(B) [3,1] + np.array(B) [3,4] - np.array(B) [4,1])
H43 = np.array(A) [1,3] * (np.array(B) [3,0] + np.array(B) [3,1])
H44 = (np.array(A) [1,2] + np.array(A) [2,1] - np.array(A) [2,2]) * (np.array(B) [1,1] - np.array(B) [2,0])
H45 = (-np.array(A) [2,2] + np.array(A) [2,3] - np.array(A) [3,2]) * (np.array(B) [2,4] + np.array(B) [3,0] + np.array(B) [3,2] + np.array(B) [3,4] + np.array(B) [4,0] + np.array(B) [4,2] + np.array(B) [4,4])
H46 = -np.array(A) [2,4] * (-np.array(B) [4,0] -np.array(B) [4,4])
H47 = (np.array(A) [1,0] - np.array(A) [1,4] - np.array(A) [2,0] + np.array(A) [2,4]) * (np.array(B) [0,0] + np.array(B) [0,1] + np.array(B) [0,4] - np.array(B) [3,0] - np.array(B) [3,1] - np.array(B) [3,4])
H48 = (-np.array(A) [1,2] + np.array(A) [2,2]) * (np.array(B) [1,1] + np.array(B) [2,1] + np.array(B) [2,4] + np.array(B) [3,0] + np.array(B) [3,1] + np.array(B) [3,4])
H49 = (-np.array(A) [0,0] - np.array(A) [0,2] + np.array(A) [0,3] + np.array(A) [0,4] - np.array(A) [1,0] - np.array(A) [1,2] + np.array(A) [1,3] + np.array(A) [1,4]) * (-np.array(B) [0,0] - np.array(B) [0,1] + np.array(B) [0,3])
H50 = (-np.array(A) [0,3] - np.array(A) [1,3]) * (np.array(B) [1,1] - np.array(B) [2,0] - np.array(B) [2,1] + np.array(B) [2,3] - np.array(B) [3,1] + np.array(B) [3,3])
H51 = np.array(A) [1,1] * (np.array(B) [1,0] + np.array(B) [1,1] - np.array(B) [4,0])
H52 = np.array(A) [3,1] * (np.array(B) [0,0] + np.array(B) [1,0] + np.array(B) [1,2])
H53 = -np.array(A) [0,1] * (-np.array(B) [1,0] + np.array(B) [1,3] + np.array(B) [3,0])
H54 = (np.array(A) [0,1] + np.array(A) [0,3] - np.array(A) [1,1] - np.array(A) [1,4] - np.array(A) [2,1] + np.array(A) [2,2] - np.array(A) [3,1] + np.array(A) [3,2] - np.array(A) [3,3] - np.array(A) [3,4]) * np.array(B) [1,2]
H55 = (np.array(A) [0,3] - np.array(A) [3,3]) * (-np.array(B) [1,2] + np.array(B) [2,0] + np.array(B) [2,2] - np.array(B) [2,3] + np.array(B) [3,2] - np.array(B) [3,3])
H56 = (np.array(A) [0,0] - np.array(A) [0,4] - np.array(A) [3,0] + np.array(A) [3,4]) * (np.array(B) [2,0] + np.array(B) [2,2] - np.array(B) [2,3] + np.array(B) [4,0] + np.array(B) [4,2] - np.array(B) [4,3])
H57 = (-np.array(A) [2,0] - np.array(A) [3,0]) * (-np.array(B) [0,2] - np.array(B) [0,4] - np.array(B) [1,4] - np.array(B) [4,0] - np.array(B) [4,2] - np.array(B) [4,4])
H58 = (-np.array(A) [0,3] - np.array(A) [0,4] - np.array(A) [2,3] - np.array(A) [2,4]) * (-np.array(B) [4,0] + np.array(B) [4,3] - np.array(B) [4,4])
H59 = (-np.array(A) [2,2] + np.array(A) [2,3] - np.array(A) [3,2] + np.array(A) [3,3]) * (np.array(B) [3,0] + np.array(B) [3,2] + np.array(B) [3,4] + np.array(B) [4,0] + np.array(B) [4,2] + np.array(B) [4,4])
H60 = (np.array(A) [1,4] + np.array(A) [3,4]) * (np.array(B) [1,2] - np.array(B) [2,0] - np.array(B) [2,1] - np.array(B) [2,2] - np.array(B) [4,1] - np.array(B) [4,2])
H61 = (np.array(A) [0,3] + np.array(A) [2,3]) * (np.array(B) [0,0] - np.array(B) [0,3] + np.array(B) [0,4] - np.array(B) [1,4] - np.array(B) [3,3] + np.array(B) [3,4] - np.array(B) [4,0] + np.array(B) [4,3] - np.array(B) [4,4])
H62 = (np.array(A) [1,0] + np.array(A) [3,0]) * (np.array(B) [0,1] + np.array(B) [0,2] + np.array(B) [1,1] - np.array(B) [3,0] - np.array(B) [3,1] - np.array(B) [3,2])
H63 = (-np.array(A) [2,2] - np.array(A) [3,2]) * (-np.array(B) [1,2] - np.array(B) [2,2] - np.array(B) [2,4] - np.array(B) [3,0] - np.array(B) [3,2] - np.array(B) [3,4])
H64 = (np.array(A) [0,0] - np.array(A) [0,2] - np.array(A) [0,3] + np.array(A) [2,0] - np.array(A) [2,2] - np.array(A) [2,3]) * (np.array(B) [0,0] - np.array(B) [0,3] + np.array(B) [0,4])
H65 = (-np.array(A) [0,0] + np.array(A) [3,0]) * (-np.array(B) [0,2] + np.array(B) [0,3] + np.array(B) [1,3] - np.array(B) [4,0] - np.array(B) [4,2] + np.array(B) [4,3])
H66 = (np.array(A) [0,0] - np.array(A) [0,1] + np.array(A) [0,2] - np.array(A) [0,4] - np.array(A) [1,1] - np.array(A) [1,4] - np.array(A) [2,1] + np.array(A) [2,2] - np.array(A) [3,0] + np.array(A) [3,1]) * np.array(B) [1,3]
H67 = (np.array(A) [1,4] - np.array(A) [2,4]) * (np.array(B) [0,0] + np.array(B) [0,1] + np.array(B) [0,4] - np.array(B) [1,4] - np.array(B) [3,0] - np.array(B) [3,1] - np.array(B) [3,4] + np.array(B) [4,1] + np.array(B) [4,4])
H68 = (np.array(A) [0,0] + np.array(A) [0,2] - np.array(A) [0,3] - np.array(A) [0,4] - np.array(A) [3,0] - np.array(A) [3,2] + np.array(A) [3,3] + np.array(A) [3,4]) * (-np.array(B) [2,0] - np.array(B) [2,2] + np.array(B) [2,3])
H69 = (-np.array(A) [0,2] + np.array(A) [0,3] - np.array(A) [1,2] + np.array(A) [1,3]) * (-np.array(B) [1,3] - np.array(B) [2,0] - np.array(B) [2,1] + np.array(B) [2,3] - np.array(B) [4,1] + np.array(B) [4,3])
H70 = (np.array(A) [1,2] - np.array(A) [1,4] + np.array(A) [3,2] - np.array(A) [3,4]) * (-np.array(B) [2,0] - np.array(B) [2,1] - np.array(B) [2,2])
H71 = (-np.array(A) [2,0] + np.array(A) [2,2] - np.array(A) [2,3] + np.array(A) [2,4] - np.array(A) [3,0] + np.array(A) [3,2] - np.array(A) [3,3] + np.array(A) [3,4]) * (-np.array(B) [4,0] - np.array(B) [4,2] - np.array(B) [4,4])
H72 = (-np.array(A) [1,0] - np.array(A) [1,3] - np.array(A) [3,0] - np.array(A) [3,3]) * (np.array(B) [3,0] + np.array(B) [3,1] + np.array(B) [3,2])
H73 = (np.array(A) [0,2] - np.array(A) [0,3] - np.array(A) [0,4] + np.array(A) [1,2] - np.array(A) [1,3] - np.array(A) [1,4]) * (np.array(B) [0,0] + np.array(B) [0,1] - np.array(B) [0,3] + np.array(B) [1,3] + np.array(B) [4,1] - np.array(B) [4,3])
H74 = (np.array(A) [1,0] - np.array(A) [1,2] + np.array(A) [1,3] - np.array(A) [2,0] + np.array(A) [2,2] - np.array(A) [2,3]) * (np.array(B) [3,0] + np.array(B) [3,1] + np.array(B) [3,4])
H75 = - (np.array(A) [0,1] + np.array(A) [0,3] - np.array(A) [1,1] - np.array(A) [1,4] - np.array(A) [2,0] + np.array(A) [2,1] + np.array(A) [2,3] + np.array(A) [2,4] - np.array(A) [3,0] + np.array(A) [3,1]) * np.array(B) [1,4]
H76 = (np.array(A) [0,2] + np.array(A) [2,2]) * (-np.array(B) [0,0] + np.array(B) [0,3] - np.array(B) [0,4] + np.array(B) [1,3] + np.array(B) [2,3] - np.array(B) [2,4])
C11 = -H10 + H12 + H14 - H15 - H16 + H53 + H5 - H66 - H7
C21 = H10 + H11 - H12 + H13 + H15 + H16 - H17 - H44 + H51
C31 = H10 - H12 + H15 + H16 - H1 + H2 + H3 - H4 + H75
C41 = -H10 + H12 - H15 - H16 + H52 + H54 - H6 - H8 + H9
C12 = H13 + H15 + H20 + H21 - H22 + H23 + H25 - H43 + H49 + H50
C22 = -H11 + H12 - H13 - H15 - H16 + H17 + H18 - H19 - H21 + H43 + H44
C32 = -H16 - H19 - H21 - H28 - H29 - H38 + H42 + H44 - H47 + H48
C42 = H11 - H12 - H18 + H21 - H32 + H33 - H34 - H36 + H62 - H70
C13 = H15 + H23 + H24 + H34 - H37 + H40 - H41 + H55 - H56 - H9
C23 = -H10 + H19 + H32 + H35 + H36 + H37 - H43 - H60 - H6 - H72
C33 = -H16 - H28 + H33 + H37 - H39 + H45 - H46 + H63 - H71 - H8
C43 = H10 + H15 + H16 - H33 + H34 - H35 - H37 - H54 + H6 + H8 - H9
C14 = -H10 + H12 + H14 - H16 + H23 + H24 + H25 + H26 + H5 - H66 - H7
C24 = H10 + H18 - H19 + H20 - H22 - H24 - H26 - H5 - H69 + H73
C34 = -H14 + H16 - H23 - H26 + H27 + H29 + H31 + H46 - H58 + H76
C44 = H12 + H25 + H26 - H33 - H35 - H40 + H41 + H65 - H68 - H7
C15 = H15 + H24 + H25 + H27 - H28 + H30 + H31 - H4 + H61 + H64
C25 = -H10 - H18 - H2 - H30 - H38 + H42 - H43 + H46 + H67 + H74
C35 = -H10 + H12 - H15 + H28 + H29 - H2 - H30 - H3 + H46 + H4 - H75
C45 = -H12 - H29 + H30 - H34 + H35 + H39 + H3 - H45 + H57 + H59
# Create matrix C
C = [[C11, C12, C13, C14, C15],
[C21, C22, C23, C24, C25],
[C31, C32, C33, C34, C35],
[C41, C42, C43, C44, C45]]
return C
C = AlphaTensor4x5by5x5(A, B)
print(np.matrix(C))
print('----------')
print("The Rank of Matrix C: ", np.linalg.matrix_rank(C))
When the above code is executed, it produces the following result:
[[ 3 -1 7 3 9]
[-2 2 -2 7 5]
[-5 9 3 3 5]
[-2 6 6 3 7]]
----------
The Rank of Matrix A: 4
----------
[[1 1 0 4 0]
[0 0 0 1 2]
[1 2 1 1 3]
[4 0 2 0 3]
[0 4 0 1 0]]
----------
The Rank of Matrix B: 5
----------
[[22 53 13 27 28]
[24 14 12 -3 19]
[10 21 9 -3 36]
[16 38 12 11 39]]
----------
The Rank of Matrix C: 4