UNPKG

8.98 kBJavaScriptView Raw
1'use strict';
2
3function floor(x, pre = 1) {
4 return Math.floor(x / pre) * pre;
5}
6function ceil(x, pre = 1) {
7 return Math.ceil(x / pre) * pre;
8}
9function round(x, pre = 1) {
10 return Math.round(x / pre) * pre;
11}
12function floorDiv(x, y) {
13 return Math.floor(x / y);
14}
15function ceilDiv(x, y) {
16 return Math.ceil(x / y);
17}
18function roundDiv(x, y) {
19 return Math.round(x / y);
20}
21function rem(x, y) {
22 return x % y;
23}
24function mod(x, y) {
25 return x - y * Math.floor(x / y);
26}
27function modp(x, y) {
28 return x - Math.abs(y) * Math.floor(x / Math.abs(y));
29}
30function constrain(x, min, max) {
31 return Math.min(Math.max(x, min), max);
32}
33function normalize(x, r, R) {
34 return (x - r) / (R - r);
35}
36function remap(x, r, R, t, T) {
37 return t + ((x - r) / (R - r)) * (T - t);
38}
39function lerp(x, y, t) {
40 return x + t * (y - x);
41}
42function isPow(x, n) {
43 if (n === 0)
44 return x === 0;
45 var p = log(Math.abs(x), Math.abs(n));
46 if (p !== Math.floor(p))
47 return false;
48 return x < 0 ? n < 0 && (p & 1) === 1 : n > 0 || (p & 1) === 0;
49}
50function prevPow(x, n) {
51 if (x <= 1)
52 return 0;
53 var p = Math.floor(Math.log(x) / Math.log(n));
54 return Math.pow(n, p);
55}
56function nextPow(x, n) {
57 if (x <= 0)
58 return 1;
59 var p = Math.ceil(Math.log(x) / Math.log(n));
60 return Math.pow(n, p);
61}
62function root(x, n) {
63 if ((n & 1) === 0)
64 return Math.pow(x, 1 / n);
65 return Math.sign(x) * Math.pow(Math.abs(x), 1 / n);
66}
67function log(x, b = Math.E) {
68 return Math.log(x) / Math.log(b);
69}
70function properDivisors(x) {
71 var x = Math.abs(x), a = [];
72 for (var i = 1; i < x; i++)
73 if (x % i === 0)
74 a.push(i);
75 return a;
76}
77function aliquotSum(x) {
78 var x = Math.abs(x), a = 0;
79 for (var i = 0; i < x; i++)
80 if (x % i === 0)
81 a += i;
82 return a;
83}
84function minPrimeFactor(x) {
85 var x = Math.abs(x);
86 if (x <= 1)
87 return 0;
88 if (x <= 3)
89 return x;
90 if (x % 2 === 0)
91 return 2;
92 if (x % 3 === 0)
93 return 3;
94 for (var i = 6, I = Math.sqrt(x) + 1; i <= I; i += 6) {
95 if (x % (i - 1) === 0)
96 return i - 1;
97 if (x % (i + 1) === 0)
98 return i + 1;
99 }
100 return x;
101}
102function maxPrimeFactor(x) {
103 var x = Math.abs(x), a = 0;
104 if (x <= 1)
105 return 0;
106 if (x <= 3)
107 return x;
108 for (; x % 2 === 0; a = 2)
109 x /= 2;
110 for (; x % 3 === 0; a = 3)
111 x /= 3;
112 for (var i = 6, I = Math.sqrt(x) + 1; x > 1 && i <= I; i += 6) {
113 for (; x % (i - 1) == 0; a = i - 1)
114 x /= i - 1;
115 for (; x % (i + 1) == 0; a = i + 1)
116 x /= i + 1;
117 }
118 if (x <= 1)
119 return a;
120 return x;
121}
122function primeFactors(x) {
123 var x = Math.abs(x), a = [];
124 if (x <= 1)
125 return [];
126 if (x <= 3)
127 return [x];
128 x = pushPrimeFactorTo$(a, x, 2);
129 x = pushPrimeFactorTo$(a, x, 3);
130 for (var i = 6, I = Math.sqrt(x) + 1; x > 1 && i <= I; i += 6) {
131 x = pushPrimeFactorTo$(a, x, i - 1);
132 x = pushPrimeFactorTo$(a, x, i + 1);
133 }
134 if (x > 1)
135 a.push(x);
136 return a;
137}
138function pushPrimeFactorTo$(a, x, f) {
139 if (x % f !== 0)
140 return x;
141 do {
142 x /= f;
143 } while (x % f === 0);
144 a.push(f);
145 return x;
146}
147function primeExponentials(x) {
148 var x = Math.abs(x), a = [];
149 if (x <= 1)
150 return [];
151 if (x <= 3)
152 return [[x, 1]];
153 x = pushPrimeExponentialTo$(a, x, 2);
154 x = pushPrimeExponentialTo$(a, x, 3);
155 for (var i = 6, I = Math.sqrt(x) + 1; x > 1 && i <= I; i += 6) {
156 x = pushPrimeExponentialTo$(a, x, i - 1);
157 x = pushPrimeExponentialTo$(a, x, i + 1);
158 }
159 if (x > 1)
160 a.push([x, 1]);
161 return a;
162}
163function pushPrimeExponentialTo$(a, x, f) {
164 if (x % f !== 0)
165 return x;
166 var e = 0;
167 do {
168 x /= f;
169 ++e;
170 } while (x % f === 0);
171 a.push([f, e]);
172 return x;
173}
174function isPrime(x) {
175 return x !== 0 && minPrimeFactor(x) === Math.abs(x);
176}
177function gcd(...xs) {
178 var a = xs[0] || 1;
179 for (var i = 1, I = xs.length; i < I; i++)
180 a = gcdPair(a, xs[i]);
181 return a;
182}
183function gcdPair(x, y) {
184 while (y !== 0) {
185 var t = y;
186 y = x % y;
187 x = t;
188 }
189 return x;
190}
191function lcm(...xs) {
192 var a = xs[0] || 1;
193 for (var i = 1, I = xs.length; i < I; i++)
194 a = a * xs[i] / gcdPair(a, xs[i]);
195 return a;
196}
197function factorial(n, k = 0) {
198 if (n < 0)
199 return 0;
200 for (var i = k + 1, a = 1; i <= n; i++)
201 a *= i;
202 return a;
203}
204function binomial(n, k) {
205 if (k < 0 || k > Math.abs(n))
206 return 0;
207 if (n < 0)
208 return Math.pow(-1, k) * binomial(-n, k);
209 k = k > n - k ? n - k : k;
210 for (var a = 1, i = 1; i <= k; i++, n--)
211 a *= n / i;
212 return a;
213}
214function multinomial(...ks) {
215 var n = sum(...ks), a = 1;
216 for (var i = 0, j = 0, I = ks.length; i < I;) {
217 if (j <= 0)
218 j = ks[i++];
219 else
220 a *= n-- / j--;
221 }
222 return a;
223}
224function degrees(x) {
225 return x * (180 / Math.PI);
226}
227function radians(x) {
228 return x * (Math.PI / 180);
229}
230function sum(...xs) {
231 var a = 0;
232 for (var x of xs)
233 a += x;
234 return a;
235}
236function product(...xs) {
237 var a = 1;
238 for (var x of xs)
239 a *= x;
240 return a;
241}
242function median(...xs) {
243 if (xs.length === 0)
244 return 0;
245 xs.sort((a, b) => a - b);
246 var i = xs.length >> 1;
247 if ((xs.length & 1) === 1)
248 return xs[i];
249 return (xs[i - 1] + xs[i]) / 2;
250}
251function modes(...xs) {
252 xs.sort((a, b) => a - b);
253 var r = maxRepeat(xs);
254 return getRepeats(xs, r);
255}
256function maxRepeat(xs) {
257 var count = Math.min(xs.length, 1), max = count;
258 for (var i = 1, I = xs.length; i < I; i++) {
259 if (xs[i - 1] === xs[i])
260 count++;
261 else {
262 max = Math.max(max, count);
263 count = 1;
264 }
265 }
266 return Math.max(max, count);
267}
268function getRepeats(xs, r) {
269 var a = [];
270 r--;
271 for (var i = 0, I = xs.length - r; i < I; i++)
272 if (xs[i] === xs[i + r])
273 a.push(xs[i += r]);
274 return a;
275}
276function range(...xs) {
277 return [Math.min(...xs), Math.max(...xs)];
278}
279function variance(...xs) {
280 if (xs.length === 0)
281 return 0;
282 var m = arithmeticMean(...xs), a = 0;
283 for (var x of xs)
284 a += (x - m) ** 2;
285 return a / xs.length;
286}
287function arithmeticMean(...xs) {
288 if (xs.length === 0)
289 return 0;
290 return sum(...xs) / xs.length;
291}
292function geometricMean(...xs) {
293 var n = xs.length;
294 return root(product(...xs), n);
295}
296function harmonicMean(...xs) {
297 var n = xs.length;
298 var p = product(...xs), q = 0;
299 for (var x of xs)
300 q += p / x;
301 return n * p / q;
302}
303function quadriaticMean(...xs) {
304 var n = xs.length, a = 0;
305 for (var x of xs)
306 a += x * x;
307 return Math.sqrt(a / n);
308}
309function cubicMean(...xs) {
310 var n = xs.length, a = 0;
311 for (var x of xs)
312 a += x ** 3;
313 return Math.cbrt(a / n);
314}
315
316function magnitude(xs) {
317 var a = 0;
318 for (var i = 0, I = xs.length; i < I; i++)
319 a += xs[i] ** 2;
320 return Math.sqrt(a);
321}
322function distance(xs, ys) {
323 var a = 0;
324 for (var i = 0, I = xs.length; i < I; i++)
325 a += (xs[i] - ys[i]) ** 2;
326 return Math.sqrt(a);
327}
328
329exports.aliquotParts = properDivisors;
330exports.aliquotSum = aliquotSum;
331exports.arithmeticMean = arithmeticMean;
332exports.binomial = binomial;
333exports.ceil = ceil;
334exports.ceilDiv = ceilDiv;
335exports.clamp = constrain;
336exports.constrain = constrain;
337exports.cubicMean = cubicMean;
338exports.degrees = degrees;
339exports.distance = distance;
340exports.factorial = factorial;
341exports.floor = floor;
342exports.floorDiv = floorDiv;
343exports.gcd = gcd;
344exports.geometricMean = geometricMean;
345exports.greatestPrimeFactor = maxPrimeFactor;
346exports.harmonicMean = harmonicMean;
347exports.hcf = gcd;
348exports.isPow = isPow;
349exports.isPrime = isPrime;
350exports.lcm = lcm;
351exports.leastPrimeFactor = minPrimeFactor;
352exports.lerp = lerp;
353exports.log = log;
354exports.magnitude = magnitude;
355exports.map = remap;
356exports.maxPrimeFactor = maxPrimeFactor;
357exports.mean = arithmeticMean;
358exports.median = median;
359exports.minPrimeFactor = minPrimeFactor;
360exports.mod = mod;
361exports.modes = modes;
362exports.modp = modp;
363exports.multinomial = multinomial;
364exports.nextPow = nextPow;
365exports.norm = normalize;
366exports.normalize = normalize;
367exports.prevPow = prevPow;
368exports.primeExponentials = primeExponentials;
369exports.primeFactors = primeFactors;
370exports.product = product;
371exports.properDivisors = properDivisors;
372exports.quadriaticMean = quadriaticMean;
373exports.radians = radians;
374exports.range = range;
375exports.rem = rem;
376exports.remap = remap;
377exports.root = root;
378exports.rootMeanSquare = quadriaticMean;
379exports.round = round;
380exports.roundDiv = roundDiv;
381exports.sum = sum;
382exports.variance = variance;