Stats Collector Reference Source Repository

src/helpers/leastFactor.js

/**
 * Returns the smallest prime that divides n
 *
 * Original Source: http://www.javascripter.net/faq/numberisprime.htm
 * @param  {Number} n The input number
 * @return {Number} returns the smallest prime that divides n
 *   - returns 0 if n=0
 *   - returns 1 if n=1, n=-1, or n is not an integer
 */
const leastFactor = function (n) {
  if (!Number.isFinite(n)) {
    return n;
  }
  if (n === 0) {
    return 0;
  }
  if (n % 1 || n * n < 2) {
    return 1;
  }
  if (n % 2 === 0) {
    return 2;
  }
  if (n % 3 === 0) {
    return 3;
  }
  if (n % 5 === 0) {
    return 5;
  }
  const m = Math.sqrt(n);
  for (let i = 7; i <= m; i += 30) {
    if (n % i === 0) {
      return i;
    }
    if (n % (i + 4) === 0) {
      return i + 4;
    }
    if (n % (i + 6) === 0) {
      return i + 6;
    }
    if (n % (i + 10) === 0) {
      return i + 10;
    }
    if (n % (i + 12) === 0) {
      return i + 12;
    }
    if (n % (i + 16) === 0) {
      return i + 16;
    }
    if (n % (i + 22) === 0) {
      return i + 22;
    }
    if (n % (i + 24) === 0) {
      return i + 24;
    }
  }
  return n;
};

export default leastFactor;