@johnhenry/math 0.0.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 (242) hide show
  1. package/README.md +165 -0
  2. package/dist/Bivector4.d.ts +52 -0
  3. package/dist/Bivector4.d.ts.map +1 -0
  4. package/dist/Bivector4.js +105 -0
  5. package/dist/Bivector4.js.map +1 -0
  6. package/dist/CellGraph.d.ts +259 -0
  7. package/dist/CellGraph.d.ts.map +1 -0
  8. package/dist/CellGraph.js +637 -0
  9. package/dist/CellGraph.js.map +1 -0
  10. package/dist/Clifford4Internal.d.ts +35 -0
  11. package/dist/Clifford4Internal.d.ts.map +1 -0
  12. package/dist/Clifford4Internal.js +86 -0
  13. package/dist/Clifford4Internal.js.map +1 -0
  14. package/dist/Combinatorics.d.ts +61 -0
  15. package/dist/Combinatorics.d.ts.map +1 -0
  16. package/dist/Combinatorics.js +186 -0
  17. package/dist/Combinatorics.js.map +1 -0
  18. package/dist/CombinatoricsGenerators.d.ts +44 -0
  19. package/dist/CombinatoricsGenerators.d.ts.map +1 -0
  20. package/dist/CombinatoricsGenerators.js +148 -0
  21. package/dist/CombinatoricsGenerators.js.map +1 -0
  22. package/dist/ComplexMath.d.ts +46 -0
  23. package/dist/ComplexMath.d.ts.map +1 -0
  24. package/dist/ComplexMath.js +98 -0
  25. package/dist/ComplexMath.js.map +1 -0
  26. package/dist/ComplexNumber.d.ts +174 -0
  27. package/dist/ComplexNumber.d.ts.map +1 -0
  28. package/dist/ComplexNumber.js +443 -0
  29. package/dist/ComplexNumber.js.map +1 -0
  30. package/dist/Cycle.d.ts +42 -0
  31. package/dist/Cycle.d.ts.map +1 -0
  32. package/dist/Cycle.js +120 -0
  33. package/dist/Cycle.js.map +1 -0
  34. package/dist/Decimal.d.ts +45 -0
  35. package/dist/Decimal.d.ts.map +1 -0
  36. package/dist/Decimal.js +135 -0
  37. package/dist/Decimal.js.map +1 -0
  38. package/dist/Distributions.d.ts +55 -0
  39. package/dist/Distributions.d.ts.map +1 -0
  40. package/dist/Distributions.js +222 -0
  41. package/dist/Distributions.js.map +1 -0
  42. package/dist/DualNumber.d.ts +42 -0
  43. package/dist/DualNumber.d.ts.map +1 -0
  44. package/dist/DualNumber.js +91 -0
  45. package/dist/DualNumber.js.map +1 -0
  46. package/dist/Environment.d.ts +44 -0
  47. package/dist/Environment.d.ts.map +1 -0
  48. package/dist/Environment.js +129 -0
  49. package/dist/Environment.js.map +1 -0
  50. package/dist/Expression.d.ts +19 -0
  51. package/dist/Expression.d.ts.map +1 -0
  52. package/dist/Expression.js +43 -0
  53. package/dist/Expression.js.map +1 -0
  54. package/dist/FFT.d.ts +21 -0
  55. package/dist/FFT.d.ts.map +1 -0
  56. package/dist/FFT.js +136 -0
  57. package/dist/FFT.js.map +1 -0
  58. package/dist/GeometricAlgebra4.d.ts +73 -0
  59. package/dist/GeometricAlgebra4.d.ts.map +1 -0
  60. package/dist/GeometricAlgebra4.js +115 -0
  61. package/dist/GeometricAlgebra4.js.map +1 -0
  62. package/dist/Geometry.d.ts +41 -0
  63. package/dist/Geometry.d.ts.map +1 -0
  64. package/dist/Geometry.js +167 -0
  65. package/dist/Geometry.js.map +1 -0
  66. package/dist/Graph.d.ts +72 -0
  67. package/dist/Graph.d.ts.map +1 -0
  68. package/dist/Graph.js +337 -0
  69. package/dist/Graph.js.map +1 -0
  70. package/dist/Graph3DUtils.d.ts +80 -0
  71. package/dist/Graph3DUtils.d.ts.map +1 -0
  72. package/dist/Graph3DUtils.js +156 -0
  73. package/dist/Graph3DUtils.js.map +1 -0
  74. package/dist/GraphUtils.d.ts +67 -0
  75. package/dist/GraphUtils.d.ts.map +1 -0
  76. package/dist/GraphUtils.js +72 -0
  77. package/dist/GraphUtils.js.map +1 -0
  78. package/dist/GroupTheory.d.ts +73 -0
  79. package/dist/GroupTheory.d.ts.map +1 -0
  80. package/dist/GroupTheory.js +194 -0
  81. package/dist/GroupTheory.js.map +1 -0
  82. package/dist/IntUtils.d.ts +33 -0
  83. package/dist/IntUtils.d.ts.map +1 -0
  84. package/dist/IntUtils.js +185 -0
  85. package/dist/IntUtils.js.map +1 -0
  86. package/dist/Interval.d.ts +44 -0
  87. package/dist/Interval.d.ts.map +1 -0
  88. package/dist/Interval.js +165 -0
  89. package/dist/Interval.js.map +1 -0
  90. package/dist/Lattice.d.ts +48 -0
  91. package/dist/Lattice.d.ts.map +1 -0
  92. package/dist/Lattice.js +65 -0
  93. package/dist/Lattice.js.map +1 -0
  94. package/dist/Logic.d.ts +22 -0
  95. package/dist/Logic.d.ts.map +1 -0
  96. package/dist/Logic.js +34 -0
  97. package/dist/Logic.js.map +1 -0
  98. package/dist/MatrixMath.d.ts +71 -0
  99. package/dist/MatrixMath.d.ts.map +1 -0
  100. package/dist/MatrixMath.js +302 -0
  101. package/dist/MatrixMath.js.map +1 -0
  102. package/dist/NumberTheory.d.ts +49 -0
  103. package/dist/NumberTheory.d.ts.map +1 -0
  104. package/dist/NumberTheory.js +230 -0
  105. package/dist/NumberTheory.js.map +1 -0
  106. package/dist/Numerical.d.ts +85 -0
  107. package/dist/Numerical.d.ts.map +1 -0
  108. package/dist/Numerical.js +343 -0
  109. package/dist/Numerical.js.map +1 -0
  110. package/dist/Permutation.d.ts +43 -0
  111. package/dist/Permutation.d.ts.map +1 -0
  112. package/dist/Permutation.js +142 -0
  113. package/dist/Permutation.js.map +1 -0
  114. package/dist/Polygon.d.ts +64 -0
  115. package/dist/Polygon.d.ts.map +1 -0
  116. package/dist/Polygon.js +221 -0
  117. package/dist/Polygon.js.map +1 -0
  118. package/dist/PolynomialRing.d.ts +74 -0
  119. package/dist/PolynomialRing.d.ts.map +1 -0
  120. package/dist/PolynomialRing.js +231 -0
  121. package/dist/PolynomialRing.js.map +1 -0
  122. package/dist/Quaternion.d.ts +37 -0
  123. package/dist/Quaternion.d.ts.map +1 -0
  124. package/dist/Quaternion.js +106 -0
  125. package/dist/Quaternion.js.map +1 -0
  126. package/dist/Rational.d.ts +34 -0
  127. package/dist/Rational.d.ts.map +1 -0
  128. package/dist/Rational.js +136 -0
  129. package/dist/Rational.js.map +1 -0
  130. package/dist/RealMath.d.ts +112 -0
  131. package/dist/RealMath.d.ts.map +1 -0
  132. package/dist/RealMath.js +262 -0
  133. package/dist/RealMath.js.map +1 -0
  134. package/dist/Rotor4.d.ts +180 -0
  135. package/dist/Rotor4.d.ts.map +1 -0
  136. package/dist/Rotor4.js +388 -0
  137. package/dist/Rotor4.js.map +1 -0
  138. package/dist/SpecialFunctions.d.ts +32 -0
  139. package/dist/SpecialFunctions.d.ts.map +1 -0
  140. package/dist/SpecialFunctions.js +161 -0
  141. package/dist/SpecialFunctions.js.map +1 -0
  142. package/dist/SpecialOperator.d.ts +21 -0
  143. package/dist/SpecialOperator.d.ts.map +1 -0
  144. package/dist/SpecialOperator.js +26 -0
  145. package/dist/SpecialOperator.js.map +1 -0
  146. package/dist/Statistics.d.ts +50 -0
  147. package/dist/Statistics.d.ts.map +1 -0
  148. package/dist/Statistics.js +131 -0
  149. package/dist/Statistics.js.map +1 -0
  150. package/dist/StringEvaluator.d.ts +48 -0
  151. package/dist/StringEvaluator.d.ts.map +1 -0
  152. package/dist/StringEvaluator.js +190 -0
  153. package/dist/StringEvaluator.js.map +1 -0
  154. package/dist/Structure.d.ts +130 -0
  155. package/dist/Structure.d.ts.map +1 -0
  156. package/dist/Structure.js +394 -0
  157. package/dist/Structure.js.map +1 -0
  158. package/dist/Symbolic.d.ts +501 -0
  159. package/dist/Symbolic.d.ts.map +1 -0
  160. package/dist/Symbolic.js +4077 -0
  161. package/dist/Symbolic.js.map +1 -0
  162. package/dist/Type.d.ts +31 -0
  163. package/dist/Type.d.ts.map +1 -0
  164. package/dist/Type.js +47 -0
  165. package/dist/Type.js.map +1 -0
  166. package/dist/Utilities.d.ts +27 -0
  167. package/dist/Utilities.d.ts.map +1 -0
  168. package/dist/Utilities.js +47 -0
  169. package/dist/Utilities.js.map +1 -0
  170. package/dist/Vec4.d.ts +39 -0
  171. package/dist/Vec4.d.ts.map +1 -0
  172. package/dist/Vec4.js +82 -0
  173. package/dist/Vec4.js.map +1 -0
  174. package/dist/Vector.d.ts +83 -0
  175. package/dist/Vector.d.ts.map +1 -0
  176. package/dist/Vector.js +173 -0
  177. package/dist/Vector.js.map +1 -0
  178. package/dist/VectorCalculus.d.ts +42 -0
  179. package/dist/VectorCalculus.d.ts.map +1 -0
  180. package/dist/VectorCalculus.js +82 -0
  181. package/dist/VectorCalculus.js.map +1 -0
  182. package/dist/VectorUtils.d.ts +172 -0
  183. package/dist/VectorUtils.d.ts.map +1 -0
  184. package/dist/VectorUtils.js +706 -0
  185. package/dist/VectorUtils.js.map +1 -0
  186. package/dist/differentiation-rules.d.ts +21 -0
  187. package/dist/differentiation-rules.d.ts.map +1 -0
  188. package/dist/differentiation-rules.js +52 -0
  189. package/dist/differentiation-rules.js.map +1 -0
  190. package/dist/index.d.ts +52 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +66 -0
  193. package/dist/index.js.map +1 -0
  194. package/package.json +68 -0
  195. package/src/Bivector4.ts +136 -0
  196. package/src/CellGraph.ts +669 -0
  197. package/src/Clifford4Internal.ts +90 -0
  198. package/src/Combinatorics.ts +183 -0
  199. package/src/CombinatoricsGenerators.ts +144 -0
  200. package/src/ComplexMath.ts +162 -0
  201. package/src/ComplexNumber.ts +491 -0
  202. package/src/Cycle.ts +126 -0
  203. package/src/Decimal.ts +145 -0
  204. package/src/Distributions.ts +269 -0
  205. package/src/DualNumber.ts +105 -0
  206. package/src/Environment.ts +127 -0
  207. package/src/Expression.ts +48 -0
  208. package/src/FFT.ts +146 -0
  209. package/src/GeometricAlgebra4.ts +157 -0
  210. package/src/Geometry.ts +173 -0
  211. package/src/Graph.ts +337 -0
  212. package/src/Graph3DUtils.ts +269 -0
  213. package/src/GraphUtils.ts +159 -0
  214. package/src/GroupTheory.ts +214 -0
  215. package/src/IntUtils.ts +200 -0
  216. package/src/Interval.ts +171 -0
  217. package/src/Lattice.ts +87 -0
  218. package/src/Logic.ts +38 -0
  219. package/src/MatrixMath.ts +326 -0
  220. package/src/NumberTheory.ts +228 -0
  221. package/src/Numerical.ts +390 -0
  222. package/src/Permutation.ts +148 -0
  223. package/src/Polygon.ts +229 -0
  224. package/src/PolynomialRing.ts +242 -0
  225. package/src/Quaternion.ts +125 -0
  226. package/src/Rational.ts +148 -0
  227. package/src/RealMath.ts +346 -0
  228. package/src/Rotor4.ts +440 -0
  229. package/src/SpecialFunctions.ts +152 -0
  230. package/src/SpecialOperator.ts +28 -0
  231. package/src/Statistics.ts +170 -0
  232. package/src/StringEvaluator.ts +208 -0
  233. package/src/Structure.ts +481 -0
  234. package/src/Symbolic.ts +4313 -0
  235. package/src/Type.ts +48 -0
  236. package/src/Utilities.ts +49 -0
  237. package/src/Vec4.ts +98 -0
  238. package/src/Vector.ts +189 -0
  239. package/src/VectorCalculus.ts +87 -0
  240. package/src/VectorUtils.ts +797 -0
  241. package/src/differentiation-rules.ts +73 -0
  242. package/src/index.ts +140 -0
