math-utils-simple 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +42 -1
  3. package/src/number/digitCount.js +5 -0
  4. package/src/number/digitalRoot.js +12 -0
  5. package/src/number/divisors.js +5 -0
  6. package/src/number/factorial.js +13 -0
  7. package/src/number/factors.js +17 -0
  8. package/src/number/fibonacci.js +18 -0
  9. package/src/{gcd.js → number/gcd.js} +1 -1
  10. package/src/number/isArmstrongNumber.js +12 -0
  11. package/src/number/isEven.js +3 -0
  12. package/src/number/isLeapYear.js +6 -0
  13. package/src/number/isOdd.js +3 -0
  14. package/src/number/isPalindromeNumber.js +5 -0
  15. package/src/number/isPerfectCube.js +3 -0
  16. package/src/number/isPerfectNumber.js +17 -0
  17. package/src/number/isPerfectSquare.js +5 -0
  18. package/src/number/isPrime.js +12 -0
  19. package/src/{lcm.js → number/lcm.js} +1 -3
  20. package/src/number/nextPrime.js +11 -0
  21. package/src/number/nthFibonacci.js +19 -0
  22. package/src/number/previousPrime.js +12 -0
  23. package/src/number/primeFactors.js +23 -0
  24. package/src/number/reverseNumber.js +11 -0
  25. package/src/number/sumOfDigits.js +6 -0
  26. package/src/rounding/ceil.js +3 -0
  27. package/src/rounding/clamp.js +7 -0
  28. package/src/rounding/floor.js +3 -0
  29. package/src/rounding/isBetween.js +11 -0
  30. package/src/rounding/normalize.js +7 -0
  31. package/src/rounding/round.js +3 -0
  32. package/src/rounding/roundDownToNearest.js +7 -0
  33. package/src/rounding/roundTo.js +4 -0
  34. package/src/rounding/roundToNearest.js +7 -0
  35. package/src/rounding/roundUpToNearest.js +7 -0
  36. package/src/rounding/snap.js +7 -0
  37. package/src/rounding/truncate.js +3 -0
  38. package/src/rounding/wrap.js +9 -0
  39. package/src/average.js +0 -11
  40. package/src/factorial.js +0 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "math-utils-simple",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "A simple math utility library for npm",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
package/src/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // ARITHMETIC
1
2
  export { default as add } from "./arithmetic/add.js";
2
3
  export { default as subtract } from "./arithmetic/subtract.js";
3
4
  export { default as multiply } from "./arithmetic/multiply.js";
@@ -13,4 +14,44 @@ export { default as increment } from "./arithmetic/increment.js";
13
14
  export { default as decrement } from "./arithmetic/decrement.js";
14
15
  export { default as square } from "./arithmetic/square.js";
15
16
  export { default as cube } from "./arithmetic/cube.js";
