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.
- package/LICENSE.md +184 -0
- package/README.md +293 -312
- package/dist/bundle.js +2 -0
- package/dist/bundle.js.LICENSE.txt +7 -0
- package/dist/parser.js +2 -0
- package/dist/parser.js.LICENSE.txt +7 -0
- package/docs-data/parser-functions.json +1960 -0
- package/index.d.ts +10 -426
- package/output/algebra/adapters.d.ts +33 -0
- package/output/algebra/adapters.js +109 -0
- package/output/algebra/algorithms/arith.d.ts +84 -0
- package/output/algebra/algorithms/arith.js +323 -0
- package/output/algebra/algorithms/factor.d.ts +3 -0
- package/output/algebra/algorithms/factor.js +5 -0
- package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
- package/output/algebra/algorithms/factorMultivariate.js +2393 -0
- package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
- package/output/algebra/algorithms/factorUnivariate.js +1072 -0
- package/output/algebra/algorithms/gcd.d.ts +22 -0
- package/output/algebra/algorithms/gcd.js +690 -0
- package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
- package/output/algebra/algorithms/groebnerBase.js +1166 -0
- package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
- package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
- package/output/algebra/algorithms/poly.d.ts +228 -0
- package/output/algebra/algorithms/poly.js +1299 -0
- package/output/algebra/algorithms/rational.d.ts +17 -0
- package/output/algebra/algorithms/rational.js +115 -0
- package/output/algebra/factor/factor.d.ts +62 -0
- package/output/algebra/factor/factor.js +158 -0
- package/output/algebra/gcd/gcd.d.ts +29 -0
- package/output/algebra/gcd/gcd.js +141 -0
- package/output/algebra/groebner.d.ts +21 -0
- package/output/algebra/groebner.js +42 -0
- package/output/algebra/partfrac.d.ts +19 -0
- package/output/algebra/partfrac.js +398 -0
- package/output/algebra/polynomialize.d.ts +20 -0
- package/output/algebra/polynomialize.js +24 -0
- package/output/algebra/simplify/complexsimp.d.ts +7 -0
- package/output/algebra/simplify/complexsimp.js +24 -0
- package/output/algebra/simplify/factorCommon.d.ts +13 -0
- package/output/algebra/simplify/factorCommon.js +136 -0
- package/output/algebra/simplify/funcsimp.d.ts +26 -0
- package/output/algebra/simplify/funcsimp.js +633 -0
- package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
- package/output/algebra/simplify/invtrigrewrite.js +96 -0
- package/output/algebra/simplify/ratsimp.d.ts +21 -0
- package/output/algebra/simplify/ratsimp.js +140 -0
- package/output/algebra/simplify/simplify.d.ts +25 -0
- package/output/algebra/simplify/simplify.js +228 -0
- package/output/algebra/simplify/trigreduce.d.ts +38 -0
- package/output/algebra/simplify/trigreduce.js +424 -0
- package/output/algebra/simplify/trigrewrite.d.ts +17 -0
- package/output/algebra/simplify/trigrewrite.js +156 -0
- package/output/algebra/simplify/trigsimp.d.ts +11 -0
- package/output/algebra/simplify/trigsimp.js +369 -0
- package/output/algebra/simplify/utils.d.ts +32 -0
- package/output/algebra/simplify/utils.js +56 -0
- package/output/algebra/utils.d.ts +32 -0
- package/output/algebra/utils.js +48 -0
- package/output/api/advanced.d.ts +7 -0
- package/output/api/advanced.js +18 -0
- package/output/api/algebra.d.ts +17 -0
- package/output/api/algebra.js +32 -0
- package/output/api/assumptions.d.ts +4 -0
- package/output/api/assumptions.js +11 -0
- package/output/api/calculus.d.ts +9 -0
- package/output/api/calculus.js +21 -0
- package/output/api/core.d.ts +17 -0
- package/output/api/core.js +41 -0
- package/output/api/debug.d.ts +16 -0
- package/output/api/debug.js +23 -0
- package/output/api/parser.d.ts +85 -0
- package/output/api/parser.js +16 -0
- package/output/api/solve.d.ts +10 -0
- package/output/api/solve.js +16 -0
- package/output/api/structures.d.ts +10 -0
- package/output/api/structures.js +22 -0
- package/output/calculus/derivative/diff.d.ts +30 -0
- package/output/calculus/derivative/diff.js +238 -0
- package/output/calculus/fresnel.d.ts +16 -0
- package/output/calculus/fresnel.js +39 -0
- package/output/calculus/integrate/byParts.d.ts +18 -0
- package/output/calculus/integrate/byParts.js +339 -0
- package/output/calculus/integrate/bySubstitution.d.ts +135 -0
- package/output/calculus/integrate/bySubstitution.js +411 -0
- package/output/calculus/integrate/integrate.d.ts +38 -0
- package/output/calculus/integrate/integrate.js +652 -0
- package/output/calculus/integrate/integrationTable.d.ts +2 -0
- package/output/calculus/integrate/integrationTable.js +914 -0
- package/output/calculus/integrate/utils.d.ts +28 -0
- package/output/calculus/integrate/utils.js +96 -0
- package/output/calculus/laplace/ilaplace.d.ts +31 -0
- package/output/calculus/laplace/ilaplace.js +192 -0
- package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
- package/output/calculus/laplace/ilaplaceTable.js +200 -0
- package/output/calculus/laplace/laplace.d.ts +22 -0
- package/output/calculus/laplace/laplace.js +109 -0
- package/output/calculus/laplace/laplaceTable.d.ts +2 -0
- package/output/calculus/laplace/laplaceTable.js +187 -0
- package/output/calculus/limit/limit.d.ts +35 -0
- package/output/calculus/limit/limit.js +1183 -0
- package/output/calculus/limit/limitsTable.d.ts +2 -0
- package/output/calculus/limit/limitsTable.js +7 -0
- package/output/core/Settings.d.ts +32 -0
- package/output/core/Settings.js +68 -0
- package/output/core/adapters.d.ts +18 -0
- package/output/core/adapters.js +40 -0
- package/output/core/classes/assumption/Assumption.d.ts +218 -0
- package/output/core/classes/assumption/Assumption.js +605 -0
- package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
- package/output/core/classes/assumption/assertiveFunctions.js +64 -0
- package/output/core/classes/assumption/assume.d.ts +90 -0
- package/output/core/classes/assumption/assume.js +145 -0
- package/output/core/classes/collection/Collection.d.ts +107 -0
- package/output/core/classes/collection/Collection.js +231 -0
- package/output/core/classes/complex/Complex.d.ts +99 -0
- package/output/core/classes/complex/Complex.js +135 -0
- package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
- package/output/core/classes/decimalSet/DecimalSet.js +453 -0
- package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
- package/output/core/classes/dictionary/Dictionary.js +213 -0
- package/output/core/classes/equation/Equation.d.ts +256 -0
- package/output/core/classes/equation/Equation.js +350 -0
- package/output/core/classes/expression/CoeffObject.d.ts +100 -0
- package/output/core/classes/expression/CoeffObject.js +198 -0
- package/output/core/classes/expression/Expression.d.ts +1674 -0
- package/output/core/classes/expression/Expression.js +2332 -0
- package/output/core/classes/expression/analysis.d.ts +25 -0
- package/output/core/classes/expression/analysis.js +218 -0
- package/output/core/classes/expression/collect.d.ts +9 -0
- package/output/core/classes/expression/collect.js +49 -0
- package/output/core/classes/expression/format.d.ts +45 -0
- package/output/core/classes/expression/format.js +217 -0
- package/output/core/classes/expression/products.d.ts +23 -0
- package/output/core/classes/expression/products.js +115 -0
- package/output/core/classes/expression/shortcuts.d.ts +35 -0
- package/output/core/classes/expression/shortcuts.js +129 -0
- package/output/core/classes/expression/traversal.d.ts +31 -0
- package/output/core/classes/expression/traversal.js +216 -0
- package/output/core/classes/expression/trig.d.ts +25 -0
- package/output/core/classes/expression/trig.js +40 -0
- package/output/core/classes/expression/utils.d.ts +52 -0
- package/output/core/classes/expression/utils.js +189 -0
- package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
- package/output/core/classes/lookupTable/LookupTable.js +55 -0
- package/output/core/classes/matrix/Matrix.d.ts +227 -0
- package/output/core/classes/matrix/Matrix.js +889 -0
- package/output/core/classes/matrix/Sylvester.d.ts +11 -0
- package/output/core/classes/matrix/Sylvester.js +54 -0
- package/output/core/classes/matrix/functions.d.ts +26 -0
- package/output/core/classes/matrix/functions.js +52 -0
- package/output/core/classes/matrix/utils.d.ts +9 -0
- package/output/core/classes/matrix/utils.js +22 -0
- package/output/core/classes/parser/Parser.d.ts +480 -0
- package/output/core/classes/parser/Parser.js +1812 -0
- package/output/core/classes/parser/Token.d.ts +58 -0
- package/output/core/classes/parser/Token.js +137 -0
- package/output/core/classes/parser/constants.d.ts +160 -0
- package/output/core/classes/parser/constants.js +227 -0
- package/output/core/classes/parser/helpers.d.ts +21 -0
- package/output/core/classes/parser/helpers.js +42 -0
- package/output/core/classes/parser/operations/add.d.ts +15 -0
- package/output/core/classes/parser/operations/add.js +238 -0
- package/output/core/classes/parser/operations/comma.d.ts +7 -0
- package/output/core/classes/parser/operations/comma.js +11 -0
- package/output/core/classes/parser/operations/compare.d.ts +21 -0
- package/output/core/classes/parser/operations/compare.js +461 -0
- package/output/core/classes/parser/operations/divide.d.ts +2 -0
- package/output/core/classes/parser/operations/divide.js +72 -0
- package/output/core/classes/parser/operations/functions.d.ts +46 -0
- package/output/core/classes/parser/operations/functions.js +430 -0
- package/output/core/classes/parser/operations/multiply.d.ts +11 -0
- package/output/core/classes/parser/operations/multiply.js +321 -0
- package/output/core/classes/parser/operations/power.d.ts +48 -0
- package/output/core/classes/parser/operations/power.js +673 -0
- package/output/core/classes/parser/operations/subtract.d.ts +3 -0
- package/output/core/classes/parser/operations/subtract.js +35 -0
- package/output/core/classes/parser/preprocess.d.ts +14 -0
- package/output/core/classes/parser/preprocess.js +259 -0
- package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
- package/output/core/classes/parser/scripting/controlFlow.js +355 -0
- package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
- package/output/core/classes/parser/scripting/evaluate.js +112 -0
- package/output/core/classes/parser/scripting/functions.d.ts +14 -0
- package/output/core/classes/parser/scripting/functions.js +59 -0
- package/output/core/classes/parser/scripting/scope.d.ts +35 -0
- package/output/core/classes/parser/scripting/scope.js +155 -0
- package/output/core/classes/parser/types.d.ts +125 -0
- package/output/core/classes/parser/types.js +2 -0
- package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
- package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
- package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
- package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
- package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
- package/output/core/classes/polynomial/Polynomial.js +1149 -0
- package/output/core/classes/polynomial/Term.d.ts +222 -0
- package/output/core/classes/polynomial/Term.js +430 -0
- package/output/core/classes/polynomial/functions.d.ts +69 -0
- package/output/core/classes/polynomial/functions.js +126 -0
- package/output/core/classes/polynomial/utils.d.ts +62 -0
- package/output/core/classes/polynomial/utils.js +206 -0
- package/output/core/classes/rational/Rational.d.ts +504 -0
- package/output/core/classes/rational/Rational.js +779 -0
- package/output/core/classes/seq/SEQ.d.ts +13 -0
- package/output/core/classes/seq/SEQ.js +137 -0
- package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
- package/output/core/classes/valuesSet/ValuesSet.js +381 -0
- package/output/core/classes/vector/Vector.d.ts +222 -0
- package/output/core/classes/vector/Vector.js +497 -0
- package/output/core/classes/vector/functions.d.ts +28 -0
- package/output/core/classes/vector/functions.js +47 -0
- package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
- package/output/core/common/classes/MathematicalAggregate.js +140 -0
- package/output/core/common/classes/Scope.d.ts +62 -0
- package/output/core/common/classes/Scope.js +122 -0
- package/output/core/common/classes/StructuredEntity.d.ts +55 -0
- package/output/core/common/classes/StructuredEntity.js +151 -0
- package/output/core/common/common.d.ts +63 -0
- package/output/core/common/common.js +279 -0
- package/output/core/common/functions/functions.d.ts +14 -0
- package/output/core/common/functions/functions.js +33 -0
- package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
- package/output/core/common/functions/structuredEntityUtils.js +40 -0
- package/output/core/converters/BaseConverter.d.ts +97 -0
- package/output/core/converters/BaseConverter.js +405 -0
- package/output/core/converters/Converter.d.ts +111 -0
- package/output/core/converters/Converter.js +802 -0
- package/output/core/converters/Pattern.d.ts +71 -0
- package/output/core/converters/Pattern.js +302 -0
- package/output/core/dispatch.d.ts +34 -0
- package/output/core/dispatch.js +304 -0
- package/output/core/errors.d.ts +531 -0
- package/output/core/errors.js +621 -0
- package/output/core/functions/bigint/bigint.d.ts +121 -0
- package/output/core/functions/bigint/bigint.js +392 -0
- package/output/core/functions/bigint/primeFactor.d.ts +49 -0
- package/output/core/functions/bigint/primeFactor.js +267 -0
- package/output/core/functions/bigint/primes.d.ts +1 -0
- package/output/core/functions/bigint/primes.js +11 -0
- package/output/core/functions/build/definitions.d.ts +12 -0
- package/output/core/functions/build/definitions.js +133 -0
- package/output/core/functions/build/index.d.ts +32 -0
- package/output/core/functions/build/index.js +136 -0
- package/output/core/functions/complex.d.ts +90 -0
- package/output/core/functions/complex.js +482 -0
- package/output/core/functions/decimal.d.ts +24 -0
- package/output/core/functions/decimal.js +664 -0
- package/output/core/functions/expand/expand.d.ts +42 -0
- package/output/core/functions/expand/expand.js +376 -0
- package/output/core/functions/fresnelNumeric.d.ts +12 -0
- package/output/core/functions/fresnelNumeric.js +123 -0
- package/output/core/functions/numeric.d.ts +140 -0
- package/output/core/functions/numeric.js +790 -0
- package/output/core/functions/rationalNormalization.d.ts +11 -0
- package/output/core/functions/rationalNormalization.js +117 -0
- package/output/core/functions/setFunction.d.ts +19 -0
- package/output/core/functions/setFunction.js +75 -0
- package/output/core/functions/string.d.ts +26 -0
- package/output/core/functions/string.js +101 -0
- package/output/core/functions/subst.d.ts +90 -0
- package/output/core/functions/subst.js +498 -0
- package/output/core/functions/utils.d.ts +24 -0
- package/output/core/functions/utils.js +51 -0
- package/output/core/types.d.ts +48 -0
- package/output/core/types.js +2 -0
- package/output/index.d.ts +339 -0
- package/output/index.js +715 -0
- package/output/math/defint/defintDecimal.d.ts +37 -0
- package/output/math/defint/defintDecimal.js +320 -0
- package/output/math/defint/defintNative.d.ts +57 -0
- package/output/math/defint/defintNative.js +292 -0
- package/output/math/geometry.d.ts +8 -0
- package/output/math/geometry.js +32 -0
- package/output/math/math.d.ts +655 -0
- package/output/math/math.js +1811 -0
- package/output/math/trig.d.ts +518 -0
- package/output/math/trig.js +1444 -0
- package/output/math/trunc.d.ts +19 -0
- package/output/math/trunc.js +36 -0
- package/output/math/utils.d.ts +60 -0
- package/output/math/utils.js +180 -0
- package/output/solve/classes/DecimalMatrix.d.ts +17 -0
- package/output/solve/classes/DecimalMatrix.js +86 -0
- package/output/solve/classes/FunctionSolver.d.ts +135 -0
- package/output/solve/classes/FunctionSolver.js +433 -0
- package/output/solve/classes/MultivariateSolver.d.ts +84 -0
- package/output/solve/classes/MultivariateSolver.js +240 -0
- package/output/solve/classes/PolynomialSolver.d.ts +85 -0
- package/output/solve/classes/PolynomialSolver.js +292 -0
- package/output/solve/classes/SolutionSet.d.ts +153 -0
- package/output/solve/classes/SolutionSet.js +357 -0
- package/output/solve/classes/Solver.d.ts +17 -0
- package/output/solve/classes/Solver.js +132 -0
- package/output/solve/classes/SymbolicSolver.d.ts +74 -0
- package/output/solve/classes/SymbolicSolver.js +601 -0
- package/output/solve/linsolve.d.ts +51 -0
- package/output/solve/linsolve.js +225 -0
- package/output/solve/solve.d.ts +34 -0
- package/output/solve/solve.js +260 -0
- package/output/solve/solveSystem.d.ts +31 -0
- package/output/solve/solveSystem.js +290 -0
- package/output/solve/utils.d.ts +9 -0
- package/output/solve/utils.js +62 -0
- package/output/utils/array.d.ts +42 -0
- package/output/utils/array.js +98 -0
- package/output/utils/debug.d.ts +131 -0
- package/output/utils/debug.js +295 -0
- package/output/utils/decimal.d.ts +3 -0
- package/output/utils/decimal.js +16 -0
- package/output/utils/numeric.d.ts +14 -0
- package/output/utils/numeric.js +51 -0
- package/output/utils/object.d.ts +26 -0
- package/output/utils/object.js +56 -0
- package/package.json +213 -57
- package/.travis.yml +0 -3
- package/Algebra.js +0 -4568
- package/BREAKING_CHANGES.md +0 -5
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -14
- package/Calculus.js +0 -2675
- package/Extra.js +0 -622
- package/Solve.js +0 -1783
- package/all.js +0 -16
- package/all.min.js +0 -1
- package/gulpfile.js +0 -16
- package/index.html +0 -158
- package/license.txt +0 -19
- package/nerdamer.core.js +0 -12510
- package/spec/LaTeX.spec.js +0 -302
- package/spec/TeXConvert.spec.js +0 -8
- package/spec/algebra.spec.js +0 -287
- package/spec/basic_parser.spec.js +0 -134
- package/spec/build.spec.js +0 -131
- package/spec/calculus.spec.js +0 -183
- package/spec/core.spec.js +0 -2970
- package/spec/extra.spec.js +0 -54
- package/spec/solve.spec.js +0 -126
- package/spec/support/jasmine.json +0 -11
- package/spec/support/utils.js +0 -42
- 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;
|