Repository navigation
Commit 5351d0c
authored
The determinant is computed by fraction-free elimination where it can be (#1129)
`Matrix.Determinant` expanded by Laplace, which is O(n!). For a fully symbolic matrix that is
optimal -- the determinant genuinely has n! terms and no algorithm returns it smaller in expanded
form. For a numeric one it is pure waste: the answer is a single number and O(n^3) work suffices.
Bareiss' fraction-free elimination now runs wherever the entries are polynomials over the rationals,
and Laplace answers everything else. What decides it is not the size but whether the entries can be
read, settled per matrix by trying -- a 12x12 with two variables and a 4x4 with sixteen are different
problems and n alone does not tell them apart.
Numeric, both arms built from source on one machine: 8x8 from 382 ms to under 1 ms, 10x10 from
14 415 ms to 2 ms, and 11x11, 12x12, 20x20 and 30x30 from not returning at all to 2, 3, 11 and 22 ms.
**The elimination was already here.** `PolynomialResultant.SylvesterDeterminant` is a Bareiss
elimination over `MultivariatePolynomial`, written for the Sylvester matrix and carrying everything
this needs: exact division, row swaps, sign tracking, a work budget and a cancellation check. It is
split into `FractionFreeDeterminant` and shared rather than written twice, which is worth saying out
loud: a sign convention or an off-by-one in an elimination is a wrong answer that looks entirely
plausible, and one implementation exercised by two callers is tested by both.
**No condition is introduced.** The issue is right that this is the thing to check rather than argue:
exactness is a fact about the ring, and `Entity` division would not notice it -- `(a * b) / a` stays
written as a quotient. The arithmetic here never touches `Entity` division. It happens in
`MultivariatePolynomial`, which has no quotients to leave behind, and `DivideExact` returns null
rather than a remainder, so a division that does not come out stops the elimination and sends the
caller to Laplace. The answer is a polynomial in the entries, or it is Laplace's.
Declined, and answered by Laplace exactly as before: an entry that is not a polynomial over the
rationals, a matrix in more than eight indeterminates, and a matrix mentioning `e` or `pi`, since a
constant is a value rather than an indeterminate and this ring cannot hold one.
The printed form of a symbolic determinant changes, because an elimination produces an expanded
polynomial where Laplace produces a nested one. Recorded in BREAKING-CHANGES.md with the shapes
measured on both arms; the expression is no larger in any case measured, and `x * (x ^ 2 + -1) + -x`
becomes `x ^ 3 - 2 * x`.
The two algorithms are compared on 300 generated matrices where both apply, as a difference
simplified to zero rather than as trees -- they group the same polynomial differently and that is not
a disagreement. No disagreements. The comparison also asserts that it read more than a third of what
it generated, so a change making the elimination decline everything fails rather than passes
vacuously.
Part of #999.1 parent 7a68049 commit 5351d0c
7 files changed
Lines changed: 539 additions & 59 deletions
File tree
- Sources
- AngouriMath
- Core/Entity/Omni
- Functions/Algebra/Polynomials
- Tests/UnitTests/Algebra/Polynomials
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
| 32 | + | |
31 | 33 | | |
32 | 34 | | |
33 | 35 | | |
| |||
848 | 850 | | |
849 | 851 | | |
850 | 852 | | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
851 | 904 | | |
852 | 905 | | |
853 | 906 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
54 | 63 | | |
55 | 64 | | |
56 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
270 | 270 | | |
271 | 271 | | |
272 | 272 | | |
273 | | - | |
274 | | - | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
279 | | - | |
280 | | - | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
281 | 285 | | |
282 | 286 | | |
283 | | - | |
| 287 | + | |
| 288 | + | |
284 | 289 | | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
285 | 296 | | |
286 | | - | |
| 297 | + | |
287 | 298 | | |
288 | | - | |
| 299 | + | |
289 | 300 | | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
290 | 304 | | |
291 | 305 | | |
292 | 306 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
0 commit comments