1 | 'use strict';
|
2 |
|
3 | function floor(x, pre = 1) {
|
4 | return Math.floor(x / pre) * pre;
|
5 | }
|
6 | function ceil(x, pre = 1) {
|
7 | return Math.ceil(x / pre) * pre;
|
8 | }
|
9 | function round(x, pre = 1) {
|
10 | return Math.round(x / pre) * pre;
|
11 | }
|
12 | function floorDiv(x, y) {
|
13 | return Math.floor(x / y);
|
14 | }
|
15 | function ceilDiv(x, y) {
|
16 | return Math.ceil(x / y);
|
17 | }
|
18 | function roundDiv(x, y) {
|
19 | return Math.round(x / y);
|
20 | }
|
21 | function rem(x, y) {
|
22 | return x % y;
|
23 | }
|
24 | function mod(x, y) {
|
25 | return x - y * Math.floor(x / y);
|
26 | }
|
27 | function modp(x, y) {
|
28 | return x - Math.abs(y) * Math.floor(x / Math.abs(y));
|
29 | }
|
30 | function constrain(x, min, max) {
|
31 | return Math.min(Math.max(x, min), max);
|
32 | }
|
33 | function normalize(x, r, R) {
|
34 | return (x - r) / (R - r);
|
35 | }
|
36 | function remap(x, r, R, t, T) {
|
37 | return t + ((x - r) / (R - r)) * (T - t);
|
38 | }
|
39 | function lerp(x, y, t) {
|
40 | return x + t * (y - x);
|
41 | }
|
42 | function 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 | }
|
50 | function 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 | }
|
56 | function 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 | }
|
62 | function 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 | }
|
67 | function log(x, b = Math.E) {
|
68 | return Math.log(x) / Math.log(b);
|
69 | }
|
70 | function 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 | }
|
77 | function 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 | }
|
84 | function 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 | }
|
102 | function 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 | }
|
122 | function 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 | }
|
138 | function 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 | }
|
147 | function 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 | }
|
163 | function 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 | }
|
174 | function isPrime(x) {
|
175 | return x !== 0 && minPrimeFactor(x) === Math.abs(x);
|
176 | }
|
177 | function 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 | }
|
183 | function gcdPair(x, y) {
|
184 | while (y !== 0) {
|
185 | var t = y;
|
186 | y = x % y;
|
187 | x = t;
|
188 | }
|
189 | return x;
|
190 | }
|
191 | function 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 | }
|
197 | function 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 | }
|
204 | function 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 | }
|
214 | function 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 | }
|
224 | function degrees(x) {
|
225 | return x * (180 / Math.PI);
|
226 | }
|
227 | function radians(x) {
|
228 | return x * (Math.PI / 180);
|
229 | }
|
230 | function sum(...xs) {
|
231 | var a = 0;
|
232 | for (var x of xs)
|
233 | a += x;
|
234 | return a;
|
235 | }
|
236 | function product(...xs) {
|
237 | var a = 1;
|
238 | for (var x of xs)
|
239 | a *= x;
|
240 | return a;
|
241 | }
|
242 | function 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 | }
|
251 | function modes(...xs) {
|
252 | xs.sort((a, b) => a - b);
|
253 | var r = maxRepeat(xs);
|
254 | return getRepeats(xs, r);
|
255 | }
|
256 | function 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 | }
|
268 | function 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 | }
|
276 | function range(...xs) {
|
277 | return [Math.min(...xs), Math.max(...xs)];
|
278 | }
|
279 | function 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 | }
|
287 | function arithmeticMean(...xs) {
|
288 | if (xs.length === 0)
|
289 | return 0;
|
290 | return sum(...xs) / xs.length;
|
291 | }
|
292 | function geometricMean(...xs) {
|
293 | var n = xs.length;
|
294 | return root(product(...xs), n);
|
295 | }
|
296 | function 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 | }
|
303 | function 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 | }
|
309 | function 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 |
|
316 | function 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 | }
|
322 | function 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 |
|
329 | exports.aliquotParts = properDivisors;
|
330 | exports.aliquotSum = aliquotSum;
|
331 | exports.arithmeticMean = arithmeticMean;
|
332 | exports.binomial = binomial;
|
333 | exports.ceil = ceil;
|
334 | exports.ceilDiv = ceilDiv;
|
335 | exports.clamp = constrain;
|
336 | exports.constrain = constrain;
|
337 | exports.cubicMean = cubicMean;
|
338 | exports.degrees = degrees;
|
339 | exports.distance = distance;
|
340 | exports.factorial = factorial;
|
341 | exports.floor = floor;
|
342 | exports.floorDiv = floorDiv;
|
343 | exports.gcd = gcd;
|
344 | exports.geometricMean = geometricMean;
|
345 | exports.greatestPrimeFactor = maxPrimeFactor;
|
346 | exports.harmonicMean = harmonicMean;
|
347 | exports.hcf = gcd;
|
348 | exports.isPow = isPow;
|
349 | exports.isPrime = isPrime;
|
350 | exports.lcm = lcm;
|
351 | exports.leastPrimeFactor = minPrimeFactor;
|
352 | exports.lerp = lerp;
|
353 | exports.log = log;
|
354 | exports.magnitude = magnitude;
|
355 | exports.map = remap;
|
356 | exports.maxPrimeFactor = maxPrimeFactor;
|
357 | exports.mean = arithmeticMean;
|
358 | exports.median = median;
|
359 | exports.minPrimeFactor = minPrimeFactor;
|
360 | exports.mod = mod;
|
361 | exports.modes = modes;
|
362 | exports.modp = modp;
|
363 | exports.multinomial = multinomial;
|
364 | exports.nextPow = nextPow;
|
365 | exports.norm = normalize;
|
366 | exports.normalize = normalize;
|
367 | exports.prevPow = prevPow;
|
368 | exports.primeExponentials = primeExponentials;
|
369 | exports.primeFactors = primeFactors;
|
370 | exports.product = product;
|
371 | exports.properDivisors = properDivisors;
|
372 | exports.quadriaticMean = quadriaticMean;
|
373 | exports.radians = radians;
|
374 | exports.range = range;
|
375 | exports.rem = rem;
|
376 | exports.remap = remap;
|
377 | exports.root = root;
|
378 | exports.rootMeanSquare = quadriaticMean;
|
379 | exports.round = round;
|
380 | exports.roundDiv = roundDiv;
|
381 | exports.sum = sum;
|
382 | exports.variance = variance;
|