@johnhenry/math 0.2.0 → 0.3.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/README.md +4 -3
- package/dist/Distributions.d.ts +86 -16
- package/dist/Distributions.d.ts.map +1 -1
- package/dist/Distributions.js +340 -89
- package/dist/Distributions.js.map +1 -1
- package/dist/EigenGeneral.d.ts +22 -0
- package/dist/EigenGeneral.d.ts.map +1 -0
- package/dist/EigenGeneral.js +327 -0
- package/dist/EigenGeneral.js.map +1 -0
- package/dist/Frobenius.d.ts +60 -0
- package/dist/Frobenius.d.ts.map +1 -0
- package/dist/Frobenius.js +162 -0
- package/dist/Frobenius.js.map +1 -0
- package/dist/Graph.d.ts +26 -0
- package/dist/Graph.d.ts.map +1 -1
- package/dist/Graph.js +75 -0
- package/dist/Graph.js.map +1 -1
- package/dist/MatrixMath.d.ts +10 -0
- package/dist/MatrixMath.d.ts.map +1 -1
- package/dist/MatrixMath.js +11 -0
- package/dist/MatrixMath.js.map +1 -1
- package/dist/MonteCarlo.d.ts +106 -0
- package/dist/MonteCarlo.d.ts.map +1 -0
- package/dist/MonteCarlo.js +183 -0
- package/dist/MonteCarlo.js.map +1 -0
- package/dist/Random.d.ts +31 -0
- package/dist/Random.d.ts.map +1 -0
- package/dist/Random.js +95 -0
- package/dist/Random.js.map +1 -0
- package/dist/Regression.d.ts +114 -0
- package/dist/Regression.d.ts.map +1 -0
- package/dist/Regression.js +338 -0
- package/dist/Regression.js.map +1 -0
- package/dist/SpecialFunctions.d.ts +3 -3
- package/dist/SpecialFunctions.d.ts.map +1 -1
- package/dist/SpecialFunctions.js +61 -51
- package/dist/SpecialFunctions.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/Distributions.ts +391 -94
- package/src/EigenGeneral.ts +342 -0
- package/src/Frobenius.ts +203 -0
- package/src/Graph.ts +68 -0
- package/src/MatrixMath.ts +13 -0
- package/src/MonteCarlo.ts +257 -0
- package/src/Random.ts +104 -0
- package/src/Regression.ts +423 -0
- package/src/SpecialFunctions.ts +52 -48
- package/src/index.ts +33 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { ComplexNumber } from "./ComplexNumber.js";
|
|
2
|
+
const zeros = (n) => Array.from({ length: n }, () => new Array(n).fill(0));
|
|
3
|
+
export function eigenGeneral(input, maxIterations = 60) {
|
|
4
|
+
const n = input.length;
|
|
5
|
+
if (n === 0)
|
|
6
|
+
return { values: [], vectors: [] };
|
|
7
|
+
const H = { re: zeros(n), im: zeros(n) };
|
|
8
|
+
for (let i = 0; i < n; i++) {
|
|
9
|
+
if (input[i].length !== n)
|
|
10
|
+
throw new Error("eigen requires a square matrix.");
|
|
11
|
+
for (let j = 0; j < n; j++) {
|
|
12
|
+
const v = input[i][j];
|
|
13
|
+
if (typeof v === "number")
|
|
14
|
+
H.re[i][j] = v;
|
|
15
|
+
else {
|
|
16
|
+
H.re[i][j] = v.re;
|
|
17
|
+
H.im[i][j] = v.im;
|
|
18
|
+
}
|
|
19
|
+
if (!Number.isFinite(H.re[i][j]) || !Number.isFinite(H.im[i][j]))
|
|
20
|
+
throw new Error("eigen requires finite matrix entries.");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const Z = { re: zeros(n), im: zeros(n) };
|
|
24
|
+
for (let i = 0; i < n; i++)
|
|
25
|
+
Z.re[i][i] = 1;
|
|
26
|
+
let norm = 0;
|
|
27
|
+
for (let i = 0; i < n; i++)
|
|
28
|
+
for (let j = 0; j < n; j++)
|
|
29
|
+
norm = Math.max(norm, Math.hypot(H.re[i][j], H.im[i][j]));
|
|
30
|
+
if (norm === 0)
|
|
31
|
+
norm = 1;
|
|
32
|
+
hessenberg(H, Z, n);
|
|
33
|
+
schur(H, Z, n, norm, maxIterations);
|
|
34
|
+
// eigenvalues & vectors
|
|
35
|
+
const tNorm = norm * n;
|
|
36
|
+
const lam = [];
|
|
37
|
+
for (let k = 0; k < n; k++)
|
|
38
|
+
lam.push([H.re[k][k], H.im[k][k]]);
|
|
39
|
+
const realTol = 1e-12 * norm;
|
|
40
|
+
const realInput = input.every((row) => row.every((v) => typeof v === "number" || v.im === 0));
|
|
41
|
+
const cols = [];
|
|
42
|
+
for (let k = 0; k < n; k++) {
|
|
43
|
+
// back-substitute (T - λ_k I) y = 0 with y_k = 1
|
|
44
|
+
const yr = new Array(n).fill(0);
|
|
45
|
+
const yi = new Array(n).fill(0);
|
|
46
|
+
yr[k] = 1;
|
|
47
|
+
for (let i = k - 1; i >= 0; i--) {
|
|
48
|
+
let sr = 0;
|
|
49
|
+
let si = 0;
|
|
50
|
+
for (let j = i + 1; j <= k; j++) {
|
|
51
|
+
sr += H.re[i][j] * yr[j] - H.im[i][j] * yi[j];
|
|
52
|
+
si += H.re[i][j] * yi[j] + H.im[i][j] * yr[j];
|
|
53
|
+
}
|
|
54
|
+
let dr = H.re[i][i] - lam[k][0];
|
|
55
|
+
let di = H.im[i][i] - lam[k][1];
|
|
56
|
+
if (Math.hypot(dr, di) < Number.EPSILON * tNorm) {
|
|
57
|
+
dr = Number.EPSILON * tNorm;
|
|
58
|
+
di = 0;
|
|
59
|
+
}
|
|
60
|
+
const d2 = dr * dr + di * di;
|
|
61
|
+
yr[i] = -(sr * dr + si * di) / d2;
|
|
62
|
+
yi[i] = -(si * dr - sr * di) / d2;
|
|
63
|
+
}
|
|
64
|
+
// v = Z y
|
|
65
|
+
const vre = new Array(n).fill(0);
|
|
66
|
+
const vim = new Array(n).fill(0);
|
|
67
|
+
for (let i = 0; i < n; i++) {
|
|
68
|
+
for (let j = 0; j <= k; j++) {
|
|
69
|
+
vre[i] += Z.re[i][j] * yr[j] - Z.im[i][j] * yi[j];
|
|
70
|
+
vim[i] += Z.re[i][j] * yi[j] + Z.im[i][j] * yr[j];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// unit norm, largest component real positive
|
|
74
|
+
let nrm = 0;
|
|
75
|
+
let big = 0;
|
|
76
|
+
let bigIdx = 0;
|
|
77
|
+
for (let i = 0; i < n; i++) {
|
|
78
|
+
const m = Math.hypot(vre[i], vim[i]);
|
|
79
|
+
nrm += m * m;
|
|
80
|
+
if (m > big * (1 + 1e-12)) {
|
|
81
|
+
big = m;
|
|
82
|
+
bigIdx = i;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
nrm = Math.sqrt(nrm);
|
|
86
|
+
const pr = vre[bigIdx] / big;
|
|
87
|
+
const pi = -vim[bigIdx] / big; // conj(phase)
|
|
88
|
+
for (let i = 0; i < n; i++) {
|
|
89
|
+
const r = (vre[i] * pr - vim[i] * pi) / nrm;
|
|
90
|
+
const m = (vre[i] * pi + vim[i] * pr) / nrm;
|
|
91
|
+
vre[i] = r;
|
|
92
|
+
vim[i] = m;
|
|
93
|
+
}
|
|
94
|
+
let lre = lam[k][0];
|
|
95
|
+
let lim = lam[k][1];
|
|
96
|
+
if (Math.abs(lim) <= realTol && realInput) {
|
|
97
|
+
lim = 0;
|
|
98
|
+
for (let i = 0; i < n; i++)
|
|
99
|
+
if (Math.abs(vim[i]) <= 1e-10)
|
|
100
|
+
vim[i] = 0;
|
|
101
|
+
}
|
|
102
|
+
if (lre === 0)
|
|
103
|
+
lre = 0; // normalise -0
|
|
104
|
+
cols.push({ lre, lim, vre, vim });
|
|
105
|
+
}
|
|
106
|
+
cols.sort((a, b) => (Math.abs(a.lre - b.lre) <= realTol ? b.lim - a.lim : b.lre - a.lre));
|
|
107
|
+
return {
|
|
108
|
+
values: cols.map((c) => new ComplexNumber(c.lre, c.lim)),
|
|
109
|
+
vectors: Array.from({ length: n }, (_, i) => cols.map((c) => new ComplexNumber(c.vre[i], c.vim[i]))),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Householder reduction to upper Hessenberg form, accumulating the unitary Z (`A = Z H Zᴴ`). */
|
|
113
|
+
function hessenberg(H, Z, n) {
|
|
114
|
+
for (let k = 0; k < n - 2; k++) {
|
|
115
|
+
let alpha = 0;
|
|
116
|
+
for (let i = k + 1; i < n; i++)
|
|
117
|
+
alpha += H.re[i][k] ** 2 + H.im[i][k] ** 2;
|
|
118
|
+
alpha = Math.sqrt(alpha);
|
|
119
|
+
if (alpha === 0)
|
|
120
|
+
continue;
|
|
121
|
+
const x0 = Math.hypot(H.re[k + 1][k], H.im[k + 1][k]);
|
|
122
|
+
// v = x + e^{i arg(x0)} alpha e1
|
|
123
|
+
const pr = x0 === 0 ? 1 : H.re[k + 1][k] / x0;
|
|
124
|
+
const pi = x0 === 0 ? 0 : H.im[k + 1][k] / x0;
|
|
125
|
+
const vr = new Array(n).fill(0);
|
|
126
|
+
const vi = new Array(n).fill(0);
|
|
127
|
+
for (let i = k + 1; i < n; i++) {
|
|
128
|
+
vr[i] = H.re[i][k];
|
|
129
|
+
vi[i] = H.im[i][k];
|
|
130
|
+
}
|
|
131
|
+
vr[k + 1] += pr * alpha;
|
|
132
|
+
vi[k + 1] += pi * alpha;
|
|
133
|
+
let vv = 0;
|
|
134
|
+
for (let i = k + 1; i < n; i++)
|
|
135
|
+
vv += vr[i] ** 2 + vi[i] ** 2;
|
|
136
|
+
if (vv === 0)
|
|
137
|
+
continue;
|
|
138
|
+
// H <- P H, P = I - 2 v vᴴ / vᴴv (rows k+1.., all columns)
|
|
139
|
+
for (let j = 0; j < n; j++) {
|
|
140
|
+
let sr = 0;
|
|
141
|
+
let si = 0;
|
|
142
|
+
for (let i = k + 1; i < n; i++) {
|
|
143
|
+
sr += vr[i] * H.re[i][j] + vi[i] * H.im[i][j];
|
|
144
|
+
si += vr[i] * H.im[i][j] - vi[i] * H.re[i][j];
|
|
145
|
+
}
|
|
146
|
+
sr = (2 * sr) / vv;
|
|
147
|
+
si = (2 * si) / vv;
|
|
148
|
+
for (let i = k + 1; i < n; i++) {
|
|
149
|
+
H.re[i][j] -= vr[i] * sr - vi[i] * si;
|
|
150
|
+
H.im[i][j] -= vr[i] * si + vi[i] * sr;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// H <- H P and Z <- Z P (columns k+1..)
|
|
154
|
+
for (const M of [H, Z]) {
|
|
155
|
+
for (let i = 0; i < n; i++) {
|
|
156
|
+
let sr = 0;
|
|
157
|
+
let si = 0;
|
|
158
|
+
for (let j = k + 1; j < n; j++) {
|
|
159
|
+
sr += M.re[i][j] * vr[j] - M.im[i][j] * vi[j];
|
|
160
|
+
si += M.re[i][j] * vi[j] + M.im[i][j] * vr[j];
|
|
161
|
+
}
|
|
162
|
+
sr = (2 * sr) / vv;
|
|
163
|
+
si = (2 * si) / vv;
|
|
164
|
+
for (let j = k + 1; j < n; j++) {
|
|
165
|
+
M.re[i][j] -= sr * vr[j] + si * vi[j];
|
|
166
|
+
M.im[i][j] -= si * vr[j] - sr * vi[j];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
for (let i = k + 2; i < n; i++) {
|
|
171
|
+
H.re[i][k] = 0;
|
|
172
|
+
H.im[i][k] = 0;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Shifted QR iteration on a Hessenberg matrix until upper triangular (complex Schur form). */
|
|
177
|
+
function schur(H, Z, n, norm, maxIterations) {
|
|
178
|
+
let hi = n - 1;
|
|
179
|
+
let iter = 0;
|
|
180
|
+
let total = 0;
|
|
181
|
+
while (hi > 0) {
|
|
182
|
+
// find the start of the active unreduced block
|
|
183
|
+
let l = hi;
|
|
184
|
+
while (l > 0) {
|
|
185
|
+
const s = Math.hypot(H.re[l - 1][l - 1], H.im[l - 1][l - 1]) + Math.hypot(H.re[l][l], H.im[l][l]);
|
|
186
|
+
const sub = Math.hypot(H.re[l][l - 1], H.im[l][l - 1]);
|
|
187
|
+
if (sub <= Number.EPSILON * (s === 0 ? norm : s)) {
|
|
188
|
+
H.re[l][l - 1] = 0;
|
|
189
|
+
H.im[l][l - 1] = 0;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
l--;
|
|
193
|
+
}
|
|
194
|
+
if (l === hi) {
|
|
195
|
+
hi--;
|
|
196
|
+
iter = 0;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (++iter > maxIterations)
|
|
200
|
+
throw new Error("eigen: QR iteration failed to converge.");
|
|
201
|
+
if (++total > 1000 * n)
|
|
202
|
+
throw new Error("eigen: QR iteration failed to converge.");
|
|
203
|
+
// Wilkinson shift: eigenvalue of the trailing 2x2 closer to H[hi][hi]
|
|
204
|
+
let mur;
|
|
205
|
+
let mui;
|
|
206
|
+
if (iter % 10 === 0) {
|
|
207
|
+
// exceptional shift
|
|
208
|
+
mur = H.re[hi][hi] + Math.hypot(H.re[hi][hi - 1], H.im[hi][hi - 1]);
|
|
209
|
+
mui = H.im[hi][hi];
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
const ar = H.re[hi - 1][hi - 1];
|
|
213
|
+
const ai = H.im[hi - 1][hi - 1];
|
|
214
|
+
const br = H.re[hi - 1][hi];
|
|
215
|
+
const bi = H.im[hi - 1][hi];
|
|
216
|
+
const cr = H.re[hi][hi - 1];
|
|
217
|
+
const ci = H.im[hi][hi - 1];
|
|
218
|
+
const dr = H.re[hi][hi];
|
|
219
|
+
const di = H.im[hi][hi];
|
|
220
|
+
// tr/2, disc = sqrt(((a-d)/2)^2 + bc)
|
|
221
|
+
const hr = (ar - dr) / 2;
|
|
222
|
+
const hiI = (ai - di) / 2;
|
|
223
|
+
const qr = hr * hr - hiI * hiI + (br * cr - bi * ci);
|
|
224
|
+
const qi = 2 * hr * hiI + (br * ci + bi * cr);
|
|
225
|
+
const qm = Math.hypot(qr, qi);
|
|
226
|
+
const sr = Math.sqrt((qm + qr) / 2);
|
|
227
|
+
const si = (qi < 0 ? -1 : 1) * Math.sqrt(Math.max(0, (qm - qr) / 2));
|
|
228
|
+
const mr = (ar + dr) / 2;
|
|
229
|
+
const mi = (ai + di) / 2;
|
|
230
|
+
const e1r = mr + sr;
|
|
231
|
+
const e1i = mi + si;
|
|
232
|
+
const e2r = mr - sr;
|
|
233
|
+
const e2i = mi - si;
|
|
234
|
+
if (Math.hypot(e1r - dr, e1i - di) <= Math.hypot(e2r - dr, e2i - di)) {
|
|
235
|
+
mur = e1r;
|
|
236
|
+
mui = e1i;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
mur = e2r;
|
|
240
|
+
mui = e2i;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
for (let i = l; i <= hi; i++) {
|
|
244
|
+
H.re[i][i] -= mur;
|
|
245
|
+
H.im[i][i] -= mui;
|
|
246
|
+
}
|
|
247
|
+
const rots = []; // [c, sr, si]
|
|
248
|
+
for (let k = l; k < hi; k++) {
|
|
249
|
+
const ar = H.re[k][k];
|
|
250
|
+
const ai = H.im[k][k];
|
|
251
|
+
const br = H.re[k + 1][k];
|
|
252
|
+
const bi = H.im[k + 1][k];
|
|
253
|
+
const am = Math.hypot(ar, ai);
|
|
254
|
+
const r = Math.hypot(am, Math.hypot(br, bi));
|
|
255
|
+
let c;
|
|
256
|
+
let sr;
|
|
257
|
+
let si;
|
|
258
|
+
if (r === 0) {
|
|
259
|
+
c = 1;
|
|
260
|
+
sr = 0;
|
|
261
|
+
si = 0;
|
|
262
|
+
}
|
|
263
|
+
else if (am === 0) {
|
|
264
|
+
c = 0;
|
|
265
|
+
// s = conj(b)/|b|
|
|
266
|
+
const bm = Math.hypot(br, bi);
|
|
267
|
+
sr = br / bm;
|
|
268
|
+
si = -bi / bm;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
c = am / r;
|
|
272
|
+
// s = (a/|a|) conj(b) / r
|
|
273
|
+
const pr = ar / am;
|
|
274
|
+
const pi = ai / am;
|
|
275
|
+
sr = (pr * br + pi * bi) / r;
|
|
276
|
+
si = (pi * br - pr * bi) / r;
|
|
277
|
+
}
|
|
278
|
+
rots.push([c, sr, si]);
|
|
279
|
+
// rows k, k+1 over columns k..n-1: [c s; -conj(s) c]
|
|
280
|
+
for (let j = k; j < n; j++) {
|
|
281
|
+
const xr = H.re[k][j];
|
|
282
|
+
const xi = H.im[k][j];
|
|
283
|
+
const yr = H.re[k + 1][j];
|
|
284
|
+
const yi = H.im[k + 1][j];
|
|
285
|
+
H.re[k][j] = c * xr + (sr * yr - si * yi);
|
|
286
|
+
H.im[k][j] = c * xi + (sr * yi + si * yr);
|
|
287
|
+
H.re[k + 1][j] = -(sr * xr + si * xi) + c * yr;
|
|
288
|
+
H.im[k + 1][j] = -(sr * xi - si * xr) + c * yi;
|
|
289
|
+
}
|
|
290
|
+
H.re[k + 1][k] = 0;
|
|
291
|
+
H.im[k + 1][k] = 0;
|
|
292
|
+
}
|
|
293
|
+
for (let idx = 0; idx < rots.length; idx++) {
|
|
294
|
+
const k = l + idx;
|
|
295
|
+
const [c, sr, si] = rots[idx];
|
|
296
|
+
const top = Math.min(hi, k + 1);
|
|
297
|
+
// columns k, k+1 over rows 0..top (H) and all rows (Z): multiply by Gᴴ = [c -s; conj(s) c]
|
|
298
|
+
for (const [M, rowEnd] of [
|
|
299
|
+
[H, top],
|
|
300
|
+
[Z, n - 1],
|
|
301
|
+
]) {
|
|
302
|
+
for (let i = 0; i <= rowEnd; i++) {
|
|
303
|
+
const xr = M.re[i][k];
|
|
304
|
+
const xi = M.im[i][k];
|
|
305
|
+
const yr = M.re[i][k + 1];
|
|
306
|
+
const yi = M.im[i][k + 1];
|
|
307
|
+
M.re[i][k] = c * xr + (yr * sr + yi * si);
|
|
308
|
+
M.im[i][k] = c * xi + (yi * sr - yr * si);
|
|
309
|
+
M.re[i][k + 1] = -(xr * sr - xi * si) + c * yr;
|
|
310
|
+
M.im[i][k + 1] = -(xr * si + xi * sr) + c * yi;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
for (let i = l; i <= hi; i++) {
|
|
315
|
+
H.re[i][i] += mur;
|
|
316
|
+
H.im[i][i] += mui;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// clear numerical dust below the diagonal
|
|
320
|
+
for (let i = 1; i < n; i++) {
|
|
321
|
+
for (let j = 0; j < i; j++) {
|
|
322
|
+
H.re[i][j] = 0;
|
|
323
|
+
H.im[i][j] = 0;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=EigenGeneral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EigenGeneral.js","sourceRoot":"","sources":["../src/EigenGeneral.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Rational } from "./Rational.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Two "Frobenius" normal forms.
|
|
4
|
+
*
|
|
5
|
+
* - {@link frobeniusNormalForm}: the *permutation* normal form of a square
|
|
6
|
+
* matrix (Frobenius / Perron-Frobenius block-triangular form). Treat the
|
|
7
|
+
* matrix as a weighted digraph (row `i` = node `i`'s out-edges, a non-zero
|
|
8
|
+
* entry = an edge); its strongly connected components, put in
|
|
9
|
+
* source-to-sink topological order, give a relabelling `P` for which
|
|
10
|
+
* `Pᵀ·A·P` is block upper triangular with an irreducible diagonal block per
|
|
11
|
+
* component. This is what mallory's matrix panel shows (`MAL-LIN-10`).
|
|
12
|
+
* - {@link rationalCanonicalForm}: the *similarity* normal form (Frobenius
|
|
13
|
+
* normal form in the algebraic sense): `A ~ diag(C(f₁), …, C(f_k))`,
|
|
14
|
+
* companion blocks of the invariant factors `f₁ | f₂ | … | f_k`, computed
|
|
15
|
+
* exactly over ℚ from the Smith normal form of `xI − A`.
|
|
16
|
+
*/
|
|
17
|
+
export type NumericMatrix = ReadonlyArray<ReadonlyArray<number>>;
|
|
18
|
+
export interface FrobeniusBlock {
|
|
19
|
+
/** The component's vertices as ORIGINAL matrix indices. */
|
|
20
|
+
component: number[];
|
|
21
|
+
/** Row/column range in `permuted` (inclusive start, exclusive end). */
|
|
22
|
+
start: number;
|
|
23
|
+
end: number;
|
|
24
|
+
}
|
|
25
|
+
export interface FrobeniusResult {
|
|
26
|
+
/** `order[i]` = the original index now at permuted position `i`. */
|
|
27
|
+
order: number[];
|
|
28
|
+
/** Permutation matrix with `Pᵀ·matrix·P === permuted`. */
|
|
29
|
+
P: number[][];
|
|
30
|
+
/** `matrix` reindexed by `order` on both axes: block upper triangular. */
|
|
31
|
+
permuted: number[][];
|
|
32
|
+
/** One entry per strongly connected component, source to sink. */
|
|
33
|
+
blocks: FrobeniusBlock[];
|
|
34
|
+
/** True when the whole matrix is a single strongly connected component. */
|
|
35
|
+
irreducible: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The block-triangular (permutation) Frobenius normal form of a square matrix.
|
|
39
|
+
* Diagonal entries are self-loops and never affect the component structure.
|
|
40
|
+
* Within a component, original index order is the (deterministic) tiebreak.
|
|
41
|
+
*/
|
|
42
|
+
export declare function frobeniusNormalForm(matrix: NumericMatrix): FrobeniusResult;
|
|
43
|
+
export interface RationalCanonicalResult {
|
|
44
|
+
/** Monic invariant factors `f₁ | f₂ | … | f_k` (non-constant only), each as coefficients lowest degree first. */
|
|
45
|
+
invariantFactors: Rational[][];
|
|
46
|
+
/** Block diagonal of the companion matrices of `invariantFactors` (n×n, exact). */
|
|
47
|
+
form: Rational[][];
|
|
48
|
+
/** The blocks' sizes (the degrees of the invariant factors). */
|
|
49
|
+
blockSizes: number[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Rational canonical form (Frobenius normal form in the similarity sense) of a
|
|
53
|
+
* square matrix with integer or {@link Rational} entries, exact over ℚ.
|
|
54
|
+
* `invariantFactors` multiply to the characteristic polynomial and the last is
|
|
55
|
+
* the minimal polynomial. Each companion block `C(f)` for
|
|
56
|
+
* `f = xᵏ + c_{k-1}x^{k-1} + … + c₀` has ones on the subdiagonal and last
|
|
57
|
+
* column `(-c₀, …, -c_{k-1})ᵀ`. The similarity transform itself is not returned.
|
|
58
|
+
*/
|
|
59
|
+
export declare function rationalCanonicalForm(matrix: ReadonlyArray<ReadonlyArray<number | bigint | Rational>>): RationalCanonicalResult;
|
|
60
|
+
//# sourceMappingURL=Frobenius.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Frobenius.d.ts","sourceRoot":"","sources":["../src/Frobenius.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0DAA0D;IAC1D,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IACd,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;IACrB,kEAAkE;IAClE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CA4B1E;AA2FD,MAAM,WAAW,uBAAuB;IACtC,iHAAiH;IACjH,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;IAC/B,mFAAmF;IACnF,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;IACnB,gEAAgE;IAChE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,GAC/D,uBAAuB,CAiBzB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { Graph } from "./Graph.js";
|
|
2
|
+
import { Rational } from "./Rational.js";
|
|
3
|
+
/**
|
|
4
|
+
* The block-triangular (permutation) Frobenius normal form of a square matrix.
|
|
5
|
+
* Diagonal entries are self-loops and never affect the component structure.
|
|
6
|
+
* Within a component, original index order is the (deterministic) tiebreak.
|
|
7
|
+
*/
|
|
8
|
+
export function frobeniusNormalForm(matrix) {
|
|
9
|
+
const n = matrix.length;
|
|
10
|
+
for (const row of matrix) {
|
|
11
|
+
if (row.length !== n)
|
|
12
|
+
throw new Error(`frobeniusNormalForm requires a square matrix (got a ${n}-row matrix with a ${row.length}-entry row).`);
|
|
13
|
+
}
|
|
14
|
+
const graph = new Graph(true);
|
|
15
|
+
for (let i = 0; i < n; i++)
|
|
16
|
+
graph.addVertex(i);
|
|
17
|
+
for (let i = 0; i < n; i++)
|
|
18
|
+
for (let j = 0; j < n; j++)
|
|
19
|
+
if (matrix[i][j] !== 0)
|
|
20
|
+
graph.addEdge(i, j, matrix[i][j]);
|
|
21
|
+
const { graph: dag, components } = graph.condensation();
|
|
22
|
+
const topo = dag.topologicalSort();
|
|
23
|
+
if (!topo)
|
|
24
|
+
throw new Error("frobeniusNormalForm: condensation unexpectedly has a cycle.");
|
|
25
|
+
const order = [];
|
|
26
|
+
const blocks = [];
|
|
27
|
+
for (const c of topo) {
|
|
28
|
+
const component = [...components[c]].sort((a, b) => a - b);
|
|
29
|
+
const start = order.length;
|
|
30
|
+
order.push(...component);
|
|
31
|
+
blocks.push({ component, start, end: order.length });
|
|
32
|
+
}
|
|
33
|
+
const permuted = order.map((oi) => order.map((oj) => matrix[oi][oj]));
|
|
34
|
+
const P = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
35
|
+
for (let i = 0; i < n; i++)
|
|
36
|
+
P[order[i]][i] = 1;
|
|
37
|
+
return { order, P, permuted, blocks, irreducible: components.length === 1 };
|
|
38
|
+
}
|
|
39
|
+
const trim = (p) => {
|
|
40
|
+
let n = p.length;
|
|
41
|
+
while (n > 0 && p[n - 1].isZero())
|
|
42
|
+
n--;
|
|
43
|
+
return p.slice(0, n);
|
|
44
|
+
};
|
|
45
|
+
const deg = (p) => p.length - 1;
|
|
46
|
+
const padd = (a, b) => trim(Array.from({ length: Math.max(a.length, b.length) }, (_, i) => (a[i] ?? Rational.Zero).add(b[i] ?? Rational.Zero)));
|
|
47
|
+
const pneg = (a) => a.map((c) => c.negate());
|
|
48
|
+
const pmul = (a, b) => {
|
|
49
|
+
if (!a.length || !b.length)
|
|
50
|
+
return [];
|
|
51
|
+
const out = Array.from({ length: a.length + b.length - 1 }, () => Rational.Zero);
|
|
52
|
+
for (let i = 0; i < a.length; i++)
|
|
53
|
+
for (let j = 0; j < b.length; j++)
|
|
54
|
+
out[i + j] = out[i + j].add(a[i].multiply(b[j]));
|
|
55
|
+
return trim(out);
|
|
56
|
+
};
|
|
57
|
+
/** Polynomial division with remainder (`b` non-zero). */
|
|
58
|
+
const pdivmod = (a, b) => {
|
|
59
|
+
let r = [...a];
|
|
60
|
+
const q = Array.from({ length: Math.max(0, a.length - b.length + 1) }, () => Rational.Zero);
|
|
61
|
+
const lead = b[b.length - 1];
|
|
62
|
+
while (r.length >= b.length) {
|
|
63
|
+
const c = r[r.length - 1].divide(lead);
|
|
64
|
+
const d = r.length - b.length;
|
|
65
|
+
q[d] = c;
|
|
66
|
+
r = trim(r.map((x, i) => (i >= d ? x.subtract(c.multiply(b[i - d])) : x)));
|
|
67
|
+
}
|
|
68
|
+
return { q: trim(q), r };
|
|
69
|
+
};
|
|
70
|
+
const monic = (p) => (p.length ? p.map((c) => c.divide(p[p.length - 1])) : p);
|
|
71
|
+
/** Smith normal form diagonal of a polynomial matrix, as monic polynomials (zero entries stay zero). */
|
|
72
|
+
function smithDiagonal(M) {
|
|
73
|
+
const n = M.length;
|
|
74
|
+
for (let t = 0; t < n; t++) {
|
|
75
|
+
for (;;) {
|
|
76
|
+
// pivot: non-zero entry of least degree in the trailing submatrix
|
|
77
|
+
let pi = -1;
|
|
78
|
+
let pj = -1;
|
|
79
|
+
for (let i = t; i < n; i++) {
|
|
80
|
+
for (let j = t; j < n; j++) {
|
|
81
|
+
if (M[i][j].length && (pi < 0 || deg(M[i][j]) < deg(M[pi][pj]))) {
|
|
82
|
+
pi = i;
|
|
83
|
+
pj = j;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (pi < 0)
|
|
88
|
+
return M.map((row, i) => (i < t ? monic(row[i]) : [])).concat([]);
|
|
89
|
+
[M[t], M[pi]] = [M[pi], M[t]];
|
|
90
|
+
for (const row of M)
|
|
91
|
+
[row[t], row[pj]] = [row[pj], row[t]];
|
|
92
|
+
const p = M[t][t];
|
|
93
|
+
let dirty = false;
|
|
94
|
+
for (let i = t + 1; i < n; i++) {
|
|
95
|
+
if (!M[i][t].length)
|
|
96
|
+
continue;
|
|
97
|
+
const { q } = pdivmod(M[i][t], p);
|
|
98
|
+
for (let j = t; j < n; j++)
|
|
99
|
+
M[i][j] = padd(M[i][j], pneg(pmul(q, M[t][j])));
|
|
100
|
+
if (M[i][t].length)
|
|
101
|
+
dirty = true;
|
|
102
|
+
}
|
|
103
|
+
for (let j = t + 1; j < n; j++) {
|
|
104
|
+
if (!M[t][j].length)
|
|
105
|
+
continue;
|
|
106
|
+
const { q } = pdivmod(M[t][j], p);
|
|
107
|
+
for (let i = t; i < n; i++)
|
|
108
|
+
M[i][j] = padd(M[i][j], pneg(pmul(q, M[i][t])));
|
|
109
|
+
if (M[t][j].length)
|
|
110
|
+
dirty = true;
|
|
111
|
+
}
|
|
112
|
+
if (dirty)
|
|
113
|
+
continue; // a smaller-degree remainder appeared: re-pivot
|
|
114
|
+
// pivot must divide everything left; if not, fold the offending row in
|
|
115
|
+
let bad = -1;
|
|
116
|
+
for (let i = t + 1; i < n && bad < 0; i++) {
|
|
117
|
+
for (let j = t + 1; j < n; j++) {
|
|
118
|
+
if (M[i][j].length && pdivmod(M[i][j], p).r.length) {
|
|
119
|
+
bad = i;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (bad < 0)
|
|
125
|
+
break;
|
|
126
|
+
for (let j = t; j < n; j++)
|
|
127
|
+
M[t][j] = padd(M[t][j], M[bad][j]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return M.map((row, i) => monic(row[i]));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Rational canonical form (Frobenius normal form in the similarity sense) of a
|
|
134
|
+
* square matrix with integer or {@link Rational} entries, exact over ℚ.
|
|
135
|
+
* `invariantFactors` multiply to the characteristic polynomial and the last is
|
|
136
|
+
* the minimal polynomial. Each companion block `C(f)` for
|
|
137
|
+
* `f = xᵏ + c_{k-1}x^{k-1} + … + c₀` has ones on the subdiagonal and last
|
|
138
|
+
* column `(-c₀, …, -c_{k-1})ᵀ`. The similarity transform itself is not returned.
|
|
139
|
+
*/
|
|
140
|
+
export function rationalCanonicalForm(matrix) {
|
|
141
|
+
const n = matrix.length;
|
|
142
|
+
for (const row of matrix)
|
|
143
|
+
if (row.length !== n)
|
|
144
|
+
throw new Error("rationalCanonicalForm requires a square matrix.");
|
|
145
|
+
const A = matrix.map((row) => row.map((v) => Rational.from(v)));
|
|
146
|
+
// xI - A as a polynomial matrix
|
|
147
|
+
const M = A.map((row, i) => row.map((a, j) => trim(i === j ? [a.negate(), Rational.One] : [a.negate()])));
|
|
148
|
+
const diag = smithDiagonal(M);
|
|
149
|
+
const factors = diag.filter((p) => p.length > 1);
|
|
150
|
+
const form = Array.from({ length: n }, () => Array.from({ length: n }, () => Rational.Zero));
|
|
151
|
+
let off = 0;
|
|
152
|
+
for (const f of factors) {
|
|
153
|
+
const k = deg(f);
|
|
154
|
+
for (let i = 1; i < k; i++)
|
|
155
|
+
form[off + i][off + i - 1] = Rational.One;
|
|
156
|
+
for (let i = 0; i < k; i++)
|
|
157
|
+
form[off + i][off + k - 1] = f[i].negate();
|
|
158
|
+
off += k;
|
|
159
|
+
}
|
|
160
|
+
return { invariantFactors: factors, form, blockSizes: factors.map(deg) };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=Frobenius.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Frobenius.js","sourceRoot":"","sources":["../src/Frobenius.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAyCzC;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,uDAAuD,CAAC,sBAAsB,GAAG,CAAC,MAAM,cAAc,CACvG,CAAC;IACN,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElH,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAE1F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAC9E,CAAC;AAOD,MAAM,IAAI,GAAG,CAAC,CAAO,EAAQ,EAAE;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,CAAC;IACvC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC;AACF,MAAM,GAAG,GAAG,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACtC,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,CAAO,EAAQ,EAAE,CACtC,IAAI,CACF,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CACnH,CAAC;AACJ,MAAM,IAAI,GAAG,CAAC,CAAO,EAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,CAAO,EAAQ,EAAE;IACtC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACtC,MAAM,GAAG,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AACF,yDAAyD;AACzD,MAAM,OAAO,GAAG,CAAC,CAAO,EAAE,CAAO,EAAwB,EAAE;IACzD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACf,MAAM,CAAC,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACT,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3B,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,CAAO,EAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1F,wGAAwG;AACxG,SAAS,aAAa,CAAC,CAAW;IAChC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,SAAS,CAAC;YACR,kEAAkE;YAClE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChE,EAAE,GAAG,CAAC,CAAC;wBACP,EAAE,GAAG,CAAC,CAAC;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,EAAE,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,CAAC;gBAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAAE,SAAS;gBAC9B,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAAE,KAAK,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAAE,SAAS;gBAC9B,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;oBAAE,KAAK,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,IAAI,KAAK;gBAAE,SAAS,CAAC,gDAAgD;YACrE,uEAAuE;YACvE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;wBACnD,GAAG,GAAG,CAAC,CAAC;wBACR,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAgE;IAEhE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,MAAM;QAAE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACnH,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,gCAAgC;IAChC,MAAM,CAAC,GAAa,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAiB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3G,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACvE,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3E,CAAC"}
|
package/dist/Graph.d.ts
CHANGED
|
@@ -47,6 +47,32 @@ export declare class Graph<T = string | number> {
|
|
|
47
47
|
hasCycle(): boolean;
|
|
48
48
|
/** Minimum spanning tree (Kruskal) of an undirected graph, as a list of edges. */
|
|
49
49
|
minimumSpanningTree(): Array<Edge<T>>;
|
|
50
|
+
/**
|
|
51
|
+
* Minimum spanning tree (or forest, when the graph is disconnected) with
|
|
52
|
+
* its total weight and the number of connected components. Edge direction
|
|
53
|
+
* is ignored. `algorithm` picks Kruskal (default, sort + union-find) or
|
|
54
|
+
* Prim (heap-based, grown from each unvisited vertex in turn); both give
|
|
55
|
+
* the same total weight, though tie-broken edge choices may differ.
|
|
56
|
+
*/
|
|
57
|
+
mst(algorithm?: "kruskal" | "prim"): {
|
|
58
|
+
edges: Array<Edge<T>>;
|
|
59
|
+
totalWeight: number;
|
|
60
|
+
components: number;
|
|
61
|
+
};
|
|
62
|
+
/** Alias of {@link stronglyConnectedComponents} (Tarjan; components in reverse topological order). */
|
|
63
|
+
scc(): T[][];
|
|
64
|
+
/**
|
|
65
|
+
* The condensation: one vertex per strongly connected component (numbered
|
|
66
|
+
* by position in {@link scc}'s output), with one weight-1 edge `i -> j`
|
|
67
|
+
* wherever the original graph has any edge from a member of `i` to a
|
|
68
|
+
* member of `j`. Always a DAG. Also returns the `components` and the
|
|
69
|
+
* `componentOf` vertex-to-index map.
|
|
70
|
+
*/
|
|
71
|
+
condensation(): {
|
|
72
|
+
graph: Graph<number>;
|
|
73
|
+
components: T[][];
|
|
74
|
+
componentOf: Map<T, number>;
|
|
75
|
+
};
|
|
50
76
|
/** Adjacency matrix (rows/cols follow the returned `order`; `Infinity` = no edge). */
|
|
51
77
|
toAdjacencyMatrix(): {
|
|
52
78
|
matrix: number[][];
|
package/dist/Graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../src/Graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,CAAC,CAAC;IACN,MAAM,EAAE,MAAM,CAAC;CAChB;AAoDD,qBAAa,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE9C,QAAQ,UAAQ;IAI5B,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;IAKrB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,SAAI,GAAG,IAAI;IAOrC,QAAQ,IAAI,CAAC,EAAE;IAIf,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;IAIpB,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAgBvB,kDAAkD;IAClD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAgBlB,gDAAgD;IAChD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAYlB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IA2BnB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;IAIlC,uEAAuE;IACvE,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE;IAY/D,gDAAgD;IAChD,mBAAmB,IAAI,CAAC,EAAE,EAAE;IAY5B,uEAAuE;IACvE,eAAe,IAAI,CAAC,EAAE,GAAG,IAAI;IAiB7B,4CAA4C;IAC5C,QAAQ,IAAI,OAAO;IAgBnB,kFAAkF;IAClF,mBAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAsBrC,sFAAsF;IACtF,iBAAiB,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;IAavD;;;;;;;;;OASG;IACH,2BAA2B,IAAI,CAAC,EAAE,EAAE;IAwCpC,sDAAsD;IACtD,aAAa,IAAI;QAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;CASvD"}
|
|
1
|
+
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../src/Graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,EAAE,CAAC,CAAC;IACN,MAAM,EAAE,MAAM,CAAC;CAChB;AAoDD,qBAAa,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;gBAE9C,QAAQ,UAAQ;IAI5B,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;IAKrB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,SAAI,GAAG,IAAI;IAOrC,QAAQ,IAAI,CAAC,EAAE;IAIf,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE;IAIpB,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAgBvB,kDAAkD;IAClD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAgBlB,gDAAgD;IAChD,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE;IAYlB;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW;IA2BnB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;IAIlC,uEAAuE;IACvE,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE;IAY/D,gDAAgD;IAChD,mBAAmB,IAAI,CAAC,EAAE,EAAE;IAY5B,uEAAuE;IACvE,eAAe,IAAI,CAAC,EAAE,GAAG,IAAI;IAiB7B,4CAA4C;IAC5C,QAAQ,IAAI,OAAO;IAgBnB,kFAAkF;IAClF,mBAAmB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAsBrC;;;;;;OAMG;IACH,GAAG,CAAC,SAAS,GAAE,SAAS,GAAG,MAAkB,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAgClH,sGAAsG;IACtG,GAAG,IAAI,CAAC,EAAE,EAAE;IAIZ;;;;;;OAMG;IACH,YAAY,IAAI;QAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;KAAE;IAiBxF,sFAAsF;IACtF,iBAAiB,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;IAavD;;;;;;;;;OASG;IACH,2BAA2B,IAAI,CAAC,EAAE,EAAE;IAwCpC,sDAAsD;IACtD,aAAa,IAAI;QAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;QAAC,KAAK,EAAE,CAAC,EAAE,CAAA;KAAE;CASvD"}
|