16
- export { default as reciprocal } from "./arithmetic/reciprocal.js";
17
+ export { default as reciprocal } from "./arithmetic/reciprocal.js";
18
+
19
+ // NUMBER
20
+ export { default as digitalRoot } from "./number/digitalRoot.js";
21
+ export { default as digitCount } from "./number/digitCount.js";
22
+ export { default as divisors } from "./number/divisors.js";
23
+ export { default as factorial } from "./number/factorial.js";
24
+ export { default as factors } from "./number/factors.js";
25
+ export { default as fibonacci } from "./number/fibonacci.js";
26
+ export { default as gcd } from "./number/gcd.js";
27
+ export { default as isArmstrongNumber } from "./number/isArmstrongNumber.js";
28
+ export { default as isEven } from "./number/isEven.js";
29
+ export { default as isOdd } from "./number/isOdd.js";
30
+ export { default as isLeapYear } from "./number/isLeapYear.js";
31
+ export { default as isPalindromeNumber } from "./number/isPalindromeNumber.js";
32
+ export { default as isPerfectCube } from "./number/isPerfectCube.js";
33
+ export { default as isPerfectNumber } from "./number/isPerfectNumber.js";
34
+ export { default as isPerfectSquare } from "./number/isPerfectSquare.js";
35
+ export { default as isPrime } from "./number/isPrime.js";
36
+ export { default as lcm } from "./number/lcm.js";
37
+ export { default as nextPrime } from "./number/nextPrime.js";
38
+ export { default as nthFibonacci } from "./number/nthFibonacci.js";
39
+ export { default as previousPrime } from "./number/previousPrime.js";
40
+ export { default as primeFactors } from "./number/primeFactors.js";
41
+ export { default as reverseNumber } from "./number/reverseNumber.js";
42
+ export { default as sumOfDigits } from "./number/sumOfDigits.js";
43
+
44
+ // ROUNDING
45
+ export { default as round } from "./rounding/round.js";
46
+ export { default as floor } from "./rounding/floor.js";
47
+ export { default as ceil } from "./rounding/ceil.js";
48
+ export { default as truncate } from "./rounding/truncate.js";
49
+ export { default as roundTo } from "./rounding/roundTo.js";
50
+ export { default as clamp } from "./rounding/clamp.js";
51
+ export { default as roundUpToNearest } from "./rounding/roundUpToNearest.js";
52
+ export { default as roundDownToNearest } from "./rounding/roundDownToNearest.js";
53
+ export { default as roundToNearest } from "./rounding/roundToNearest.js";
54
+ export { default as snap } from "./rounding/snap.js";
55
+ export { default as isBetween } from "./rounding/isBetween.js";
56
+ export { default as wrap } from "./rounding/wrap.js";
57
+ export { default as normalize } from "./rounding/normalize.js";
@@ -0,0 +1,5 @@
1
+ export default function digitCount(n) {
2
+ return Math.abs(Math.trunc(n))
3
+ .toString()
4
+ .length;
5
+ }
@@ -0,0 +1,12 @@
1
+ export default function digitalRoot(n) {
2
+ n = Math.abs(Math.trunc(n));
3
+
4
+ while (n >= 10) {
5
+ n = n
6
+ .toString()
7
+ .split("")
8
+ .reduce((sum, digit) => sum + Number(digit), 0);
9
+ }
10
+
11
+ return n;
12
+ }
@@ -0,0 +1,5 @@
1
+ import factors from "./factors.js";
2
+
3
+ export default function divisors(n) {
4
+ return factors(n);
5
+ }
@@ -0,0 +1,13 @@
1
+ export default function factorial(n) {
2
+ if (!Number.isInteger(n) || n < 0) {
3
+ throw new Error("Factorial is only defined for non-negative integers.");
4
+ }
5
+
6
+ let result = 1;
7
+
8
+ for (let i = 2; i <= n; i++) {
9
+ result *= i;
10
+ }
11
+
12
+ return result;
13
+ }
@@ -0,0 +1,17 @@
1
+ export default function factors(n) {
2
+ if (n === 0) return [];
3
+
4
+ const result = [];
5
+
6
+ for (let i = 1; i <= Math.sqrt(Math.abs(n)); i++) {
7
+ if (n % i === 0) {
8
+ result.push(i);
9
+
10
+ if (i !== Math.abs(n) / i) {
11
+ result.push(Math.abs(n) / i);
12
+ }
13
+ }
14
+ }
15
+
16
+ return result.sort((a, b) => a - b);
17
+ }
@@ -0,0 +1,18 @@
1
+ export default function fibonacci(count) {
2
+ if (!Number.isInteger(count) || count < 1) {
3
+ throw new Error("Count must be a positive integer.");
4
+ }
5
+
6
+ if (count === 1) return [0];
7
+
8
+ const sequence = [0, 1];
9
+
10
+ while (sequence.length < count) {
11
+ sequence.push(
12
+ sequence[sequence.length - 1] +
13
+ sequence[sequence.length - 2]
14
+ );
15
+ }
16
+
17
+ return sequence;
18
+ }
@@ -9,4 +9,4 @@ export default function gcd(a, b) {
9
9
  }
10
10
 
11
11
  return a;
