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,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.multiply = multiply;
4
+ exports.merge = merge;
5
+ exports.canonicalizeRadicals = canonicalizeRadicals;
6
+ const errors_1 = require("../../../errors");
7
+ const errors_2 = require("../../../errors");
8
+ const complex_1 = require("../../../functions/complex");
9
+ const Settings_1 = require("../../../Settings");
10
+ const Expression_1 = require("../../expression/Expression");
11
+ const shortcuts_1 = require("../../expression/shortcuts");
12
+ const constants_1 = require("../constants");
13
+ const power_1 = require("./power");
14
+ /**
15
+ * Multiplies two Expressions
16
+ *
17
+ * @param a
18
+ * @param b
19
+ * @returns
20
+ */
21
+ function multiply(a, b) {
22
+ let retval;
23
+ // TODO: The DEFER_SIMPLIFICATION flag currently does not work as intended. The intent is for it
24
+ // to defer simplification and return an expression providing the user with a fully reconstructed AST.
25
+ // The mechanisms required to achieve this are currently not in place. Use Parser.parseRPN for now
26
+ // and manually construct it.
27
+ if (Settings_1.Settings.DEFER_SIMPLIFICATION) {
28
+ // The wrap function is just a function to allow us to encapsulate the value
29
+ retval = merge(Expression_1.Expression.toFunction(constants_1.WRAP, [a]), Expression_1.Expression.toFunction(constants_1.WRAP, [b]));
30
+ retval.deferred = true;
31
+ }
32
+ else {
33
+ if (a.isZero()) {
34
+ if (b.isInf()) {
35
+ throw new errors_1.UndefinedError(errors_2.ErrorMessages[Settings_1.Settings.LANGUAGE].infinityTimesZero);
36
+ }
37
+ retval = Expression_1.Expression.Number('0');
38
+ }
39
+ else if (a.isNUM() && b.isNUM()) {
40
+ retval = Expression_1.Expression.fromRational(a.getMultiplier().times(b.getMultiplier()));
41
+ }
42
+ else if (a.isComplex() && b.isComplex() && a.isSum() && b.isSum()) {
43
+ const realA = a.realPart();
44
+ const realB = b.realPart();
45
+ const imA = a.imagPart();
46
+ const imB = b.imagPart();
47
+ retval = realA
48
+ .times(realB)
49
+ .minus(imA.times(imB))
50
+ .plus(realA.times(imB).plus(imA.times(realB)).times(Expression_1.Expression.Img()));
51
+ }
52
+ else if (a.isNUM() && !b.isInf()) {
53
+ retval = b.copy();
54
+ retval.multiplier = a.getMultiplier().times(b.getMultiplier());
55
+ }
56
+ // Multiplication of infinity
57
+ else if ((a.isInf() || a.isNUM()) && b.isInf()) {
58
+ // The default value for infinity is Inf
59
+ retval = Expression_1.Expression.Inf();
60
+ // Infinity times anything including itself is infinity.
61
+ // It's just a matter of determining the sign at this point.
62
+ if (a.getMultiplier().times(b.getMultiplier()).isNegative()) {
63
+ retval = retval.neg();
64
+ }
65
+ else if (a.isZero() || b.isZero()) {
66
+ throw new errors_1.UndefinedError('Infinity times zero is undefined!');
67
+ }
68
+ }
69
+ else if (a.value === b.value) {
70
+ // Define Rule: i * i = -1
71
+ retval = a.copy();
72
+ retval.multiplier = retval.getMultiplier().times(b.getMultiplier());
73
+ const power = a.getPower().plus(b.getPower());
74
+ if (power.isZero()) {
75
+ retval = Expression_1.Expression.fromRational(retval.getMultiplier());
76
+ }
77
+ else {
78
+ retval = Expression_1.Expression.setPower(retval, power);
79
+ }
80
+ const pow = retval.getPower();
81
+ // Simplify powers of i
82
+ if (retval.isI()) {
83
+ retval = (0, complex_1.simplifyImaginary)(retval);
84
+ }
85
+ // The abs is redundant for even powers for abs
86
+ else if (retval.isFunction(constants_1.ABS) && pow.isEven()) {
87
+ retval = retval.getArguments()[0].pow(pow).times(retval.getMultiplier());
88
+ }
89
+ // Else just leave it undefined
90
+ }
91
+ // We can just flip because of commutativity. Add can figure out the rest.
92
+ // ******************** RECIPROCALS ******************** //
93
+ else if (constants_1.RANK[a.type] > constants_1.RANK[b.type]) {
94
+ retval = multiply(b, a);
95
+ }
96
+ // Do not use else since this is a catchall for all unhandled cases.
97
+ retval = retval || merge(a, b);
98
+ // Check to make sure that the EXP can be unwrapped. Consider 3^(2/3)*3^(1/3)
99
+ // This started out as an EXP but since its power is now 1, (3)^1, it can be downgraded
100
+ // to a simple NUM
101
+ if (retval.isEXP() && retval.isLinear()) {
102
+ retval = retval.getBase().times(retval.getMultiplier());
103
+ }
104
+ // This ensures that imaginary numbers are properly expanded.
105
+ if (Settings_1.Settings.EVALUATE) {
106
+ retval = retval.distributeMultiplier();
107
+ }
108
+ }
109
+ return retval;
110
+ }
111
+ function transfer(a, b, but) {
112
+ let retval = a.getMultiplier(true);
113
+ const elements = a.getElements();
114
+ // Transfer over the remaining elements
115
+ for (const x in elements) {
116
+ if (x !== but) {
117
+ retval = multiply(retval, elements[x]);
118
+ }
119
+ }
120
+ // Transfer over the existing element
121
+ const result = multiply(elements[but], b);
122
+ //Exit early
123
+ return multiply(retval, result);
124
+ }
125
+ function combine(a, b, keyA, keyB) {
126
+ const retval = Expression_1.Expression.Number('1');
127
+ // We want the multiplier at the top so remove from a and b
128
+ retval.elements = {};
129
+ // Copy the elements
130
+ // TODO: This check should probably be handled by the keyValue method
131
+ retval.elements[keyA] = a.copy();
132
+ retval.elements[keyB] = b.copy();
133
+ return [retval, [a, b]];
134
+ }
135
+ function canMerge(a) {
136
+ return a.isProduct() && a.isLinear();
137
+ }
138
+ function merge(a, b) {
139
+ let retval;
140
+ let elements = [];
141
+ const expressionType = Expression_1.Expression.TYPES.PRD;
142
+ let aCanMerge = canMerge(a);
143
+ let bCanMerge = canMerge(b);
144
+ let setProperties = true;
145
+ // The multiplier is carried at the top of the expression they get moved and stripped from a and b;
146
+ let multiplier = a.multiplier || b.multiplier ? a.getMultiplier().times(b.getMultiplier()) : undefined;
147
+ if (multiplier) {
148
+ a = new Expression_1.Expression(a);
149
+ b = new Expression_1.Expression(b);
150
+ a.multiplier = undefined;
151
+ b.multiplier = undefined;
152
+ }
153
+ if (a.elements && !b.elements) {
154
+ [b, a] = [a, b]; // Swap them
155
+ [bCanMerge, aCanMerge] = [aCanMerge, bCanMerge];
156
+ }
157
+ // Case 1: Neither has an expression object so make an empty container and append a copy of the second.
158
+ // If skipAction is true then it will just append and skip everything else. Remember, a != b
159
+ if (!bCanMerge) {
160
+ const keyA = a.type === Expression_1.Expression.TYPES.GRP ? a.value : a.keyValue();
161
+ const keyB = b.type === Expression_1.Expression.TYPES.GRP ? b.value : b.keyValue();
162
+ const aIsProductAndLinear = a.isProduct() && a.isLinear();
163
+ // Check if it has the element
164
+ if (aIsProductAndLinear && b.isProduct() && b.getPower().isMinusOne()) {
165
+ let at = a;
166
+ let bt = (0, shortcuts_1.one)();
167
+ const aElements = a.getElements();
168
+ const bElements = b.getElements();
169
+ for (const x in bElements) {
170
+ const e = bElements[x];
171
+ if (x in aElements) {
172
+ at = multiply(at, (0, power_1.power)(e, (0, shortcuts_1.minusOne)()));
173
+ }
174
+ else {
175
+ bt = multiply(bt, e);
176
+ }
177
+ }
178
+ [retval, elements] = combine(at, multiply((0, power_1.power)(bt, (0, shortcuts_1.minusOne)()), a.getMultiplier(true)), a.keyValue(), b.keyValue());
179
+ }
180
+ else if (aIsProductAndLinear && a.getElements()[keyB]) {
181
+ retval = transfer(a, b, keyB);
182
+ setProperties = false;
183
+ }
184
+ else {
185
+ const p = a.getPower();
186
+ const q = b.getPower();
187
+ if (p.sign() === -1 && q.sign() === -1) {
188
+ const _a = a.invert();
189
+ const _b = b.invert();
190
+ retval = multiply(_a, _b);
191
+ retval = retval.invert();
192
+ elements = Object.values(retval.getElements());
193
+ }
194
+ else {
195
+ [retval, elements] = combine(new Expression_1.Expression(a), new Expression_1.Expression(b), keyA, keyB);
196
+ }
197
+ }
198
+ }
199
+ // Case 2: The second has an expression object and the other doesn't. This has to of course be of the
200
+ // the right type. The first object gets added to the second object's expression container.
201
+ else if (!aCanMerge && bCanMerge) {
202
+ const key = a.keyValue();
203
+ retval = new Expression_1.Expression(b);
204
+ const subExpressions = retval.getElements();
205
+ let result;
206
+ // No need to move the multiplier since sub elements don't carry one
207
+ // and it has already been moved from a
208
+ if (key in subExpressions) {
209
+ result = multiply(a, subExpressions[key]);
210
+ }
211
+ else {
212
+ let existing = undefined;
213
+ // See if you can find a product since we prefer it going there before creating a new one
214
+ // This is an early simplification step that pays off.
215
+ for (const x in subExpressions) {
216
+ if (subExpressions[x].isProduct()) {
217
+ existing = subExpressions[x];
218
+ delete subExpressions[x];
219
+ break;
220
+ }
221
+ }
222
+ if (existing) {
223
+ result = multiply(a, existing);
224
+ }
225
+ else {
226
+ result = new Expression_1.Expression(a);
227
+ }
228
+ }
229
+ // remove it if it resulted in one
230
+ if (result.isNUM()) {
231
+ // If it's a number and not one then move it to the multiplier
232
+ if (!result.isOne()) {
233
+ multiplier = multiplier?.times(result.getMultiplier());
234
+ }
235
+ delete subExpressions[key];
236
+ }
237
+ else {
238
+ subExpressions[key] = result;
239
+ }
240
+ elements = Object.values(subExpressions);
241
+ }
242
+ // Case 3: They both have expression objects
243
+ else {
244
+ retval = new Expression_1.Expression(a);
245
+ retval.multiplier = a.getMultiplier().times(b.getMultiplier());
246
+ const retvalElements = retval.getElements();
247
+ const bExpressions = b.getElements();
248
+ for (const x in bExpressions) {
249
+ const e = bExpressions[x];
250
+ if (x in retvalElements) {
251
+ const result = multiply(e, retvalElements[x]);
252
+ // Don't multiply 1
253
+ if (expressionType === Expression_1.Expression.TYPES.PRD && result.isOne()) {
254
+ delete retvalElements[x];
255
+ }
256
+ else {
257
+ retvalElements[x] = result;
258
+ }
259
+ }
260
+ else {
261
+ retvalElements[x] = new Expression_1.Expression(e);
262
+ }
263
+ }
264
+ elements = Object.values(retvalElements);
265
+ }
266
+ // Don't set the properties for recursive calls since those have already been set.
267
+ if (setProperties) {
268
+ // Set the type
269
+ retval.type = expressionType;
270
+ // Update the value
271
+ retval.value = Expression_1.Expression.getValue(elements, 'text', expressionType);
272
+ }
273
+ // Put the multiplier back
274
+ if (multiplier && !multiplier.isOne()) {
275
+ retval.multiplier = multiplier;
276
+ }
277
+ // Remove unnecessary complexity. If the type is PRD and can be made a lesser type then do so
278
+ if (retval.isProduct() && Object.keys(retval.getElements()).length === 1) {
279
+ const onlyElement = Object.values(retval.getElements())[0];
280
+ onlyElement.multiplier = onlyElement.getMultiplier().times(retval.getMultiplier());
281
+ retval = onlyElement;
282
+ }
283
+ return retval;
284
+ }
285
+ function canonicalizeRadicals(x) {
286
+ let retval;
287
+ // Direct numeric radical: e.g. 2^(-1/2)
288
+ if (x.isEXP() && x.isConstant() && x.hasRadical()) {
289
+ retval = (0, power_1.rationalizeRadical)(x, true);
290
+ }
291
+ // Function: canonicalize arguments
292
+ else if (x.isFunction()) {
293
+ const args = x.getArguments().map(arg => canonicalizeRadicals(arg));
294
+ let t = Expression_1.Expression.toFunction(x.name, args);
295
+ t.multiplier = x.multiplier;
296
+ t = Expression_1.Expression.setPower(t, x.getPower());
297
+ retval = t;
298
+ }
299
+ // Product containing radicals: walk elements
300
+ else if (x.isProduct()) {
301
+ let retval = Expression_1.Expression.fromRational(x.getMultiplier());
302
+ x.each(element => {
303
+ retval = retval.times(canonicalizeRadicals(element));
304
+ });
305
+ }
306
+ // Sum: walk terms
307
+ else if (x.isSum() && x.isLinear()) {
308
+ let retval = (0, shortcuts_1.zero)();
309
+ x.each(term => {
310
+ retval = retval.plus(canonicalizeRadicals(term));
311
+ });
312
+ }
313
+ // EXP with non-numeric base: canonicalize the base and power
314
+ else if (x.isEXP()) {
315
+ const base = canonicalizeRadicals(x.getBase());
316
+ const pow = canonicalizeRadicals(x.getPower());
317
+ const retval = base.pow(pow);
318
+ retval.multiplier = x.multiplier;
319
+ }
320
+ return retval ?? x;
321
+ }
@@ -0,0 +1,48 @@
1
+ import { Expression } from '../../expression/Expression';
2
+ import type { factorCountType } from '../../../functions/bigint/primeFactor';
3
+ /**
4
+ * IMPORTANT: Expressions of type EXP carry a sign in their value.
5
+ * @param a
6
+ * @param b
7
+ * @returns
8
+ */
9
+ export declare function power(a: Expression, b: Expression): Expression;
10
+ /**
11
+ * Sets the power of a Expression by converting it to an exponential.
12
+ * This functions assumes that no negatives roots or exponents are provided.
13
+ * If EVALUATE is set it returns the evaluate value
14
+ *
15
+ * @param a
16
+ * @param b
17
+ */
18
+ export declare function setPower(a: Expression, b: Expression): Expression;
19
+ /**
20
+ * Converts the square root to power form
21
+ *
22
+ * @param x
23
+ */
24
+ export declare function sqrtToPow(x: Expression): Expression;
25
+ /**
26
+ * Converts a function from power to sqrt form
27
+ *
28
+ * @param x
29
+ */
30
+ export declare function powToSqrt(x: Expression): Expression;
31
+ /**
32
+ * Removes factors of two.
33
+ *
34
+ * @param n
35
+ * @returns
36
+ */
37
+ export declare function nthPow(x: bigint | factorCountType, root: bigint): Expression;
38
+ /**
39
+ * Rationalizes a numeric expression with a negative fractional power.
40
+ * Rewrites a^(-p/q) as a^((kq-p)/q) * a^(-k) where k = ceil(p/q),
41
+ * removing the radical from the denominator.
42
+ *
43
+ * Example: 5^(-2/3) → 5^(1/3) * 5^(-1) = 5^(1/3) / 5
44
+ *
45
+ * @param x An EXP expression like 5^(-2/3)
46
+ * @returns The rationalized expression
47
+ */
48
+ export declare function rationalizeRadical(x: Expression, canonical?: boolean): Expression;