math-utils-simple 1.0.0 → 1.2.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 (44) hide show
  1. package/package.json +8 -3
  2. package/src/arithmetic/abs.js +3 -0
  3. package/src/arithmetic/cube.js +3 -0
  4. package/src/arithmetic/cubeRoot.js +3 -0
  5. package/src/arithmetic/decrement.js +3 -0
  6. package/src/arithmetic/increment.js +3 -0
  7. package/src/arithmetic/mod.js +4 -0
  8. package/src/arithmetic/negate.js +3 -0
  9. package/src/arithmetic/nthRoot.js +4 -0
  10. package/src/arithmetic/reciprocal.js +4 -0
  11. package/src/arithmetic/square.js +3 -0
  12. package/src/index.js +44 -10
  13. package/src/number/digitCount.js +5 -0
  14. package/src/number/digitalRoot.js +12 -0
  15. package/src/number/divisors.js +5 -0
  16. package/src/number/factorial.js +13 -0
  17. package/src/number/factors.js +17 -0
  18. package/src/number/fibonacci.js +18 -0
  19. package/src/{gcd.js → number/gcd.js} +1 -1
  20. package/src/number/isArmstrongNumber.js +12 -0
  21. package/src/number/isEven.js +3 -0
  22. package/src/number/isLeapYear.js +6 -0
  23. package/src/number/isOdd.js +3 -0
  24. package/src/number/isPalindromeNumber.js +5 -0
  25. package/src/number/isPerfectCube.js +3 -0
  26. package/src/number/isPerfectNumber.js +17 -0
  27. package/src/number/isPerfectSquare.js +5 -0
  28. package/src/number/isPrime.js +12 -0
  29. package/src/{lcm.js → number/lcm.js} +1 -3
  30. package/src/number/nextPrime.js +11 -0
  31. package/src/number/nthFibonacci.js +19 -0
  32. package/src/number/previousPrime.js +12 -0
  33. package/src/number/primeFactors.js +23 -0
  34. package/src/number/reverseNumber.js +11 -0
  35. package/src/number/sumOfDigits.js +6 -0
  36. package/src/utils/validate.js +5 -0
  37. package/src/average.js +0 -11
  38. package/src/factorial.js +0 -14
  39. /package/src/{add.js → arithmetic/add.js} +0 -0
  40. /package/src/{divide.js → arithmetic/divide.js} +0 -0
  41. /package/src/{multiply.js → arithmetic/multiply.js} +0 -0
  42. /package/src/{power.js → arithmetic/power.js} +0 -0
  43. /package/src/{sqrt.js → arithmetic/sqrt.js} +0 -0
  44. /package/src/{subtract.js → arithmetic/subtract.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "math-utils-simple",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "A simple math utility library for npm",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -10,7 +10,12 @@
10
10
  "scripts": {
11
11
  "test": "node --test"
12
12
  },
13
- "keywords": ["math", "utils", "npm", "library"],
13
+ "keywords": [
14
+ "math",
15
+ "utils",
16
+ "npm",
17
+ "library"
18
+ ],
14
19
  "author": "Umar Farooq",
15
20
  "license": "MIT"
16
- }
21
+ }
@@ -0,0 +1,3 @@
1
+ export default function abs(n) {
2
+ return Math.abs(n);
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function cube(n) {
2
+ return n * n * n;
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function cubeRoot(n) {
2
+ return Math.cbrt(n);
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function decrement(n) {
2
+ return n - 1;
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function increment(n) {
2
+ return n + 1;
3
+ }
@@ -0,0 +1,4 @@
1
+ export default function mod(a, b) {
2
+ if (b === 0) throw new Error("Modulo by zero.");
3
+ return a % b;
4
+ }
@@ -0,0 +1,3 @@
1
+ export default function negate(n) {
2
+ return -n;
3
+ }
@@ -0,0 +1,4 @@
1
+ export default function nthRoot(number, n) {
2
+ if (n === 0) throw new Error("Root degree cannot be zero.");
3
+ return Math.pow(number, 1 / n);
4
+ }
@@ -0,0 +1,4 @@
1
+ export default function reciprocal(n) {
2
+ if (n === 0) throw new Error("Cannot calculate reciprocal of zero.");
3
+ return 1 / n;
4
+ }
@@ -0,0 +1,3 @@
1
+ export default function square(n) {
2
+ return n * n;
3
+ }
package/src/index.js CHANGED
@@ -1,10 +1,44 @@
1
- export { default as add } from "./add.js";
2
- export { default as subtract } from "./subtract.js";
3
- export { default as multiply } from "./multiply.js";
4
- export { default as divide } from "./divide.js";
5
- export { default as power } from "./power.js";
6
- export { default as sqrt } from "./sqrt.js";
7
- export { default as factorial } from "./factorial.js";
8
- export { default as gcd } from "./gcd.js";
9
- export { default as lcm } from "./lcm.js";
10
- export { default as average } from "./average.js";
1
+ // ARITHMETIC
2
+
3
+ export { default as add } from "./arithmetic/add.js";
4
+ export { default as subtract } from "./arithmetic/subtract.js";
5
+ export { default as multiply } from "./arithmetic/multiply.js";
6
+ export { default as divide } from "./arithmetic/divide.js";
7
+ export { default as mod } from "./arithmetic/mod.js";
8
+ export { default as power } from "./arithmetic/power.js";
9
+ export { default as sqrt } from "./arithmetic/sqrt.js";
10
+ export { default as cubeRoot } from "./arithmetic/cubeRoot.js";
11
+ export { default as nthRoot } from "./arithmetic/nthRoot.js";
12
+ export { default as abs } from "./arithmetic/abs.js";
13
+ export { default as negate } from "./arithmetic/negate.js";
14
+ export { default as increment } from "./arithmetic/increment.js";
15
+ export { default as decrement } from "./arithmetic/decrement.js";
16
+ export { default as square } from "./arithmetic/square.js";
17
+ export { default as cube } from "./arithmetic/cube.js";
18
+ export { default as reciprocal } from "./arithmetic/reciprocal.js";
19
+
20
+ // NUMBER
21
+
22
+ export { default as digitalRoot } from "./number/digitalRoot.js";
23
+ export { default as digitCount } from "./number/digitCount.js";
24
+ export { default as divisors } from "./number/divisors.js";
25
+ export { default as factorial } from "./number/factorial.js";
26
+ export { default as factors } from "./number/factors.js";
27
+ export { default as fibonacci } from "./number/fibonacci.js";
28
+ export { default as gcd } from "./number/gcd.js";
29
+ export { default as isArmstrongNumber } from "./number/isArmstrongNumber.js";
30
+ export { default as isEven } from "./number/isEven.js";
31
+ export { default as isOdd } from "./number/isOdd.js";
32
+ export { default as isLeapYear } from "./number/isLeapYear.js";
33
+ export { default as isPalindromeNumber } from "./number/isPalindromeNumber.js";
34
+ export { default as isPerfectCube } from "./number/isPerfectCube.js";
35
+ export { default as isPerfectNumber } from "./number/isPerfectNumber.js";
36
+ export { default as isPerfectSquare } from "./number/isPerfectSquare.js";
37
+ export { default as isPrime } from "./number/isPrime.js";
38
+ export { default as lcm } from "./number/lcm.js";
39
+ export { default as nextPrime } from "./number/nextPrime.js";
40
+ export { default as nthFibonacci } from "./number/nthFibonacci.js";
41
+ export { default as previousPrime } from "./number/previousPrime.js";
42
+ export { default as primeFactors } from "./number/primeFactors.js";
43
+ export { default as reverseNumber } from "./number/reverseNumber.js";
44
+ export { default as sumOfDigits } from "./number/sumOfDigits.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,5 @@
1
+ function validateNumber(value, name = "value") {
2
+ if (typeof value !== "number" || Number.isNaN(value)) {
3
+ throw new TypeError(`${name} must be a valid number.`);
4
+ }
5
+ }
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
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes