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