12
- }
12
+ }
@@ -0,0 +1,12 @@
1
+ export default function isArmstrongNumber(n) {
2
+ const digits = Math.abs(n).toString().split("");
3
+
4
+ const power = digits.length;
5
+
6
+ const sum = digits.reduce(
7
+ (acc, digit) => acc + Math.pow(Number(digit), power),
8
+ 0
9
+ );
10
+
11
+ return sum === Math.abs(n);
12
+ }
@@ -0,0 +1,3 @@
1
+ export default function isEven(n) {
2
+ return n % 2 === 0;
3
+ }
@@ -0,0 +1,6 @@
1
+ export default function isLeapYear(year) {
2
+ return (
3
+ year % 4 === 0 &&
4
+ (year % 100 !== 0 || year % 400 === 0)
5
+ );
6
+ }
@@ -0,0 +1,3 @@
1
+ export default function isOdd(n) {
2
+ return n % 2 !== 0;
3
+ }
@@ -0,0 +1,5 @@
1
+ export default function isPalindromeNumber(n) {
2
+ const str = Math.abs(n).toString();
3
+
4
+ return str === str.split("").reverse().join("");
5
+ }
@@ -0,0 +1,3 @@
1
+ export default function isPerfectCube(n) {
2
+ return Number.isInteger(Math.cbrt(n));
3
+ }
@@ -0,0 +1,17 @@
1
+ export default function isPerfectNumber(n) {
2
+ if (n <= 1) return false;
3
+
4
+ let sum = 1;
5
+
6
+ for (let i = 2; i <= Math.sqrt(n); i++) {
7
+ if (n % i === 0) {
8
+ sum += i;
9
+
10
+ if (i !== n / i) {
11
+ sum += n / i;
12
+ }
13
+ }
14
+ }
15
+
16
+ return sum === n;
17
+ }
@@ -0,0 +1,5 @@
1
+ export default function isPerfectSquare(n) {
2
+ if (n < 0) return false;
3
+
4
+ return Number.isInteger(Math.sqrt(n));
5
+ }
@@ -0,0 +1,12 @@
1
+ export default function isPrime(n) {
2
+ if (!Number.isInteger(n) || n < 2) return false;
3
+
4
+ if (n === 2) return true;
5
+ if (n % 2 === 0) return false;
6
+
7
+ for (let i = 3; i <= Math.sqrt(n); i += 2) {
8
+ if (n % i === 0) return false;
9
+ }
10
+
11
+ return true;
12
+ }
@@ -1,8 +1,6 @@
1
1
  import gcd from "./gcd.js";
2
2
 
3
3
  export default function lcm(a, b) {
4
- if (a === 0 || b === 0) {
5
- return 0;
6
- }
4
+ if (a === 0 || b === 0) return 0;
7
5
  return Math.abs(a * b) / gcd(a, b);
8
6
  }
