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,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @module arith
|
|
4
|
+
*
|
|
5
|
+
* Low-level integer and modular arithmetic helpers used throughout the library.
|
|
6
|
+
*
|
|
7
|
+
* - All integer arithmetic is done with `bigint`.
|
|
8
|
+
* - Modular routines assume a prime modulus `p` when inverses are required.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.GcdBudgetExceededError = exports.PrimeSelectionError = void 0;
|
|
12
|
+
exports.abs = abs;
|
|
13
|
+
exports.gcd = gcd;
|
|
14
|
+
exports.pow = pow;
|
|
15
|
+
exports.powN = powN;
|
|
16
|
+
exports.bigIntSqrt = bigIntSqrt;
|
|
17
|
+
exports.intNthRootExact = intNthRootExact;
|
|
18
|
+
exports.getDivisors = getDivisors;
|
|
19
|
+
exports.modNorm = modNorm;
|
|
20
|
+
exports.modSymmetric = modSymmetric;
|
|
21
|
+
exports.modInv = modInv;
|
|
22
|
+
exports.contentBigint = contentBigint;
|
|
23
|
+
exports.bigintBitLength = bigintBitLength;
|
|
24
|
+
exports.nextPrime32 = nextPrime32;
|
|
25
|
+
/**
|
|
26
|
+
* Shared integer + modular arithmetic primitives used across Zippel GCD and
|
|
27
|
+
* multivariate factorization.
|
|
28
|
+
*
|
|
29
|
+
* Design goals:
|
|
30
|
+
* - BigInt-only arithmetic for coefficient paths.
|
|
31
|
+
* - Small, stable surface area: use `abs`, `gcd`, `pow`.
|
|
32
|
+
*/
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Integer arithmetic
|
|
35
|
+
// ============================================================================
|
|
36
|
+
/** Absolute value for BigInt. */
|
|
37
|
+
function abs(a) {
|
|
38
|
+
return a < 0n ? -a : a;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Euclidean GCD for BigInt.
|
|
42
|
+
*
|
|
43
|
+
* Returns a nonnegative gcd. gcd(0,0) = 0.
|
|
44
|
+
*/
|
|
45
|
+
function gcd(a, b) {
|
|
46
|
+
a = abs(a);
|
|
47
|
+
b = abs(b);
|
|
48
|
+
while (b !== 0n) {
|
|
49
|
+
[a, b] = [b, a % b];
|
|
50
|
+
}
|
|
51
|
+
return a;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Integer exponentiation for BigInt with a nonnegative exponent.
|
|
55
|
+
*
|
|
56
|
+
* This is NOT modular exponentiation (see {@link modPow}).
|
|
57
|
+
*/
|
|
58
|
+
function pow(base, exp) {
|
|
59
|
+
if (exp < 0n) {
|
|
60
|
+
throw new Error('pow: negative exponent');
|
|
61
|
+
}
|
|
62
|
+
let b = base;
|
|
63
|
+
let e = exp;
|
|
64
|
+
let r = 1n;
|
|
65
|
+
while (e > 0n) {
|
|
66
|
+
if (e & 1n) {
|
|
67
|
+
r *= b;
|
|
68
|
+
}
|
|
69
|
+
b *= b;
|
|
70
|
+
e >>= 1n;
|
|
71
|
+
}
|
|
72
|
+
return r;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Integer exponentiation for BigInt with a small nonnegative JS number exponent.
|
|
76
|
+
*
|
|
77
|
+
* Convenience wrapper used throughout factorization code where exponents are known
|
|
78
|
+
* to fit in a number.
|
|
79
|
+
*/
|
|
80
|
+
function powN(base, exp) {
|
|
81
|
+
if (!Number.isInteger(exp) || exp < 0) {
|
|
82
|
+
throw new Error('powN: exponent must be a nonnegative integer');
|
|
83
|
+
}
|
|
84
|
+
return pow(base, BigInt(exp));
|
|
85
|
+
}
|
|
86
|
+
// ============================================================================
|
|
87
|
+
// Number theory helpers (BigInt)
|
|
88
|
+
// ============================================================================
|
|
89
|
+
/**
|
|
90
|
+
* Integer square root: floor(sqrt(n)) for n >= 0.
|
|
91
|
+
*/
|
|
92
|
+
function bigIntSqrt(n) {
|
|
93
|
+
if (n < 0n) {
|
|
94
|
+
throw new Error('bigIntSqrt: negative input');
|
|
95
|
+
}
|
|
96
|
+
if (n < 2n) {
|
|
97
|
+
return n;
|
|
98
|
+
}
|
|
99
|
+
// Newton iteration.
|
|
100
|
+
let x0 = n;
|
|
101
|
+
let x1 = (x0 + 1n) >> 1n;
|
|
102
|
+
while (x1 < x0) {
|
|
103
|
+
x0 = x1;
|
|
104
|
+
x1 = (x1 + n / x1) >> 1n;
|
|
105
|
+
}
|
|
106
|
+
return x0;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Exact n-th root if it exists.
|
|
110
|
+
* Returns r such that r^n === value, or null if value is not a perfect n-th power.
|
|
111
|
+
*/
|
|
112
|
+
function intNthRootExact(value, n) {
|
|
113
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
114
|
+
throw new Error('intNthRootExact: n must be a positive integer');
|
|
115
|
+
}
|
|
116
|
+
if (value < 0n) {
|
|
117
|
+
// Only odd roots exist for negative values.
|
|
118
|
+
if ((n & 1) === 0) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const r = intNthRootExact(-value, n);
|
|
122
|
+
return r === null ? null : -r;
|
|
123
|
+
}
|
|
124
|
+
if (value === 0n) {
|
|
125
|
+
return 0n;
|
|
126
|
+
}
|
|
127
|
+
if (value === 1n) {
|
|
128
|
+
return 1n;
|
|
129
|
+
}
|
|
130
|
+
// Exponential search for an upper bound.
|
|
131
|
+
let lo = 0n;
|
|
132
|
+
let hi = 1n;
|
|
133
|
+
while (powN(hi, n) < value) {
|
|
134
|
+
hi <<= 1n;
|
|
135
|
+
}
|
|
136
|
+
// Binary search.
|
|
137
|
+
while (lo + 1n < hi) {
|
|
138
|
+
const mid = (lo + hi) >> 1n;
|
|
139
|
+
const p = powN(mid, n);
|
|
140
|
+
if (p === value) {
|
|
141
|
+
return mid;
|
|
142
|
+
}
|
|
143
|
+
if (p < value) {
|
|
144
|
+
lo = mid;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
hi = mid;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return powN(hi, n) === value ? hi : powN(lo, n) === value ? lo : null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Return positive divisors of n (n > 0) by trial division.
|
|
154
|
+
*
|
|
155
|
+
* NOTE: This is intended for small integers used in factoring heuristics.
|
|
156
|
+
*/
|
|
157
|
+
function getDivisors(n) {
|
|
158
|
+
if (n <= 0n) {
|
|
159
|
+
throw new Error('getDivisors: n must be positive');
|
|
160
|
+
}
|
|
161
|
+
const out = [];
|
|
162
|
+
const r = bigIntSqrt(n);
|
|
163
|
+
for (let d = 1n; d <= r; d++) {
|
|
164
|
+
if (n % d === 0n) {
|
|
165
|
+
out.push(d);
|
|
166
|
+
const q = n / d;
|
|
167
|
+
if (q !== d) {
|
|
168
|
+
out.push(q);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
out.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Extended Euclidean algorithm.
|
|
177
|
+
*
|
|
178
|
+
* Returns `{ g, x, y }` such that `a*x + b*y = g = gcd(a,b)` (up to sign).
|
|
179
|
+
*/
|
|
180
|
+
function egcd(a, b) {
|
|
181
|
+
let old_r = a, r = b;
|
|
182
|
+
let old_s = 1n, s = 0n;
|
|
183
|
+
let old_t = 0n, t = 1n;
|
|
184
|
+
while (r !== 0n) {
|
|
185
|
+
const q = old_r / r;
|
|
186
|
+
[old_r, r] = [r, old_r - q * r];
|
|
187
|
+
[old_s, s] = [s, old_s - q * s];
|
|
188
|
+
[old_t, t] = [t, old_t - q * t];
|
|
189
|
+
}
|
|
190
|
+
return { g: old_r, x: old_s, y: old_t };
|
|
191
|
+
}
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// Modular arithmetic
|
|
194
|
+
// ============================================================================
|
|
195
|
+
/** Normalize a into the range [0, |p|). Throws if p is zero. */
|
|
196
|
+
function modNorm(a, p) {
|
|
197
|
+
if (p === 0n) {
|
|
198
|
+
throw new Error('modNorm: modulus must be nonzero');
|
|
199
|
+
}
|
|
200
|
+
const m = abs(p);
|
|
201
|
+
const r = a % m;
|
|
202
|
+
return r < 0n ? r + m : r;
|
|
203
|
+
}
|
|
204
|
+
/** Map a to the symmetric residue class (-|p|/2, |p|/2]. */
|
|
205
|
+
function modSymmetric(a, p) {
|
|
206
|
+
if (p === 0n) {
|
|
207
|
+
throw new Error('modSymmetric: modulus must be nonzero');
|
|
208
|
+
}
|
|
209
|
+
const m = abs(p);
|
|
210
|
+
const r = modNorm(a, m);
|
|
211
|
+
const half = m / 2n;
|
|
212
|
+
return r > half ? r - m : r;
|
|
213
|
+
}
|
|
214
|
+
/** Modular multiplicative inverse of a mod p, where gcd(a,p)=1. */
|
|
215
|
+
function modInv(a, p) {
|
|
216
|
+
const aa = modNorm(a, p);
|
|
217
|
+
if (aa === 0n) {
|
|
218
|
+
throw new Error('modInv: non-invertible (0)');
|
|
219
|
+
}
|
|
220
|
+
const { g, x } = egcd(aa, p);
|
|
221
|
+
if (g !== 1n && g !== -1n) {
|
|
222
|
+
throw new Error('modInv: non-invertible');
|
|
223
|
+
}
|
|
224
|
+
return modNorm(x, p);
|
|
225
|
+
}
|
|
226
|
+
// ============================================================================
|
|
227
|
+
// Coefficient utilities
|
|
228
|
+
// ============================================================================
|
|
229
|
+
/**
|
|
230
|
+
* Content (GCD of coefficients) for an iterable of bigint coefficients.
|
|
231
|
+
* Returns 0n for the all-zero collection.
|
|
232
|
+
*/
|
|
233
|
+
function contentBigint(coeffs) {
|
|
234
|
+
let g0 = 0n;
|
|
235
|
+
for (const c of coeffs) {
|
|
236
|
+
const a = abs(c);
|
|
237
|
+
g0 = gcd(g0, a);
|
|
238
|
+
if (g0 === 1n) {
|
|
239
|
+
return 1n;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return g0;
|
|
243
|
+
}
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
// Univariate polynomial arithmetic over F_p (coeff arrays low->high)
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// ============================================================================
|
|
248
|
+
// Misc small utilities
|
|
249
|
+
// ============================================================================
|
|
250
|
+
/** Bit-length of a bigint (0 -> 0). */
|
|
251
|
+
function bigintBitLength(a) {
|
|
252
|
+
if (a < 0n) {
|
|
253
|
+
a = -a;
|
|
254
|
+
}
|
|
255
|
+
let bits = 0;
|
|
256
|
+
while (a > 0n) {
|
|
257
|
+
bits++;
|
|
258
|
+
a >>= 1n;
|
|
259
|
+
}
|
|
260
|
+
return bits;
|
|
261
|
+
}
|
|
262
|
+
/** Simple primality test for 32-bit positive integers. */
|
|
263
|
+
function isPrime32(n) {
|
|
264
|
+
if (!Number.isInteger(n) || n < 2) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
if (n === 2 || n === 3) {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
if ((n & 1) === 0) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
if (n % 3 === 0) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
const limit = Math.floor(Math.sqrt(n));
|
|
277
|
+
for (let d = 5; d <= limit; d += 6) {
|
|
278
|
+
if (n % d === 0 || n % (d + 2) === 0) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
/** Next prime >= start. */
|
|
285
|
+
function nextPrime32(start) {
|
|
286
|
+
let n = start;
|
|
287
|
+
if (n <= 2) {
|
|
288
|
+
return 2;
|
|
289
|
+
}
|
|
290
|
+
if ((n & 1) === 0) {
|
|
291
|
+
n++;
|
|
292
|
+
}
|
|
293
|
+
while (!isPrime32(n)) {
|
|
294
|
+
n += 2;
|
|
295
|
+
}
|
|
296
|
+
return n;
|
|
297
|
+
}
|
|
298
|
+
class AlgebraError extends Error {
|
|
299
|
+
/** Additional structured debugging info. Always present (possibly empty). */
|
|
300
|
+
details;
|
|
301
|
+
phase;
|
|
302
|
+
constructor(message, phase = 'unknown', details) {
|
|
303
|
+
super(message);
|
|
304
|
+
this.name = this.constructor.name;
|
|
305
|
+
this.phase = phase;
|
|
306
|
+
this.details = details ?? {};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
class PrimeSelectionError extends AlgebraError {
|
|
310
|
+
constructor(message, details) {
|
|
311
|
+
super(message, 'prime-selection', details);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.PrimeSelectionError = PrimeSelectionError;
|
|
315
|
+
/**
|
|
316
|
+
* Thrown when Zippel-style multivariate GCD exceeds its specialization / interpolation budget.
|
|
317
|
+
*/
|
|
318
|
+
class GcdBudgetExceededError extends AlgebraError {
|
|
319
|
+
constructor(message, details) {
|
|
320
|
+
super(message, 'budget', details);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
exports.GcdBudgetExceededError = GcdBudgetExceededError;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.factorPoly = void 0;
|
|
4
|
+
var factorMultivariate_1 = require("./factorMultivariate");
|
|
5
|
+
Object.defineProperty(exports, "factorPoly", { enumerable: true, get: function () { return factorMultivariate_1.factorPoly; } });
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module factor_multivariate
|
|
3
|
+
*
|
|
4
|
+
* Multivariate polynomial factorization over Z[x1, x2, ..., xn].
|
|
5
|
+
*/
|
|
6
|
+
import { MultiPoly } from './multiPoly/MultiPoly';
|
|
7
|
+
import { type Vars } from './poly';
|
|
8
|
+
export type { Vars };
|
|
9
|
+
/**
|
|
10
|
+
* Get all combinations of k elements from array
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Main entry point for multivariate factorization
|
|
14
|
+
*/
|
|
15
|
+
export type PolyFactor = {
|
|
16
|
+
poly: MultiPoly;
|
|
17
|
+
multiplicity: number;
|
|
18
|
+
};
|
|
19
|
+
export type FactorsObject = {
|
|
20
|
+
content: bigint;
|
|
21
|
+
factors: PolyFactor[];
|
|
22
|
+
};
|
|
23
|
+
export declare function factorPoly(f: MultiPoly, vars: string[]): FactorsObject;
|