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,17 @@
|
|
|
1
|
+
export type Rat = {
|
|
2
|
+
n: bigint;
|
|
3
|
+
d: bigint;
|
|
4
|
+
};
|
|
5
|
+
export declare function ratNorm(r: Rat): Rat;
|
|
6
|
+
export declare function rat(n: bigint, d?: bigint): Rat;
|
|
7
|
+
export declare function ratAdd(a: Rat, b: Rat): Rat;
|
|
8
|
+
export declare function ratSub(a: Rat, b: Rat): Rat;
|
|
9
|
+
export declare function ratMul(a: Rat, b: Rat): Rat;
|
|
10
|
+
export declare function ratDiv(a: Rat, b: Rat): Rat;
|
|
11
|
+
export declare function ratToInt(r: Rat): bigint | null;
|
|
12
|
+
export declare function uniAddRat(a: Rat[], b: Rat[]): Rat[];
|
|
13
|
+
export declare function uniMulRat(a: Rat[], b: Rat[]): Rat[];
|
|
14
|
+
export declare function interpolateUnivariateRat(points: Array<{
|
|
15
|
+
x: bigint;
|
|
16
|
+
y: Rat;
|
|
17
|
+
}>): Rat[];
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ratNorm = ratNorm;
|
|
4
|
+
exports.rat = rat;
|
|
5
|
+
exports.ratAdd = ratAdd;
|
|
6
|
+
exports.ratSub = ratSub;
|
|
7
|
+
exports.ratMul = ratMul;
|
|
8
|
+
exports.ratDiv = ratDiv;
|
|
9
|
+
exports.ratToInt = ratToInt;
|
|
10
|
+
exports.uniAddRat = uniAddRat;
|
|
11
|
+
exports.uniMulRat = uniMulRat;
|
|
12
|
+
exports.interpolateUnivariateRat = interpolateUnivariateRat;
|
|
13
|
+
const arith_1 = require("./arith");
|
|
14
|
+
function ratNorm(r) {
|
|
15
|
+
if (r.d === 0n) {
|
|
16
|
+
throw new Error('Rat: division by zero');
|
|
17
|
+
}
|
|
18
|
+
if (r.n === 0n) {
|
|
19
|
+
return { n: 0n, d: 1n };
|
|
20
|
+
}
|
|
21
|
+
let n = r.n;
|
|
22
|
+
let d = r.d;
|
|
23
|
+
if (d < 0n) {
|
|
24
|
+
n = -n;
|
|
25
|
+
d = -d;
|
|
26
|
+
}
|
|
27
|
+
const g0 = (0, arith_1.gcd)(n, d);
|
|
28
|
+
return { n: n / g0, d: d / g0 };
|
|
29
|
+
}
|
|
30
|
+
function rat(n, d = 1n) {
|
|
31
|
+
return ratNorm({ n, d });
|
|
32
|
+
}
|
|
33
|
+
function ratAdd(a, b) {
|
|
34
|
+
return ratNorm({ n: a.n * b.d + b.n * a.d, d: a.d * b.d });
|
|
35
|
+
}
|
|
36
|
+
function ratSub(a, b) {
|
|
37
|
+
return ratNorm({ n: a.n * b.d - b.n * a.d, d: a.d * b.d });
|
|
38
|
+
}
|
|
39
|
+
function ratMul(a, b) {
|
|
40
|
+
return ratNorm({ n: a.n * b.n, d: a.d * b.d });
|
|
41
|
+
}
|
|
42
|
+
function ratDiv(a, b) {
|
|
43
|
+
if (b.n === 0n) {
|
|
44
|
+
throw new Error('Rat: divide by zero');
|
|
45
|
+
}
|
|
46
|
+
return ratNorm({ n: a.n * b.d, d: a.d * b.n });
|
|
47
|
+
}
|
|
48
|
+
function ratToInt(r) {
|
|
49
|
+
return r.d === 1n ? r.n : null;
|
|
50
|
+
}
|
|
51
|
+
function uniAddRat(a, b) {
|
|
52
|
+
const len = Math.max(a.length, b.length);
|
|
53
|
+
const out = new Array(len).fill(0).map(() => rat(0n));
|
|
54
|
+
for (let i = 0; i < len; i++) {
|
|
55
|
+
out[i] = ratAdd(a[i] ?? rat(0n), b[i] ?? rat(0n));
|
|
56
|
+
}
|
|
57
|
+
while (out.length > 1 && out[out.length - 1].n === 0n) {
|
|
58
|
+
out.pop();
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function uniMulRat(a, b) {
|
|
63
|
+
const out = new Array(a.length + b.length - 1).fill(0).map(() => rat(0n));
|
|
64
|
+
for (let i = 0; i < a.length; i++) {
|
|
65
|
+
for (let j = 0; j < b.length; j++) {
|
|
66
|
+
out[i + j] = ratAdd(out[i + j], ratMul(a[i], b[j]));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
while (out.length > 1 && out[out.length - 1].n === 0n) {
|
|
70
|
+
out.pop();
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function interpolateUnivariateRat(points) {
|
|
75
|
+
if (points.length === 0) {
|
|
76
|
+
return [rat(0n)];
|
|
77
|
+
}
|
|
78
|
+
const byX = new Map();
|
|
79
|
+
for (const p of points) {
|
|
80
|
+
const prev = byX.get(p.x);
|
|
81
|
+
if (!prev) {
|
|
82
|
+
byX.set(p.x, p.y);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (ratSub(prev, p.y).n !== 0n) {
|
|
86
|
+
throw new Error('interpolateUnivariateRat: duplicate x with conflicting y');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const uniq = [...byX.entries()]
|
|
90
|
+
.map(([x, y]) => ({ x, y }))
|
|
91
|
+
.sort((a, b) => (a.x < b.x ? -1 : a.x > b.x ? 1 : 0));
|
|
92
|
+
const n = uniq.length;
|
|
93
|
+
if (n === 1) {
|
|
94
|
+
return [uniq[0].y];
|
|
95
|
+
}
|
|
96
|
+
let poly = [rat(0n)];
|
|
97
|
+
for (let i = 0; i < n; i++) {
|
|
98
|
+
let basis = [rat(1n)];
|
|
99
|
+
let denom = rat(1n);
|
|
100
|
+
for (let j = 0; j < n; j++) {
|
|
101
|
+
if (j === i) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
basis = uniMulRat(basis, [rat(-uniq[j].x), rat(1n)]);
|
|
105
|
+
denom = ratMul(denom, rat(uniq[i].x - uniq[j].x));
|
|
106
|
+
}
|
|
107
|
+
const scale = ratDiv(uniq[i].y, denom);
|
|
108
|
+
const scaled = basis.map(c => ratMul(c, scale));
|
|
109
|
+
poly = uniAddRat(poly, scaled);
|
|
110
|
+
}
|
|
111
|
+
while (poly.length > 1 && poly[poly.length - 1].n === 0n) {
|
|
112
|
+
poly.pop();
|
|
113
|
+
}
|
|
114
|
+
return poly;
|
|
115
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Expression } from '../../core/classes/expression/Expression';
|
|
2
|
+
import { Vector } from '../../core/classes/vector/Vector';
|
|
3
|
+
import type { ExpressionInput } from '../../core/types';
|
|
4
|
+
/**
|
|
5
|
+
* Factors polynomial-like numerator and denominator components of an expression.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* The implementation converts polynomial structure to the exact integer-coefficient
|
|
9
|
+
* factorization layer. Irrational constants and function-valued components may be
|
|
10
|
+
* temporarily represented by substitution variables. If the input cannot be handled
|
|
11
|
+
* by that finite polynomial path, the function returns an unevaluated symbolic
|
|
12
|
+
* `factor(input)` expression rather than exposing the internal failure.
|
|
13
|
+
*
|
|
14
|
+
* @param x - Expression-compatible value to factor.
|
|
15
|
+
* @returns A factored expression or an unevaluated symbolic `factor` call.
|
|
16
|
+
*/
|
|
17
|
+
export declare function factor(x: ExpressionInput): Expression;
|
|
18
|
+
/**
|
|
19
|
+
* Factors the numerator of polynomial-like input into Expression factors.
|
|
20
|
+
*
|
|
21
|
+
* @param x - Input whose numerator should be factored.
|
|
22
|
+
* @returns New factor expressions; unsupported input is returned as a one-element array.
|
|
23
|
+
*/
|
|
24
|
+
export declare function polyFactorExpressions(x: ExpressionInput): Expression[];
|
|
25
|
+
/**
|
|
26
|
+
* Wraps the polynomial factor expressions in an ordered {@link Vector}.
|
|
27
|
+
*
|
|
28
|
+
* @param x - Polynomial-like input.
|
|
29
|
+
* @returns A new Vector containing the factor expressions.
|
|
30
|
+
*/
|
|
31
|
+
export declare function polyFactors(x: ExpressionInput): Vector;
|
|
32
|
+
/**
|
|
33
|
+
* Factors the polynomialized numerator and denominator separately.
|
|
34
|
+
*
|
|
35
|
+
* @param x - Rational expression to polynomialize and factor.
|
|
36
|
+
* @returns New numerator and denominator factor arrays after reversing temporary substitutions.
|
|
37
|
+
*/
|
|
38
|
+
export declare function factorExpressionParts(x: ExpressionInput): {
|
|
39
|
+
numerator: Expression[];
|
|
40
|
+
denominator: Expression[];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Factors the numerator and denominator separately and returns each factor list as a Vector.
|
|
44
|
+
*
|
|
45
|
+
* @param x - Expression-compatible value to factor.
|
|
46
|
+
* @returns New Vectors for the numerator and denominator factors.
|
|
47
|
+
*/
|
|
48
|
+
export declare function factors(x: ExpressionInput): {
|
|
49
|
+
numerator: Vector;
|
|
50
|
+
denominator: Vector;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Returns prime-power factors for the numeric parts of a numerator and denominator.
|
|
54
|
+
*
|
|
55
|
+
* @param x - Numeric or expression-compatible value.
|
|
56
|
+
* @returns Numerator and denominator Vectors. Non-numeric components are kept as single
|
|
57
|
+
* factors instead of being recursively factored.
|
|
58
|
+
*/
|
|
59
|
+
export declare function numberFactors(x: ExpressionInput): {
|
|
60
|
+
numerator: Vector;
|
|
61
|
+
denominator: Vector;
|
|
62
|
+
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.factor = factor;
|
|
4
|
+
exports.polyFactorExpressions = polyFactorExpressions;
|
|
5
|
+
exports.polyFactors = polyFactors;
|
|
6
|
+
exports.factorExpressionParts = factorExpressionParts;
|
|
7
|
+
exports.factors = factors;
|
|
8
|
+
exports.numberFactors = numberFactors;
|
|
9
|
+
const analysis_1 = require("../../core/classes/expression/analysis");
|
|
10
|
+
const Expression_1 = require("../../core/classes/expression/Expression");
|
|
11
|
+
const constants_1 = require("../../core/classes/parser/constants");
|
|
12
|
+
const multiply_1 = require("../../core/classes/parser/operations/multiply");
|
|
13
|
+
const Polynomial_1 = require("../../core/classes/polynomial/Polynomial");
|
|
14
|
+
const Vector_1 = require("../../core/classes/vector/Vector");
|
|
15
|
+
const primeFactor_1 = require("../../core/functions/bigint/primeFactor");
|
|
16
|
+
const subst_1 = require("../../core/functions/subst");
|
|
17
|
+
const adapters_1 = require("../adapters");
|
|
18
|
+
const factor_1 = require("../algorithms/factor");
|
|
19
|
+
const polynomialize_1 = require("../polynomialize");
|
|
20
|
+
/**
|
|
21
|
+
* Factors polynomial-like numerator and denominator components of an expression.
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* The implementation converts polynomial structure to the exact integer-coefficient
|
|
25
|
+
* factorization layer. Irrational constants and function-valued components may be
|
|
26
|
+
* temporarily represented by substitution variables. If the input cannot be handled
|
|
27
|
+
* by that finite polynomial path, the function returns an unevaluated symbolic
|
|
28
|
+
* `factor(input)` expression rather than exposing the internal failure.
|
|
29
|
+
*
|
|
30
|
+
* @param x - Expression-compatible value to factor.
|
|
31
|
+
* @returns A factored expression or an unevaluated symbolic `factor` call.
|
|
32
|
+
*/
|
|
33
|
+
function factor(x) {
|
|
34
|
+
let retval;
|
|
35
|
+
try {
|
|
36
|
+
x = Expression_1.Expression.create(x);
|
|
37
|
+
if (x.isZero()) {
|
|
38
|
+
retval = x;
|
|
39
|
+
}
|
|
40
|
+
else if (x.isNUM() && x.isInteger()) {
|
|
41
|
+
let factoredInteger;
|
|
42
|
+
const factorCounts = (0, primeFactor_1.primeFactorCounts)(x.getMultiplier().numerator);
|
|
43
|
+
for (const prime in factorCounts) {
|
|
44
|
+
const primePower = Expression_1.Expression.toEXP(prime, factorCounts[prime]);
|
|
45
|
+
factoredInteger = factoredInteger
|
|
46
|
+
? (0, multiply_1.merge)(factoredInteger, primePower)
|
|
47
|
+
: primePower;
|
|
48
|
+
}
|
|
49
|
+
retval = factoredInteger ?? Expression_1.Expression.Number('1');
|
|
50
|
+
if (x.sign() === -1) {
|
|
51
|
+
retval = retval.neg();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// A variable is already fully factored.
|
|
55
|
+
else if (x.isVAR()) {
|
|
56
|
+
retval = x;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const factored = factors(x);
|
|
60
|
+
retval = factored.numerator.prod().div(factored.denominator.prod());
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
retval = Expression_1.Expression.toFunction(constants_1.FACTOR, [x]);
|
|
65
|
+
}
|
|
66
|
+
return retval;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Factors the numerator of polynomial-like input into Expression factors.
|
|
70
|
+
*
|
|
71
|
+
* @param x - Input whose numerator should be factored.
|
|
72
|
+
* @returns New factor expressions; unsupported input is returned as a one-element array.
|
|
73
|
+
*/
|
|
74
|
+
function polyFactorExpressions(x) {
|
|
75
|
+
let retval;
|
|
76
|
+
try {
|
|
77
|
+
const expr = (0, analysis_1.normalizeMultiplierDenominators)(Expression_1.Expression.create(x));
|
|
78
|
+
const num = expr.getNumerator();
|
|
79
|
+
const den = expr.getDenominator();
|
|
80
|
+
// MultiPoly strictly works in Z. Irrational coefficients
|
|
81
|
+
// must first be promoted to variables.
|
|
82
|
+
const [subbed, map] = (0, subst_1.uSubConstants)(num);
|
|
83
|
+
const p = new Polynomial_1.Polynomial(subbed);
|
|
84
|
+
const variables = p.variables;
|
|
85
|
+
const { poly } = (0, adapters_1.polynomialToMultiPoly)(p);
|
|
86
|
+
// Factor it
|
|
87
|
+
const factors = (0, factor_1.factorPoly)(poly, variables);
|
|
88
|
+
// Remove the u-substitution
|
|
89
|
+
retval = (0, adapters_1.factorsToExpressions)(factors, variables).map(f => (0, subst_1.uUnSub)(f, map).div(den));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
retval = [Expression_1.Expression.create(x)];
|
|
93
|
+
}
|
|
94
|
+
return retval;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Wraps the polynomial factor expressions in an ordered {@link Vector}.
|
|
98
|
+
*
|
|
99
|
+
* @param x - Polynomial-like input.
|
|
100
|
+
* @returns A new Vector containing the factor expressions.
|
|
101
|
+
*/
|
|
102
|
+
function polyFactors(x) {
|
|
103
|
+
const retval = new Vector_1.Vector(polyFactorExpressions(x));
|
|
104
|
+
return retval;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Factors the polynomialized numerator and denominator separately.
|
|
108
|
+
*
|
|
109
|
+
* @param x - Rational expression to polynomialize and factor.
|
|
110
|
+
* @returns New numerator and denominator factor arrays after reversing temporary substitutions.
|
|
111
|
+
*/
|
|
112
|
+
function factorExpressionParts(x) {
|
|
113
|
+
const { numerator, denominator, map } = (0, polynomialize_1.polynomialize)(Expression_1.Expression.create(x));
|
|
114
|
+
return {
|
|
115
|
+
numerator: polyFactorExpressions(numerator).map(f => (0, subst_1.uUnSub)(f, map)),
|
|
116
|
+
denominator: polyFactorExpressions(denominator).map(f => (0, subst_1.uUnSub)(f, map)),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Factors the numerator and denominator separately and returns each factor list as a Vector.
|
|
121
|
+
*
|
|
122
|
+
* @param x - Expression-compatible value to factor.
|
|
123
|
+
* @returns New Vectors for the numerator and denominator factors.
|
|
124
|
+
*/
|
|
125
|
+
function factors(x) {
|
|
126
|
+
const { numerator, denominator } = factorExpressionParts(x);
|
|
127
|
+
return {
|
|
128
|
+
numerator: new Vector_1.Vector(numerator),
|
|
129
|
+
denominator: new Vector_1.Vector(denominator),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Returns prime-power factors for the numeric parts of a numerator and denominator.
|
|
134
|
+
*
|
|
135
|
+
* @param x - Numeric or expression-compatible value.
|
|
136
|
+
* @returns Numerator and denominator Vectors. Non-numeric components are kept as single
|
|
137
|
+
* factors instead of being recursively factored.
|
|
138
|
+
*/
|
|
139
|
+
function numberFactors(x) {
|
|
140
|
+
x = Expression_1.Expression.create(x);
|
|
141
|
+
const numerator = x.getNumerator();
|
|
142
|
+
const denominator = x.getDenominator();
|
|
143
|
+
function factorNumber(num) {
|
|
144
|
+
if (!num.isNUM()) {
|
|
145
|
+
return new Vector_1.Vector([num]);
|
|
146
|
+
}
|
|
147
|
+
const factors = new Vector_1.Vector();
|
|
148
|
+
const factorCounts = (0, primeFactor_1.primeFactorCounts)(num.getMultiplier().numerator);
|
|
149
|
+
for (const prime in factorCounts) {
|
|
150
|
+
factors.append(Expression_1.Expression.toEXP(prime, factorCounts[prime]));
|
|
151
|
+
}
|
|
152
|
+
return factors;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
numerator: factorNumber(numerator),
|
|
156
|
+
denominator: factorNumber(denominator),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Expression } from '../../core/classes/expression/Expression';
|
|
2
|
+
import type { ExpressionInput } from '../../core/types';
|
|
3
|
+
/**
|
|
4
|
+
* Computes a symbolic greatest common divisor over rational polynomial structure.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Numerators and denominators are polynomialized, function-valued or irrational
|
|
8
|
+
* constants may be temporarily substituted, and the multivariate Zippel GCD is
|
|
9
|
+
* verified by exact polynomial division. Factoring supplies an expensive final
|
|
10
|
+
* fallback. When conversion or the supported polynomial algorithms fail, the
|
|
11
|
+
* result remains symbolic as `gcd(x, y)`.
|
|
12
|
+
*
|
|
13
|
+
* @param x - First expression-compatible operand.
|
|
14
|
+
* @param y - Second expression-compatible operand.
|
|
15
|
+
* @returns The exact symbolic GCD or an unevaluated `gcd` expression.
|
|
16
|
+
*/
|
|
17
|
+
export declare function gcd(x: ExpressionInput, y: ExpressionInput): Expression;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the least common multiple of two expressions.
|
|
20
|
+
*
|
|
21
|
+
* Numeric inputs reuse exact `Rational` arithmetic. Polynomial expressions use
|
|
22
|
+
* the existing GCD normalization so shared symbolic factors are retained.
|
|
23
|
+
*
|
|
24
|
+
* @param x - First expression-compatible operand.
|
|
25
|
+
* @param y - Second expression-compatible operand.
|
|
26
|
+
* @returns Zero when either operand is zero; otherwise a non-negative numeric LCM or
|
|
27
|
+
* the symbolic product divided by {@link gcd}.
|
|
28
|
+
*/
|
|
29
|
+
export declare function lcm(x: ExpressionInput, y: ExpressionInput): Expression;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gcd = gcd;
|
|
4
|
+
exports.lcm = lcm;
|
|
5
|
+
const collect_1 = require("../../core/classes/expression/collect");
|
|
6
|
+
const Expression_1 = require("../../core/classes/expression/Expression");
|
|
7
|
+
const shortcuts_1 = require("../../core/classes/expression/shortcuts");
|
|
8
|
+
const constants_1 = require("../../core/classes/parser/constants");
|
|
9
|
+
const Polynomial_1 = require("../../core/classes/polynomial/Polynomial");
|
|
10
|
+
const utils_1 = require("../../core/classes/polynomial/utils");
|
|
11
|
+
const subst_1 = require("../../core/functions/subst");
|
|
12
|
+
const adapters_1 = require("../adapters");
|
|
13
|
+
const gcd_1 = require("../algorithms/gcd");
|
|
14
|
+
const factor_1 = require("../factor/factor");
|
|
15
|
+
const polynomialize_1 = require("../polynomialize");
|
|
16
|
+
/**
|
|
17
|
+
* Computes a symbolic greatest common divisor over rational polynomial structure.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* Numerators and denominators are polynomialized, function-valued or irrational
|
|
21
|
+
* constants may be temporarily substituted, and the multivariate Zippel GCD is
|
|
22
|
+
* verified by exact polynomial division. Factoring supplies an expensive final
|
|
23
|
+
* fallback. When conversion or the supported polynomial algorithms fail, the
|
|
24
|
+
* result remains symbolic as `gcd(x, y)`.
|
|
25
|
+
*
|
|
26
|
+
* @param x - First expression-compatible operand.
|
|
27
|
+
* @param y - Second expression-compatible operand.
|
|
28
|
+
* @returns The exact symbolic GCD or an unevaluated `gcd` expression.
|
|
29
|
+
*/
|
|
30
|
+
function gcd(x, y) {
|
|
31
|
+
try {
|
|
32
|
+
x = Expression_1.Expression.create(x);
|
|
33
|
+
y = Expression_1.Expression.create(y);
|
|
34
|
+
const asDecimal = x.hasDecimal() || y.hasDecimal();
|
|
35
|
+
const { numerator: ax, denominator: bx, map } = (0, polynomialize_1.polynomialize)(x);
|
|
36
|
+
const { numerator: px, denominator: qx, map: finalMap } = (0, polynomialize_1.polynomialize)(y, map);
|
|
37
|
+
const vars = (0, collect_1.collectVariablesSet)([ax, bx, px, qx]);
|
|
38
|
+
const g0 = expressionGCD(ax, px, vars);
|
|
39
|
+
const g1 = expressionGCD(bx, qx, vars);
|
|
40
|
+
const retval = (0, subst_1.uUnSub)(g0.div(g1), finalMap);
|
|
41
|
+
retval.getMultiplier().asDecimal = asDecimal;
|
|
42
|
+
return retval;
|
|
43
|
+
}
|
|
44
|
+
catch { }
|
|
45
|
+
return Expression_1.Expression.toFunction(constants_1.GCD, [x, y]);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns the least common multiple of two expressions.
|
|
49
|
+
*
|
|
50
|
+
* Numeric inputs reuse exact `Rational` arithmetic. Polynomial expressions use
|
|
51
|
+
* the existing GCD normalization so shared symbolic factors are retained.
|
|
52
|
+
*
|
|
53
|
+
* @param x - First expression-compatible operand.
|
|
54
|
+
* @param y - Second expression-compatible operand.
|
|
55
|
+
* @returns Zero when either operand is zero; otherwise a non-negative numeric LCM or
|
|
56
|
+
* the symbolic product divided by {@link gcd}.
|
|
57
|
+
*/
|
|
58
|
+
function lcm(x, y) {
|
|
59
|
+
const a = Expression_1.Expression.create(x);
|
|
60
|
+
const b = Expression_1.Expression.create(y);
|
|
61
|
+
let retval;
|
|
62
|
+
if (a.isZero() || b.isZero()) {
|
|
63
|
+
retval = (0, shortcuts_1.zero)();
|
|
64
|
+
}
|
|
65
|
+
else if (a.isNUM() && b.isNUM()) {
|
|
66
|
+
retval = Expression_1.Expression.fromRational(a.getMultiplier().LCM(b.getMultiplier()).abs());
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
retval = a.times(b).div(gcd(a, b));
|
|
70
|
+
}
|
|
71
|
+
return retval;
|
|
72
|
+
}
|
|
73
|
+
function expressionGCD(x, y, variables) {
|
|
74
|
+
let retval;
|
|
75
|
+
if (x.isNUM() && y.isNUM()) {
|
|
76
|
+
retval = Expression_1.Expression.create(x.getMultiplier().GCD(y.getMultiplier()));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const f = new Polynomial_1.Polynomial(x);
|
|
80
|
+
const g = new Polynomial_1.Polynomial(y);
|
|
81
|
+
if (f.isZero() && g.isZero()) {
|
|
82
|
+
return (0, shortcuts_1.zero)();
|
|
83
|
+
}
|
|
84
|
+
if (f.isZero()) {
|
|
85
|
+
return Expression_1.Expression.create(y);
|
|
86
|
+
}
|
|
87
|
+
if (g.isZero()) {
|
|
88
|
+
return Expression_1.Expression.create(x);
|
|
89
|
+
}
|
|
90
|
+
const { mGCD, p, q } = f.stripMonomialGCD(g);
|
|
91
|
+
variables ??= [...new Set(p.variables.concat(q.variables))].sort();
|
|
92
|
+
const { poly: poly1 } = (0, adapters_1.polynomialToMultiPoly)(p, variables);
|
|
93
|
+
const { poly: poly2 } = (0, adapters_1.polynomialToMultiPoly)(q, variables);
|
|
94
|
+
const g0 = (0, gcd_1.zippelGCDMulti)(poly1, poly2, variables);
|
|
95
|
+
retval = (0, adapters_1.multiPolyToExpression)(g0, variables);
|
|
96
|
+
// Verify
|
|
97
|
+
if (!(0, utils_1.divide)(p, retval)[1].isZero()) {
|
|
98
|
+
retval = (0, shortcuts_1.one)();
|
|
99
|
+
}
|
|
100
|
+
// Don't give up just yet. Try by factor
|
|
101
|
+
if (retval.isOne()) {
|
|
102
|
+
retval = gcdByCommonFactors(p.getExpression(), q.getExpression());
|
|
103
|
+
}
|
|
104
|
+
// Put back the monomial gcd
|
|
105
|
+
retval = retval.times(mGCD.getExpression());
|
|
106
|
+
}
|
|
107
|
+
return retval;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Factors both expressions and compares their factors as a last-resort GCD strategy.
|
|
111
|
+
*
|
|
112
|
+
* Factoring is expensive, so this path runs only after exact polynomial reduction fails
|
|
113
|
+
* to find a nontrivial divisor.
|
|
114
|
+
*/
|
|
115
|
+
function gcdByCommonFactors(f, g) {
|
|
116
|
+
let retval = (0, shortcuts_1.one)();
|
|
117
|
+
if (!f.isProduct()) {
|
|
118
|
+
f = (0, factor_1.factor)(f);
|
|
119
|
+
}
|
|
120
|
+
if (!g.isProduct()) {
|
|
121
|
+
g = (0, factor_1.factor)(g);
|
|
122
|
+
}
|
|
123
|
+
// Only proceed if both are products
|
|
124
|
+
if (f.isProduct() && g.isProduct()) {
|
|
125
|
+
const fArray = f.elementsArray();
|
|
126
|
+
const gArray = g.elementsArray();
|
|
127
|
+
// Compare them
|
|
128
|
+
for (const a of fArray) {
|
|
129
|
+
for (const b of gArray) {
|
|
130
|
+
// If they're equal then they're a common factor
|
|
131
|
+
if (a.eq(b)) {
|
|
132
|
+
retval = retval.times(a);
|
|
133
|
+
}
|
|
134
|
+
else if (a.isProduct() && b.isProduct()) {
|
|
135
|
+
return gcd(a, b);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return retval;
|
|
141
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Vector } from '../core/classes/vector/Vector';
|
|
2
|
+
import type { ExpressionInput } from '../core/types';
|
|
3
|
+
/**
|
|
4
|
+
* Computes an expression-facing Groebner basis for polynomial generators.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* All generators are converted using one variable order so exponent indices remain
|
|
8
|
+
* consistent. Rational coefficient denominators are cleared per generator before the
|
|
9
|
+
* exact integer-coefficient `MultiPoly` engine runs; multiplying a generator by a
|
|
10
|
+
* nonzero scalar preserves the generated ideal. When `vars` is omitted, variables are
|
|
11
|
+
* collected across every generator.
|
|
12
|
+
*
|
|
13
|
+
* This convenience wrapper uses lexicographic order and a reduced, deterministically
|
|
14
|
+
* sorted basis. Use the advanced Groebner APIs for another monomial order, resource
|
|
15
|
+
* budgets, elimination, or ideal membership.
|
|
16
|
+
*
|
|
17
|
+
* @param expressionArray - Polynomial-like generators of the ideal.
|
|
18
|
+
* @param vars - Variable order, from highest to lowest lexicographic priority.
|
|
19
|
+
* @returns A new vector containing expression representations of the basis.
|
|
20
|
+
*/
|
|
21
|
+
export declare function groebner(expressionArray: ExpressionInput[] | Vector, vars?: string[]): Vector;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.groebner = groebner;
|
|
4
|
+
const analysis_1 = require("../core/classes/expression/analysis");
|
|
5
|
+
const collect_1 = require("../core/classes/expression/collect");
|
|
6
|
+
const Expression_1 = require("../core/classes/expression/Expression");
|
|
7
|
+
const Polynomial_1 = require("../core/classes/polynomial/Polynomial");
|
|
8
|
+
const Vector_1 = require("../core/classes/vector/Vector");
|
|
9
|
+
const adapters_1 = require("./adapters");
|
|
10
|
+
const groebnerBase_1 = require("./algorithms/groebnerBase");
|
|
11
|
+
/**
|
|
12
|
+
* Computes an expression-facing Groebner basis for polynomial generators.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* All generators are converted using one variable order so exponent indices remain
|
|
16
|
+
* consistent. Rational coefficient denominators are cleared per generator before the
|
|
17
|
+
* exact integer-coefficient `MultiPoly` engine runs; multiplying a generator by a
|
|
18
|
+
* nonzero scalar preserves the generated ideal. When `vars` is omitted, variables are
|
|
19
|
+
* collected across every generator.
|
|
20
|
+
*
|
|
21
|
+
* This convenience wrapper uses lexicographic order and a reduced, deterministically
|
|
22
|
+
* sorted basis. Use the advanced Groebner APIs for another monomial order, resource
|
|
23
|
+
* budgets, elimination, or ideal membership.
|
|
24
|
+
*
|
|
25
|
+
* @param expressionArray - Polynomial-like generators of the ideal.
|
|
26
|
+
* @param vars - Variable order, from highest to lowest lexicographic priority.
|
|
27
|
+
* @returns A new vector containing expression representations of the basis.
|
|
28
|
+
*/
|
|
29
|
+
function groebner(expressionArray, vars) {
|
|
30
|
+
const inputs = Vector_1.Vector.isVector(expressionArray) ? expressionArray.elements : expressionArray;
|
|
31
|
+
const expressions = inputs.map(e => Expression_1.Expression.create(e));
|
|
32
|
+
// Get the unified variable list across ALL generators
|
|
33
|
+
vars ??= (0, collect_1.collectVariablesSet)(expressions);
|
|
34
|
+
// Convert each polynomial using the unified variable list so indices are consistent.
|
|
35
|
+
// Since the Groebner core operates on MultiPoly over Z, clear denominators per generator
|
|
36
|
+
// before converting so rational-coefficient inputs are lifted into equivalent integer ones.
|
|
37
|
+
const polys = expressions.map(e => {
|
|
38
|
+
const cleared = (0, analysis_1.normalizeMultiplierDenominators)(e);
|
|
39
|
+
return (0, adapters_1.polynomialToMultiPoly)(new Polynomial_1.Polynomial(cleared, vars), vars).poly;
|
|
40
|
+
});
|
|
41
|
+
return new Vector_1.Vector((0, groebnerBase_1.Groebner)(polys, vars).map(gb => (0, adapters_1.multiPolyToExpression)(gb, vars)));
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Expression } from '../core/classes/expression/Expression';
|
|
2
|
+
import type { ExpressionInput } from '../core/types';
|
|
3
|
+
/**
|
|
4
|
+
* Decomposes a rational expression P(x)/Q(x) into partial fractions.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The routine extracts `P(x)/Q(x)`, performs polynomial long division for an improper
|
|
8
|
+
* fraction, factors `Q` over the supported exact polynomial domain, and solves the
|
|
9
|
+
* undetermined coefficients by exact evaluation and row reduction. Repeated linear
|
|
10
|
+
* factors and irreducible quadratic factors are supported. An irreducible factor of
|
|
11
|
+
* higher degree, a singular coefficient system, a denominator independent of the
|
|
12
|
+
* selected variable, or a factorization that does not expose a useful decomposition
|
|
13
|
+
* leaves the original expression unchanged.
|
|
14
|
+
*
|
|
15
|
+
* @param x - Rational expression to decompose.
|
|
16
|
+
* @param variable - Main variable; defaults to the first variable reported by the expression.
|
|
17
|
+
* @returns A new decomposition when one is found, otherwise the original parsed expression.
|
|
18
|
+
*/
|
|
19
|
+
export declare function partfrac(x: ExpressionInput, variable?: ExpressionInput): Expression;
|