@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,106 @@
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 class Quaternion {
7
+ w;
8
+ x;
9
+ y;
10
+ z;
11
+ static Identity = new Quaternion(1, 0, 0, 0);
12
+ static Zero = new Quaternion(0, 0, 0, 0);
13
+ constructor(w = 0, x = 0, y = 0, z = 0) {
14
+ this.w = w;
15
+ this.x = x;
16
+ this.y = y;
17
+ this.z = z;
18
+ }
19
+ add(q) {
20
+ return new Quaternion(this.w + q.w, this.x + q.x, this.y + q.y, this.z + q.z);
21
+ }
22
+ subtract(q) {
23
+ return new Quaternion(this.w - q.w, this.x - q.x, this.y - q.y, this.z - q.z);
24
+ }
25
+ scale(s) {
26
+ return new Quaternion(this.w * s, this.x * s, this.y * s, this.z * s);
27
+ }
28
+ negate() {
29
+ return new Quaternion(-this.w, -this.x, -this.y, -this.z);
30
+ }
31
+ /** The Hamilton product (non-commutative). */
32
+ multiply(q) {
33
+ return new Quaternion(this.w * q.w - this.x * q.x - this.y * q.y - this.z * q.z, this.w * q.x + this.x * q.w + this.y * q.z - this.z * q.y, this.w * q.y - this.x * q.z + this.y * q.w + this.z * q.x, this.w * q.z + this.x * q.y - this.y * q.x + this.z * q.w);
34
+ }
35
+ conjugate() {
36
+ return new Quaternion(this.w, -this.x, -this.y, -this.z);
37
+ }
38
+ dot(q) {
39
+ return this.w * q.w + this.x * q.x + this.y * q.y + this.z * q.z;
40
+ }
41
+ get norm() {
42
+ return Math.hypot(this.w, this.x, this.y, this.z);
43
+ }
44
+ normalize() {
45
+ const n = this.norm;
46
+ if (n === 0)
47
+ throw new Error("Cannot normalize the zero quaternion.");
48
+ return this.scale(1 / n);
49
+ }
50
+ /** Multiplicative inverse `q⁻¹ = conj(q) / |q|²`. */
51
+ inverse() {
52
+ const n2 = this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z;
53
+ if (n2 === 0)
54
+ throw new Error("The zero quaternion has no inverse.");
55
+ return this.conjugate().scale(1 / n2);
56
+ }
57
+ equals(q) {
58
+ return this.w === q.w && this.x === q.x && this.y === q.y && this.z === q.z;
59
+ }
60
+ /** A unit quaternion representing a rotation of `angle` radians about `axis`. */
61
+ static fromAxisAngle(axis, angle) {
62
+ const [ax, ay, az] = axis;
63
+ const len = Math.hypot(ax, ay, az) || 1;
64
+ const half = angle / 2;
65
+ const s = Math.sin(half) / len;
66
+ return new Quaternion(Math.cos(half), ax * s, ay * s, az * s);
67
+ }
68
+ /** Rotate a 3D vector by this (unit) quaternion, returning `[x, y, z]`. */
69
+ rotateVector(v) {
70
+ const q = this.normalize();
71
+ const p = new Quaternion(0, v[0], v[1], v[2]);
72
+ const r = q.multiply(p).multiply(q.conjugate());
73
+ return [r.x, r.y, r.z];
74
+ }
75
+ /** The 3×3 rotation matrix (as `number[][]`) for this quaternion. */
76
+ toRotationMatrix() {
77
+ const { w, x, y, z } = this.normalize();
78
+ return [
79
+ [1 - 2 * (y * y + z * z), 2 * (x * y - z * w), 2 * (x * z + y * w)],
80
+ [2 * (x * y + z * w), 1 - 2 * (x * x + z * z), 2 * (y * z - x * w)],
81
+ [2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x * x + y * y)],
82
+ ];
83
+ }
84
+ /** Spherical linear interpolation between two unit quaternions. */
85
+ static slerp(a, b, t) {
86
+ const qa = a.normalize();
87
+ let qb = b.normalize();
88
+ let cos = qa.dot(qb);
89
+ if (cos < 0) {
90
+ qb = qb.scale(-1);
91
+ cos = -cos;
92
+ }
93
+ if (cos > 0.9995)
94
+ return qa.add(qb.subtract(qa).scale(t)).normalize();
95
+ const theta0 = Math.acos(cos);
96
+ const theta = theta0 * t;
97
+ const sinTheta0 = Math.sin(theta0);
98
+ const s0 = Math.sin(theta0 - theta) / sinTheta0;
99
+ const s1 = Math.sin(theta) / sinTheta0;
100
+ return qa.scale(s0).add(qb.scale(s1));
101
+ }
102
+ toString() {
103
+ return `${this.w} + ${this.x}i + ${this.y}j + ${this.z}k`;
104
+ }
105
+ }
106
+ //# sourceMappingURL=Quaternion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Quaternion.js","sourceRoot":"","sources":["../src/Quaternion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Rational — an exact rational number `numerator / denominator` backed by
3
+ * `bigint`, always stored in lowest terms with a positive denominator. Gives the
4
+ * library exact (error-free) arithmetic, e.g. for exact linear algebra or
5
+ * polynomial GCDs.
6
+ */
7
+ export declare class Rational {
8
+ readonly numerator: bigint;
9
+ readonly denominator: bigint;
10
+ static readonly Zero: Rational;
11
+ static readonly One: Rational;
12
+ constructor(numerator: bigint | number, denominator?: bigint | number);
13
+ static from(value: bigint | number | Rational): Rational;
14
+ /** Best rational approximation of a float via continued fractions. */
15
+ static fromNumber(value: number, maxDenominator?: number): Rational;
16
+ add(other: Rational): Rational;
17
+ subtract(other: Rational): Rational;
18
+ multiply(other: Rational): Rational;
19
+ divide(other: Rational): Rational;
20
+ negate(): Rational;
21
+ reciprocal(): Rational;
22
+ abs(): Rational;
23
+ /** Raise to an integer power (negative powers invert). */
24
+ pow(exponent: number): Rational;
25
+ equals(other: Rational): boolean;
26
+ /** -1, 0 or 1 depending on ordering against `other`. */
27
+ compare(other: Rational): number;
28
+ lessThan(other: Rational): boolean;
29
+ get sign(): number;
30
+ isZero(): boolean;
31
+ toNumber(): number;
32
+ toString(): string;
33
+ }
34
+ //# sourceMappingURL=Rational.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rational.d.ts","sourceRoot":"","sources":["../src/Rational.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,MAAM,CAAC,QAAQ,CAAC,IAAI,WAAwB;IAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAwB;gBAE/B,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,MAAW;IAazE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ;IAMxD,sEAAsE;IACtE,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,SAAY,GAAG,QAAQ;IAoBtE,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAO9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAOnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAInC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAKjC,MAAM,IAAI,QAAQ;IAIlB,UAAU,IAAI,QAAQ;IAKtB,GAAG,IAAI,QAAQ;IAIf,0DAA0D;IAC1D,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;IAc/B,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIhC,wDAAwD;IACxD,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAKhC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIlC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,IAAI,OAAO;IAIjB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Rational — an exact rational number `numerator / denominator` backed by
3
+ * `bigint`, always stored in lowest terms with a positive denominator. Gives the
4
+ * library exact (error-free) arithmetic, e.g. for exact linear algebra or
5
+ * polynomial GCDs.
6
+ */
7
+ function bgcd(a, b) {
8
+ let x = a < 0n ? -a : a;
9
+ let y = b < 0n ? -b : b;
10
+ while (y)
11
+ [x, y] = [y, x % y];
12
+ return x;
13
+ }
14
+ const toBig = (x) => {
15
+ if (typeof x === "bigint")
16
+ return x;
17
+ if (!Number.isInteger(x))
18
+ throw new Error(`Rational requires integer inputs; got ${x}`);
19
+ return BigInt(x);
20
+ };
21
+ export class Rational {
22
+ numerator;
23
+ denominator;
24
+ static Zero = new Rational(0n, 1n);
25
+ static One = new Rational(1n, 1n);
26
+ constructor(numerator, denominator = 1n) {
27
+ let n = toBig(numerator);
28
+ let d = toBig(denominator);
29
+ if (d === 0n)
30
+ throw new Error("Rational denominator must be non-zero.");
31
+ if (d < 0n) {
32
+ n = -n;
33
+ d = -d;
34
+ }
35
+ const g = bgcd(n, d) || 1n;
36
+ this.numerator = n / g;
37
+ this.denominator = d / g;
38
+ }
39
+ static from(value) {
40
+ if (value instanceof Rational)
41
+ return value;
42
+ if (typeof value === "bigint")
43
+ return new Rational(value, 1n);
44
+ return Rational.fromNumber(value);
45
+ }
46
+ /** Best rational approximation of a float via continued fractions. */
47
+ static fromNumber(value, maxDenominator = 1_000_000) {
48
+ if (Number.isInteger(value))
49
+ return new Rational(BigInt(value), 1n);
50
+ if (!Number.isFinite(value))
51
+ throw new Error("Cannot make a Rational from a non-finite number.");
52
+ let [h0, h1] = [0n, 1n];
53
+ let [k0, k1] = [1n, 0n];
54
+ let x = value;
55
+ const maxD = BigInt(maxDenominator);
56
+ for (let i = 0; i < 64; i++) {
57
+ const a = Math.floor(x);
58
+ const aB = BigInt(a);
59
+ [h0, h1] = [h1, aB * h1 + h0];
60
+ [k0, k1] = [k1, aB * k1 + k0];
61
+ if (k1 > maxD)
62
+ return new Rational(h0, k0);
63
+ const frac = x - a;
64
+ if (frac < 1e-15)
65
+ break;
66
+ x = 1 / frac;
67
+ }
68
+ return new Rational(h1, k1);
69
+ }
70
+ add(other) {
71
+ return new Rational(this.numerator * other.denominator + other.numerator * this.denominator, this.denominator * other.denominator);
72
+ }
73
+ subtract(other) {
74
+ return new Rational(this.numerator * other.denominator - other.numerator * this.denominator, this.denominator * other.denominator);
75
+ }
76
+ multiply(other) {
77
+ return new Rational(this.numerator * other.numerator, this.denominator * other.denominator);
78
+ }
79
+ divide(other) {
80
+ if (other.numerator === 0n)
81
+ throw new Error("Division by zero Rational.");
82
+ return new Rational(this.numerator * other.denominator, this.denominator * other.numerator);
83
+ }
84
+ negate() {
85
+ return new Rational(-this.numerator, this.denominator);
86
+ }
87
+ reciprocal() {
88
+ if (this.numerator === 0n)
89
+ throw new Error("Zero has no reciprocal.");
90
+ return new Rational(this.denominator, this.numerator);
91
+ }
92
+ abs() {
93
+ return this.numerator < 0n ? this.negate() : this;
94
+ }
95
+ /** Raise to an integer power (negative powers invert). */
96
+ pow(exponent) {
97
+ if (!Number.isInteger(exponent))
98
+ throw new Error("Rational.pow requires an integer exponent.");
99
+ if (exponent < 0)
100
+ return this.reciprocal().pow(-exponent);
101
+ let result = Rational.One;
102
+ let base = this;
103
+ let e = exponent;
104
+ while (e > 0) {
105
+ if (e & 1)
106
+ result = result.multiply(base);
107
+ base = base.multiply(base);
108
+ e >>= 1;
109
+ }
110
+ return result;
111
+ }
112
+ equals(other) {
113
+ return this.numerator === other.numerator && this.denominator === other.denominator;
114
+ }
115
+ /** -1, 0 or 1 depending on ordering against `other`. */
116
+ compare(other) {
117
+ const diff = this.numerator * other.denominator - other.numerator * this.denominator;
118
+ return diff < 0n ? -1 : diff > 0n ? 1 : 0;
119
+ }
120
+ lessThan(other) {
121
+ return this.compare(other) < 0;
122
+ }
123
+ get sign() {
124
+ return this.numerator < 0n ? -1 : this.numerator > 0n ? 1 : 0;
125
+ }
126
+ isZero() {
127
+ return this.numerator === 0n;
128
+ }
129
+ toNumber() {
130
+ return Number(this.numerator) / Number(this.denominator);
131
+ }
132
+ toString() {
133
+ return this.denominator === 1n ? `${this.numerator}` : `${this.numerator}/${this.denominator}`;
134
+ }
135
+ }
136
+ //# sourceMappingURL=Rational.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rational.js","sourceRoot":"","sources":["../src/Rational.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { Vector } from "./Vector.ts";
2
+ /**
3
+ * RealMath — arithmetic, trigonometry, numeric calculus and probability over
4
+ * real numbers, as plain exported functions (no wrapping class — a `static`
5
+ * method bag buys nothing over top-level functions for pure scalar math).
6
+ * Ported from Mallory's ActionScript `RealMath`.
7
+ *
8
+ * Matrix operations were dropped: `Structure.realField()` already provides
9
+ * generic linear algebra, and {@link MatrixMath} covers heavier real-only
10
+ * needs (LU/QR/Cholesky/SVD). Sample statistics (`mean`/`variance`/percentiles/
11
+ * regression/etc.) moved to {@link Statistics}, which is real-only by nature
12
+ * (order-dependent stats don't generalize to complex numbers).
13
+ *
14
+ * Bugs fixed from the AS3 original:
15
+ * - `subtract` returned `a*b` (!).
16
+ * - `equal` ignored its tolerance argument (`Math.abs(a-b) <= 0`).
17
+ * - `integrateN` used a nonsensical sample point and had an unreachable return.
18
+ * - `differentiateN` was a forward difference despite claiming to be symmetric.
19
+ * - `crossProduct` read index 3 for the z-component and used truthiness tests.
20
+ */
21
+ type RVec = Vector<number>;
22
+ type Unary = (x: number) => number;
23
+ export declare const Zero = 0;
24
+ export declare const One = 1;
25
+ export declare const E: number;
26
+ export declare const PI: number;
27
+ export declare const PHI = 1.61803399;
28
+ export declare const PositiveInfinity: number;
29
+ export declare const NegativeInfinity: number;
30
+ export declare function radiansToDegrees(r: number): number;
31
+ export declare function degreesToRadians(d: number): number;
32
+ /** Equality within `distance` (bug fix: AS3 ignored the tolerance). */
33
+ export declare function equal(a: number, b: number, distance?: number): boolean;
34
+ export declare function compare(a: number, b: number): number;
35
+ export declare function lessThan(a: number, b: number): boolean;
36
+ export declare function greaterThan(a: number, b: number): boolean;
37
+ export declare function negative(a?: number): number;
38
+ /** `1/a` (matches `divide`'s directed-infinity convention rather than always returning NaN). */
39
+ export declare function reciprocal(a?: number): number;
40
+ /** Round away tiny floating-point noise (rounds to 10 decimal places). */
41
+ export declare function identity(a?: number): number;
42
+ export declare function add(a?: number, b?: number): number;
43
+ /** Subtraction (bug fix: AS3 returned `a*b`). */
44
+ export declare function subtract(a?: number, b?: number): number;
45
+ export declare function multiply(a?: number, b?: number): number;
46
+ export declare function divide(a?: number, b?: number): number;
47
+ export declare function power(a?: number, exponent?: number): number;
48
+ export declare function square(a?: number): number;
49
+ export declare function squareRoot(a?: number): number;
50
+ export declare function logarithm(a?: number, base?: number): number;
51
+ export declare function sine(a?: number): number;
52
+ export declare function cosine(a?: number): number;
53
+ export declare function tangent(a?: number): number;
54
+ export declare function cosecant(a?: number): number;
55
+ export declare function secant(a?: number): number;
56
+ export declare function cotangent(a?: number): number;
57
+ export declare function hyperbolicSine(a: number): number;
58
+ export declare function hyperbolicCosine(a: number): number;
59
+ export declare function hyperbolicTangent(a: number): number;
60
+ export declare function hyperbolicCosecant(a: number): number;
61
+ export declare function hyperbolicSecant(a: number): number;
62
+ export declare function hyperbolicCotangent(a: number): number;
63
+ export declare function sumSeries(unaryOperation: Unary, start?: number, end?: number): number;
64
+ export declare function productSeries(unaryOperation: Unary, start?: number, end?: number): number;
65
+ /**
66
+ * Newton–Raphson root finder for `unaryOperation(x) == target`.
67
+ *
68
+ * Bug fix: the AS3 version updated `guess -= (f(guess) - target)`, i.e. Newton
69
+ * with an assumed derivative of 1 — it diverges for almost any nonlinear
70
+ * function. Here the derivative is estimated numerically ({@link differentiateN})
71
+ * so the iteration actually converges, and unbounded recursion is replaced by a
72
+ * bounded loop.
73
+ */
74
+ export declare function solveN(unaryOperation: Unary, target: number, desiredAccuracy?: number, guess?: number, maxIterations?: number): number;
75
+ /**
76
+ * Numeric integral via the midpoint rule (bug fix: the AS3 code sampled at
77
+ * `2*lowerLimit+interval` and had an unreachable return).
78
+ */
79
+ export declare function integrateN(unaryOperation: Unary, lowerLimit: number, upperLimit: number, interval?: number): number;
80
+ /**
81
+ * Numeric derivative via the symmetric difference quotient (bug fix: the AS3
82
+ * code was a forward difference despite the "symmetric" comment).
83
+ */
84
+ export declare function differentiateN(unaryOperation: Unary, point: number, limit?: number): number;
85
+ export declare function normalDistribution(mean: number, sDev: number): Unary;
86
+ export declare function standardNormalDistribution(x: number): number;
87
+ export declare function normalProbability(x: number, mean: number, sDev: number, negativeInfinityApproximation?: number, integrationInterval?: number): number;
88
+ export declare function standardNormalProbability(z: number, negativeInfinityApproximation?: number, interval?: number): number;
89
+ /** Round to `precision` decimal places (replaces the buggy Flex NumberFormatter). */
90
+ export declare function roundTo(num: number, precision?: number): number;
91
+ /** Uniform random in `[min(r1,r2), max(r1,r2)]`. */
92
+ export declare function random(r1?: number, r2?: number, _inclusive?: boolean): number;
93
+ /** Placeholder for the random.org fetch; always falls back to {@link random}. */
94
+ export declare function randomOrg(lower?: number, upper?: number, inclusive?: boolean, fallback?: boolean): number;
95
+ export declare function jitter(a: number, magnitude?: number): number;
96
+ export declare function addVector(alpha: RVec, beta: RVec): RVec;
97
+ export declare function scaleVector(alpha: RVec, scalar: number): RVec;
98
+ export declare function negativeVector(alpha: RVec): RVec;
99
+ export declare function subtractVector(alpha: RVec, beta: RVec): RVec;
100
+ export declare function dotProduct(alpha: RVec, beta: RVec): number;
101
+ /**
102
+ * 3D cross product (bug fix: the AS3 code read index 3 for the z-component
103
+ * and used truthiness tests that dropped legitimate zero components).
104
+ */
105
+ export declare function crossProduct(alpha: RVec, beta: RVec): RVec;
106
+ export declare function kroneckerProduct(A: RVec, B: RVec): RVec;
107
+ export declare function distanceVector(alpha: RVec, beta: RVec, norm?: number): number;
108
+ export declare function pNorm(alpha: RVec, norm?: number): number;
109
+ export declare function magnitudeVector(alpha: RVec): number;
110
+ export declare function angleBetween(alpha: RVec, beta: RVec): number;
111
+ export {};
112
+ //# sourceMappingURL=RealMath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealMath.d.ts","sourceRoot":"","sources":["../src/RealMath.ts"],"names":[],"mappings":"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"}