nerdamer 1.1.13 → 2.0.0-rc.1

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 (341) hide show
  1. package/LICENSE.md +184 -0
  2. package/README.md +293 -312
  3. package/dist/bundle.js +2 -0
  4. package/dist/bundle.js.LICENSE.txt +7 -0
  5. package/dist/parser.js +2 -0
  6. package/dist/parser.js.LICENSE.txt +7 -0
  7. package/docs-data/parser-functions.json +1960 -0
  8. package/index.d.ts +10 -426
  9. package/output/algebra/adapters.d.ts +33 -0
  10. package/output/algebra/adapters.js +109 -0
  11. package/output/algebra/algorithms/arith.d.ts +84 -0
  12. package/output/algebra/algorithms/arith.js +323 -0
  13. package/output/algebra/algorithms/factor.d.ts +3 -0
  14. package/output/algebra/algorithms/factor.js +5 -0
  15. package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
  16. package/output/algebra/algorithms/factorMultivariate.js +2393 -0
  17. package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
  18. package/output/algebra/algorithms/factorUnivariate.js +1072 -0
  19. package/output/algebra/algorithms/gcd.d.ts +22 -0
  20. package/output/algebra/algorithms/gcd.js +690 -0
  21. package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
  22. package/output/algebra/algorithms/groebnerBase.js +1166 -0
  23. package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
  24. package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
  25. package/output/algebra/algorithms/poly.d.ts +228 -0
  26. package/output/algebra/algorithms/poly.js +1299 -0
  27. package/output/algebra/algorithms/rational.d.ts +17 -0
  28. package/output/algebra/algorithms/rational.js +115 -0
  29. package/output/algebra/factor/factor.d.ts +62 -0
  30. package/output/algebra/factor/factor.js +158 -0
  31. package/output/algebra/gcd/gcd.d.ts +29 -0
  32. package/output/algebra/gcd/gcd.js +141 -0
  33. package/output/algebra/groebner.d.ts +21 -0
  34. package/output/algebra/groebner.js +42 -0
  35. package/output/algebra/partfrac.d.ts +19 -0
  36. package/output/algebra/partfrac.js +398 -0
  37. package/output/algebra/polynomialize.d.ts +20 -0
  38. package/output/algebra/polynomialize.js +24 -0
  39. package/output/algebra/simplify/complexsimp.d.ts +7 -0
  40. package/output/algebra/simplify/complexsimp.js +24 -0
  41. package/output/algebra/simplify/factorCommon.d.ts +13 -0
  42. package/output/algebra/simplify/factorCommon.js +136 -0
  43. package/output/algebra/simplify/funcsimp.d.ts +26 -0
  44. package/output/algebra/simplify/funcsimp.js +633 -0
  45. package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
  46. package/output/algebra/simplify/invtrigrewrite.js +96 -0
  47. package/output/algebra/simplify/ratsimp.d.ts +21 -0
  48. package/output/algebra/simplify/ratsimp.js +140 -0
  49. package/output/algebra/simplify/simplify.d.ts +25 -0
  50. package/output/algebra/simplify/simplify.js +228 -0
  51. package/output/algebra/simplify/trigreduce.d.ts +38 -0
  52. package/output/algebra/simplify/trigreduce.js +424 -0
  53. package/output/algebra/simplify/trigrewrite.d.ts +17 -0
  54. package/output/algebra/simplify/trigrewrite.js +156 -0
  55. package/output/algebra/simplify/trigsimp.d.ts +11 -0
  56. package/output/algebra/simplify/trigsimp.js +369 -0
  57. package/output/algebra/simplify/utils.d.ts +32 -0
  58. package/output/algebra/simplify/utils.js +56 -0
  59. package/output/algebra/utils.d.ts +32 -0
  60. package/output/algebra/utils.js +48 -0
  61. package/output/api/advanced.d.ts +7 -0
  62. package/output/api/advanced.js +18 -0
  63. package/output/api/algebra.d.ts +17 -0
  64. package/output/api/algebra.js +32 -0
  65. package/output/api/assumptions.d.ts +4 -0
  66. package/output/api/assumptions.js +11 -0
  67. package/output/api/calculus.d.ts +9 -0
  68. package/output/api/calculus.js +21 -0
  69. package/output/api/core.d.ts +17 -0
  70. package/output/api/core.js +41 -0
  71. package/output/api/debug.d.ts +16 -0
  72. package/output/api/debug.js +23 -0
  73. package/output/api/parser.d.ts +85 -0
  74. package/output/api/parser.js +16 -0
  75. package/output/api/solve.d.ts +10 -0
  76. package/output/api/solve.js +16 -0
  77. package/output/api/structures.d.ts +10 -0
  78. package/output/api/structures.js +22 -0
  79. package/output/calculus/derivative/diff.d.ts +30 -0
  80. package/output/calculus/derivative/diff.js +238 -0
  81. package/output/calculus/fresnel.d.ts +16 -0
  82. package/output/calculus/fresnel.js +39 -0
  83. package/output/calculus/integrate/byParts.d.ts +18 -0
  84. package/output/calculus/integrate/byParts.js +339 -0
  85. package/output/calculus/integrate/bySubstitution.d.ts +135 -0
  86. package/output/calculus/integrate/bySubstitution.js +411 -0
  87. package/output/calculus/integrate/integrate.d.ts +38 -0
  88. package/output/calculus/integrate/integrate.js +652 -0
  89. package/output/calculus/integrate/integrationTable.d.ts +2 -0
  90. package/output/calculus/integrate/integrationTable.js +914 -0
  91. package/output/calculus/integrate/utils.d.ts +28 -0
  92. package/output/calculus/integrate/utils.js +96 -0
  93. package/output/calculus/laplace/ilaplace.d.ts +31 -0
  94. package/output/calculus/laplace/ilaplace.js +192 -0
  95. package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
  96. package/output/calculus/laplace/ilaplaceTable.js +200 -0
  97. package/output/calculus/laplace/laplace.d.ts +22 -0
  98. package/output/calculus/laplace/laplace.js +109 -0
  99. package/output/calculus/laplace/laplaceTable.d.ts +2 -0
  100. package/output/calculus/laplace/laplaceTable.js +187 -0
  101. package/output/calculus/limit/limit.d.ts +35 -0
  102. package/output/calculus/limit/limit.js +1183 -0
  103. package/output/calculus/limit/limitsTable.d.ts +2 -0
  104. package/output/calculus/limit/limitsTable.js +7 -0
  105. package/output/core/Settings.d.ts +32 -0
  106. package/output/core/Settings.js +68 -0
  107. package/output/core/adapters.d.ts +18 -0
  108. package/output/core/adapters.js +40 -0
  109. package/output/core/classes/assumption/Assumption.d.ts +218 -0
  110. package/output/core/classes/assumption/Assumption.js +605 -0
  111. package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
  112. package/output/core/classes/assumption/assertiveFunctions.js +64 -0
  113. package/output/core/classes/assumption/assume.d.ts +90 -0
  114. package/output/core/classes/assumption/assume.js +145 -0
  115. package/output/core/classes/collection/Collection.d.ts +107 -0
  116. package/output/core/classes/collection/Collection.js +231 -0
  117. package/output/core/classes/complex/Complex.d.ts +99 -0
  118. package/output/core/classes/complex/Complex.js +135 -0
  119. package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
  120. package/output/core/classes/decimalSet/DecimalSet.js +453 -0
  121. package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
  122. package/output/core/classes/dictionary/Dictionary.js +213 -0
  123. package/output/core/classes/equation/Equation.d.ts +256 -0
  124. package/output/core/classes/equation/Equation.js +350 -0
  125. package/output/core/classes/expression/CoeffObject.d.ts +100 -0
  126. package/output/core/classes/expression/CoeffObject.js +198 -0
  127. package/output/core/classes/expression/Expression.d.ts +1674 -0
  128. package/output/core/classes/expression/Expression.js +2332 -0
  129. package/output/core/classes/expression/analysis.d.ts +25 -0
  130. package/output/core/classes/expression/analysis.js +218 -0
  131. package/output/core/classes/expression/collect.d.ts +9 -0
  132. package/output/core/classes/expression/collect.js +49 -0
  133. package/output/core/classes/expression/format.d.ts +45 -0
  134. package/output/core/classes/expression/format.js +217 -0
  135. package/output/core/classes/expression/products.d.ts +23 -0
  136. package/output/core/classes/expression/products.js +115 -0
  137. package/output/core/classes/expression/shortcuts.d.ts +35 -0
  138. package/output/core/classes/expression/shortcuts.js +129 -0
  139. package/output/core/classes/expression/traversal.d.ts +31 -0
  140. package/output/core/classes/expression/traversal.js +216 -0
  141. package/output/core/classes/expression/trig.d.ts +25 -0
  142. package/output/core/classes/expression/trig.js +40 -0
  143. package/output/core/classes/expression/utils.d.ts +52 -0
  144. package/output/core/classes/expression/utils.js +189 -0
  145. package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
  146. package/output/core/classes/lookupTable/LookupTable.js +55 -0
  147. package/output/core/classes/matrix/Matrix.d.ts +227 -0
  148. package/output/core/classes/matrix/Matrix.js +889 -0
  149. package/output/core/classes/matrix/Sylvester.d.ts +11 -0
  150. package/output/core/classes/matrix/Sylvester.js +54 -0
  151. package/output/core/classes/matrix/functions.d.ts +26 -0
  152. package/output/core/classes/matrix/functions.js +52 -0
  153. package/output/core/classes/matrix/utils.d.ts +9 -0
  154. package/output/core/classes/matrix/utils.js +22 -0
  155. package/output/core/classes/parser/Parser.d.ts +480 -0
  156. package/output/core/classes/parser/Parser.js +1812 -0
  157. package/output/core/classes/parser/Token.d.ts +58 -0
  158. package/output/core/classes/parser/Token.js +137 -0
  159. package/output/core/classes/parser/constants.d.ts +160 -0
  160. package/output/core/classes/parser/constants.js +227 -0
  161. package/output/core/classes/parser/helpers.d.ts +21 -0
  162. package/output/core/classes/parser/helpers.js +42 -0
  163. package/output/core/classes/parser/operations/add.d.ts +15 -0
  164. package/output/core/classes/parser/operations/add.js +238 -0
  165. package/output/core/classes/parser/operations/comma.d.ts +7 -0
  166. package/output/core/classes/parser/operations/comma.js +11 -0
  167. package/output/core/classes/parser/operations/compare.d.ts +21 -0
  168. package/output/core/classes/parser/operations/compare.js +461 -0
  169. package/output/core/classes/parser/operations/divide.d.ts +2 -0
  170. package/output/core/classes/parser/operations/divide.js +72 -0
  171. package/output/core/classes/parser/operations/functions.d.ts +46 -0
  172. package/output/core/classes/parser/operations/functions.js +430 -0
  173. package/output/core/classes/parser/operations/multiply.d.ts +11 -0
  174. package/output/core/classes/parser/operations/multiply.js +321 -0
  175. package/output/core/classes/parser/operations/power.d.ts +48 -0
  176. package/output/core/classes/parser/operations/power.js +673 -0
  177. package/output/core/classes/parser/operations/subtract.d.ts +3 -0
  178. package/output/core/classes/parser/operations/subtract.js +35 -0
  179. package/output/core/classes/parser/preprocess.d.ts +14 -0
  180. package/output/core/classes/parser/preprocess.js +259 -0
  181. package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
  182. package/output/core/classes/parser/scripting/controlFlow.js +355 -0
  183. package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
  184. package/output/core/classes/parser/scripting/evaluate.js +112 -0
  185. package/output/core/classes/parser/scripting/functions.d.ts +14 -0
  186. package/output/core/classes/parser/scripting/functions.js +59 -0
  187. package/output/core/classes/parser/scripting/scope.d.ts +35 -0
  188. package/output/core/classes/parser/scripting/scope.js +155 -0
  189. package/output/core/classes/parser/types.d.ts +125 -0
  190. package/output/core/classes/parser/types.js +2 -0
  191. package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
  192. package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
  193. package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
  194. package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
  195. package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
  196. package/output/core/classes/polynomial/Polynomial.js +1149 -0
  197. package/output/core/classes/polynomial/Term.d.ts +222 -0
  198. package/output/core/classes/polynomial/Term.js +430 -0
  199. package/output/core/classes/polynomial/functions.d.ts +69 -0
  200. package/output/core/classes/polynomial/functions.js +126 -0
  201. package/output/core/classes/polynomial/utils.d.ts +62 -0
  202. package/output/core/classes/polynomial/utils.js +206 -0
  203. package/output/core/classes/rational/Rational.d.ts +504 -0
  204. package/output/core/classes/rational/Rational.js +779 -0
  205. package/output/core/classes/seq/SEQ.d.ts +13 -0
  206. package/output/core/classes/seq/SEQ.js +137 -0
  207. package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
  208. package/output/core/classes/valuesSet/ValuesSet.js +381 -0
  209. package/output/core/classes/vector/Vector.d.ts +222 -0
  210. package/output/core/classes/vector/Vector.js +497 -0
  211. package/output/core/classes/vector/functions.d.ts +28 -0
  212. package/output/core/classes/vector/functions.js +47 -0
  213. package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
  214. package/output/core/common/classes/MathematicalAggregate.js +140 -0
  215. package/output/core/common/classes/Scope.d.ts +62 -0
  216. package/output/core/common/classes/Scope.js +122 -0
  217. package/output/core/common/classes/StructuredEntity.d.ts +55 -0
  218. package/output/core/common/classes/StructuredEntity.js +151 -0
  219. package/output/core/common/common.d.ts +63 -0
  220. package/output/core/common/common.js +279 -0
  221. package/output/core/common/functions/functions.d.ts +14 -0
  222. package/output/core/common/functions/functions.js +33 -0
  223. package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
  224. package/output/core/common/functions/structuredEntityUtils.js +40 -0
  225. package/output/core/converters/BaseConverter.d.ts +97 -0
  226. package/output/core/converters/BaseConverter.js +405 -0
  227. package/output/core/converters/Converter.d.ts +111 -0
  228. package/output/core/converters/Converter.js +802 -0
  229. package/output/core/converters/Pattern.d.ts +71 -0
  230. package/output/core/converters/Pattern.js +302 -0
  231. package/output/core/dispatch.d.ts +34 -0
  232. package/output/core/dispatch.js +304 -0
  233. package/output/core/errors.d.ts +531 -0
  234. package/output/core/errors.js +621 -0
  235. package/output/core/functions/bigint/bigint.d.ts +121 -0
  236. package/output/core/functions/bigint/bigint.js +392 -0
  237. package/output/core/functions/bigint/primeFactor.d.ts +49 -0
  238. package/output/core/functions/bigint/primeFactor.js +267 -0
  239. package/output/core/functions/bigint/primes.d.ts +1 -0
  240. package/output/core/functions/bigint/primes.js +11 -0
  241. package/output/core/functions/build/definitions.d.ts +12 -0
  242. package/output/core/functions/build/definitions.js +133 -0
  243. package/output/core/functions/build/index.d.ts +32 -0
  244. package/output/core/functions/build/index.js +136 -0
  245. package/output/core/functions/complex.d.ts +90 -0
  246. package/output/core/functions/complex.js +482 -0
  247. package/output/core/functions/decimal.d.ts +24 -0
  248. package/output/core/functions/decimal.js +664 -0
  249. package/output/core/functions/expand/expand.d.ts +42 -0
  250. package/output/core/functions/expand/expand.js +376 -0
  251. package/output/core/functions/fresnelNumeric.d.ts +12 -0
  252. package/output/core/functions/fresnelNumeric.js +123 -0
  253. package/output/core/functions/numeric.d.ts +140 -0
  254. package/output/core/functions/numeric.js +790 -0
  255. package/output/core/functions/rationalNormalization.d.ts +11 -0
  256. package/output/core/functions/rationalNormalization.js +117 -0
  257. package/output/core/functions/setFunction.d.ts +19 -0
  258. package/output/core/functions/setFunction.js +75 -0
  259. package/output/core/functions/string.d.ts +26 -0
  260. package/output/core/functions/string.js +101 -0
  261. package/output/core/functions/subst.d.ts +90 -0
  262. package/output/core/functions/subst.js +498 -0
  263. package/output/core/functions/utils.d.ts +24 -0
  264. package/output/core/functions/utils.js +51 -0
  265. package/output/core/types.d.ts +48 -0
  266. package/output/core/types.js +2 -0
  267. package/output/index.d.ts +339 -0
  268. package/output/index.js +715 -0
  269. package/output/math/defint/defintDecimal.d.ts +37 -0
  270. package/output/math/defint/defintDecimal.js +320 -0
  271. package/output/math/defint/defintNative.d.ts +57 -0
  272. package/output/math/defint/defintNative.js +292 -0
  273. package/output/math/geometry.d.ts +8 -0
  274. package/output/math/geometry.js +32 -0
  275. package/output/math/math.d.ts +655 -0
  276. package/output/math/math.js +1811 -0
  277. package/output/math/trig.d.ts +518 -0
  278. package/output/math/trig.js +1444 -0
  279. package/output/math/trunc.d.ts +19 -0
  280. package/output/math/trunc.js +36 -0
  281. package/output/math/utils.d.ts +60 -0
  282. package/output/math/utils.js +180 -0
  283. package/output/solve/classes/DecimalMatrix.d.ts +17 -0
  284. package/output/solve/classes/DecimalMatrix.js +86 -0
  285. package/output/solve/classes/FunctionSolver.d.ts +135 -0
  286. package/output/solve/classes/FunctionSolver.js +433 -0
  287. package/output/solve/classes/MultivariateSolver.d.ts +84 -0
  288. package/output/solve/classes/MultivariateSolver.js +240 -0
  289. package/output/solve/classes/PolynomialSolver.d.ts +85 -0
  290. package/output/solve/classes/PolynomialSolver.js +292 -0
  291. package/output/solve/classes/SolutionSet.d.ts +153 -0
  292. package/output/solve/classes/SolutionSet.js +357 -0
  293. package/output/solve/classes/Solver.d.ts +17 -0
  294. package/output/solve/classes/Solver.js +132 -0
  295. package/output/solve/classes/SymbolicSolver.d.ts +74 -0
  296. package/output/solve/classes/SymbolicSolver.js +601 -0
  297. package/output/solve/linsolve.d.ts +51 -0
  298. package/output/solve/linsolve.js +225 -0
  299. package/output/solve/solve.d.ts +34 -0
  300. package/output/solve/solve.js +260 -0
  301. package/output/solve/solveSystem.d.ts +31 -0
  302. package/output/solve/solveSystem.js +290 -0
  303. package/output/solve/utils.d.ts +9 -0
  304. package/output/solve/utils.js +62 -0
  305. package/output/utils/array.d.ts +42 -0
  306. package/output/utils/array.js +98 -0
  307. package/output/utils/debug.d.ts +131 -0
  308. package/output/utils/debug.js +295 -0
  309. package/output/utils/decimal.d.ts +3 -0
  310. package/output/utils/decimal.js +16 -0
  311. package/output/utils/numeric.d.ts +14 -0
  312. package/output/utils/numeric.js +51 -0
  313. package/output/utils/object.d.ts +26 -0
  314. package/output/utils/object.js +56 -0
  315. package/package.json +213 -57
  316. package/.travis.yml +0 -3
  317. package/Algebra.js +0 -4568
  318. package/BREAKING_CHANGES.md +0 -5
  319. package/CODE_OF_CONDUCT.md +0 -46
  320. package/CONTRIBUTING.md +0 -14
  321. package/Calculus.js +0 -2675
  322. package/Extra.js +0 -622
  323. package/Solve.js +0 -1783
  324. package/all.js +0 -16
  325. package/all.min.js +0 -1
  326. package/gulpfile.js +0 -16
  327. package/index.html +0 -158
  328. package/license.txt +0 -19
  329. package/nerdamer.core.js +0 -12510
  330. package/spec/LaTeX.spec.js +0 -302
  331. package/spec/TeXConvert.spec.js +0 -8
  332. package/spec/algebra.spec.js +0 -287
  333. package/spec/basic_parser.spec.js +0 -134
  334. package/spec/build.spec.js +0 -131
  335. package/spec/calculus.spec.js +0 -183
  336. package/spec/core.spec.js +0 -2970
  337. package/spec/extra.spec.js +0 -54
  338. package/spec/solve.spec.js +0 -126
  339. package/spec/support/jasmine.json +0 -11
  340. package/spec/support/utils.js +0 -42
  341. package/spec/text.spec.js +0 -132
