@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,221 @@
1
+ import { NumberTheory } from "./NumberTheory.js";
2
+ import { distanceVector } from "./RealMath.js";
3
+ import { Vector } from "./Vector.js";
4
+ /**
5
+ * Polygon — an ordered list of vertex points ({@link Vector} subclass). Ported
6
+ * from Mallory's ActionScript `Polygon`.
7
+ *
8
+ * Bug fixes from the AS3 original:
9
+ * - `perimeter` accumulated into a `uint`, truncating the fractional length.
10
+ * - `area` only summed two triangles, so it was wrong for pentagons and up; it
11
+ * now uses the shoelace formula, correct for any simple polygon.
12
+ * - `angle` was stubbed to `return 0` (with dead code calling classes that do
13
+ * not exist); it now computes the interior angle via the law of cosines it
14
+ * documented.
15
+ */
16
+ export class Polygon extends Vector {
17
+ /** The vertex at `index`, wrapping around the polygon. */
18
+ vertex(index) {
19
+ return this[Number(NumberTheory.mod(index, this.length))];
20
+ }
21
+ get vertexCount() {
22
+ return this.length;
23
+ }
24
+ get edgeCount() {
25
+ if (this.vertexCount < 3)
26
+ return this.length - 1;
27
+ return this.vertexCount;
28
+ }
29
+ /** The edge starting at `index` as a two-vertex polygon. */
30
+ edge(index) {
31
+ return new Polygon(this.vertex(index), this.vertex(index + 1));
32
+ }
33
+ /** Total perimeter length (bug fix: no longer truncated to an integer). */
34
+ perimeter() {
35
+ let per = 0;
36
+ for (let i = 0; i < this.edgeCount; i++) {
37
+ per += distanceVector(this.vertex(i), this.vertex(i + 1));
38
+ }
39
+ return per;
40
+ }
41
+ /** Heron's-formula area of the triangle on the first three vertices. */
42
+ triArea() {
43
+ const a = distanceVector(this.vertex(0), this.vertex(1));
44
+ const b = distanceVector(this.vertex(1), this.vertex(2));
45
+ const c = distanceVector(this.vertex(2), this.vertex(0));
46
+ const s = (a + b + c) / 2;
47
+ return Math.sqrt(s * (s - a) * (s - b) * (s - c));
48
+ }
49
+ /**
50
+ * Area of the polygon via the shoelace formula (bug fix: the AS3 version only
51
+ * summed two triangles and was wrong for polygons with more than four sides).
52
+ */
53
+ area() {
54
+ if (this.vertexCount < 3)
55
+ return 0;
56
+ if (this.vertexCount === 3)
57
+ return this.triArea();
58
+ let sum = 0;
59
+ for (let i = 0; i < this.vertexCount; i++) {
60
+ const current = this.vertex(i);
61
+ const next = this.vertex(i + 1);
62
+ sum += current.x * next.y - next.x * current.y;
63
+ }
64
+ return Math.abs(sum) / 2;
65
+ }
66
+ /**
67
+ * The area centroid (center of mass) as an `[x, y]` point. Complements
68
+ * {@link perimeter} and {@link area}. Falls back to the vertex average for a
69
+ * degenerate (zero-area) polygon.
70
+ */
71
+ centroid() {
72
+ let signedArea = 0;
73
+ let cx = 0;
74
+ let cy = 0;
75
+ for (let i = 0; i < this.vertexCount; i++) {
76
+ const cur = this.vertex(i);
77
+ const next = this.vertex(i + 1);
78
+ const cross = cur.x * next.y - next.x * cur.y;
79
+ signedArea += cross;
80
+ cx += (cur.x + next.x) * cross;
81
+ cy += (cur.y + next.y) * cross;
82
+ }
83
+ if (signedArea === 0) {
84
+ // Degenerate: average the vertices.
85
+ let sx = 0;
86
+ let sy = 0;
87
+ for (let i = 0; i < this.vertexCount; i++) {
88
+ sx += this.vertex(i).x;
89
+ sy += this.vertex(i).y;
90
+ }
91
+ const n = this.vertexCount || 1;
92
+ return Vector.fromArray([sx / n, sy / n]);
93
+ }
94
+ return Vector.fromArray([cx / (3 * signedArea), cy / (3 * signedArea)]);
95
+ }
96
+ /**
97
+ * Interior angle (radians) at vertex `i`, via the law of cosines
98
+ * (bug fix: the AS3 method always returned 0).
99
+ */
100
+ angle(i) {
101
+ const ab = distanceVector(this.vertex(i), this.vertex(i + 1));
102
+ const bc = distanceVector(this.vertex(i), this.vertex(i - 1));
103
+ const ac = distanceVector(this.vertex(i + 1), this.vertex(i - 1));
104
+ return Math.acos((ab * ab + bc * bc - ac * ac) / (2 * ab * bc));
105
+ }
106
+ /** True when `point` lies inside the polygon (even-odd ray-casting rule). */
107
+ contains(point) {
108
+ const px = point.x;
109
+ const py = point.y;
110
+ let inside = false;
111
+ const n = this.vertexCount;
112
+ for (let i = 0, j = n - 1; i < n; j = i++) {
113
+ const vi = this.vertex(i);
114
+ const vj = this.vertex(j);
115
+ const xi = vi.x;
116
+ const yi = vi.y;
117
+ const xj = vj.x;
118
+ const yj = vj.y;
119
+ if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi)
120
+ inside = !inside;
121
+ }
122
+ return inside;
123
+ }
124
+ /** True when the polygon is convex (all turns share the same orientation). */
125
+ isConvex() {
126
+ const n = this.vertexCount;
127
+ if (n < 3)
128
+ return false;
129
+ let sign = 0;
130
+ for (let i = 0; i < n; i++) {
131
+ const a = this.vertex(i);
132
+ const b = this.vertex(i + 1);
133
+ const c = this.vertex(i + 2);
134
+ const cross = (b.x - a.x) * (c.y - b.y) -
135
+ (b.y - a.y) * (c.x - b.x);
136
+ if (cross !== 0) {
137
+ const s = Math.sign(cross);
138
+ if (sign === 0)
139
+ sign = s;
140
+ else if (s !== sign)
141
+ return false;
142
+ }
143
+ }
144
+ return true;
145
+ }
146
+ /** True when no two non-adjacent edges cross (the polygon is simple). */
147
+ isSimple() {
148
+ const n = this.vertexCount;
149
+ if (n < 3)
150
+ return false;
151
+ for (let i = 0; i < n; i++) {
152
+ const a1 = this.vertex(i);
153
+ const a2 = this.vertex(i + 1);
154
+ for (let j = i + 1; j < n; j++) {
155
+ // Skip edges that share a vertex (adjacent, or the wrap-around pair).
156
+ if (j === i || j === i + 1 || (i === 0 && j === n - 1))
157
+ continue;
158
+ const b1 = this.vertex(j);
159
+ const b2 = this.vertex(j + 1);
160
+ if (Polygon.segmentsIntersect(a1, a2, b1, b2))
161
+ return false;
162
+ }
163
+ }
164
+ return true;
165
+ }
166
+ static orient(a, b, c) {
167
+ return ((b.x - a.x) * (c.y - a.y) -
168
+ (b.y - a.y) * (c.x - a.x));
169
+ }
170
+ static onSegment(a, b, p) {
171
+ return (Math.min(a.x, b.x) <= p.x &&
172
+ p.x <= Math.max(a.x, b.x) &&
173
+ Math.min(a.y, b.y) <= p.y &&
174
+ p.y <= Math.max(a.y, b.y));
175
+ }
176
+ static segmentsIntersect(p1, p2, p3, p4) {
177
+ const d1 = Polygon.orient(p3, p4, p1);
178
+ const d2 = Polygon.orient(p3, p4, p2);
179
+ const d3 = Polygon.orient(p1, p2, p3);
180
+ const d4 = Polygon.orient(p1, p2, p4);
181
+ if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)))
182
+ return true;
183
+ if (d1 === 0 && Polygon.onSegment(p3, p4, p1))
184
+ return true;
185
+ if (d2 === 0 && Polygon.onSegment(p3, p4, p2))
186
+ return true;
187
+ if (d3 === 0 && Polygon.onSegment(p1, p2, p3))
188
+ return true;
189
+ if (d4 === 0 && Polygon.onSegment(p1, p2, p4))
190
+ return true;
191
+ return false;
192
+ }
193
+ /**
194
+ * A regular n-gon: `n` vertices evenly spaced on a circle of `radius`
195
+ * around `center`, starting at `startAngle` (default `-pi/2`, i.e. the
196
+ * first vertex points straight up — the conventional orientation for a
197
+ * polygon drawn on a screen y-down or math y-up axis alike) and
198
+ * proceeding counterclockwise in standard math convention.
199
+ */
200
+ static regular(n, radius = 1, center = Vector.fromArray([0, 0]), startAngle = -Math.PI / 2) {
201
+ if (n < 3)
202
+ throw new Error(`Polygon.regular: n must be at least 3, got ${n}`);
203
+ const cx = center.x;
204
+ const cy = center.y;
205
+ const vertices = Array.from({ length: n }, (_, i) => {
206
+ const theta = startAngle + (2 * Math.PI * i) / n;
207
+ return Vector.fromArray([cx + radius * Math.cos(theta), cy + radius * Math.sin(theta)]);
208
+ });
209
+ return new Polygon(...vertices);
210
+ }
211
+ /** A clone of the polygon (deep-clones nested vertex vectors by default). */
212
+ clone(deep = true) {
213
+ const out = new Polygon(this.length);
214
+ for (let i = 0; i < out.length; i++) {
215
+ const el = this[i];
216
+ out[i] = deep && el instanceof Vector ? el.clone() : el;
217
+ }
218
+ return out;
219
+ }
220
+ }
221
+ //# sourceMappingURL=Polygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Polygon.js","sourceRoot":"","sources":["../src/Polygon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { Structure } from "./Structure.ts";
2
+ /**
3
+ * PolynomialRing — polynomials with coefficients in an arbitrary {@link Structure}
4
+ * (a finite field, the rationals, quaternions, whatever the structure supplies),
5
+ * following {@link GroupTheory}'s idiom of accepting the algebra as a constructor
6
+ * parameter rather than duplicating field logic. This generalizes long division,
7
+ * GCD, differentiation, and evaluation to any field — e.g. polynomials over
8
+ * `Structure.integersModulo(7)`, or plain real polynomials via
9
+ * `new PolynomialRing(Structure.realField())`.
10
+ *
11
+ * Coefficients are plain `T[]` arrays in ascending power (`p[i]` is the
12
+ * coefficient of `x^i`), trimmed of trailing zero coefficients. The zero
13
+ * polynomial is `[]`, with degree `-1`.
14
+ *
15
+ * {@link parsePolynomial}/{@link polynomialToString} below are real-number-only
16
+ * helpers for the common `"3*x^2-2*x+1"` string notation — parsing/formatting
17
+ * needs decimal syntax, which doesn't generalize to an arbitrary `Structure`.
18
+ */
19
+ export declare class PolynomialRing<T> {
20
+ readonly structure: Structure<T>;
21
+ constructor(structure: Structure<T>);
22
+ /** Drop trailing coefficients equal to the structure's zero. */
23
+ private trim;
24
+ /** `-1` for the zero polynomial, else the index of the highest non-zero coefficient. */
25
+ degree(p: T[]): number;
26
+ zero(): T[];
27
+ one(): T[];
28
+ private pad;
29
+ add(a: T[], b: T[]): T[];
30
+ negate(p: T[]): T[];
31
+ subtract(a: T[], b: T[]): T[];
32
+ scale(p: T[], scalar: T): T[];
33
+ multiply(a: T[], b: T[]): T[];
34
+ /** Polynomial long division over the structure's field operations. */
35
+ divmod(a: T[], b: T[]): {
36
+ quotient: T[];
37
+ remainder: T[];
38
+ };
39
+ divide(a: T[], b: T[]): T[];
40
+ mod(a: T[], b: T[]): T[];
41
+ /** Rescale so the leading coefficient is the structure's one. No-op on the zero polynomial. */
42
+ private makeMonic;
43
+ /** Monic GCD via the Euclidean algorithm (repeated `divmod`). */
44
+ gcd(a: T[], b: T[]): T[];
45
+ /**
46
+ * The derivative polynomial (`i·c_i`, well-defined over any ring: `i` is
47
+ * built up as a running "`n` copies of the structure's `one`, added
48
+ * together" accumulator rather than being reconstructed from scratch for
49
+ * each coefficient — that would cost O(i) additions per coefficient, i.e.
50
+ * O(n²) additions overall for a degree-n polynomial).
51
+ */
52
+ derivative(p: T[]): T[];
53
+ /**
54
+ * An antiderivative with zero constant of integration (`c_i / (i+1)`, via the
55
+ * structure's `reciprocal`). `i+1` is built up as a running accumulator (see
56
+ * {@link derivative}) instead of being reconstructed from scratch per term.
57
+ */
58
+ antiderivative(p: T[]): T[];
59
+ /** Evaluate at `x` via Horner's method, using the structure's field operations. */
60
+ evaluate(p: T[], x: T): T;
61
+ equal(a: T[], b: T[]): boolean;
62
+ toString(p: T[], variable?: string): string;
63
+ }
64
+ /**
65
+ * Parse a real-coefficient polynomial string such as `"3*x^2-2*x+1"` into
66
+ * ascending-power coefficients (inverse of {@link polynomialToString}).
67
+ */
68
+ export declare function parsePolynomial(str: string, variable?: string): number[];
69
+ /**
70
+ * Render ascending-power real coefficients as a human-readable string such as
71
+ * `3*x^2+2*x+1` (inverse of {@link parsePolynomial}).
72
+ */
73
+ export declare function polynomialToString(coeffs: number[], variable?: string, descending?: boolean): string;
74
+ //# sourceMappingURL=PolynomialRing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolynomialRing.d.ts","sourceRoot":"","sources":["../src/PolynomialRing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAc,CAAC,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;gBAErB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAInC,gEAAgE;IAChE,OAAO,CAAC,IAAI;IAMZ,wFAAwF;IACxF,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM;IAItB,IAAI,IAAI,CAAC,EAAE;IAIX,GAAG,IAAI,CAAC,EAAE;IAIV,OAAO,CAAC,GAAG;IAMX,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAOxB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAInB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAI7B,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE;IAI7B,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAW7B,sEAAsE;IACtE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;QAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,CAAA;KAAE;IAsBzD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAI3B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAIxB,+FAA+F;IAC/F,OAAO,CAAC,SAAS;IAMjB,iEAAiE;IACjE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAWxB;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAWvB;;;;OAIG;IACH,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAW3B,mFAAmF;IACnF,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC;IAQzB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO;IAM9B,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;CAazC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,MAAM,EAAE,CAyBrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAM,EAAE,UAAU,UAAO,GAAG,MAAM,CAU9F"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * PolynomialRing — polynomials with coefficients in an arbitrary {@link Structure}
3
+ * (a finite field, the rationals, quaternions, whatever the structure supplies),
4
+ * following {@link GroupTheory}'s idiom of accepting the algebra as a constructor
5
+ * parameter rather than duplicating field logic. This generalizes long division,
6
+ * GCD, differentiation, and evaluation to any field — e.g. polynomials over
7
+ * `Structure.integersModulo(7)`, or plain real polynomials via
8
+ * `new PolynomialRing(Structure.realField())`.
9
+ *
10
+ * Coefficients are plain `T[]` arrays in ascending power (`p[i]` is the
11
+ * coefficient of `x^i`), trimmed of trailing zero coefficients. The zero
12
+ * polynomial is `[]`, with degree `-1`.
13
+ *
14
+ * {@link parsePolynomial}/{@link polynomialToString} below are real-number-only
15
+ * helpers for the common `"3*x^2-2*x+1"` string notation — parsing/formatting
16
+ * needs decimal syntax, which doesn't generalize to an arbitrary `Structure`.
17
+ */
18
+ export class PolynomialRing {
19
+ structure;
20
+ constructor(structure) {
21
+ this.structure = structure;
22
+ }
23
+ /** Drop trailing coefficients equal to the structure's zero. */
24
+ trim(p) {
25
+ let n = p.length;
26
+ while (n > 0 && this.structure.equality(p[n - 1], this.structure.zero))
27
+ n--;
28
+ return p.slice(0, n);
29
+ }
30
+ /** `-1` for the zero polynomial, else the index of the highest non-zero coefficient. */
31
+ degree(p) {
32
+ return this.trim(p).length - 1;
33
+ }
34
+ zero() {
35
+ return [];
36
+ }
37
+ one() {
38
+ return [this.structure.one];
39
+ }
40
+ pad(p, length) {
41
+ const result = p.slice();
42
+ while (result.length < length)
43
+ result.push(this.structure.zero);
44
+ return result;
45
+ }
46
+ add(a, b) {
47
+ const length = Math.max(a.length, b.length);
48
+ const pa = this.pad(a, length);
49
+ const pb = this.pad(b, length);
50
+ return this.trim(pa.map((x, i) => this.structure.add(x, pb[i])));
51
+ }
52
+ negate(p) {
53
+ return p.map((x) => this.structure.negative(x));
54
+ }
55
+ subtract(a, b) {
56
+ return this.add(a, this.negate(b));
57
+ }
58
+ scale(p, scalar) {
59
+ return this.trim(p.map((x) => this.structure.multiply(scalar, x)));
60
+ }
61
+ multiply(a, b) {
62
+ if (a.length === 0 || b.length === 0)
63
+ return [];
64
+ const result = new Array(a.length + b.length - 1).fill(this.structure.zero);
65
+ for (let i = 0; i < a.length; i++) {
66
+ for (let j = 0; j < b.length; j++) {
67
+ result[i + j] = this.structure.add(result[i + j], this.structure.multiply(a[i], b[j]));
68
+ }
69
+ }
70
+ return this.trim(result);
71
+ }
72
+ /** Polynomial long division over the structure's field operations. */
73
+ divmod(a, b) {
74
+ const bd = this.degree(b);
75
+ if (bd < 0)
76
+ throw new Error("PolynomialRing: division by the zero polynomial");
77
+ let remainder = this.trim(a);
78
+ const leadInv = this.structure.reciprocal(b[bd]);
79
+ const quotient = new Array(Math.max(this.degree(remainder) - bd + 1, 0)).fill(this.structure.zero);
80
+ while (this.degree(remainder) >= bd) {
81
+ const rd = this.degree(remainder);
82
+ const shift = rd - bd;
83
+ const coeff = this.structure.multiply(remainder[rd], leadInv);
84
+ quotient[shift] = coeff;
85
+ for (let i = 0; i <= bd; i++) {
86
+ remainder[i + shift] = this.structure.subtract(remainder[i + shift], this.structure.multiply(coeff, b[i]));
87
+ }
88
+ remainder = this.trim(remainder);
89
+ }
90
+ return { quotient: this.trim(quotient), remainder };
91
+ }
92
+ divide(a, b) {
93
+ return this.divmod(a, b).quotient;
94
+ }
95
+ mod(a, b) {
96
+ return this.divmod(a, b).remainder;
97
+ }
98
+ /** Rescale so the leading coefficient is the structure's one. No-op on the zero polynomial. */
99
+ makeMonic(p) {
100
+ const d = this.degree(p);
101
+ if (d < 0)
102
+ return p;
103
+ return this.scale(p, this.structure.reciprocal(p[d]));
104
+ }
105
+ /** Monic GCD via the Euclidean algorithm (repeated `divmod`). */
106
+ gcd(a, b) {
107
+ let x = this.trim(a);
108
+ let y = this.trim(b);
109
+ while (this.degree(y) >= 0) {
110
+ const { remainder } = this.divmod(x, y);
111
+ x = y;
112
+ y = remainder;
113
+ }
114
+ return this.makeMonic(x);
115
+ }
116
+ /**
117
+ * The derivative polynomial (`i·c_i`, well-defined over any ring: `i` is
118
+ * built up as a running "`n` copies of the structure's `one`, added
119
+ * together" accumulator rather than being reconstructed from scratch for
120
+ * each coefficient — that would cost O(i) additions per coefficient, i.e.
121
+ * O(n²) additions overall for a degree-n polynomial).
122
+ */
123
+ derivative(p) {
124
+ const trimmed = this.trim(p);
125
+ const out = [];
126
+ let n = this.structure.zero; // accumulates to `i` as an element of the structure
127
+ for (let i = 1; i < trimmed.length; i++) {
128
+ n = this.structure.add(n, this.structure.one);
129
+ out.push(this.structure.multiply(n, trimmed[i]));
130
+ }
131
+ return this.trim(out);
132
+ }
133
+ /**
134
+ * An antiderivative with zero constant of integration (`c_i / (i+1)`, via the
135
+ * structure's `reciprocal`). `i+1` is built up as a running accumulator (see
136
+ * {@link derivative}) instead of being reconstructed from scratch per term.
137
+ */
138
+ antiderivative(p) {
139
+ const trimmed = this.trim(p);
140
+ const out = [this.structure.zero];
141
+ let n = this.structure.zero; // accumulates to `i+1` as an element of the structure
142
+ for (let i = 0; i < trimmed.length; i++) {
143
+ n = this.structure.add(n, this.structure.one);
144
+ out.push(this.structure.multiply(trimmed[i], this.structure.reciprocal(n)));
145
+ }
146
+ return this.trim(out);
147
+ }
148
+ /** Evaluate at `x` via Horner's method, using the structure's field operations. */
149
+ evaluate(p, x) {
150
+ let result = this.structure.zero;
151
+ for (let i = p.length - 1; i >= 0; i--) {
152
+ result = this.structure.add(this.structure.multiply(result, x), p[i]);
153
+ }
154
+ return result;
155
+ }
156
+ equal(a, b) {
157
+ const ta = this.trim(a);
158
+ const tb = this.trim(b);
159
+ return ta.length === tb.length && ta.every((x, i) => this.structure.equality(x, tb[i]));
160
+ }
161
+ toString(p, variable = "x") {
162
+ const trimmed = this.trim(p);
163
+ if (trimmed.length === 0)
164
+ return "0";
165
+ const terms = [];
166
+ for (let i = trimmed.length - 1; i >= 0; i--) {
167
+ const c = trimmed[i];
168
+ if (this.structure.equality(c, this.structure.zero))
169
+ continue;
170
+ if (i === 0)
171
+ terms.push(`${c}`);
172
+ else if (i === 1)
173
+ terms.push(`${c}*${variable}`);
174
+ else
175
+ terms.push(`${c}*${variable}^${i}`);
176
+ }
177
+ return terms.join("+");
178
+ }
179
+ }
180
+ /**
181
+ * Parse a real-coefficient polynomial string such as `"3*x^2-2*x+1"` into
182
+ * ascending-power coefficients (inverse of {@link polynomialToString}).
183
+ */
184
+ export function parsePolynomial(str, variable = "x") {
185
+ const s = str.replace(/\s+/g, "");
186
+ if (s === "")
187
+ return [0];
188
+ const terms = s
189
+ .replace(/-/g, "+-")
190
+ .split("+")
191
+ .filter((t) => t !== "");
192
+ const p = [];
193
+ for (const term of terms) {
194
+ let coef;
195
+ let exp;
196
+ const vi = term.indexOf(variable);
197
+ if (vi === -1) {
198
+ coef = Number(term);
199
+ exp = 0;
200
+ }
201
+ else {
202
+ const coefPart = term.slice(0, vi).replace(/\*$/, "");
203
+ coef = coefPart === "" || coefPart === "+" ? 1 : coefPart === "-" ? -1 : Number(coefPart);
204
+ const rest = term.slice(vi + variable.length);
205
+ exp = rest.startsWith("^") ? Number(rest.slice(1)) : 1;
206
+ }
207
+ p[exp] = (p[exp] ?? 0) + coef;
208
+ }
209
+ for (let i = 0; i < p.length; i++)
210
+ if (p[i] === undefined)
211
+ p[i] = 0;
212
+ return p;
213
+ }
214
+ /**
215
+ * Render ascending-power real coefficients as a human-readable string such as
216
+ * `3*x^2+2*x+1` (inverse of {@link parsePolynomial}).
217
+ */
218
+ export function polynomialToString(coeffs, variable = "x", descending = true) {
219
+ const term = (coef, i) => {
220
+ if (i === 0)
221
+ return String(coef);
222
+ if (i === 1)
223
+ return `${coef}*${variable}`;
224
+ return `${coef}*${variable}^${i}`;
225
+ };
226
+ const indices = descending
227
+ ? Array.from({ length: coeffs.length }, (_, i) => coeffs.length - 1 - i)
228
+ : Array.from({ length: coeffs.length }, (_, i) => i);
229
+ return indices.map((i) => term(coeffs[i], i)).join("+");
230
+ }
231
+ //# sourceMappingURL=PolynomialRing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolynomialRing.js","sourceRoot":"","sources":["../src/PolynomialRing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Quaternion — a number of the form `w + x·i + y·j + z·k`, the four-dimensional
3
+ * division algebra. Extends the idea of {@link ComplexNumber} and is the
4
+ * standard tool for representing and composing 3D rotations.
5
+ */
6
+ export declare class Quaternion {
7
+ readonly w: number;
8
+ readonly x: number;
9
+ readonly y: number;
10
+ readonly z: number;
11
+ static readonly Identity: Quaternion;
12
+ static readonly Zero: Quaternion;
13
+ constructor(w?: number, x?: number, y?: number, z?: number);
14
+ add(q: Quaternion): Quaternion;
15
+ subtract(q: Quaternion): Quaternion;
16
+ scale(s: number): Quaternion;
17
+ negate(): Quaternion;
18
+ /** The Hamilton product (non-commutative). */
19
+ multiply(q: Quaternion): Quaternion;
20
+ conjugate(): Quaternion;
21
+ dot(q: Quaternion): number;
22
+ get norm(): number;
23
+ normalize(): Quaternion;
24
+ /** Multiplicative inverse `q⁻¹ = conj(q) / |q|²`. */
25
+ inverse(): Quaternion;
26
+ equals(q: Quaternion): boolean;
27
+ /** A unit quaternion representing a rotation of `angle` radians about `axis`. */
28
+ static fromAxisAngle(axis: [number, number, number], angle: number): Quaternion;
29
+ /** Rotate a 3D vector by this (unit) quaternion, returning `[x, y, z]`. */
30
+ rotateVector(v: [number, number, number]): [number, number, number];
31
+ /** The 3×3 rotation matrix (as `number[][]`) for this quaternion. */
32
+ toRotationMatrix(): number[][];
33
+ /** Spherical linear interpolation between two unit quaternions. */
34
+ static slerp(a: Quaternion, b: Quaternion, t: number): Quaternion;
35
+ toString(): string;
36
+ }
37
+ //# sourceMappingURL=Quaternion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Quaternion.d.ts","sourceRoot":"","sources":["../src/Quaternion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAEnB,MAAM,CAAC,QAAQ,CAAC,QAAQ,aAA8B;IACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,aAA8B;gBAEtC,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,CAAC,SAAI;IAOtC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAI9B,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAInC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAI5B,MAAM,IAAI,UAAU;IAIpB,8CAA8C;IAC9C,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IASnC,SAAS,IAAI,UAAU;IAIvB,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM;IAI1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,SAAS,IAAI,UAAU;IAMvB,qDAAqD;IACrD,OAAO,IAAI,UAAU;IAMrB,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO;IAI9B,iFAAiF;IACjF,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;IAQ/E,2EAA2E;IAC3E,YAAY,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAOnE,qEAAqE;IACrE,gBAAgB,IAAI,MAAM,EAAE,EAAE;IAS9B,mEAAmE;IACnE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU;IAiBjE,QAAQ,IAAI,MAAM;CAGnB"}