UNPKG

8.07 kBJavaScriptView Raw
1function floor(x, pre = 1) {
2 return Math.floor(x / pre) * pre;
3}
4function ceil(x, pre = 1) {
5 return Math.ceil(x / pre) * pre;
6}
7function round(x, pre = 1) {
8 return Math.round(x / pre) * pre;
9}
10function floorDiv(x, y) {
11 return Math.floor(x / y);
12}
13function ceilDiv(x, y) {
14 return Math.ceil(x / y);
15}
16function roundDiv(x, y) {
17 return Math.round(x / y);
18}
19function rem(x, y) {
20 return x % y;
21}
22function mod(x, y) {
23 return x - y * Math.floor(x / y);
24}
25function modp(x, y) {
26 return x - Math.abs(y) * Math.floor(x / Math.abs(y));
27}
28function constrain(x, min, max) {
29 return Math.min(Math.max(x, min), max);
30}
31function normalize(x, r, R) {
32 return (x - r) / (R - r);
33}
34function remap(x, r, R, t, T) {
35 return t + ((x - r) / (R - r)) * (T - t);
36}
37function lerp(x, y, t) {
38 return x + t * (y - x);
39}
40function 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}
48function 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}
54function 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}
60function 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}
65function log(x, b = Math.E) {
66 return Math.log(x) / Math.log(b);
67}
68function 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}
75function 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}
82function 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}
100function 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}
120function 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}
136function 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}
145function 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}
161function 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}
172function isPrime(x) {
173 return x !== 0 && minPrimeFactor(x) === Math.abs(x);
174}
175function 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}
181function gcdPair(x, y) {
182 while (y !== 0) {
183 var t = y;
184 y = x % y;
185 x = t;
186 }
187 return x;
188}
189function 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}
195function 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}
202function 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}
212function 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}
222function degrees(x) {
223 return x * (180 / Math.PI);
224}
225function radians(x) {
226 return x * (Math.PI / 180);
227}
228function sum(...xs) {
229 var a = 0;
230 for (var x of xs)
231 a += x;
232 return a;
233}
234function product(...xs) {
235 var a = 1;
236 for (var x of xs)
237 a *= x;
238 return a;
239}
240function 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}
249function modes(...xs) {
250 xs.sort((a, b) => a - b);
251 var r = maxRepeat(xs);
252 return getRepeats(xs, r);
253}
254function 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}
266function 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}
274function range(...xs) {
275 return [Math.min(...xs), Math.max(...xs)];
276}
277function 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}
285function arithmeticMean(...xs) {
286 if (xs.length === 0)
287 return 0;
288 return sum(...xs) / xs.length;
289}
290function geometricMean(...xs) {
291 var n = xs.length;
292 return root(product(...xs), n);
293}
294function 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}
301function 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}
307function 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
314function 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}
320function 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
327export { 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 };