Source: utils/lcm.js

/**
 * Calculates the least common multiple of a list of numbers.
 *
 * @param {Array.<number>} numbers The array of numbers.
 *
 * @returns {number} The result of the least common multiple calculation.
 */
function lcm(...numbers) {
  const gcd = (numbers) => {
    if (!numbers.length) return 0;
    else if (numbers.length === 1) return Math.abs(numbers[0]);
    else
      return numbers
        .slice(1)
        .reduce(
          (a, b) =>
            ((f, a, b) => f(f, a, b))(
              (f, a, b) => (!b ? a : f(f, b, a % b)),
              a,
              b
            ),
          Math.abs(numbers[0])
        );
  };

  if (!numbers.length) return 0;
  else if (numbers.length === 1) return Math.abs(numbers[0]);
  else return Math.abs(numbers.reduce((acc, n) => acc * n, 1)) / gcd(numbers);
}

export default lcm;