Source: utils/lcm.js

  1. /**
  2. * Calculates the least common multiple of a list of numbers.
  3. *
  4. * @param {Array.<number>} numbers The array of numbers.
  5. *
  6. * @returns {number} The result of the least common multiple calculation.
  7. */
  8. function lcm(...numbers) {
  9. const gcd = (numbers) => {
  10. if (!numbers.length) return 0;
  11. else if (numbers.length === 1) return Math.abs(numbers[0]);
  12. else
  13. return numbers
  14. .slice(1)
  15. .reduce(
  16. (a, b) =>
  17. ((f, a, b) => f(f, a, b))(
  18. (f, a, b) => (!b ? a : f(f, b, a % b)),
  19. a,
  20. b
  21. ),
  22. Math.abs(numbers[0])
  23. );
  24. };
  25. if (!numbers.length) return 0;
  26. else if (numbers.length === 1) return Math.abs(numbers[0]);
  27. else return Math.abs(numbers.reduce((acc, n) => acc * n, 1)) / gcd(numbers);
  28. }
  29. export default lcm;