@@ -0,0 +1,443 @@
1
+ import { hyperbolicCosine as realHCos, hyperbolicSine as realHSin, roundTo } from "./RealMath.js";
2
+ import { Vector } from "./Vector.js";
3
+ function coerce(x) {
4
+ return x instanceof ComplexNumber ? x : new ComplexNumber(x);
5
+ }
6
+ /** Round tiny floating-point noise out of both components (10 decimal places). */
7
+ function roundComplex(z, precision = 10) {
8
+ return new ComplexNumber(roundTo(z.value, precision), roundTo(z.iValue, precision));
9
+ }
10
+ /**
11
+ * ComplexNumber — an immutable-ish complex value `value + iValue·i`, with a
12
+ * fluent arithmetic/trigonometric API matching the style of `Quaternion`/
13
+ * `Rational`/`DualNumber`/`Decimal`.
14
+ *
15
+ * Ported from Mallory's ActionScript `ComplexNumber`. The AS3 class extended
16
+ * `Array` and stashed its two coordinates in a private `Vector`; that indirection
17
+ * bought nothing, so here the real and imaginary parts are plain number fields.
18
+ * The historical accessor names `value` (real) and `iValue` (imaginary) are kept
19
+ * because the rest of the library reads them hundreds of times; `re`/`im` are
20
+ * provided as modern aliases.
21
+ *
22
+ * The arithmetic/trig/log methods and the `E`/`I`/`PI`/`PHI`/`Zero`/`One`
23
+ * constants and `random()` factory were previously the static-method "namespace
24
+ * class" `ComplexMath` — folded in here so a complex value carries its own
25
+ * operations rather than requiring a second class to operate on it.
26
+ *
27
+ * Bug fixes relative to the AS3 original:
28
+ * - `parse` (was `fromString`) no longer throws when `String.match` returns
29
+ * `null`, and it correctly handles negative imaginary parts and the bare
30
+ * `i` / `-i` forms, so it round-trips with `toString`.
31
+ * - `toString` renders a negative imaginary part as `a-b*i` rather than the
32
+ * old `a+-b*i`.
33
+ * - `divide`'s zero-divisor branches compared `alpha.ivalue` (lowercase v),
34
+ * which is always `undefined`, so the eight directed infinities were never
35
+ * returned. Fixed to `iValue`.
36
+ * - `power`: a zero base produced `NaN` (via `ln 0`); now handled directly, so
37
+ * `square(0)`, `squareRoot(0)` and e.g. `arcSine(0)` are correct.
38
+ */
39
+ export class ComplexNumber {
40
+ value;
41
+ iValue;
42
+ /** "Not a Complex Number" — both parts NaN. */
43
+ static NaCN = new ComplexNumber(NaN, NaN);
44
+ // The eight directed infinities of the complex plane.
45
+ static PositiveInfinity = new ComplexNumber(Infinity, 0);
46
+ static InfinityQ1 = new ComplexNumber(Infinity, Infinity);
47
+ static PositiveInfinityI = new ComplexNumber(0, Infinity);
48
+ static InfinityQ2 = new ComplexNumber(-Infinity, Infinity);
49
+ static NegativeInfinity = new ComplexNumber(-Infinity, 0);
50
+ static InfinityQ3 = new ComplexNumber(-Infinity, -Infinity);
51
+ static NegativeInfinityI = new ComplexNumber(0, -Infinity);
52
+ static InfinityQ4 = new ComplexNumber(Infinity, -Infinity);
53
+ static Zero = new ComplexNumber(0, 0);
54
+ static One = new ComplexNumber(1, 0);
55
+ static I = new ComplexNumber(0, 1);
56
+ static E = new ComplexNumber(Math.E, 0);
57
+ static PI = new ComplexNumber(Math.PI, 0);
58
+ static PHI = new ComplexNumber((1 + Math.sqrt(5)) / 2, 0);
59
+ /**
60
+ * Construct a complex number. Accepts:
61
+ * - `()` → 0
62
+ * - `(re, im)` → re + im·i
63
+ * - `(ComplexNumber)` → a copy
64
+ * - `(number)` → a real number
65
+ * - `(string)` → parsed (see {@link ComplexNumber.parse})
66
+ */
67
+ constructor(value = 0, iValue = 0) {
68
+ if (value instanceof ComplexNumber) {
69
+ this.value = value.value;
70
+ this.iValue = value.iValue;
71
+ }
72
+ else if (typeof value === "string") {
73
+ const parsed = ComplexNumber.parse(value);
74
+ this.value = parsed.value;
75
+ this.iValue = parsed.iValue;
76
+ }
77
+ else {
78
+ this.value = value;
79
+ this.iValue = iValue;
80
+ }
81
+ }
82
+ /** Modern alias for {@link value} (the real part). */
83
+ get re() {
84
+ return this.value;
85
+ }
86
+ set re(v) {
87
+ this.value = v;
88
+ }
89
+ /** Modern alias for {@link iValue} (the imaginary part). */
90
+ get im() {
91
+ return this.iValue;
92
+ }
93
+ set im(v) {
94
+ this.iValue = v;
95
+ }
96
+ /**
97
+ * Coerce an arbitrary value into a ComplexNumber, returning {@link NaCN} for
98
+ * anything that cannot be interpreted numerically. Safe replacement for the
99
+ * AS3 pattern `new ComplexNumber(element)` used by {@link isComplex}.
100
+ */
101
+ static from(input) {
102
+ if (input instanceof ComplexNumber)
103
+ return new ComplexNumber(input);
104
+ if (typeof input === "number")
105
+ return new ComplexNumber(input, 0);
106
+ if (typeof input === "string")
107
+ return ComplexNumber.parse(input);
108
+ return new ComplexNumber(NaN, NaN);
109
+ }
110
+ /** True when `input` is NOT a finite/definite complex number. */
111
+ static isNotComplex(input) {
112
+ const c = ComplexNumber.from(input);
113
+ return Number.isNaN(c.value) || Number.isNaN(c.iValue);
114
+ }
115
+ /** True when `input` can be interpreted as a complex number. */
116
+ static isComplex(input) {
117
+ const c = ComplexNumber.from(input);
118
+ return !Number.isNaN(c.value) && !Number.isNaN(c.iValue);
119
+ }
120
+ /**
121
+ * Wrap arguments into a ComplexNumber. Mirrors AS3 `Wrap`: one argument is
122
+ * coerced, two are taken as (re, im). Returns {@link NaCN} for other arities
123
+ * (the AS3 version returned `false`; a ComplexNumber is friendlier and typed).
124
+ */
125
+ static wrap(...args) {
126
+ if (args.length === 1)
127
+ return ComplexNumber.from(args[0]);
128
+ if (args.length === 2)
129
+ return new ComplexNumber(Number(args[0]), Number(args[1]));
130
+ return new ComplexNumber(NaN, NaN);
131
+ }
132
+ /** Build a real complex number from a plain number. */
133
+ static fromNumber(num) {
134
+ return new ComplexNumber(num, 0);
135
+ }
136
+ /** Build a complex number from polar form `r·e^(iθ)` (inverse of magnitude/angle). */
137
+ static fromPolar(magnitude, angle) {
138
+ return new ComplexNumber(magnitude * Math.cos(angle), magnitude * Math.sin(angle));
139
+ }
140
+ /** Build a complex number from a `[re, im]` vector-like (inverse of {@link toVector}). */
141
+ static fromVector(coordinates) {
142
+ return new ComplexNumber(coordinates[0] ?? 0, coordinates[1] ?? 0);
143
+ }
144
+ /** Parse the `<complexNumber>` form produced by {@link toXML} (inverse of it). */
145
+ static fromXML(xml) {
146
+ const re = /<value>(.*?)<\/value>/.exec(xml);
147
+ const im = /<iValue>(.*?)<\/iValue>/.exec(xml);
148
+ return new ComplexNumber(re ? Number(re[1]) : NaN, im ? Number(im[1]) : NaN);
149
+ }
150
+ /**
151
+ * Parse a string such as `"3"`, `"-2*i"`, `"i"`, `"3+2*i"`, `"3-2i"`.
152
+ * The `*` between coefficient and `i` is optional. Whitespace is ignored.
153
+ * Returns {@link NaCN} when the string is not a recognisable complex literal.
154
+ */
155
+ static parse(expression) {
156
+ // Collapse only the `*` that multiplies `i` (e.g. `2*i` -> `2i`); a bare `*`
157
+ // is multiplication and must NOT be swallowed, or `"4*2"` would parse as 42.
158
+ const s = expression.replace(/\s+/g, "").replace(/\*i/g, "i");
159
+ if (s.length === 0)
160
+ return new ComplexNumber(NaN, NaN);
161
+ if (!s.includes("i")) {
162
+ const n = Number(s);
163
+ return Number.isNaN(n) ? new ComplexNumber(NaN, NaN) : new ComplexNumber(n, 0);
164
+ }
165
+ if (!s.endsWith("i"))
166
+ return new ComplexNumber(NaN, NaN);
167
+ const body = s.slice(0, -1); // strip trailing 'i'
168
+ // Locate the sign that separates the real and imaginary terms. A leading
169
+ // sign (position 0) belongs to the real term; a sign preceded by 'e'/'E'
170
+ // is part of an exponent, not a separator.
171
+ let splitIdx = -1;
172
+ for (let k = 1; k < body.length; k++) {
173
+ const ch = body[k];
174
+ const prev = body[k - 1];
175
+ if ((ch === "+" || ch === "-") && prev !== "e" && prev !== "E")
176
+ splitIdx = k;
177
+ }
178
+ let realStr;
179
+ let imagStr;
180
+ if (splitIdx === -1) {
181
+ realStr = "";
182
+ imagStr = body;
183
+ }
184
+ else {
185
+ realStr = body.slice(0, splitIdx);
186
+ imagStr = body.slice(splitIdx);
187
+ }
188
+ const real = realStr === "" ? 0 : Number(realStr);
189
+ let imag;
190
+ if (imagStr === "" || imagStr === "+")
191
+ imag = 1;
192
+ else if (imagStr === "-")
193
+ imag = -1;
194
+ else
195
+ imag = Number(imagStr);
196
+ if (Number.isNaN(real) || Number.isNaN(imag))
197
+ return new ComplexNumber(NaN, NaN);
198
+ return new ComplexNumber(real, imag);
199
+ }
200
+ /** Uniform random complex number, real part in `[min(r1,r2), max(r1,r2)]`, imaginary in `[min(i1,i2), max(i1,i2)]`. */
201
+ static random(r1 = 1, r2 = 0, i1 = 1, i2 = 0, _inclusive = true) {
202
+ const low = Math.min(r1, r2);
203
+ const high = Math.max(r1, r2);
204
+ const iLow = Math.min(i1, i2);
205
+ const iHigh = Math.max(i1, i2);
206
+ return new ComplexNumber(low + Math.random() * (high - low), iLow + Math.random() * (iHigh - iLow));
207
+ }
208
+ /** XML-ish serialisation kept for API compatibility. */
209
+ toXML() {
210
+ return `<complexNumber><value>${this.value}</value><iValue>${this.iValue}</iValue></complexNumber>`;
211
+ }
212
+ /** The two coordinates as a fresh {@link Vector}. */
213
+ toVector() {
214
+ return Vector.fromArray([this.value, this.iValue]);
215
+ }
216
+ /**
217
+ * String representation. In `fullMode` the raw `a+bi` form is emitted (used
218
+ * for debugging); otherwise a canonical, sign-correct form is produced that
219
+ * round-trips through {@link parse}.
220
+ */
221
+ toString(fullMode = false) {
222
+ if (fullMode)
223
+ return `${this.value}+${this.iValue}i`;
224
+ if (this.value === 0 && this.iValue === 0)
225
+ return "0";
226
+ if (this.iValue === 0)
227
+ return String(this.value);
228
+ const absImag = Math.abs(this.iValue);
229
+ const imagPart = absImag === 1 ? "i" : `${absImag}*i`;
230
+ if (this.value === 0)
231
+ return this.iValue < 0 ? `-${imagPart}` : imagPart;
232
+ return `${this.value}${this.iValue < 0 ? "-" : "+"}${imagPart}`;
233
+ }
234
+ /** Additive inverse `-z`. */
235
+ neg() {
236
+ return new ComplexNumber(-this.value, -this.iValue);
237
+ }
238
+ /** Multiplicative inverse `1/z` (returns {@link NaCN} for zero). */
239
+ reciprocal() {
240
+ const { value: a, iValue: b } = this;
241
+ if (a === 0 && b === 0)
242
+ return new ComplexNumber(NaN, NaN);
243
+ const denom = a * a + b * b;
244
+ return new ComplexNumber(a / denom, -b / denom);
245
+ }
246
+ /** Complex conjugate `a - b·i`. */
247
+ conjugate() {
248
+ return new ComplexNumber(this.value, -this.iValue);
249
+ }
250
+ /** Swap the real and imaginary parts (`a + b·i` → `b + a·i`). */
251
+ flip() {
252
+ return new ComplexNumber(this.iValue, this.value);
253
+ }
254
+ /** Structural equality (NaN parts compare unequal, matching IEEE semantics). */
255
+ equals(other) {
256
+ return this.value === other.value && this.iValue === other.iValue;
257
+ }
258
+ /** Lexicographic comparison: real part first, then imaginary. */
259
+ lexCompare(other) {
260
+ const b = coerce(other);
261
+ if (this.value > b.value)
262
+ return 1;
263
+ if (this.value < b.value)
264
+ return -1;
265
+ if (this.iValue > b.iValue)
266
+ return 1;
267
+ if (this.iValue < b.iValue)
268
+ return -1;
269
+ return 0;
270
+ }
271
+ /** Comparison by magnitude. */
272
+ magCompare(other) {
273
+ const ma = this.magnitude();
274
+ const mb = coerce(other).magnitude();
275
+ if (ma > mb)
276
+ return 1;
277
+ if (ma < mb)
278
+ return -1;
279
+ return 0;
280
+ }
281
+ add(other = 0) {
282
+ const b = coerce(other);
283
+ return new ComplexNumber(this.value + b.value, this.iValue + b.iValue);
284
+ }
285
+ subtract(other = 0) {
286
+ const b = coerce(other);
287
+ return new ComplexNumber(this.value - b.value, this.iValue - b.iValue);
288
+ }
289
+ multiply(other = 1) {
290
+ const b = coerce(other);
291
+ return new ComplexNumber(this.value * b.value - this.iValue * b.iValue, this.value * b.iValue + this.iValue * b.value);
292
+ }
293
+ /** Division, returning one of the eight directed infinities on a zero divisor. */
294
+ divide(other = 1) {
295
+ const b = coerce(other);
296
+ if (b.value === 0 && b.iValue === 0) {
297
+ if (this.value > 0) {
298
+ if (this.iValue === 0)
299
+ return ComplexNumber.PositiveInfinity;
300
+ if (this.iValue > 0)
301
+ return ComplexNumber.InfinityQ1;
302
+ return ComplexNumber.InfinityQ4;
303
+ }
304
+ if (this.value < 0) {
305
+ if (this.iValue === 0)
306
+ return ComplexNumber.NegativeInfinity;
307
+ if (this.iValue > 0)
308
+ return ComplexNumber.InfinityQ2;
309
+ return ComplexNumber.InfinityQ3;
310
+ }
311
+ if (this.iValue === 0)
312
+ return ComplexNumber.NaCN;
313
+ if (this.iValue > 0)
314
+ return ComplexNumber.PositiveInfinityI;
315
+ return ComplexNumber.NegativeInfinityI;
316
+ }
317
+ return this.multiply(b.reciprocal());
318
+ }
319
+ magnitude() {
320
+ return Math.hypot(this.value, this.iValue);
321
+ }
322
+ angle() {
323
+ return Math.atan2(this.iValue, this.value);
324
+ }
325
+ static power2(a, b) {
326
+ if (a.value === 0 && a.iValue === 0 && !(b.value === 0 && b.iValue === 0)) {
327
+ return new ComplexNumber(0, 0);
328
+ }
329
+ const mag = a.magnitude();
330
+ const ang = a.angle();
331
+ const c = b.value;
332
+ const d = b.iValue;
333
+ const multiplier = mag ** c / Math.E ** (d * ang);
334
+ const cospart = multiplier * Math.cos(d * Math.log(mag) + c * ang);
335
+ const sinpart = multiplier * Math.sin(d * Math.log(mag) + c * ang);
336
+ return roundComplex(new ComplexNumber(cospart, sinpart));
337
+ }
338
+ selectedNaturalLogarithm(selector = 0) {
339
+ const mag = this.magnitude();
340
+ const ang = this.angle();
341
+ return roundComplex(new ComplexNumber(Math.log(mag), ang + 2 * Math.PI * selector));
342
+ }
343
+ /** `this ** exponent`, with branch selection for the multivalued complex logarithm. */
344
+ power(exponent = 1, selector = 0) {
345
+ const b = coerce(exponent);
346
+ // Handle a zero base directly (bug fix: ln 0 otherwise poisons the result).
347
+ if (this.value === 0 && this.iValue === 0) {
348
+ if (b.value === 0 && b.iValue === 0)
349
+ return new ComplexNumber(1, 0);
350
+ if (b.value > 0)
351
+ return new ComplexNumber(0, 0);
352
+ return ComplexNumber.NaCN;
353
+ }
354
+ const newPow = b.multiply(this.selectedNaturalLogarithm(selector));
355
+ return ComplexNumber.power2(ComplexNumber.E, newPow);
356
+ }
357
+ square() {
358
+ return this.power(2);
359
+ }
360
+ squareRoot() {
361
+ return this.power(0.5);
362
+ }
363
+ /** Logarithm in an arbitrary `base` (natural log by default), with branch selection. */
364
+ logarithm(base = Math.E, selectA = 0, selectB = 0) {
365
+ const b = coerce(base);
366
+ return roundComplex(this.selectedNaturalLogarithm(selectA).divide(b.selectedNaturalLogarithm(selectB)));
367
+ }
368
+ sine() {
369
+ return new ComplexNumber(roundTo(Math.sin(this.value) * realHCos(this.iValue)), roundTo(Math.cos(this.value) * realHSin(this.iValue)));
370
+ }
371
+ cosine() {
372
+ return new ComplexNumber(roundTo(Math.cos(this.value) * realHCos(this.iValue)), roundTo(-Math.sin(this.value) * realHSin(this.iValue)));
373
+ }
374
+ tangent() {
375
+ return this.sine().divide(this.cosine());
376
+ }
377
+ hyperbolicSine() {
378
+ return new ComplexNumber(roundTo(realHSin(this.value) * Math.cos(this.iValue)), roundTo(realHCos(this.value) * Math.sin(this.iValue)));
379
+ }
380
+ hyperbolicCosine() {
381
+ return new ComplexNumber(roundTo(realHCos(this.value) * Math.cos(this.iValue)), roundTo(realHSin(this.value) * Math.sin(this.iValue)));
382
+ }
383
+ hyperbolicTangent() {
384
+ return this.hyperbolicSine().divide(this.hyperbolicCosine());
385
+ }
386
+ arcSine() {
387
+ const inner = ComplexNumber.I.multiply(this).add(new ComplexNumber(1, 0).subtract(this.square()).squareRoot());
388
+ return ComplexNumber.I.neg().multiply(inner.logarithm());
389
+ }
390
+ arcCosine() {
391
+ const inner = this.add(this.square().subtract(1).squareRoot());
392
+ return ComplexNumber.I.neg().multiply(inner.logarithm());
393
+ }
394
+ arcTangent() {
395
+ const iThis = ComplexNumber.I.multiply(this);
396
+ const left = new ComplexNumber(1, 0).subtract(iThis).logarithm();
397
+ const right = new ComplexNumber(1, 0).add(iThis).logarithm();
398
+ return ComplexNumber.I.divide(2).multiply(left.subtract(right));
399
+ }
400
+ /** `asinh(z) = log(z + sqrt(z^2 + 1))`. */
401
+ arcHyperbolicSine() {
402
+ const inner = this.add(this.square().add(1).squareRoot());
403
+ return inner.logarithm();
404
+ }
405
+ /**
406
+ * `acosh(z) = log(z + sqrt(z+1)*sqrt(z-1))` — the numerically-careful
407
+ * factored form, not the naive `log(z + sqrt(z^2-1))`. The two are
408
+ * algebraically identical but the factored form keeps the two square
409
+ * roots' branch cuts separate (one for `z+1`, one for `z-1`), which
410
+ * matches the principal-branch convention every serious complex `acosh`
411
+ * implementation uses (e.g. the C99/IEEE 754-2008 `cacosh` reference
412
+ * algorithm) — the naive form can pick the wrong branch/sign near its
413
+ * own cut along the real axis below 1.
414
+ */
415
+ arcHyperbolicCosine() {
416
+ const inner = this.add(this.add(1).squareRoot().multiply(this.subtract(1).squareRoot()));
417
+ return inner.logarithm();
418
+ }
419
+ /** `atanh(z) = 0.5 * log((1+z)/(1-z))`. */
420
+ arcHyperbolicTangent() {
421
+ const numerator = new ComplexNumber(1, 0).add(this);
422
+ const denominator = new ComplexNumber(1, 0).subtract(this);
423
+ return numerator.divide(denominator).logarithm().divide(2);
424
+ }
425
+ /**
426
+ * Coercion safety: a genuinely complex value (nonzero imaginary part)
427
+ * cannot be implicitly converted to a `Number` — without this override,
428
+ * `+z`/`z * 2`/etc. on a non-real `ComplexNumber` silently produce `NaN`
429
+ * (the default `Object`-to-primitive path falls through to parsing
430
+ * `toString()`'s `"a+bi"` output as a number), which is exactly the kind
431
+ * of silent-wrong-answer failure this library avoids elsewhere. A purely
432
+ * real `ComplexNumber` (iValue === 0) still converts safely, matching
433
+ * `ℝ ⊂ ℂ`.
434
+ */
435
+ valueOf() {
436
+ if (this.iValue !== 0) {
437
+ throw new TypeError(`Cannot implicitly convert a non-real ComplexNumber (${this.toString()}) to a Number -- ` +
438
+ "use .value/.re for the real part, .magnitude() for the modulus, or an explicit .toString().");
439
+ }
440
+ return this.value;
441
+ }
442
+ }
443
+ //# sourceMappingURL=ComplexNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplexNumber.js","sourceRoot":"","sources":["../src/ComplexNumber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Permutation } from "./Permutation.ts";
2
+ /**
3
+ * Cycle — a permutation cycle over an ordered list of distinct elements.
4
+ * Ported from Mallory's ActionScript `Cycle`.
5
+ *
6
+ * Bug fix / modernisation: the AS3 constructor silently left `_elements`
7
+ * undefined when the input contained repeats (every later method then threw);
8
+ * this version rejects repeats up front with a clear error. The misspelled
9
+ * `transpotions` methods are corrected to `transpositions`.
10
+ */
11
+ export declare class Cycle<T = unknown> {
12
+ private readonly _elements;
13
+ constructor(elements: T[]);
14
+ /** A fresh copy of the ordered elements. */
15
+ get elements(): T[];
16
+ /** Cycles with fewer than two elements have length 1. */
17
+ get length(): number;
18
+ /** Map an element to the next in the cycle (identity outside the cycle). */
19
+ apply(element: T): T;
20
+ /** The inverse cycle (reverse order). */
21
+ inverse(): Cycle<T>;
22
+ /** The same cycle with its representation rotated left. */
23
+ shiftedLeft(): Cycle<T>;
24
+ /** The same cycle with its representation rotated right. */
25
+ shiftedRight(): Cycle<T>;
26
+ /** Convert to the equivalent {@link Permutation}. */
27
+ toPermutation(): Permutation<T>;
28
+ toString(): string;
29
+ contains(element: T): boolean;
30
+ /** Decompose into a product of adjacent transpositions. */
31
+ transpositions(): Array<Cycle<T>>;
32
+ /** An alternate transposition decomposition (all sharing the last element). */
33
+ transpositionsAlt(): Array<Cycle<T>>;
34
+ /** An n-cycle is an even permutation iff n is odd. */
35
+ even(): boolean;
36
+ odd(): boolean;
37
+ /** True when two cycles are equal up to rotation. */
38
+ static equal<T>(sigma: Cycle<T>, tao: Cycle<T>): boolean;
39
+ /** True when two cycles share no elements. */
40
+ static disjoint<T>(sigma: Cycle<T>, tao: Cycle<T>): boolean;
41
+ }
42
+ //# sourceMappingURL=Cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cycle.d.ts","sourceRoot":"","sources":["../src/Cycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C;;;;;;;;GAQG;AACH,qBAAa,KAAK,CAAC,CAAC,GAAG,OAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;gBAEpB,QAAQ,EAAE,CAAC,EAAE;IASzB,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAElB;IAED,yDAAyD;IACzD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,4EAA4E;IAC5E,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;IASpB,yCAAyC;IACzC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;IAInB,2DAA2D;IAC3D,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC;IAIvB,4DAA4D;IAC5D,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC;IAKxB,qDAAqD;IACrD,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC;IAI/B,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO;IAI7B,2DAA2D;IAC3D,cAAc,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAWjC,+EAA+E;IAC/E,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IASpC,sDAAsD;IACtD,IAAI,IAAI,OAAO;IAIf,GAAG,IAAI,OAAO;IAId,qDAAqD;IACrD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO;IAcxD,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO;CAM5D"}
package/dist/Cycle.js ADDED
@@ -0,0 +1,120 @@
1
+ import { Permutation } from "./Permutation.js";
2
+ /**
3
+ * Cycle — a permutation cycle over an ordered list of distinct elements.
4
+ * Ported from Mallory's ActionScript `Cycle`.
5
+ *
6
+ * Bug fix / modernisation: the AS3 constructor silently left `_elements`
7
+ * undefined when the input contained repeats (every later method then threw);
8
+ * this version rejects repeats up front with a clear error. The misspelled
9
+ * `transpotions` methods are corrected to `transpositions`.
10
+ */
11
+ export class Cycle {
12
+ _elements;
13
+ constructor(elements) {
14
+ for (let i = 0; i < elements.length; i++) {
15
+ if (elements.lastIndexOf(elements[i]) !== i) {
16
+ throw new Error("Cycle elements must be distinct (no repeats).");
17
+ }
18
+ }
19
+ this._elements = [...elements];
20
+ }
21
+ /** A fresh copy of the ordered elements. */
22
+ get elements() {
23
+ return [...this._elements];
24
+ }
25
+ /** Cycles with fewer than two elements have length 1. */
26
+ get length() {
27
+ return this._elements.length < 2 ? 1 : this._elements.length;
28
+ }
29
+ /** Map an element to the next in the cycle (identity outside the cycle). */
30
+ apply(element) {
31
+ const els = this._elements;
32
+ if (element === els[els.length - 1])
33
+ return els[0];
34
+ for (let i = 0; i < els.length; i++) {
35
+ if (element === els[i])
36
+ return els[i + 1];
37
+ }
38
+ return element;
39
+ }
40
+ /** The inverse cycle (reverse order). */
41
+ inverse() {
42
+ return new Cycle([...this._elements].reverse());
43
+ }
44
+ /** The same cycle with its representation rotated left. */
45
+ shiftedLeft() {
46
+ return new Cycle(this._elements.map((e) => this.apply(e)));
47
+ }
48
+ /** The same cycle with its representation rotated right. */
49
+ shiftedRight() {
50
+ const inv = this.inverse();
51
+ return new Cycle(this._elements.map((e) => inv.apply(e)));
52
+ }
53
+ /** Convert to the equivalent {@link Permutation}. */
54
+ toPermutation() {
55
+ return new Permutation(this.elements, this.shiftedLeft().elements);
56
+ }
57
+ toString() {
58
+ return `(${this._elements.join(",")})`;
59
+ }
60
+ contains(element) {
61
+ return this._elements.includes(element);
62
+ }
63
+ /** Decompose into a product of adjacent transpositions. */
64
+ transpositions() {
65
+ // A cycle of length <= 1 (a fixed point / the identity) has no
66
+ // transpositions -- there's nothing here to seed a fake Cycle<T> from.
67
+ if (this.length < 2)
68
+ return [];
69
+ const out = [];
70
+ for (let i = 0; i < this.length - 1; i++) {
71
+ out.push(new Cycle([this._elements[i], this._elements[i + 1]]));
72
+ }
73
+ return out;
74
+ }
75
+ /** An alternate transposition decomposition (all sharing the last element). */
76
+ transpositionsAlt() {
77
+ if (this.length < 2)
78
+ return [];
79
+ const out = [];
80
+ for (let i = 0; i < this.length - 1; i++) {
81
+ out.push(new Cycle([this._elements[this.length - 2 - i], this._elements[this.length - 1]]));
82
+ }
83
+ return out;
84
+ }
85
+ /** An n-cycle is an even permutation iff n is odd. */
86
+ even() {
87
+ return this.length % 2 === 1;
88
+ }
89
+ odd() {
90
+ return !this.even();
91
+ }
92
+ /** True when two cycles are equal up to rotation. */
93
+ static equal(sigma, tao) {
94
+ if (sigma.length !== tao.length)
95
+ return false;
96
+ let s = sigma;
97
+ for (let i = 0; i < sigma.length; i++) {
98
+ const se = s.elements;
99
+ const te = tao.elements;
100
+ let equalCount = 0;
101
+ for (let j = 0; j < se.length; j++)
102
+ if (se[j] === te[j])
103
+ equalCount++;
104
+ if (equalCount === sigma.length)
105
+ return true;
106
+ s = s.shiftedLeft();
107
+ }
108
+ return false;
109
+ }
110
+ /** True when two cycles share no elements. */
111
+ static disjoint(sigma, tao) {
112
+ for (const a of sigma.elements) {
113
+ for (const b of tao.elements)
114
+ if (a === b)
115
+ return false;
116
+ }
117
+ return true;
118
+ }
119
+ }
120
+ //# sourceMappingURL=Cycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cycle.js","sourceRoot":"","sources":["../src/Cycle.ts"],"names":[],"mappings":"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"}