{"id":4124,"date":"2022-10-18T13:30:40","date_gmt":"2022-10-18T18:30:40","guid":{"rendered":"https:\/\/williamsportwebdeveloper.com\/cgi\/wp\/?p=4124"},"modified":"2022-10-18T13:30:40","modified_gmt":"2022-10-18T18:30:40","slug":"implementing-matrix-multiplication-algorithms-discovered-by-deepminds-alphatensor","status":"publish","type":"post","link":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/?p=4124","title":{"rendered":"Implementing Matrix Multiplication Algorithms Discovered By DeepMind&#8217;s AlphaTensor"},"content":{"rendered":"<p>Last week there was a lot of excitement when DeepMind&#8217;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.<\/p>\n<p>If you download the <a href=\"https:\/\/www.nature.com\/articles\/s41586-022-05172-4.pdf\">PDF<\/a> from the Nature article you will find the algorithm for multiplying 4 \u00d7 4 matrices in modular arithmetic (Z2) with 47 multiplications on page 12 and the algorithm for multiplying 4 \u00d7 5 by 5 \u00d7 5 matrices in standard arithmetic with 76 multiplications on page 13.<\/p>\n<p>I was unable to implement the algorithm for multiplying 4&#215;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 \u00d7 5 by 5 \u00d7 5 matrices it was a lot of work.<\/p>\n<p>The 76 multiplications are:<\/p>\n<pre>H1 = a3,2 * (-b2,1 - b2,5 - b3,1)\r\nH2 = (a2,2 + a2,5 - a3,5) * (-b2,5 - b5,1)\r\nH3 = (-a3,1 - a4,1 + a4,2) * (-b1,1 + b2,5)\r\nH4 = (a1,2 + a1,4 + a3,4) * (-b2,5 - b4,1)\r\nH5 = (a1,5 + a2,2 + a2,5) * (-b2,4 + b5,1)\r\nH6 = (-a2,2 - a2,5 - a4,5) * (b2,3 + b5,1)\r\nH7 = (-a1,1 + a4,1 - a4,2) * (b1,1 + b2,4) \r\nH8 = (a3,2 - a3,3 - a4,3) * (-b2,3 + b3,1)\r\nH9 = (-a1,2 - a1,4 + a4,4) * (b2,3 + b4,1)\r\nH10 = (a2,2 + a2,5) * b5,1 \r\nH11 = (-a2,1 - a4,1 + a4,2) * (-b1,1 + b2,2)\r\nH12 = (a4,1 - a4,2) * b1,1 \r\nH13 = (a1,2 + a1,4 + a2,4) * (b2,2 + b4,1)\r\nH14 = (a1,3 - a3,2 + a3,3) * (b2,4 + b3,1) \r\nH15 = (-a1,2 - a1,4) * b4,1 \r\nH16 = (-a3,2 + a3,3) * b3,1\r\nH17 = (a1,2 + a1,4 - a2,1 + a2,2 - a2,3 + a2,4 - a3,2 + a3,3 - a4,1 + a4,2) * b2,2\r\nH18 = a2,1 * (b1,1 + b1,2 + b5,2)\r\nH19 = -a2,3 * (b3,1 + b3,2 + b5,2)\r\nH20 = (-a1,5 + a2,1 + a2,3 - a2,5) * (-b1,1 - b1,2 + b1,4 - b5,2)\r\nH21 = (a2,1 + a2,3 - a2,5) * b5,2\r\nH22 = (a1,3 - a1,4 - a2,4) * (b1,1 + b1,2 - b1,4 - b3,1 - b3,2 + b3,4 + b4,4)\r\nH23 = a1,3 * (-b3,1 + b3,4 + b4,4)\r\nH24 = a1,5 * (-b4,4 - b5,1 + b5,4)\r\nH25 = -a1,1 * (b1,1 - b1,4)\r\nH26 = (-a1,3 + a1,4 + a1,5) * b4,4\r\nH27 = (a1,3 - a3,1 + a3,3) * (b1,1 - b1,4 + b1,5 + b3,5)\r\nH28 = -a3,4 * (-b3,5 - b4,1 - b4,5)\r\nH29 = a3,1 * (b1,1 + b1,5 + b3,5)\r\nH30 = (a3,1 - a3,3 + a3,4) * b3,5\r\nH31 = (-a1,4 - a1,5 - a3,4) * (-b4,4 - b5,1 + b5,4 - b5,5)\r\nH32 = (a2,1 + a4,1 + a4,4) * (b1,3 - b4,1 - b4,2 - b4,3)\r\nH33 = a4,3 * (-b3,1 - b3,3)\r\nH34 = a4,4 * (-b1,3 + b4,1 + b4,3)\r\nH35 = -a4,5 * (b1,3 + b5,1 + b5,3)\r\nH36 = (a2,3 - a2,5 - a4,5) * (b3,1 + b3,2 + b3,3 + b5,2)\r\nH37 = (-a4,1 - a4,4 + a4,5) * b1,3\r\nH38 = (-a2,3 - a3,1 + a3,3 - a3,4) * (b3,5 + b4,1 + b4,2 + b4,5)\r\nH39 = (-a3,1 - a4,1 - a4,4 + a4,5) * (b1,3 + b5,1 + b5,3 + b5,5)\r\nH40 = (-a1,3 + a1,4 + a1,5 - a4,4) * (-b3,1 - b3,3 + b3,4 + b4,4)\r\nH41 = (-a1,1 + a4,1 - a4,5) * (b1,3 + b3,1 + b3,3 - b3,4 + b5,1 + b5,3 - b5,4)\r\nH42 = (-a2,1 + a2,5 - a3,5) * (-b1,1 - b1,2 - b1,5 + b4,1 + b4,2 + b4,5 - b5,2)\r\nH43 = a2,4 * (b4,1 + b4,2)\r\nH44 = (a2,3 + a3,2 - a3,3) * (b2,2 - b3,1)\r\nH45 = (-a3,3 + a3,4 - a4,3) * (b3,5 + b4,1 + b4,3 + b4,5 + b5,1 + b5,3 + b5,5)\r\nH46 = -a3,5 * (-b5,1 -b5,5)\r\nH47 = (a2,1 - a2,5 - a3,1 + a3,5) * (b1,1 + b1,2 + b1,5 - b4,1 - b4,2 - b4,5)\r\nH48 = (-a2,3 + a3,3) * (b2,2 + b3,2 + b3,5 + b4,1 + b4,2 + b4,5)\r\nH49 = (-a1,1 - a1,3 + a1,4 + a1,5 - a2,1 - a2,3 + a2,4 + a2,5) * (-b1,1 - b1,2 + b1,4)\r\nH50 = (-a1,4 - a2,4) * (b2,2 - b3,1 - b3,2 + b3,4 - b4,2 + b4,4)\r\nH51 = a2,2 * (b2,1 + b2,2 - b5,1)\r\nH52 = a4,2 * (b1,1 + b2,1 + b2,3)\r\nH53 = -a1,2 * (-b2,1 + b2,4 + b4,1)\r\nH54 = (a1,2 + a1,4 - a2,2 - a2,5 - a3,2 + a3,3 - a4,2 + a4,3 - a4,4 - a4,5) * b2,3\r\nH55 = (a1,4 - a4,4) * (-b2,3 + b3,1 + b3,3 - b3,4 + b4,3 - b4,4)\r\nH56 = (a1,1 - a1,5 - a4,1 + a4,5) * (b3,1 + b3,3 - b3,4 + b5,1 + b5,3 - b5,4)\r\nH57 = (-a3,1 - a4,1) * (-b1,3 - b1,5 - b2,5 - b5,1 - b5,3 - b5,5)\r\nH58 = (-a1,4 - a1,5 - a3,4 - a3,5) * (-b5,1 + b5,4 - b5,5)\r\nH59 = (-a3,3 + a3,4 - a4,3 + a4,4) * (b4,1 + b4,3 + b4,5 + b5,1 + b5,3 + b5,5)\r\nH60 = (a2,5 + a4,5) * (b2,3 - b3,1 - b3,2 - b3,3 - b5,2 - b5,3)\r\nH61 = (a1,4 + a3,4) * (b1,1 - b1,4 + b1,5 - b2,5 - b4,4 + b4,5 - b5,1 + b5,4 - b5,5)\r\nH62 = (a2,1 + a4,1) * (b1,2 + b1,3 + b2,2 - b4,1 - b4,2 - b4,3)\r\nH63 = (-a3,3 - a4,3) * (-b2,3 - b3,3 - b3,5 - b4,1 - b4,3 - b4,5)\r\nH64 = (a1,1 - a1,3 - a1,4 + a3,1 - a3,3 - a3,4) * (b1,1 - b1,4 + b1,5)\r\nH65 = (-a1,1 + a4,1) * (-b1,3 + b1,4 + b2,4 - b5,1 - b5,3 + b5,4)\r\nH66 = (a1,1 - a1,2 + a1,3 - a1,5 - a2,2 - a2,5 - a3,2 + a3,3 - a4,1 + a4,2) * b2,4\r\nH67 = (a2,5 - a3,5) * (b1,1 + b1,2 + b1,5 - b2,5 - b4,1 - b4,2 - b4,5 + b5,2 + b5,5)\r\nH68 = (a1,1 + a1,3 - a1,4 - a1,5 - a4,1 - a4,3 + a4,4 + a4,5) * (-b3,1 - b3,3 + b3,4)\r\nH69 = (-a1,3 + a1,4 - a2,3 + a2,4) * (-b2,4 - b3,1 - b3,2 + b3,4 - b5,2 + b5,4)\r\nH70 = (a2,3 - a2,5 + a4,3 - a4,5) * (-b3,1 - b3,2 - b3,3)\r\nH71 = (-a3,1 + a3,3 - a3,4 + a3,5 - a4,1 + a4,3 - a4,4 + a4,5) * (-b5,1 - b5,3 - b5,5)\r\nH72 = (-a2,1 - a2,4 - a4,1 - a4,4) * (b4,1 + b4,2 + b4,3)\r\nH73 = (a1,3 - a1,4 - a1,5 + a2,3 - a2,4 - a2,5) * (b1,1 + b1,2 - b1,4 + b2,4 + b5,2 - b5,4)\r\nH74 = (a2,1 - a2,3 + a2,4 - a3,1 + a3,3 - a3,4) * (b4,1 + b4,2 + b4,5)\r\nH75 = - (a1,2 + a1,4 - a2,2 - a2,5 - a3,1 + a3,2 + a3,4 + a3,5 - a4,1 + a4,2) * b2,5\r\nH76 = (a1,3 + a3,3) * (-b1,1 + b1,4 - b1,5 + b2,4 + b3,4 - b3,5)<\/pre>\n<p>These calculations are used to get the numbers for the 4&#215;5 matrix that is the result of the multiplication:<\/p>\n<pre>C1,1 = -H10 + H12 + H14 - H15 - H16 + H53 + H5 - H66 - H7\r\nC2,1 = H10 + H11 - H12 + H13 + H15 + H16 - H17 - H44 + H51\r\nC3,1 = H10 - H12 + H15 + H16 - H1 + H2 + H3 - H4 + H75\r\nC4,1 = -H10 + H12 - H15 - H16 + H52 + H54 - H6 - H8 + H9\r\nC1,2 = H13 + H15 + H20 + H21 - H22 + H23 + H25 - H43 + H49 + H50\r\nC2,2 = -H11 + H12 - H13 - H15 - H16 + H17 + H18 - H19 - H21 + H43 + H44\r\nC3,2 = -H16 - H19 - H21 - H28 - H29 - H38 + H42 + H44 - H47 + H48\r\nC4,2 = H11 - H12 - H18 + H21 - H32 + H33 - H34 - H36 + H62 - H70 \r\nC1,3 = H15 + H23 + H24 + H34 - H37 + H40 - H41 + H55 - H56 - H9\r\nC2,3 = -H10 + H19 + H32 + H35 + H36 + H37 - H43 - H60 - H6 - H72\r\nC3,3 = -H16 - H28 + H33 + H37 - H39 + H45 - H46 + H63 - H71 - H8 \r\nC4,3 = H10 + H15 + H16 - H33 + H34 - H35 - H37 - H54 + H6 + H8 - H9\r\nC1,4 = -H10 + H12 + H14 - H16 + H23 + H24 + H25 + H26 + H5 - H66 - H7 \r\nC2,4 = H10 + H18 - H19 + H20 - H22 - H24 - H26 - H5 - H69 + H73 \r\nC3,4 = -H14 + H16 - H23 - H26 + H27 + H29 + H31 + H46 - H58 + H76\r\nC4,4 = H12 + H25 + H26 - H33 - H35 - H40 + H41 + H65 - H68 - H7 \r\nC1,5 = H15 + H24 + H25 + H27 - H28 + H30 + H31 - H4 + H61 + H64 \r\nC2,5 = -H10 - H18 - H2 - H30 - H38 + H42 - H43 + H46 + H67 + H74\r\nC3,5 = -H10 + H12 - H15 + H28 + H29 - H2 - H30 - H3 + H46 + H4 - H75\r\nC4,5 = -H12 - H29 + H30 - H34 + H35 + H39 + H3 - H45 + H57 + H59<\/pre>\n<p>The following Python code is an implementation of this algorithm using 76 multiplications to get 20 numbers for the matrix:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import numpy as np\r\n\r\n# 4x5 matrix\r\nA = [[3, -1, 7, 3, 9],\r\n      [-2, 2, -2, 7, 5],\r\n      [-5, 9, 3, 3, 5],\r\n      [-2, 6, 6, 3, 7]]\r\n    \r\n # 5x5 matrix \r\nB = [[1, 1, 0, 4, 0],\r\n      [0, 0, 0, 1, 2],\r\n      [1, 2, 1, 1, 3],\r\n      [4, 0, 2, 0, 3],\r\n      [0, 4, 0,1, 0]]\r\n\r\nprint(np.matrix(A))\r\nprint('----------')\r\nprint(\"The Rank of Matrix A: \", np.linalg.matrix_rank(A))\r\nprint('----------')\r\nprint(np.matrix(B))\r\nprint('----------')\r\nprint(\"The Rank of Matrix B: \", np.linalg.matrix_rank(B))\r\nprint('----------')\r\n#print(np.dot(A,B)) \r\n\r\n\r\ndef AlphaTensor4x5by5x5(A, B):\r\n    H1 = np.array(A) [2,1] * (-np.array(B) [1,0] - np.array(B) [1,4] - np.array(B) [2,0])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    H10 = (np.array(A) [1,1] + np.array(A) [1,4]) * np.array(B) [4,0]\r\n    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])\r\n    H12 = (np.array(A) [3,0] - np.array(A) [3,1]) * np.array(B) [0,0]\r\n    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])\r\n    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])\r\n    H15 = (-np.array(A) [0,1] - np.array(A) [0,3]) * np.array(B) [3,0]\r\n    H16 = (-np.array(A) [2,1] + np.array(A) [2,2]) * np.array(B) [2,0]\r\n    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]\r\n    H18 = np.array(A) [1,0] * (np.array(B) [0,0] + np.array(B) [0,1] + np.array(B) [4,1])\r\n    H19 = -np.array(A) [1,2] * (np.array(B) [2,0] + np.array(B) [2,1] + np.array(B) [4,1])\r\n    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])\r\n    H21 = (np.array(A) [1,0] + np.array(A) [1,2] - np.array(A) [1,4]) * np.array(B) [4,1]\r\n    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])\r\n    H23 = np.array(A) [0,2] * (-np.array(B) [2,0] + np.array(B) [2,3] + np.array(B) [3,3])\r\n    H24 = np.array(A) [0,4] * (-np.array(B) [3,3] - np.array(B) [4,0] + np.array(B) [4,3])\r\n    H25 = -np.array(A) [0,0] * (np.array(B) [0,0] - np.array(B) [0,3])\r\n    H26 = (-np.array(A) [0,2] + np.array(A) [0,3] + np.array(A) [0,4]) * np.array(B) [3,3]\r\n    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])\r\n    H28 = -np.array(A) [2,3] * (-np.array(B) [2,4] - np.array(B) [3,0] - np.array(B) [3,4])\r\n    H29 = np.array(A) [2,0] * (np.array(B) [0,0] + np.array(B) [0,4] + np.array(B) [2,4])\r\n    H30 = (np.array(A) [2,0] - np.array(A) [2,2] + np.array(A) [2,3]) * np.array(B) [2,4]\r\n    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])\r\n    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])\r\n    H33 = np.array(A) [3,2] * (-np.array(B) [2,0] - np.array(B) [2,2])\r\n    H34 = np.array(A) [3,3] * (-np.array(B) [0,2] + np.array(B) [3,0] + np.array(B) [3,2])\r\n    H35 = -np.array(A) [3,4] * (np.array(B) [0,2] + np.array(B) [4,0] + np.array(B) [4,2])\r\n    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])\r\n    H37 = (-np.array(A) [3,0] - np.array(A) [3,3] + np.array(A) [3,4]) * np.array(B) [0,2]\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    H43 = np.array(A) [1,3] * (np.array(B) [3,0] + np.array(B) [3,1])\r\n    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])\r\n    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])\r\n    H46 = -np.array(A) [2,4] * (-np.array(B) [4,0] -np.array(B) [4,4])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    H51 = np.array(A) [1,1] * (np.array(B) [1,0] + np.array(B) [1,1] - np.array(B) [4,0])\r\n    H52 = np.array(A) [3,1] * (np.array(B) [0,0] + np.array(B) [1,0] + np.array(B) [1,2])\r\n    H53 = -np.array(A) [0,1] * (-np.array(B) [1,0] + np.array(B) [1,3] + np.array(B) [3,0])\r\n    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]\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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]\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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])\r\n    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]\r\n    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])\r\n    \r\n        \r\n    C11 = -H10 + H12 + H14 - H15 - H16 + H53 + H5 - H66 - H7\r\n    C21 = H10 + H11 - H12 + H13 + H15 + H16 - H17 - H44 + H51\r\n    C31 = H10 - H12 + H15 + H16 - H1 + H2 + H3 - H4 + H75\r\n    C41 = -H10 + H12 - H15 - H16 + H52 + H54 - H6 - H8 + H9\r\n    C12 = H13 + H15 + H20 + H21 - H22 + H23 + H25 - H43 + H49 + H50\r\n    C22 = -H11 + H12 - H13 - H15 - H16 + H17 + H18 - H19 - H21 + H43 + H44\r\n    C32 = -H16 - H19 - H21 - H28 - H29 - H38 + H42 + H44 - H47 + H48\r\n    C42 = H11 - H12 - H18 + H21 - H32 + H33 - H34 - H36 + H62 - H70 \r\n    C13 = H15 + H23 + H24 + H34 - H37 + H40 - H41 + H55 - H56 - H9\r\n    C23 = -H10 + H19 + H32 + H35 + H36 + H37 - H43 - H60 - H6 - H72\r\n    C33 = -H16 - H28 + H33 + H37 - H39 + H45 - H46 + H63 - H71 - H8 \r\n    C43 = H10 + H15 + H16 - H33 + H34 - H35 - H37 - H54 + H6 + H8 - H9\r\n    C14 = -H10 + H12 + H14 - H16 + H23 + H24 + H25 + H26 + H5 - H66 - H7 \r\n    C24 = H10 + H18 - H19 + H20 - H22 - H24 - H26 - H5 - H69 + H73 \r\n    C34 = -H14 + H16 - H23 - H26 + H27 + H29 + H31 + H46 - H58 + H76\r\n    C44 = H12 + H25 + H26 - H33 - H35 - H40 + H41 + H65 - H68 - H7 \r\n    C15 = H15 + H24 + H25 + H27 - H28 + H30 + H31 - H4 + H61 + H64 \r\n    C25 = -H10 - H18 - H2 - H30 - H38 + H42 - H43 + H46 + H67 + H74\r\n    C35 = -H10 + H12 - H15 + H28 + H29 - H2 - H30 - H3 + H46 + H4 - H75\r\n    C45 = -H12 - H29 + H30 - H34 + H35 + H39 + H3 - H45 + H57 + H59\r\n    \r\n    # Create matrix C\r\n    C = [[C11, C12, C13, C14, C15], \r\n         [C21, C22, C23, C24, C25],\r\n         [C31, C32, C33, C34, C35], \r\n         [C41, C42, C43, C44, C45]]\r\n    \r\n    return C    \r\n\r\nC = AlphaTensor4x5by5x5(A, B)   \r\nprint(np.matrix(C))\r\nprint('----------')\r\nprint(\"The Rank of Matrix C: \", np.linalg.matrix_rank(C))\r\n<\/code><\/pre>\n<\/div>\n<p>When the above code is executed, it produces the following result:<\/p>\n<pre class=\"cmd\">[[ 3 -1  7  3  9]\r\n [-2  2 -2  7  5]\r\n [-5  9  3  3  5]\r\n [-2  6  6  3  7]]\r\n----------\r\nThe Rank of Matrix A:  4\r\n----------\r\n[[1 1 0 4 0]\r\n [0 0 0 1 2]\r\n [1 2 1 1 3]\r\n [4 0 2 0 3]\r\n [0 4 0 1 0]]\r\n----------\r\nThe Rank of Matrix B:  5\r\n----------\r\n[[22 53 13 27 28]\r\n [24 14 12 -3 19]\r\n [10 21  9 -3 36]\r\n [16 38 12 11 39]]\r\n----------\r\nThe Rank of Matrix C:  4\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Last week there was a lot of excitement when DeepMind&#8217;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 &hellip; <a href=\"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/?p=4124\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1887,12,1968,1606],"tags":[1964,1965,1966,1967,1028],"_links":{"self":[{"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/posts\/4124"}],"collection":[{"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4124"}],"version-history":[{"count":1,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/posts\/4124\/revisions"}],"predecessor-version":[{"id":4125,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=\/wp\/v2\/posts\/4124\/revisions\/4125"}],"wp:attachment":[{"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4124"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/williamsportwebdeveloper.com\/cgi\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}