JSFiddle - React, Tailwind, and code Playground

by evgkch

JavaScript

const { log2 } = Math;

const mul = (A, colsA, rowsA) => (B, colsB, rowsB) => {

  if (colsA !== rowsB)
    throw new Error('Number of cols A and rows B are different.')
    
  const C = new Array(rowsA * colsB);

  const logH = log2(rowsA);
  const logW = log2(colsB); 
  
  const frame = log2(colsA);

  const depth = logW + logH; 

  const mask = (1 << logH) - 1;
  
  function calc(d, sa, sb, j) {
  	if (d > 0)
    {
      return calc(d - 1, sa, sb, j << 1) + calc(d - 1, sa, sb, (j << 1) ^ 1);
    }
    else
    {
      return A[(sa * colsA) ^ j] * B[sb ^ (colsB * j)]
    }
  }
  
  function helper(d, i) {
  	if (d > 0)
    {
    	helper(d - 1, i << 1);
      helper(d - 1, (i << 1) ^ 1);
    }
    else
    {
			C[i] = calc(frame, i >> logH, i & mask)
    }
  }
  
  helper(logH + logW);

  return C;

};

const MultiplyMatrix = (A, colsA, rowsA) => (B, colsB, rowsB) => {
  if (colsA !== rowsB)
    throw new Error('Number of cols A and rows B are different.')
    
  const C = new Array(rowsA * colsB);
  
  for (let i = 0; i < rowsA; i++)
  {
    for (let j = 0; j < colsB; j++)
    {
			let sum = 0;
      for (let k = 0; k < colsB; k++)
        sum += A[i * colsA + k] * B[k * colsB + j];
      C[i * colsB + j] = sum;
    }
  }
  return C;
}

const arr = Array.from({ length: 1 << 20 }, (_, k) => Math.random());

const A = [0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12, 13, 14, 15];
const B = [0,1,2,3,4,5,6,7, 8, 9, 10, 11, 12, 13, 14, 15];

console.log(Array.from(mul(A, 4, 4)(B, 4, 4)));

console.log(MultiplyMatrix(arr, 1 << 10, 1 << 10)(arr, 1 << 10, 1 << 10))