@@ -0,0 +1,222 @@
1
+ import { Expression } from '../expression/Expression';
2
+ import { TERM } from '../parser/constants';
3
+ /** Powers keyed by variable name. Missing variables have degree zero. */
4
+ export type PowersObject = Record<string, number>;
5
+ /**
6
+ * Represents one coefficient-monomial term in a {@link Polynomial}.
7
+ *
8
+ * @remarks
9
+ * A term stores an `Expression` coefficient, a mutable variable-to-power record, and
10
+ * a sorted copy of the supplied variable names. The coefficient and a power object
11
+ * supplied to the constructor are retained by reference; {@link Term.copy} creates
12
+ * independent copies of both.
13
+ *
14
+ * Multidegree, total power, expression, and value text are computed lazily and cached.
15
+ * Arithmetic methods return new terms and refresh their derived degree fields. Direct
16
+ * mutation of {@link Term.coeff}, {@link Term.powers}, or the setter overload of
17
+ * {@link Term.deg} does not invalidate every cached field, so callers should prefer a
18
+ * copied/reconstructed term when cached values may already have been read.
19
+ */
20
+ export declare class Term {
21
+ /** Mutable symbolic coefficient. */
22
+ coeff: Expression;
23
+ /** Runtime tag used by Nerdamer's term type guard. */
24
+ dataType: typeof TERM;
25
+ /** Lazily cached expression representation. */
26
+ expression?: Expression;
27
+ /** Number of variables whose power is positive. */
28
+ length: number;
29
+ /** Lazily cached multidegree in {@link variables} order. */
30
+ multidegArray?: number[];
31
+ /** Mutable powers keyed by variable name. */
32
+ powers: PowersObject;
33
+ /** Lazily cached sum of all stored powers. */
34
+ totalPower?: number;
35
+ /** Lazily cached unit-coefficient monomial text. */
36
+ valueString?: string;
37
+ /** Sorted variable names used for multidegree and rendering order. */
38
+ variables: string[];
39
+ /**
40
+ * Creates a term from a coefficient and monomial powers.
41
+ *
42
+ * @param coeff - Expression coefficient or parser text. Existing expressions are retained.
43
+ * @param powers - Power record or comma-separated degrees aligned with `variables`.
44
+ * An object power record is retained by reference.
45
+ * @param variables - Variable order to interpret string powers. The term stores a sorted copy.
46
+ */
47
+ constructor(coeff: Expression | string, powers: PowersObject | string, variables: string[]);
48
+ /**
49
+ * Checks if the given object is a Term
50
+ *
51
+ * @param obj - Value to test.
52
+ * @returns Whether `obj` carries Nerdamer's term discriminator.
53
+ */
54
+ static isTerm(obj: unknown): obj is Term;
55
+ /**
56
+ * Gets the total number of non-unit variables in the term
57
+ *
58
+ * @returns The number of variables with positive powers.
59
+ */
60
+ private getLength;
61
+ /** Recalculates degree-derived caches after term arithmetic and returns this term. */
62
+ private update;
63
+ /**
64
+ * Forces the multidegree array to be recalculated
65
+ *
66
+ * @returns The refreshed internal multidegree array.
67
+ */
68
+ private updateMultiDegArray;
69
+ /**
70
+ * Forces the total power to be recalculated
71
+ *
72
+ * @returns The refreshed total degree.
73
+ */
74
+ private updateTotalPower;
75
+ /**
76
+ * Tests whether two terms have the same unit-coefficient monomial.
77
+ *
78
+ * @param t - Term to compare.
79
+ * @returns Whether their rendered variable-and-power components match.
80
+ */
81
+ canAddOrSubtract(t: Term): boolean;
82
+ /**
83
+ * Creates an independently mutable copy of this term.
84
+ *
85
+ * @returns A term with copied coefficient, powers, and variable array. Lazy caches are rebuilt on demand.
86
+ */
87
+ copy(): Term;
88
+ /**
89
+ * Returns the degree of one variable.
90
+ *
91
+ * @param v - Variable whose power is read.
92
+ * @returns The stored power, or zero when the variable is absent.
93
+ */
94
+ deg(v: string): number;
95
+ /**
96
+ * Assigns the degree of one variable.
97
+ *
98
+ * @param v - Variable whose power is written.
99
+ * @param value - New numeric power.
100
+ * @returns This term after assignment. Lazy caches are not invalidated automatically.
101
+ */
102
+ deg(v: string, value: number): Term;
103
+ /**
104
+ * Differentiates this term with respect to one variable.
105
+ *
106
+ * @param variable - Differentiation variable.
107
+ * @param n - Non-negative derivative order.
108
+ * @returns A new differentiated term, or a zero term when `n` exceeds the power.
109
+ */
110
+ diff(variable: string, n?: number): Term;
111
+ /**
112
+ * Subtracts another term's multidegree from this term's multidegree.
113
+ *
114
+ * @param term - Term whose degree tuple is subtracted.
115
+ * @returns A new component-wise difference array in this term's variable order.
116
+ */
117
+ difference(term: Term): number[];
118
+ /**
119
+ * Divides this term by the provided term
120
+ *
121
+ * @param t - Divisor term.
122
+ * @returns A new quotient term; negative powers are permitted by this low-level operation.
123
+ */
124
+ div(t: Term): Term;
125
+ /**
126
+ * Checks if one term can divide another.
127
+ *
128
+ * @param t - Candidate dividend term.
129
+ * @returns Whether every power in this term is no greater than the corresponding power in `t`.
130
+ */
131
+ divides(t: Term): boolean;
132
+ /**
133
+ * Checks for equality with another Term
134
+ *
135
+ * @param t - Term to compare.
136
+ * @returns Whether coefficient and monomial quotient equal one.
137
+ */
138
+ eq(t: Term): boolean;
139
+ /**
140
+ * Tests whether this is a constant term equal to a number.
141
+ *
142
+ * @param n - Numeric value to compare with the coefficient.
143
+ */
144
+ eqNumber(n: number | string): boolean;
145
+ /**
146
+ * Returns a lazily constructed expression for this term.
147
+ *
148
+ * @returns The cached internal expression reference.
149
+ */
150
+ getExpression(): Expression;
151
+ /**
152
+ * Returns this term's multidegree in its stored variable order.
153
+ *
154
+ * @returns The cached internal degree array.
155
+ */
156
+ getMultidegArray(): number[];
157
+ /**
158
+ * Returns the sum of powers in this term.
159
+ *
160
+ * @returns The cached total degree.
161
+ */
162
+ getTotalPower(): number;
163
+ /**
164
+ * Formats the monomial with a unit coefficient.
165
+ *
166
+ * @param useVariables - Optional variable order used for this rendering.
167
+ * @returns Parser text such as `x^2*y`, or `1` for a constant term.
168
+ */
169
+ getValueString(useVariables?: string[]): string;
170
+ /**
171
+ * Tests whether every stored variable power is zero.
172
+ *
173
+ * @returns Whether the term is constant, independent of its coefficient value.
174
+ */
175
+ isConstant(): boolean;
176
+ /**
177
+ * Tests whether the coefficient is zero.
178
+ *
179
+ * @returns Whether the term's symbolic coefficient is zero.
180
+ */
181
+ isZero(): boolean;
182
+ /**
183
+ * Calculates the LCM of two terms with numeric coefficients
184
+ * TODO: Extend to non-numeric coefficients
185
+ *
186
+ * @param t - Other monomial term.
187
+ * @param withCoeff - Include the exact numeric coefficient LCM instead of using one.
188
+ * @returns A new term containing maximum powers for the union of variables.
189
+ */
190
+ LCM(t: Term, withCoeff?: boolean): Term;
191
+ /**
192
+ * Returns the variable name with the greatest stored power.
193
+ */
194
+ max(): string;
195
+ /**
196
+ * Returns the variable name with the least stored power.
197
+ */
198
+ min(): string;
199
+ /**
200
+ * Calculates the multidegree array
201
+ *
202
+ * @param variables - Variable order for the result.
203
+ * @returns A new power array, using zero for missing variables.
204
+ */
205
+ multideg(variables: string[]): number[];
206
+ /**
207
+ * Gets the text representation of the monomial
208
+ *
209
+ * @param useVariables - Optional variable rendering order.
210
+ * @returns Canonical parser text for the coefficient and monomial.
211
+ */
212
+ text(useVariables?: string[]): string;
213
+ /**
214
+ * Multiplies this term with the given term
215
+ *
216
+ * @param x - Multiplier term.
217
+ * @returns A new term with multiplied coefficients and added powers.
218
+ */
219
+ times(x: Term): Term;
220
+ /** Returns the same parser text as {@link Term.text}. */
221
+ toString(): string;
222
+ }
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Term = void 0;
4
+ const common_1 = require("../../common/common");
5
+ const bigint_1 = require("../../functions/bigint/bigint");
6
+ const numeric_1 = require("../../functions/numeric");
7
+ const utils_1 = require("../../functions/utils");
8
+ const Expression_1 = require("../expression/Expression");
9
+ const constants_1 = require("../parser/constants");
10
+ /**
11
+ * Represents one coefficient-monomial term in a {@link Polynomial}.
12
+ *
13
+ * @remarks
14
+ * A term stores an `Expression` coefficient, a mutable variable-to-power record, and
15
+ * a sorted copy of the supplied variable names. The coefficient and a power object
16
+ * supplied to the constructor are retained by reference; {@link Term.copy} creates
17
+ * independent copies of both.
18
+ *
19
+ * Multidegree, total power, expression, and value text are computed lazily and cached.
20
+ * Arithmetic methods return new terms and refresh their derived degree fields. Direct
21
+ * mutation of {@link Term.coeff}, {@link Term.powers}, or the setter overload of
22
+ * {@link Term.deg} does not invalidate every cached field, so callers should prefer a
23
+ * copied/reconstructed term when cached values may already have been read.
24
+ */
25
+ class Term {
26
+ /** Mutable symbolic coefficient. */
27
+ coeff;
28
+ /** Runtime tag used by Nerdamer's term type guard. */
29
+ dataType = constants_1.TERM;
30
+ /** Lazily cached expression representation. */
31
+ expression;
32
+ /** Number of variables whose power is positive. */
33
+ length;
34
+ /** Lazily cached multidegree in {@link variables} order. */
35
+ multidegArray;
36
+ /** Mutable powers keyed by variable name. */
37
+ powers;
38
+ /** Lazily cached sum of all stored powers. */
39
+ totalPower;
40
+ /** Lazily cached unit-coefficient monomial text. */
41
+ valueString;
42
+ /** Sorted variable names used for multidegree and rendering order. */
43
+ variables;
44
+ /**
45
+ * Creates a term from a coefficient and monomial powers.
46
+ *
47
+ * @param coeff - Expression coefficient or parser text. Existing expressions are retained.
48
+ * @param powers - Power record or comma-separated degrees aligned with `variables`.
49
+ * An object power record is retained by reference.
50
+ * @param variables - Variable order to interpret string powers. The term stores a sorted copy.
51
+ */
52
+ constructor(coeff, powers, variables) {
53
+ if (typeof powers === 'string') {
54
+ this.powers = {};
55
+ powers.split(',').forEach((x, i) => {
56
+ this.powers[variables[i]] = Number(x);
57
+ });
58
+ }
59
+ else {
60
+ this.powers = powers;
61
+ }
62
+ this.coeff = typeof coeff === 'string' ? Expression_1.Expression.create(coeff) : coeff;
63
+ this.length = this.getLength();
64
+ // Terms use a stable sorted variable order independent of later changes to the caller's array.
65
+ this.variables = [...variables].sort();
66
+ }
67
+ /**
68
+ * Checks if the given object is a Term
69
+ *
70
+ * @param obj - Value to test.
71
+ * @returns Whether `obj` carries Nerdamer's term discriminator.
72
+ */
73
+ static isTerm(obj) {
74
+ return (0, common_1.isNerdamerNativeType)(obj, constants_1.TERM);
75
+ }
76
+ /**
77
+ * Gets the total number of non-unit variables in the term
78
+ *
79
+ * @returns The number of variables with positive powers.
80
+ */
81
+ getLength() {
82
+ let length = 0;
83
+ for (const x in this.powers) {
84
+ if (this.powers[x] > 0) {
85
+ length++;
86
+ }
87
+ }
88
+ return length;
89
+ }
90
+ /** Recalculates degree-derived caches after term arithmetic and returns this term. */
91
+ update() {
92
+ this.updateMultiDegArray();
93
+ this.updateTotalPower();
94
+ this.length = this.getLength();
95
+ return this;
96
+ }
97
+ /**
98
+ * Forces the multidegree array to be recalculated
99
+ *
100
+ * @returns The refreshed internal multidegree array.
101
+ */
102
+ updateMultiDegArray() {
103
+ const retval = this.multideg(this.variables);
104
+ this.multidegArray = retval;
105
+ return retval;
106
+ }
107
+ /**
108
+ * Forces the total power to be recalculated
109
+ *
110
+ * @returns The refreshed total degree.
111
+ */
112
+ updateTotalPower() {
113
+ let retval = 0;
114
+ for (const x in this.powers) {
115
+ retval += this.deg(x);
116
+ }
117
+ this.totalPower = retval;
118
+ return retval;
119
+ }
120
+ /**
121
+ * Tests whether two terms have the same unit-coefficient monomial.
122
+ *
123
+ * @param t - Term to compare.
124
+ * @returns Whether their rendered variable-and-power components match.
125
+ */
126
+ canAddOrSubtract(t) {
127
+ return this.getValueString() === t.getValueString();
128
+ }
129
+ /**
130
+ * Creates an independently mutable copy of this term.
131
+ *
132
+ * @returns A term with copied coefficient, powers, and variable array. Lazy caches are rebuilt on demand.
133
+ */
134
+ copy() {
135
+ return new Term(new Expression_1.Expression(this.coeff), { ...this.powers }, this.variables);
136
+ }
137
+ deg(v, value) {
138
+ if (value !== undefined) {
139
+ this.powers[v] = value;
140
+ return this;
141
+ }
142
+ return this.powers[v] || 0;
143
+ }
144
+ /**
145
+ * Differentiates this term with respect to one variable.
146
+ *
147
+ * @param variable - Differentiation variable.
148
+ * @param n - Non-negative derivative order.
149
+ * @returns A new differentiated term, or a zero term when `n` exceeds the power.
150
+ */
151
+ diff(variable, n = 1) {
152
+ const p = this.deg(variable);
153
+ let retval;
154
+ if (n > p) {
155
+ retval = new Term('0', '0', []);
156
+ }
157
+ else {
158
+ retval = this.copy();
159
+ retval.powers[variable] = p - n;
160
+ const d = n - 1;
161
+ const r = (0, bigint_1.productInRange)(p - d, p);
162
+ retval.coeff = retval.coeff.times(BigInt(r));
163
+ }
164
+ return retval;
165
+ }
166
+ /**
167
+ * Subtracts another term's multidegree from this term's multidegree.
168
+ *
169
+ * @param term - Term whose degree tuple is subtracted.
170
+ * @returns A new component-wise difference array in this term's variable order.
171
+ */
172
+ difference(term) {
173
+ const a = this.getMultidegArray();
174
+ const b = term.getMultidegArray();
175
+ const diff = [];
176
+ for (let i = 0; i < a.length; i++) {
177
+ diff[i] = a[i] - b[i];
178
+ }
179
+ return diff;
180
+ }
181
+ /**
182
+ * Divides this term by the provided term
183
+ *
184
+ * @param t - Divisor term.
185
+ * @returns A new quotient term; negative powers are permitted by this low-level operation.
186
+ */
187
+ div(t) {
188
+ const retval = this.copy();
189
+ retval.coeff = retval.coeff.div(t.coeff);
190
+ for (const v in t.powers) {
191
+ if (!retval.variables.includes(v)) {
192
+ retval.variables.push(v);
193
+ }
194
+ retval.deg(v, retval.deg(v) - t.deg(v));
195
+ }
196
+ return retval.update();
197
+ }
198
+ /**
199
+ * Checks if one term can divide another.
200
+ *
201
+ * @param t - Candidate dividend term.
202
+ * @returns Whether every power in this term is no greater than the corresponding power in `t`.
203
+ */
204
+ divides(t) {
205
+ // If it's a number, then it divides so easy check and done
206
+ if (this.getTotalPower() === 0) {
207
+ return true;
208
+ }
209
+ // Divides essentially loops through the dividend and ensures that each power is >= to the divisor for each variable
210
+ for (const x in this.powers) {
211
+ if (this.deg(x) > t.deg(x)) {
212
+ return false;
213
+ }
214
+ }
215
+ return true;
216
+ }
217
+ /**
218
+ * Checks for equality with another Term
219
+ *
220
+ * @param t - Term to compare.
221
+ * @returns Whether coefficient and monomial quotient equal one.
222
+ */
223
+ eq(t) {
224
+ return this.div(t).eqNumber(1);
225
+ }
226
+ /**
227
+ * Tests whether this is a constant term equal to a number.
228
+ *
229
+ * @param n - Numeric value to compare with the coefficient.
230
+ */
231
+ eqNumber(n) {
232
+ return (0, numeric_1.sum)(...Object.values(this.powers)) === 0 && this.coeff.eq(n);
233
+ }
234
+ /**
235
+ * Returns a lazily constructed expression for this term.
236
+ *
237
+ * @returns The cached internal expression reference.
238
+ */
239
+ getExpression() {
240
+ if (this.expression === undefined) {
241
+ let expression = new Expression_1.Expression(this.coeff);
242
+ for (const variable of this.variables) {
243
+ const power = this.deg(variable);
244
+ if (power !== 0) {
245
+ expression = expression.times(Expression_1.Expression.Variable(variable).pow(power));
246
+ }
247
+ }
248
+ this.expression = expression;
249
+ }
250
+ return this.expression;
251
+ }
252
+ /**
253
+ * Returns this term's multidegree in its stored variable order.
254
+ *
255
+ * @returns The cached internal degree array.
256
+ */
257
+ getMultidegArray() {
258
+ let retval = this.multidegArray;
259
+ if (retval === undefined) {
260
+ retval = this.updateMultiDegArray();
261
+ }
262
+ return retval;
263
+ }
264
+ /**
265
+ * Returns the sum of powers in this term.
266
+ *
267
+ * @returns The cached total degree.
268
+ */
269
+ getTotalPower() {
270
+ let retval = this.totalPower;
271
+ if (retval === undefined) {
272
+ retval = this.updateTotalPower();
273
+ }
274
+ return retval;
275
+ }
276
+ /**
277
+ * Formats the monomial with a unit coefficient.
278
+ *
279
+ * @param useVariables - Optional variable order used for this rendering.
280
+ * @returns Parser text such as `x^2*y`, or `1` for a constant term.
281
+ */
282
+ getValueString(useVariables) {
283
+ // If the user variables have been specified then force regeneration of the string.
284
+ if (this.valueString === undefined || useVariables !== undefined) {
285
+ if (this.getTotalPower() === 0) {
286
+ this.valueString = '1';
287
+ }
288
+ else {
289
+ const vars = useVariables || [...this.variables].sort();
290
+ const vArray = [];
291
+ for (const v of vars) {
292
+ const p = this.deg(v);
293
+ const pv = p === 1 ? '' : Expression_1.Expression.POW_OPR + p;
294
+ if (p !== 0) {
295
+ vArray.push(`${v}${pv}`);
296
+ }
297
+ }
298
+ this.valueString = vArray.join('*');
299
+ }
300
+ }
301
+ return this.valueString;
302
+ }
303
+ /**
304
+ * Tests whether every stored variable power is zero.
305
+ *
306
+ * @returns Whether the term is constant, independent of its coefficient value.
307
+ */
308
+ isConstant() {
309
+ for (const p in this.powers) {
310
+ if (this.powers[p] !== 0) {
311
+ return false;
312
+ }
313
+ }
314
+ return true;
315
+ }
316
+ /**
317
+ * Tests whether the coefficient is zero.
318
+ *
319
+ * @returns Whether the term's symbolic coefficient is zero.
320
+ */
321
+ isZero() {
322
+ return this.coeff.isZero();
323
+ }
324
+ /**
325
+ * Calculates the LCM of two terms with numeric coefficients
326
+ * TODO: Extend to non-numeric coefficients
327
+ *
328
+ * @param t - Other monomial term.
329
+ * @param withCoeff - Include the exact numeric coefficient LCM instead of using one.
330
+ * @returns A new term containing maximum powers for the union of variables.
331
+ */
332
+ LCM(t, withCoeff = false) {
333
+ const variables = (0, utils_1.arrayAddUnique)([...this.variables], t.variables);
334
+ const powers = {};
335
+ // Calculate the max power between this and t.
336
+ for (const v of variables) {
337
+ powers[v] = Math.max(this.deg(v), t.deg(v));
338
+ }
339
+ const coeff = withCoeff
340
+ ? Expression_1.Expression.fromRational(this.coeff.getMultiplier().LCM(t.coeff.getMultiplier()))
341
+ : '1';
342
+ return new Term(coeff, powers, variables);
343
+ }
344
+ /**
345
+ * Returns the variable name with the greatest stored power.
346
+ */
347
+ max() {
348
+ return Object.keys(this.powers).reduce((a, b) => (this.powers[a] > this.powers[b] ? a : b));
349
+ }
350
+ /**
351
+ * Returns the variable name with the least stored power.
352
+ */
353
+ min() {
354
+ return Object.keys(this.powers).reduce((a, b) => (this.powers[a] < this.powers[b] ? a : b));
355
+ }
356
+ /**
357
+ * Calculates the multidegree array
358
+ *
359
+ * @param variables - Variable order for the result.
360
+ * @returns A new power array, using zero for missing variables.
361
+ */
362
+ multideg(variables) {
363
+ const arr = [];
364
+ for (const v of variables) {
365
+ arr.push(this.deg(v));
366
+ }
367
+ return arr;
368
+ }
369
+ /**
370
+ * Gets the text representation of the monomial
371
+ *
372
+ * @param useVariables - Optional variable rendering order.
373
+ * @returns Canonical parser text for the coefficient and monomial.
374
+ */
375
+ text(useVariables) {
376
+ let c = this.coeff.text();
377
+ // Wrap sums in brackets
378
+ if (this.coeff.isSum()) {
379
+ c = `(${c})`;
380
+ }
381
+ let retval;
382
+ // Zero times anything is zero so nothing left to do
383
+ if (c === '0') {
384
+ retval = c;
385
+ }
386
+ else {
387
+ let v = this.getValueString(useVariables);
388
+ // Remove the safety '1';
389
+ if (v === '1') {
390
+ v = '';
391
+ }
392
+ // Add multiplication sign
393
+ if (v) {
394
+ if (c === '1') {
395
+ c = '';
396
+ }
397
+ else if (c === '-1') {
398
+ c = '-';
399
+ }
400
+ else {
401
+ c += '*';
402
+ }
403
+ }
404
+ retval = `${c}${v}`;
405
+ }
406
+ return retval;
407
+ }
408
+ /**
409
+ * Multiplies this term with the given term
410
+ *
411
+ * @param x - Multiplier term.
412
+ * @returns A new term with multiplied coefficients and added powers.
413
+ */
414
+ times(x) {
415
+ const retval = this.copy();
416
+ retval.coeff = retval.coeff.times(x.coeff);
417
+ for (const v in x.powers) {
418
+ if (!retval.variables.includes(v)) {
419
+ retval.variables.push(v);
420
+ }
421
+ retval.deg(v, retval.deg(v) + x.deg(v));
422
+ }
423
+ return retval.update();
424
+ }
425
+ /** Returns the same parser text as {@link Term.text}. */
426
+ toString() {
427
+ return this.text();
428
+ }
429
+ }
430
+ exports.Term = Term;