@@ -0,0 +1,11 @@
1
+ import isPrime from "./isPrime.js";
2
+
3
+ export default function nextPrime(n) {
4
+ let candidate = Math.floor(n) + 1;
5
+
6
+ while (!isPrime(candidate)) {
7
+ candidate++;
8
+ }
9
+
10
+ return candidate;
11
+ }
@@ -0,0 +1,19 @@
1
+ export default function nthFibonacci(n) {
2
+ if (!Number.isInteger(n) || n < 0) {
3
+ throw new Error("n must be a non-negative integer.");
4
+ }
5
+
6
+ if (n === 0) return 0;
7
+ if (n === 1) return 1;
8
+
9
+ let a = 0;
10
+ let b = 1;
11
+
12
+ for (let i = 2; i <= n; i++) {
13
+ const next = a + b;
14
+ a = b;
15
+ b = next;
16
+ }
17
+
18
+ return b;
19
+ }
@@ -0,0 +1,12 @@
1
+ import isPrime from "./isPrime.js";
2
+
3
+ export default function previousPrime(n) {
4
+ let candidate = Math.floor(n) - 1;
5
+
6
+ while (candidate >= 2) {
7
+ if (isPrime(candidate)) return candidate;
8
+ candidate--;
9
+ }
10
+
11
+ return null;
12
+ }
@@ -0,0 +1,23 @@
1
+ export default function primeFactors(n) {
2
+ const factors = [];
3
+
4
+ if (n < 2) return factors;
5
+
6
+ while (n % 2 === 0) {
7
+ factors.push(2);
8
+ n /= 2;
9
+ }
10
+
11
+ for (let i = 3; i <= Math.sqrt(n); i += 2) {
12
+ while (n % i === 0) {
13
+ factors.push(i);
14
+ n /= i;
15
+ }
16
+ }
17
+
18
+ if (n > 2) {
19
+ factors.push(n);
20
+ }
21
+
22
+ return factors;
23
+ }
@@ -0,0 +1,11 @@
1
+ export default function reverseNumber(n) {
2
+ const reversed = Number(
3
+ Math.abs(Math.trunc(n))
4
+ .toString()
5
+ .split("")
6
+ .reverse()
7
+ .join("")
8
+ );
9
+
10
+ return n < 0 ? -reversed : reversed;
11
+ }
@@ -0,0 +1,6 @@
1
+ export default function sumOfDigits(n) {
2
+ return Math.abs(Math.trunc(n))
3
+ .toString()
4
+ .split("")
5
+ .reduce((sum, digit) => sum + Number(digit), 0);
6
+ }
@@ -0,0 +1,3 @@
1
+ export default function ceil(n) {
2
+ return Math.ceil(n);
3
+ }
@@ -0,0 +1,7 @@
1
+ export default function clamp(value, min, max) {
2
+ if (min > max) {
3
+ throw new Error("min cannot be greater than max.");
4
+ }
5
+
6
+ return Math.min(Math.max(value, min), max);
7
+ }
@@ -0,0 +1,3 @@
1
+ export default function floor(n) {
2
+ return Math.floor(n);
3
+ }
@@ -0,0 +1,11 @@
1
+ export default function isBetween(value, min, max, inclusive = true) {
2
+ if (min > max) {
3
+ throw new Error("min cannot be greater than max.");
4
+ }
5
+
6
+ if (inclusive) {
7
+ return value >= min && value <= max;
8
+ }
9
+
10
+ return value > min && value < max;
11
+ }
@@ -0,0 +1,7 @@
1
+ export default function normalize(value, min, max) {
2
+ if (min === max) {
3
+ throw new Error("min and max cannot be equal.");
4
+ }
5
+
6
+ return (value - min) / (max - min);
7
+ }
@@ -0,0 +1,3 @@
1
+ export default function round(n) {
2
+ return Math.round(n);
3
+ }
@@ -0,0 +1,7 @@
1
+ export default function roundDownToNearest(value, multiple) {
2
+ if (multiple === 0) {
3
+ throw new Error("multiple cannot be zero.");
4
+ }
5
+
6
+ return Math.floor(value / multiple) * multiple;
7
+ }
@@ -0,0 +1,4 @@
1
+ export default function roundTo(n, decimals = 0) {
2
+ const factor = 10 ** decimals;
3
+ return Math.round(n * factor) / factor;
4
+ }
@@ -0,0 +1,7 @@
1
+ export default function roundToNearest(value, multiple) {
2
+ if (multiple === 0) {
3
+ throw new Error("multiple cannot be zero.");
4
+ }
5
+
6
+ return Math.round(value / multiple) * multiple;
7
+ }
@@ -0,0 +1,7 @@
1
+ export default function roundUpToNearest(value, multiple) {
2
+ if (multiple === 0) {
3
+ throw new Error("multiple cannot be zero.");
4
+ }
5
+
6
+ return Math.ceil(value / multiple) * multiple;
7
+ }
@@ -0,0 +1,7 @@
1
+ export default function snap(value, step) {
2
+ if (step === 0) {
3
+ throw new Error("step cannot be zero.");
4
+ }
5
+
6
+ return Math.round(value / step) * step;
7
+ }
@@ -0,0 +1,3 @@
1
+ export default function truncate(n) {
2
+ return Math.trunc(n);
3
+ }
@@ -0,0 +1,9 @@
1
+ export default function wrap(value, min, max) {
2
+ if (min >= max) {
3
+ throw new Error("min must be less than max.");
4
+ }
5
+
6
+ const range = max - min;
7
+
8
+ return ((((value - min) % range) + range) % range) + min;
9
+ }
package/src/average.js DELETED
@@ -1,11 +0,0 @@
1
- export default function average(numbers) {
2
- if (!Array.isArray(numbers)) {
3
- throw new Error("Input must be an array");
4
- }
5
- if (numbers.length === 0) {
6
- throw new Error("Cannot calculate average of an empty array");
7
- }
8
-
9
- const sum = numbers.reduce((acc, num) => acc + num, 0);
10
- return sum / numbers.length;
11
- }
package/src/factorial.js DELETED
@@ -1,14 +0,0 @@
1
- export default function factorial(n) {
2
- if (n < 0) {
3
- throw new Error("Factorial is not defined for negative numbers");
4
- }
5
- if (!Number.isInteger(n)) {
6
- throw new Error("Factorial is only defined for integers");
7
- }
8
-
9
- let result = 1;
10
- for (let i = 2; i <= n; i++) {
11
- result *= i;
12
- }
13
- return result;
14
- }