@johnhenry/math 0.1.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.
Files changed (62) hide show
  1. package/README.md +5 -4
  2. package/dist/Distributions.d.ts +86 -16
  3. package/dist/Distributions.d.ts.map +1 -1
  4. package/dist/Distributions.js +340 -89
  5. package/dist/Distributions.js.map +1 -1
  6. package/dist/EigenGeneral.d.ts +22 -0
  7. package/dist/EigenGeneral.d.ts.map +1 -0
  8. package/dist/EigenGeneral.js +327 -0
  9. package/dist/EigenGeneral.js.map +1 -0
  10. package/dist/Frobenius.d.ts +60 -0
  11. package/dist/Frobenius.d.ts.map +1 -0
  12. package/dist/Frobenius.js +162 -0
  13. package/dist/Frobenius.js.map +1 -0
  14. package/dist/Graph.d.ts +26 -0
  15. package/dist/Graph.d.ts.map +1 -1
  16. package/dist/Graph.js +75 -0
  17. package/dist/Graph.js.map +1 -1
  18. package/dist/MatrixMath.d.ts +10 -0
  19. package/dist/MatrixMath.d.ts.map +1 -1
  20. package/dist/MatrixMath.js +11 -0
  21. package/dist/MatrixMath.js.map +1 -1
  22. package/dist/MonteCarlo.d.ts +106 -0
  23. package/dist/MonteCarlo.d.ts.map +1 -0
  24. package/dist/MonteCarlo.js +183 -0
  25. package/dist/MonteCarlo.js.map +1 -0
  26. package/dist/Random.d.ts +31 -0
  27. package/dist/Random.d.ts.map +1 -0
  28. package/dist/Random.js +95 -0
  29. package/dist/Random.js.map +1 -0
  30. package/dist/Regression.d.ts +114 -0
  31. package/dist/Regression.d.ts.map +1 -0
  32. package/dist/Regression.js +338 -0
  33. package/dist/Regression.js.map +1 -0
  34. package/dist/Shader.d.ts +41 -0
  35. package/dist/Shader.d.ts.map +1 -0
  36. package/dist/Shader.js +758 -0
  37. package/dist/Shader.js.map +1 -0
  38. package/dist/SpecialFunctions.d.ts +3 -3
  39. package/dist/SpecialFunctions.d.ts.map +1 -1
  40. package/dist/SpecialFunctions.js +61 -51
  41. package/dist/SpecialFunctions.js.map +1 -1
  42. package/dist/Symbolic.d.ts +12 -0
  43. package/dist/Symbolic.d.ts.map +1 -1
  44. package/dist/Symbolic.js +16 -0
  45. package/dist/Symbolic.js.map +1 -1
  46. package/dist/index.d.ts +7 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +5 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/Distributions.ts +391 -94
  52. package/src/EigenGeneral.ts +342 -0
  53. package/src/Frobenius.ts +203 -0
  54. package/src/Graph.ts +68 -0
  55. package/src/MatrixMath.ts +13 -0
  56. package/src/MonteCarlo.ts +257 -0
  57. package/src/Random.ts +104 -0
  58. package/src/Regression.ts +423 -0
  59. package/src/Shader.ts +837 -0
  60. package/src/SpecialFunctions.ts +52 -48
  61. package/src/Symbolic.ts +18 -0
  62. package/src/index.ts +34 -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":"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"}
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[][];
@@ -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"}