numz 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/.vscode/extensions.json +4 -0
- package/docs/.vscode/launch.json +11 -0
- package/docs/README.md +49 -0
- package/docs/astro.config.mjs +64 -0
- package/docs/package-lock.json +7592 -0
- package/docs/package.json +19 -0
- package/docs/public/favicon.svg +1 -0
- package/docs/src/assets/houston.webp +0 -0
- package/docs/src/content/docs/about.md +11 -0
- package/docs/src/content/docs/guides/example.md +11 -0
- package/docs/src/content/docs/index.mdx +40 -0
- package/docs/src/content/docs/philosophy.md +15 -0
- package/docs/src/content/docs/reference/complex/complex.mdx +66 -0
- package/docs/src/content/docs/reference/functions/arithmetic.md +14 -0
- package/docs/src/content/docs/reference/functions/mapfun.md +81 -0
- package/docs/src/content/docs/reference/functions/ufunc.md +41 -0
- package/docs/src/content/docs/reference/functions/utils.md +16 -0
- package/docs/src/content/docs/reference/matrix/matrix.mdx +97 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/pulse-train.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/pwm.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/sawtooth-train.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/sinusoid.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/square.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/periodic/triangle.md +6 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/dirac.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/noise.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/rampe.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/rect.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/signum.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/sinc.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/trapezoid.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/pulse/tri.md +12 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/arange.md +21 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/geomspace.md +21 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/linspace.md +16 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/logspace.md +20 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/nums.md +17 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/ones.md +19 -0
- package/docs/src/content/docs/reference/signal/functions/sequences/zeros.md +20 -0
- package/docs/src/content/docs/reference/stats/accum/accum-max.md +4 -0
- package/docs/src/content/docs/reference/stats/accum/accum-min.md +4 -0
- package/docs/src/content/docs/reference/stats/accum/accum-prod.md +4 -0
- package/docs/src/content/docs/reference/stats/accum/accum-sum.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/contraharmonic-mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/geo_mean.md +6 -0
- package/docs/src/content/docs/reference/stats/averages/harmonic_mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/iq-mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/mean.md +6 -0
- package/docs/src/content/docs/reference/stats/averages/midhinge.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/midrange.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/power_mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/rms.md +12 -0
- package/docs/src/content/docs/reference/stats/averages/trimmed_mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/weighted_mean.md +4 -0
- package/docs/src/content/docs/reference/stats/averages/winsorized_mean.md +4 -0
- package/docs/src/content.config.ts +7 -0
- package/docs/src/pages/a.astro +0 -0
- package/docs/src/styles/custom.css +21 -0
- package/docs/tsconfig.json +5 -0
- package/package.json +2 -2
- package/src/calculus/derivative/index.js +16 -0
- package/src/calculus/index.js +22 -0
- package/src/calculus/integral/index.js +21 -0
- package/src/discret/bitwise/index.js +34 -0
- package/src/discret/combination/index.js +86 -0
- package/src/discret/index-dep.js +110 -0
- package/src/discret/index.js +4 -0
- package/src/discret/permutation/index.js +89 -0
- package/src/discret/sequences/index.js +30 -0
- package/src/index.js +6 -1
- package/src/signal/conv/conv.js +43 -0
- package/src/signal/conv/conv2.js +71 -0
- package/src/signal/conv/index.js +2 -0
- package/src/signal/fft/fft.js +47 -0
- package/src/signal/fft/ifft.js +16 -0
- package/src/signal/fft/index.js +2 -52
- package/src/signal/fft/utils/index.js +1 -19
- package/src/signal/functions/index.js +1 -1
- package/src/signal/functions/sequence/index.js +13 -3
- package/src/signal/index.js +1 -1
- package/src/stats/average/index.js +2 -2
- package/src/stats/distributions/continuos/index.js +35 -0
- package/src/stats/distributions/discret/index.js +45 -0
- package/src/stats/distributions/index.js +3 -0
- package/src/stats/distributions/multivar/index.js +40 -0
- package/src/stats/index.js +2 -1
- package/src/ufunc/index.js +1 -0
- package/test/index.js +39 -0
- package/test/index.py +14 -0
- package/src/signal/fft/fft1d/index.js +0 -18
- package/src/signal/fft/fftnd/index.js +0 -27
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: nums
|
|
3
|
+
description: nums
|
|
4
|
+
sidebar :
|
|
5
|
+
order: 2
|
|
6
|
+
---
|
|
7
|
+
## Definition
|
|
8
|
+
|
|
9
|
+
## Signature
|
|
10
|
+
```ts
|
|
11
|
+
nums(num : number, n : number) : number[]
|
|
12
|
+
```
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
const z = nums(1.5, 10) // [1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5]
|
|
17
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: zeros
|
|
3
|
+
description: zeros
|
|
4
|
+
sidebar:
|
|
5
|
+
order : 0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Defintion
|
|
9
|
+
|
|
10
|
+
## Signature
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
zeros(n : number) : []number
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
const z = zeros(10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
|
20
|
+
```
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defineCollection } from 'astro:content';
|
|
2
|
+
import { docsLoader } from '@astrojs/starlight/loaders';
|
|
3
|
+
import { docsSchema } from '@astrojs/starlight/schema';
|
|
4
|
+
|
|
5
|
+
export const collections = {
|
|
6
|
+
docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
|
|
7
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--sl-content-width: 50rem;
|
|
3
|
+
--sl-text-5xl: 3.5rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
h1{
|
|
7
|
+
color : darkblue;
|
|
8
|
+
/* text-decoration: 2px underline blueviolet;
|
|
9
|
+
text-decoration-skip-ink: auto; */
|
|
10
|
+
/* border-bottom: 1px red solid; */
|
|
11
|
+
}
|
|
12
|
+
p a{
|
|
13
|
+
color: blueviolet;
|
|
14
|
+
text-decoration: none;
|
|
15
|
+
&:hover{
|
|
16
|
+
text-decoration: underline;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/* strong{
|
|
20
|
+
color: blueviolet;
|
|
21
|
+
} */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "numz",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "scientific computing with zikojs",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -29,6 +29,6 @@
|
|
|
29
29
|
"rollup": "^4.24.0"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"ziko": "^0.
|
|
32
|
+
"ziko": "^0.57.0"
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const derivative = (f, x, h = 1e-8) => (f(x + h) - f(x - h)) / (2 * h);
|
|
2
|
+
export const derivative_n = (f, x, n = 1, h = 1e-8) => {
|
|
3
|
+
if (n === 0) return f(x);
|
|
4
|
+
const df = (x0) => derivative(f, x0, h);
|
|
5
|
+
return derivative_n(df, x, n - 1, h);
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export const partial_derivative = (f, vars, varIndex, h = 1e-8) => {
|
|
10
|
+
const x1 = [...vars];
|
|
11
|
+
const x2 = [...vars];
|
|
12
|
+
x1[varIndex] += h;
|
|
13
|
+
x2[varIndex] -= h;
|
|
14
|
+
return (f(...x1) - f(...x2)) / (2 * h);
|
|
15
|
+
};
|
|
16
|
+
export const gradient = (f, vars, h = 1e-8) => vars.map((_, i) => partial_derivative(f, vars, i, h));
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './derivative/index.js'
|
|
2
|
+
export * from './integral/index.js'
|
|
3
|
+
import { factorial } from "../discret";
|
|
4
|
+
export const taylor_series = (f, x0, n=5, h=1e-5) => {
|
|
5
|
+
let sum=0;
|
|
6
|
+
for(let i=0;i<=n;i++){
|
|
7
|
+
sum += derivative_n(f,x0,i,h) / factorial(i)*(x0**i);
|
|
8
|
+
}
|
|
9
|
+
return sum;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export const newton_raphson = (f, x0, tol=1e-8, maxIter=100) => {
|
|
13
|
+
let x=x0;
|
|
14
|
+
for(let i=0;i<maxIter;i++){
|
|
15
|
+
const fx=f(x), dfx=derivative(f,x);
|
|
16
|
+
if(Math.abs(dfx)<1e-12) break;
|
|
17
|
+
const dx=fx/dfx;
|
|
18
|
+
x-=dx;
|
|
19
|
+
if(Math.abs(dx)<tol) break;
|
|
20
|
+
}
|
|
21
|
+
return x;
|
|
22
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const integral_simpson = (f, a, b, n=1000) => {
|
|
2
|
+
if(n%2===1) n+=1;
|
|
3
|
+
const h=(b-a)/n;
|
|
4
|
+
let s=f(a)+f(b);
|
|
5
|
+
for(let i=1;i<n;i++){
|
|
6
|
+
s+=f(a+i*h)*(i%2===0?2:4);
|
|
7
|
+
}
|
|
8
|
+
return s*h/3;
|
|
9
|
+
};
|
|
10
|
+
export const integral_trapezoid = (f, a, b, n=1000) => {
|
|
11
|
+
const h=(b-a)/n;
|
|
12
|
+
let s=(f(a)+f(b))/2;
|
|
13
|
+
for(let i=1;i<n;i++) s+=f(a+i*h);
|
|
14
|
+
return s*h;
|
|
15
|
+
};
|
|
16
|
+
export const integral_midpoint = (f, a, b, n=1000)=>{
|
|
17
|
+
const h=(b-a)/n;
|
|
18
|
+
let s=0;
|
|
19
|
+
for(let i=0;i<n;i++) s+=f(a+(i+0.5)*h);
|
|
20
|
+
return s*h;
|
|
21
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
export const bitmasks = (n) => {
|
|
4
|
+
const res = [];
|
|
5
|
+
for (let i = 0; i < 1 << n; i++) {
|
|
6
|
+
const mask = [];
|
|
7
|
+
for (let j = 0; j < n; j++) mask.push((i >> j) & 1);
|
|
8
|
+
res.push(mask);
|
|
9
|
+
}
|
|
10
|
+
return res;
|
|
11
|
+
};
|
|
12
|
+
export const subsets_by_mask = (arr) => {
|
|
13
|
+
const n = arr.length,
|
|
14
|
+
res = [];
|
|
15
|
+
for (let i = 0; i < 1 << n; i++) {
|
|
16
|
+
const subset = [];
|
|
17
|
+
for (let j = 0; j < n; j++) if ((i >> j) & 1) subset.push(arr[j]);
|
|
18
|
+
res.push(subset);
|
|
19
|
+
}
|
|
20
|
+
return res;
|
|
21
|
+
};
|
|
22
|
+
export const gray_code = (n) => {
|
|
23
|
+
if (n === 0) return [0];
|
|
24
|
+
const prev = gray_code(n - 1);
|
|
25
|
+
return [...prev, ...prev.map((x) => x | (1 << (n - 1)))];
|
|
26
|
+
};
|
|
27
|
+
export const hamming_weight = (x) => {
|
|
28
|
+
let count = 0;
|
|
29
|
+
while (x) {
|
|
30
|
+
x &= x - 1;
|
|
31
|
+
count++;
|
|
32
|
+
}
|
|
33
|
+
return count;
|
|
34
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export const combinations = (arr, repetition = false) => {
|
|
2
|
+
const n = arr.length,
|
|
3
|
+
result = [];
|
|
4
|
+
if (!repetition) {
|
|
5
|
+
const back = (start, cur) => {
|
|
6
|
+
if (cur.length) result.push([...cur]);
|
|
7
|
+
for (let i = start; i < n; i++) {
|
|
8
|
+
cur.push(arr[i]);
|
|
9
|
+
back(i + 1, cur);
|
|
10
|
+
cur.pop();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
back(0, []);
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const back = (start, cur) => {
|
|
17
|
+
if (cur.length) result.push([...cur]);
|
|
18
|
+
for (let i = start; i < n; i++) {
|
|
19
|
+
cur.push(arr[i]);
|
|
20
|
+
back(i, cur);
|
|
21
|
+
cur.pop();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
back(0, []);
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
export const k_combinations = (arr, k, repetition = false) => {
|
|
31
|
+
const n = arr.length,
|
|
32
|
+
result = [];
|
|
33
|
+
if (!repetition) {
|
|
34
|
+
const back = (start, cur) => {
|
|
35
|
+
if (cur.length === k) result.push([...cur]);
|
|
36
|
+
else
|
|
37
|
+
for (let i = start; i < n; i++) {
|
|
38
|
+
cur.push(arr[i]);
|
|
39
|
+
back(i + 1, cur);
|
|
40
|
+
cur.pop();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
back(0, []);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
const back = (start, cur) => {
|
|
47
|
+
if (cur.length === k) result.push([...cur]);
|
|
48
|
+
else
|
|
49
|
+
for (let i = start; i < n; i++) {
|
|
50
|
+
cur.push(arr[i]);
|
|
51
|
+
back(i, cur);
|
|
52
|
+
cur.pop();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
back(0, []);
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const multiset_combinations = (arr, k) => {
|
|
60
|
+
const counter = {},
|
|
61
|
+
unique = [];
|
|
62
|
+
for (const x of arr) {
|
|
63
|
+
if (!counter[x]) {
|
|
64
|
+
counter[x] = 0;
|
|
65
|
+
unique.push(x);
|
|
66
|
+
}
|
|
67
|
+
counter[x]++;
|
|
68
|
+
}
|
|
69
|
+
const result = [];
|
|
70
|
+
const back = (i, cur, remaining) => {
|
|
71
|
+
if (cur.length === k) {
|
|
72
|
+
result.push([...cur]);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (i >= unique.length) return;
|
|
76
|
+
const u = unique[i],
|
|
77
|
+
max_use = Math.min(counter[u], k - cur.length);
|
|
78
|
+
for (let use = 0; use <= max_use; use++) {
|
|
79
|
+
for (let j = 0; j < use; j++) cur.push(u);
|
|
80
|
+
back(i + 1, cur, remaining - use);
|
|
81
|
+
for (let j = 0; j < use; j++) cur.pop();
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
back(0, [], k);
|
|
85
|
+
return result;
|
|
86
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// ==========================================
|
|
2
|
+
// Discrete Mathematics / Combinatorics
|
|
3
|
+
// ==========================================
|
|
4
|
+
// ------------------------------
|
|
5
|
+
// Binomial & Multichoose
|
|
6
|
+
// ------------------------------
|
|
7
|
+
export const binomial = (n, k) => {
|
|
8
|
+
if (n !== Math.floor(n) || k !== Math.floor(k))
|
|
9
|
+
return TypeError("n,k must be integers");
|
|
10
|
+
if (k < 0 || k > n) return 0;
|
|
11
|
+
k = Math.min(k, n - k);
|
|
12
|
+
let r = 1;
|
|
13
|
+
for (let i = 1; i <= k; i++) r = (r * (n - (k - i))) / i;
|
|
14
|
+
return r;
|
|
15
|
+
};
|
|
16
|
+
export const comb_repetition = (n, k) => binomial(n + k - 1, k);
|
|
17
|
+
export const multichoose = comb_repetition;
|
|
18
|
+
|
|
19
|
+
// Comb // Perm
|
|
20
|
+
export const power_set = (arr) => {
|
|
21
|
+
const n = arr.length,
|
|
22
|
+
result = [];
|
|
23
|
+
for (let i = 0; i < 1 << n; i++) {
|
|
24
|
+
const subset = [];
|
|
25
|
+
for (let j = 0; j < n; j++) if ((i >> j) & 1) subset.push(arr[j]);
|
|
26
|
+
result.push(subset);
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const cartesian = (...sets) => {
|
|
32
|
+
let result = [[]];
|
|
33
|
+
for (const set of sets) {
|
|
34
|
+
const temp = [];
|
|
35
|
+
for (const x of result) for (const y of set) temp.push([...x, y]);
|
|
36
|
+
result = temp;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// ------------------------------
|
|
42
|
+
// Counting / Sequences
|
|
43
|
+
// ------------------------------
|
|
44
|
+
export const derangement = (n) => {
|
|
45
|
+
if (n !== Math.floor(n)) return TypeError("n must be integer");
|
|
46
|
+
let r = 1;
|
|
47
|
+
for (let i = 1; i <= n; i++) {
|
|
48
|
+
r = i * r + (i % 2 === 0 ? 1 : -1);
|
|
49
|
+
}
|
|
50
|
+
return Math.round(r / Math.E);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const catalan = (n) => binomial(2 * n, n) / (n + 1);
|
|
54
|
+
|
|
55
|
+
export const stirling2 = (n, k) => {
|
|
56
|
+
if (k < 0 || k > n) return 0;
|
|
57
|
+
let S = Array(k + 1).fill(0);
|
|
58
|
+
S[0] = 1;
|
|
59
|
+
for (let i = 1; i <= n; i++)
|
|
60
|
+
for (let j = k; j > 0; j--) S[j] = j * S[j] + S[j - 1];
|
|
61
|
+
return S[k];
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const bell = (n) => {
|
|
65
|
+
let B = [1];
|
|
66
|
+
for (let i = 1; i <= n; i++) {
|
|
67
|
+
B[i] = 0;
|
|
68
|
+
for (let j = 0; j < i; j++) B[i] += binomial(i - 1, j) * B[j];
|
|
69
|
+
}
|
|
70
|
+
return B[n];
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const lah = (n, k) => {
|
|
74
|
+
if (n < 0 || k < 0 || k > n) return 0;
|
|
75
|
+
return (binomial(n - 1, k - 1) * factorial(n)) / factorial(k);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// // Eulerian numbers: number of permutations with exactly k ascents
|
|
79
|
+
export const eulerian = (n,k)=>{
|
|
80
|
+
if(k<0||k>=n) return 0;
|
|
81
|
+
let dp=[Array(k+2).fill(0)];
|
|
82
|
+
dp[0][0]=1;
|
|
83
|
+
for(let i=1;i<=n;i++){
|
|
84
|
+
const ndp=Array(k+2).fill(0);
|
|
85
|
+
for(let j=0;j<=Math.min(i-1,k);j++){
|
|
86
|
+
ndp[j]= (i-j)*dp[i-1]?[j]??0:
|
|
87
|
+
ndp[j+1]= (j+1)*dp[i-1][j];
|
|
88
|
+
}
|
|
89
|
+
dp=ndp;
|
|
90
|
+
}
|
|
91
|
+
return dp[k];
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// Partition numbers
|
|
95
|
+
export const partition_number = (n) => {
|
|
96
|
+
if (n === 0) return 1;
|
|
97
|
+
let p = [1];
|
|
98
|
+
for (let i = 1; i <= n; i++) {
|
|
99
|
+
let s = 0;
|
|
100
|
+
for (let k = 1; ; k++) {
|
|
101
|
+
let j1 = i - (k * (3 * k - 1)) / 2;
|
|
102
|
+
let j2 = i - (k * (3 * k + 1)) / 2;
|
|
103
|
+
if (j1 < 0 && j2 < 0) break;
|
|
104
|
+
if (j1 >= 0) s += (k % 2 === 0 ? -1 : 1) * p[j1];
|
|
105
|
+
if (j2 >= 0) s += (k % 2 === 0 ? -1 : 1) * p[j2];
|
|
106
|
+
}
|
|
107
|
+
p.push(s);
|
|
108
|
+
}
|
|
109
|
+
return p[n];
|
|
110
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export const permutations = (arr, repetition = false) => {
|
|
2
|
+
const n = arr.length,
|
|
3
|
+
result = [];
|
|
4
|
+
if (repetition) {
|
|
5
|
+
const back = (cur) => {
|
|
6
|
+
if (cur.length === n) result.push([...cur]);
|
|
7
|
+
else
|
|
8
|
+
for (let i = 0; i < n; i++) {
|
|
9
|
+
cur.push(arr[i]);
|
|
10
|
+
back(cur);
|
|
11
|
+
cur.pop();
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
back([]);
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
const back = (cur, used) => {
|
|
18
|
+
if (cur.length === n) result.push([...cur]);
|
|
19
|
+
else
|
|
20
|
+
for (let i = 0; i < n; i++) {
|
|
21
|
+
if (used[i]) continue;
|
|
22
|
+
used[i] = true;
|
|
23
|
+
cur.push(arr[i]);
|
|
24
|
+
back(cur, used);
|
|
25
|
+
cur.pop();
|
|
26
|
+
used[i] = false;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
back([], Array(n).fill(false));
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
export const k_permutations = (arr, k, repetition = false) => {
|
|
35
|
+
const n = arr.length,
|
|
36
|
+
result = [];
|
|
37
|
+
if (repetition) {
|
|
38
|
+
const back = (cur) => {
|
|
39
|
+
if (cur.length === k) result.push([...cur]);
|
|
40
|
+
else
|
|
41
|
+
for (let i = 0; i < n; i++) {
|
|
42
|
+
cur.push(arr[i]);
|
|
43
|
+
back(cur);
|
|
44
|
+
cur.pop();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
back([]);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
const back = (cur, used) => {
|
|
51
|
+
if (cur.length === k) result.push([...cur]);
|
|
52
|
+
else
|
|
53
|
+
for (let i = 0; i < n; i++) {
|
|
54
|
+
if (used[i]) continue;
|
|
55
|
+
used[i] = true;
|
|
56
|
+
cur.push(arr[i]);
|
|
57
|
+
back(cur, used);
|
|
58
|
+
cur.pop();
|
|
59
|
+
used[i] = false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
back([], Array(n).fill(false));
|
|
63
|
+
return result;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const multiset_permutations = (arr) => {
|
|
67
|
+
const result = [],
|
|
68
|
+
counter = {};
|
|
69
|
+
for (const x of arr) counter[x] = (counter[x] || 0) + 1;
|
|
70
|
+
const unique = Object.keys(counter);
|
|
71
|
+
const n = arr.length;
|
|
72
|
+
const back = (cur) => {
|
|
73
|
+
if (cur.length === n) {
|
|
74
|
+
result.push([...cur]);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
for (const u of unique) {
|
|
78
|
+
if (counter[u] > 0) {
|
|
79
|
+
cur.push(u);
|
|
80
|
+
counter[u]--;
|
|
81
|
+
back(cur);
|
|
82
|
+
cur.pop();
|
|
83
|
+
counter[u]++;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
back([]);
|
|
88
|
+
return result;
|
|
89
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const factorial = (n) => {
|
|
2
|
+
if (n < 0 || n !== Math.floor(n))
|
|
3
|
+
return TypeError("n must be non-negative integer");
|
|
4
|
+
let r = 1;
|
|
5
|
+
for (let i = 2; i <= n; i++) r *= i;
|
|
6
|
+
return r;
|
|
7
|
+
};
|
|
8
|
+
export const double_factorial = (n) => {
|
|
9
|
+
if (n < 0 || n !== Math.floor(n))
|
|
10
|
+
return TypeError("n must be non-negative integer");
|
|
11
|
+
let r = 1;
|
|
12
|
+
for (let i = n; i > 1; i -= 2) r *= i;
|
|
13
|
+
return r;
|
|
14
|
+
};
|
|
15
|
+
export const falling = (n, k) => {
|
|
16
|
+
if (n !== Math.floor(n) || k !== Math.floor(k))
|
|
17
|
+
return TypeError("n,k must be integers");
|
|
18
|
+
if (k < 0) return 0;
|
|
19
|
+
let r = 1;
|
|
20
|
+
for (let i = 0; i < k; i++) r *= n - i;
|
|
21
|
+
return r;
|
|
22
|
+
};
|
|
23
|
+
export const rising = (n, k) => {
|
|
24
|
+
if (n !== Math.floor(n) || k !== Math.floor(k))
|
|
25
|
+
return TypeError("n,k must be integers");
|
|
26
|
+
if (k < 0) return 0;
|
|
27
|
+
let r = 1;
|
|
28
|
+
for (let i = 0; i < k; i++) r *= n + i;
|
|
29
|
+
return r;
|
|
30
|
+
};
|