-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
71 lines (60 loc) · 1.52 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const { getFactorizator } = require('./factorization');
const { getPrimalityTester } = require('./primality');
const { getGCDCalculator } = require('./gcd');
const { isEven, isSquare, number, sqrt } = require('./utils/math');
const { flat, sort, uniq } = require('./utils/array');
/**
* Recursive integer factorizer.
*
* @param {Function} factorizator
* @param {Function} isPrime
* @param {Number} n
*/
const factorizer = (n, options) => {
const { factorizator, isPrime } = options;
const recursive = x => factorizer(x, options);
if (!n) {
return [];
}
if (n === 1) {
return [];
}
if (factorizator.oddOnly && isEven(n)) {
return [2, ...recursive(n / 2)];
}
if (isPrime(n)) {
return [n];
}
if (isSquare(n)) {
const root = number(sqrt(n));
return [
...recursive(root),
...recursive(root)
];
}
return flat(factorizator(n, options).map(recursive));
};
/**
* Factorization process entry point.
*
* @param {Number} n
* @param {String} fMethod Name of Factorization Method
* @param {String} pMethod Name of Primality Tester Method
*/
const factorize = (n, {
factorizator = 'fermat',
primalityTester = 'fermat',
gcdCalculator = 'prime',
full = false,
} = {}) => {
let factors = factorizer(n, {
factorizator: getFactorizator(factorizator),
isPrime: getPrimalityTester(primalityTester),
gcd: getGCDCalculator(gcdCalculator),
});
if (!full) {
factors = uniq(factors);
}
return sort(factors);
};
module.exports.factorize = factorize;