nerdamer 1.1.13 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/BREAKING_CHANGES.md +244 -5
  2. package/LICENSE.md +184 -0
  3. package/README.md +232 -318
  4. package/dist/bundle.js +2 -0
  5. package/dist/bundle.js.LICENSE.txt +7 -0
  6. package/dist/parser.js +2 -0
  7. package/dist/parser.js.LICENSE.txt +7 -0
  8. package/docs-data/parser-functions.json +2248 -0
  9. package/index.d.ts +10 -426
  10. package/output/algebra/adapters.d.ts +3 -0
  11. package/output/algebra/adapters.js +11 -0
  12. package/output/algebra/algorithms/arith.d.ts +84 -0
  13. package/output/algebra/algorithms/arith.js +324 -0
  14. package/output/algebra/algorithms/groebnerBase.d.ts +161 -0
  15. package/output/algebra/algorithms/groebnerBase.js +929 -0
  16. package/output/algebra/dispatch.d.ts +1 -0
  17. package/output/algebra/dispatch.js +25 -0
  18. package/output/algebra/factor/factor.d.ts +77 -0
  19. package/output/algebra/factor/factor.js +245 -0
  20. package/output/algebra/gcd/gcd.d.ts +30 -0
  21. package/output/algebra/gcd/gcd.js +95 -0
  22. package/output/algebra/groebner.d.ts +21 -0
  23. package/output/algebra/groebner.js +36 -0
  24. package/output/algebra/partfrac.d.ts +19 -0
  25. package/output/algebra/partfrac.js +365 -0
  26. package/output/algebra/polynomial/ModularSparsePolynomial.d.ts +131 -0
  27. package/output/algebra/polynomial/ModularSparsePolynomial.js +378 -0
  28. package/output/algebra/polynomial/ModularSparsePolynomialFactor.d.ts +40 -0
  29. package/output/algebra/polynomial/ModularSparsePolynomialFactor.js +661 -0
  30. package/output/algebra/polynomial/SparsePolynomialFactor.d.ts +64 -0
  31. package/output/algebra/polynomial/SparsePolynomialFactor.js +492 -0
  32. package/output/algebra/polynomial/SparsePolynomialGcd.d.ts +29 -0
  33. package/output/algebra/polynomial/SparsePolynomialGcd.js +259 -0
  34. package/output/algebra/polynomial/SparsePolynomialMultivariateFactor.d.ts +82 -0
  35. package/output/algebra/polynomial/SparsePolynomialMultivariateFactor.js +604 -0
  36. package/output/algebra/polynomial/modularGcd.d.ts +40 -0
  37. package/output/algebra/polynomial/modularGcd.js +365 -0
  38. package/output/algebra/polynomialize.d.ts +20 -0
  39. package/output/algebra/polynomialize.js +26 -0
  40. package/output/algebra/simplify/complexsimp.d.ts +7 -0
  41. package/output/algebra/simplify/complexsimp.js +24 -0
  42. package/output/algebra/simplify/factorCommon.d.ts +13 -0
  43. package/output/algebra/simplify/factorCommon.js +136 -0
  44. package/output/algebra/simplify/funcsimp.d.ts +26 -0
  45. package/output/algebra/simplify/funcsimp.js +633 -0
  46. package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
  47. package/output/algebra/simplify/invtrigrewrite.js +96 -0
  48. package/output/algebra/simplify/ratsimp.d.ts +21 -0
  49. package/output/algebra/simplify/ratsimp.js +140 -0
  50. package/output/algebra/simplify/simplify.d.ts +25 -0
  51. package/output/algebra/simplify/simplify.js +237 -0
  52. package/output/algebra/simplify/trigreduce.d.ts +38 -0
  53. package/output/algebra/simplify/trigreduce.js +424 -0
  54. package/output/algebra/simplify/trigrewrite.d.ts +17 -0
  55. package/output/algebra/simplify/trigrewrite.js +156 -0
  56. package/output/algebra/simplify/trigsimp.d.ts +11 -0
  57. package/output/algebra/simplify/trigsimp.js +369 -0
  58. package/output/algebra/simplify/utils.d.ts +32 -0
  59. package/output/algebra/simplify/utils.js +56 -0
  60. package/output/algebra/utils.d.ts +32 -0
  61. package/output/algebra/utils.js +48 -0
  62. package/output/api/advanced.d.ts +8 -0
  63. package/output/api/advanced.js +18 -0
  64. package/output/api/algebra.d.ts +17 -0
  65. package/output/api/algebra.js +35 -0
  66. package/output/api/assumptions.d.ts +4 -0
  67. package/output/api/assumptions.js +11 -0
  68. package/output/api/calculus.d.ts +10 -0
  69. package/output/api/calculus.js +22 -0
  70. package/output/api/core.d.ts +17 -0
  71. package/output/api/core.js +41 -0
  72. package/output/api/debug.d.ts +16 -0
  73. package/output/api/debug.js +23 -0
  74. package/output/api/languages/deu.d.ts +3 -0
  75. package/output/api/languages/deu.js +266 -0
  76. package/output/api/languages/fra.d.ts +3 -0
  77. package/output/api/languages/fra.js +266 -0
  78. package/output/api/languages/ita.d.ts +3 -0
  79. package/output/api/languages/ita.js +266 -0
  80. package/output/api/languages/nld.d.ts +3 -0
  81. package/output/api/languages/nld.js +266 -0
  82. package/output/api/languages/por.d.ts +3 -0
  83. package/output/api/languages/por.js +266 -0
  84. package/output/api/languages/spa.d.ts +3 -0
  85. package/output/api/languages/spa.js +266 -0
  86. package/output/api/parser.d.ts +93 -0
  87. package/output/api/parser.js +18 -0
  88. package/output/api/solve.d.ts +10 -0
  89. package/output/api/solve.js +17 -0
  90. package/output/api/structures.d.ts +10 -0
  91. package/output/api/structures.js +23 -0
  92. package/output/calculus/adapters.d.ts +8 -0
  93. package/output/calculus/adapters.js +41 -0
  94. package/output/calculus/derivative/diff.d.ts +30 -0
  95. package/output/calculus/derivative/diff.js +241 -0
  96. package/output/calculus/dispatch.d.ts +1 -0
  97. package/output/calculus/dispatch.js +25 -0
  98. package/output/calculus/fresnel.d.ts +16 -0
  99. package/output/calculus/fresnel.js +39 -0
  100. package/output/calculus/integrate/byParts.d.ts +18 -0
  101. package/output/calculus/integrate/byParts.js +339 -0
  102. package/output/calculus/integrate/bySubstitution.d.ts +135 -0
  103. package/output/calculus/integrate/bySubstitution.js +411 -0
  104. package/output/calculus/integrate/integrate.d.ts +38 -0
  105. package/output/calculus/integrate/integrate.js +652 -0
  106. package/output/calculus/integrate/integrationTable.d.ts +2 -0
  107. package/output/calculus/integrate/integrationTable.js +914 -0
  108. package/output/calculus/integrate/utils.d.ts +28 -0
  109. package/output/calculus/integrate/utils.js +96 -0
  110. package/output/calculus/laplace/ilaplace.d.ts +31 -0
  111. package/output/calculus/laplace/ilaplace.js +192 -0
  112. package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
  113. package/output/calculus/laplace/ilaplaceTable.js +200 -0
  114. package/output/calculus/laplace/laplace.d.ts +22 -0
  115. package/output/calculus/laplace/laplace.js +109 -0
  116. package/output/calculus/laplace/laplaceTable.d.ts +2 -0
  117. package/output/calculus/laplace/laplaceTable.js +187 -0
  118. package/output/calculus/limit/limit.d.ts +35 -0
  119. package/output/calculus/limit/limit.js +1183 -0
  120. package/output/calculus/limit/limitsTable.d.ts +2 -0
  121. package/output/calculus/limit/limitsTable.js +7 -0
  122. package/output/core/Settings.d.ts +32 -0
  123. package/output/core/Settings.js +68 -0
  124. package/output/core/classes/assumption/Assumption.d.ts +218 -0
  125. package/output/core/classes/assumption/Assumption.js +609 -0
  126. package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
  127. package/output/core/classes/assumption/assertiveFunctions.js +64 -0
  128. package/output/core/classes/assumption/assume.d.ts +90 -0
  129. package/output/core/classes/assumption/assume.js +145 -0
  130. package/output/core/classes/assumption/dispatch.d.ts +1 -0
  131. package/output/core/classes/assumption/dispatch.js +11 -0
  132. package/output/core/classes/collection/Collection.d.ts +107 -0
  133. package/output/core/classes/collection/Collection.js +240 -0
  134. package/output/core/classes/complex/Complex.d.ts +109 -0
  135. package/output/core/classes/complex/Complex.js +153 -0
  136. package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
  137. package/output/core/classes/decimalSet/DecimalSet.js +454 -0
  138. package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
  139. package/output/core/classes/dictionary/Dictionary.js +216 -0
  140. package/output/core/classes/equation/Equation.d.ts +256 -0
  141. package/output/core/classes/equation/Equation.js +350 -0
  142. package/output/core/classes/expression/CoeffObject.d.ts +100 -0
  143. package/output/core/classes/expression/CoeffObject.js +197 -0
  144. package/output/core/classes/expression/Expression.d.ts +1691 -0
  145. package/output/core/classes/expression/Expression.js +2381 -0
  146. package/output/core/classes/expression/analysis.d.ts +25 -0
  147. package/output/core/classes/expression/analysis.js +218 -0
  148. package/output/core/classes/expression/collect.d.ts +9 -0
  149. package/output/core/classes/expression/collect.js +49 -0
  150. package/output/core/classes/expression/format.d.ts +54 -0
  151. package/output/core/classes/expression/format.js +340 -0
  152. package/output/core/classes/expression/products.d.ts +23 -0
  153. package/output/core/classes/expression/products.js +115 -0
  154. package/output/core/classes/expression/shortcuts.d.ts +35 -0
  155. package/output/core/classes/expression/shortcuts.js +129 -0
  156. package/output/core/classes/expression/traversal.d.ts +31 -0
  157. package/output/core/classes/expression/traversal.js +216 -0
  158. package/output/core/classes/expression/trig.d.ts +25 -0
  159. package/output/core/classes/expression/trig.js +40 -0
  160. package/output/core/classes/expression/utils.d.ts +61 -0
  161. package/output/core/classes/expression/utils.js +235 -0
  162. package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
  163. package/output/core/classes/lookupTable/LookupTable.js +55 -0
  164. package/output/core/classes/matrix/Matrix.d.ts +227 -0
  165. package/output/core/classes/matrix/Matrix.js +901 -0
  166. package/output/core/classes/matrix/Sylvester.d.ts +11 -0
  167. package/output/core/classes/matrix/Sylvester.js +54 -0
  168. package/output/core/classes/matrix/dispatch.d.ts +1 -0
  169. package/output/core/classes/matrix/dispatch.js +19 -0
  170. package/output/core/classes/matrix/functions.d.ts +28 -0
  171. package/output/core/classes/matrix/functions.js +57 -0
  172. package/output/core/classes/matrix/utils.d.ts +9 -0
  173. package/output/core/classes/matrix/utils.js +22 -0
  174. package/output/core/classes/parser/Parser.d.ts +493 -0
  175. package/output/core/classes/parser/Parser.js +1863 -0
  176. package/output/core/classes/parser/Token.d.ts +58 -0
  177. package/output/core/classes/parser/Token.js +137 -0
  178. package/output/core/classes/parser/constants.d.ts +162 -0
  179. package/output/core/classes/parser/constants.js +229 -0
  180. package/output/core/classes/parser/controlFlowSignals.d.ts +38 -0
  181. package/output/core/classes/parser/controlFlowSignals.js +60 -0
  182. package/output/core/classes/parser/helpers.d.ts +21 -0
  183. package/output/core/classes/parser/helpers.js +42 -0
  184. package/output/core/classes/parser/operations/add.d.ts +15 -0
  185. package/output/core/classes/parser/operations/add.js +236 -0
  186. package/output/core/classes/parser/operations/comma.d.ts +7 -0
  187. package/output/core/classes/parser/operations/comma.js +11 -0
  188. package/output/core/classes/parser/operations/compare.d.ts +21 -0
  189. package/output/core/classes/parser/operations/compare.js +474 -0
  190. package/output/core/classes/parser/operations/divide.d.ts +2 -0
  191. package/output/core/classes/parser/operations/divide.js +72 -0
  192. package/output/core/classes/parser/operations/functions.d.ts +46 -0
  193. package/output/core/classes/parser/operations/functions.js +438 -0
  194. package/output/core/classes/parser/operations/multiply.d.ts +11 -0
  195. package/output/core/classes/parser/operations/multiply.js +328 -0
  196. package/output/core/classes/parser/operations/power.d.ts +48 -0
  197. package/output/core/classes/parser/operations/power.js +673 -0
  198. package/output/core/classes/parser/operations/subtract.d.ts +3 -0
  199. package/output/core/classes/parser/operations/subtract.js +36 -0
  200. package/output/core/classes/parser/preprocess.d.ts +7 -0
  201. package/output/core/classes/parser/preprocess.js +246 -0
  202. package/output/core/classes/parser/scripting/controlFlow.d.ts +23 -0
  203. package/output/core/classes/parser/scripting/controlFlow.js +279 -0
  204. package/output/core/classes/parser/scripting/deferred.d.ts +4 -0
  205. package/output/core/classes/parser/scripting/deferred.js +65 -0
  206. package/output/core/classes/parser/scripting/dispatch.d.ts +1 -0
  207. package/output/core/classes/parser/scripting/dispatch.js +62 -0
  208. package/output/core/classes/parser/scripting/evaluate.d.ts +23 -0
  209. package/output/core/classes/parser/scripting/evaluate.js +128 -0
  210. package/output/core/classes/parser/scripting/functions.d.ts +14 -0
  211. package/output/core/classes/parser/scripting/functions.js +59 -0
  212. package/output/core/classes/parser/scripting/scope.d.ts +8 -0
  213. package/output/core/classes/parser/scripting/scope.js +132 -0
  214. package/output/core/classes/parser/types.d.ts +130 -0
  215. package/output/core/classes/parser/types.js +2 -0
  216. package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
  217. package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
  218. package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
  219. package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
  220. package/output/core/classes/polynomial/Polynomial.d.ts +504 -0
  221. package/output/core/classes/polynomial/Polynomial.js +1195 -0
  222. package/output/core/classes/polynomial/SparsePolynomial.d.ts +221 -0
  223. package/output/core/classes/polynomial/SparsePolynomial.js +824 -0
  224. package/output/core/classes/polynomial/SparsePolynomialAdapter.d.ts +56 -0
  225. package/output/core/classes/polynomial/SparsePolynomialAdapter.js +241 -0
  226. package/output/core/classes/polynomial/Term.d.ts +222 -0
  227. package/output/core/classes/polynomial/Term.js +430 -0
  228. package/output/core/classes/polynomial/adapters.d.ts +18 -0
  229. package/output/core/classes/polynomial/adapters.js +33 -0
  230. package/output/core/classes/polynomial/dispatch.d.ts +1 -0
  231. package/output/core/classes/polynomial/dispatch.js +14 -0
  232. package/output/core/classes/polynomial/functions.d.ts +77 -0
  233. package/output/core/classes/polynomial/functions.js +189 -0
  234. package/output/core/classes/polynomial/utils.d.ts +62 -0
  235. package/output/core/classes/polynomial/utils.js +207 -0
  236. package/output/core/classes/rational/Rational.d.ts +501 -0
  237. package/output/core/classes/rational/Rational.js +829 -0
  238. package/output/core/classes/seq/SEQ.d.ts +13 -0
  239. package/output/core/classes/seq/SEQ.js +137 -0
  240. package/output/core/classes/valuesSet/ValuesSet.d.ts +187 -0
  241. package/output/core/classes/valuesSet/ValuesSet.js +399 -0
  242. package/output/core/classes/vector/Vector.d.ts +222 -0
  243. package/output/core/classes/vector/Vector.js +501 -0
  244. package/output/core/classes/vector/dispatch.d.ts +1 -0
  245. package/output/core/classes/vector/dispatch.js +11 -0
  246. package/output/core/classes/vector/functions.d.ts +28 -0
  247. package/output/core/classes/vector/functions.js +47 -0
  248. package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
  249. package/output/core/common/classes/MathematicalAggregate.js +149 -0
  250. package/output/core/common/classes/Scope.d.ts +62 -0
  251. package/output/core/common/classes/Scope.js +122 -0
  252. package/output/core/common/classes/StructuredEntity.d.ts +55 -0
  253. package/output/core/common/classes/StructuredEntity.js +151 -0
  254. package/output/core/common/common.d.ts +62 -0
  255. package/output/core/common/common.js +74 -0
  256. package/output/core/common/functions/functions.d.ts +14 -0
  257. package/output/core/common/functions/functions.js +33 -0
  258. package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
  259. package/output/core/common/functions/structuredEntityUtils.js +40 -0
  260. package/output/core/converters/BaseConverter.d.ts +97 -0
  261. package/output/core/converters/BaseConverter.js +405 -0
  262. package/output/core/converters/Converter.d.ts +111 -0
  263. package/output/core/converters/Converter.js +806 -0
  264. package/output/core/converters/Pattern.d.ts +71 -0
  265. package/output/core/converters/Pattern.js +302 -0
  266. package/output/core/dispatch.d.ts +52 -0
  267. package/output/core/dispatch.js +26 -0
  268. package/output/core/errors.d.ts +316 -0
  269. package/output/core/errors.js +349 -0
  270. package/output/core/fullFunctions.d.ts +7 -0
  271. package/output/core/fullFunctions.js +31 -0
  272. package/output/core/functions/bigint/bigint.d.ts +133 -0
  273. package/output/core/functions/bigint/bigint.js +444 -0
  274. package/output/core/functions/bigint/primeFactor.d.ts +51 -0
  275. package/output/core/functions/bigint/primeFactor.js +267 -0
  276. package/output/core/functions/bigint/primes.d.ts +1 -0
  277. package/output/core/functions/bigint/primes.js +11 -0
  278. package/output/core/functions/build/definitions.d.ts +12 -0
  279. package/output/core/functions/build/definitions.js +139 -0
  280. package/output/core/functions/build/index.d.ts +32 -0
  281. package/output/core/functions/build/index.js +136 -0
  282. package/output/core/functions/complex.d.ts +90 -0
  283. package/output/core/functions/complex.dispatch.d.ts +1 -0
  284. package/output/core/functions/complex.dispatch.js +16 -0
  285. package/output/core/functions/complex.js +482 -0
  286. package/output/core/functions/decimal.d.ts +24 -0
  287. package/output/core/functions/decimal.js +665 -0
  288. package/output/core/functions/expand/expand.d.ts +42 -0
  289. package/output/core/functions/expand/expand.js +376 -0
  290. package/output/core/functions/fresnelNumeric.d.ts +12 -0
  291. package/output/core/functions/fresnelNumeric.js +123 -0
  292. package/output/core/functions/numeric.d.ts +140 -0
  293. package/output/core/functions/numeric.js +790 -0
  294. package/output/core/functions/rationalNormalization.d.ts +11 -0
  295. package/output/core/functions/rationalNormalization.js +117 -0
  296. package/output/core/functions/setFunction.d.ts +19 -0
  297. package/output/core/functions/setFunction.js +75 -0
  298. package/output/core/functions/string.d.ts +26 -0
  299. package/output/core/functions/string.js +102 -0
  300. package/output/core/functions/subst.d.ts +90 -0
  301. package/output/core/functions/subst.js +506 -0
  302. package/output/core/functions/utils.d.ts +24 -0
  303. package/output/core/functions/utils.js +51 -0
  304. package/output/core/parserFunctions.d.ts +7 -0
  305. package/output/core/parserFunctions.js +25 -0
  306. package/output/core/types.d.ts +48 -0
  307. package/output/core/types.js +2 -0
  308. package/output/index.d.ts +359 -0
  309. package/output/index.js +739 -0
  310. package/output/math/defint/defint.d.ts +18 -0
  311. package/output/math/defint/defint.js +60 -0
  312. package/output/math/defint/defintDecimal.d.ts +37 -0
  313. package/output/math/defint/defintDecimal.js +321 -0
  314. package/output/math/defint/defintNative.d.ts +57 -0
  315. package/output/math/defint/defintNative.js +281 -0
  316. package/output/math/dispatch.d.ts +1 -0
  317. package/output/math/dispatch.js +101 -0
  318. package/output/math/geometry.d.ts +12 -0
  319. package/output/math/geometry.js +55 -0
  320. package/output/math/math.d.ts +695 -0
  321. package/output/math/math.js +1955 -0
  322. package/output/math/trig.d.ts +518 -0
  323. package/output/math/trig.js +1444 -0
  324. package/output/math/trunc.d.ts +19 -0
  325. package/output/math/trunc.js +36 -0
  326. package/output/math/utils.d.ts +66 -0
  327. package/output/math/utils.js +219 -0
  328. package/output/solve/classes/DecimalMatrix.d.ts +17 -0
  329. package/output/solve/classes/DecimalMatrix.js +86 -0
  330. package/output/solve/classes/FunctionSolver.d.ts +135 -0
  331. package/output/solve/classes/FunctionSolver.js +433 -0
  332. package/output/solve/classes/MultivariateSolver.d.ts +84 -0
  333. package/output/solve/classes/MultivariateSolver.js +240 -0
  334. package/output/solve/classes/PolynomialSolver.d.ts +104 -0
  335. package/output/solve/classes/PolynomialSolver.js +492 -0
  336. package/output/solve/classes/SolutionSet.d.ts +172 -0
  337. package/output/solve/classes/SolutionSet.js +434 -0
  338. package/output/solve/classes/Solver.d.ts +17 -0
  339. package/output/solve/classes/Solver.js +132 -0
  340. package/output/solve/classes/SymbolicSolver.d.ts +74 -0
  341. package/output/solve/classes/SymbolicSolver.js +601 -0
  342. package/output/solve/dispatch.d.ts +1 -0
  343. package/output/solve/dispatch.js +13 -0
  344. package/output/solve/linsolve.d.ts +53 -0
  345. package/output/solve/linsolve.js +233 -0
  346. package/output/solve/solve.d.ts +44 -0
  347. package/output/solve/solve.js +368 -0
  348. package/output/solve/solveSystem.d.ts +31 -0
  349. package/output/solve/solveSystem.js +266 -0
  350. package/output/solve/utils.d.ts +10 -0
  351. package/output/solve/utils.js +58 -0
  352. package/output/utils/array.d.ts +42 -0
  353. package/output/utils/array.js +98 -0
  354. package/output/utils/debug.d.ts +131 -0
  355. package/output/utils/debug.js +296 -0
  356. package/output/utils/decimal.d.ts +3 -0
  357. package/output/utils/decimal.js +16 -0
  358. package/output/utils/numeric.d.ts +14 -0
  359. package/output/utils/numeric.js +51 -0
  360. package/output/utils/object.d.ts +26 -0
  361. package/output/utils/object.js +56 -0
  362. package/package.json +178 -57
  363. package/.travis.yml +0 -3
  364. package/Algebra.js +0 -4568
  365. package/CODE_OF_CONDUCT.md +0 -46
  366. package/CONTRIBUTING.md +0 -14
  367. package/Calculus.js +0 -2675
  368. package/Extra.js +0 -622
  369. package/Solve.js +0 -1783
  370. package/all.js +0 -16
  371. package/all.min.js +0 -1
  372. package/gulpfile.js +0 -16
  373. package/index.html +0 -158
  374. package/license.txt +0 -19
  375. package/nerdamer.core.js +0 -12510
  376. package/spec/LaTeX.spec.js +0 -302
  377. package/spec/TeXConvert.spec.js +0 -8
  378. package/spec/algebra.spec.js +0 -287
  379. package/spec/basic_parser.spec.js +0 -134
  380. package/spec/build.spec.js +0 -131
  381. package/spec/calculus.spec.js +0 -183
  382. package/spec/core.spec.js +0 -2970
  383. package/spec/extra.spec.js +0 -54
  384. package/spec/solve.spec.js +0 -126
  385. package/spec/support/jasmine.json +0 -11
  386. package/spec/support/utils.js +0 -42
  387. package/spec/text.spec.js +0 -132
@@ -0,0 +1,604 @@
1
+ "use strict";
2
+ /**
3
+ * @module sparsePolynomialMultivariateFactor
4
+ *
5
+ * Evaluation configuration for Wang/EEZ multivariate integer factorization.
6
+ *
7
+ * External references consulted:
8
+ * - Wang/EEZ evaluation-point tests and lifting pipeline:
9
+ * https://github.com/sympy/sympy/blob/120ee85f346f6292b763cc195afda4f907260d4a/sympy/polys/factortools.py
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.testWangEvaluationPoint = testWangEvaluationPoint;
13
+ exports.testWangConfiguration = testWangConfiguration;
14
+ exports.testWangBivariateConfiguration = testWangBivariateConfiguration;
15
+ exports.liftWangConfiguration = liftWangConfiguration;
16
+ exports.liftWangBivariateConfiguration = liftWangBivariateConfiguration;
17
+ exports.factorSquareFreeMultivariateInteger = factorSquareFreeMultivariateInteger;
18
+ exports.factorSquareFreeBivariateInteger = factorSquareFreeBivariateInteger;
19
+ exports.factorMultivariateInteger = factorMultivariateInteger;
20
+ exports.factorBivariateInteger = factorBivariateInteger;
21
+ exports.findWangConfiguration = findWangConfiguration;
22
+ exports.findWangBivariateConfiguration = findWangBivariateConfiguration;
23
+ exports.findWangEvaluationPoint = findWangEvaluationPoint;
24
+ const SparsePolynomial_1 = require("../../core/classes/polynomial/SparsePolynomial");
25
+ const errors_1 = require("../../core/errors");
26
+ const bigint_1 = require("../../core/functions/bigint/bigint");
27
+ const primeFactor_1 = require("../../core/functions/bigint/primeFactor");
28
+ const ModularSparsePolynomialFactor_1 = require("./ModularSparsePolynomialFactor");
29
+ const SparsePolynomialFactor_1 = require("./SparsePolynomialFactor");
30
+ const SparsePolynomialGcd_1 = require("./SparsePolynomialGcd");
31
+ const INITIAL_WANG_LIFT_PRIME = 1000003n;
32
+ function assertWangVariables(polynomial, variables) {
33
+ if (variables.length < 2) {
34
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang evaluation', requirement: (0, errors_1.message)('polyReqAtLeastTwoSelectedVariables') }));
35
+ }
36
+ const selected = new Set();
37
+ let previous = -1;
38
+ for (const variableIndex of variables) {
39
+ polynomial.degree(variableIndex);
40
+ if (selected.has(variableIndex)) {
41
+ throw new RangeError((0, errors_1.message)('polyVariablesUnique', { operation: 'Wang evaluation' }));
42
+ }
43
+ if (variableIndex <= previous) {
44
+ throw new RangeError((0, errors_1.message)('polyVariablesRingOrder', { operation: 'Wang evaluation' }));
45
+ }
46
+ selected.add(variableIndex);
47
+ previous = variableIndex;
48
+ }
49
+ for (const activeVariable of polynomial.variables()) {
50
+ if (!selected.has(activeVariable)) {
51
+ throw new RangeError((0, errors_1.message)('polyVariablesIncludeActive', { operation: 'Wang evaluation' }));
52
+ }
53
+ }
54
+ }
55
+ function evaluateTail(polynomial, variables, values) {
56
+ return polynomial.evaluateVariables(variables.slice(1), values);
57
+ }
58
+ function normalizeSpecialization(polynomial) {
59
+ let content = polynomial.content();
60
+ let primitive = polynomial.primitivePart();
61
+ const leading = primitive.leadingTerm('lex');
62
+ if (leading !== null && leading.coefficient < 0n) {
63
+ content = -content;
64
+ primitive = primitive.negate();
65
+ }
66
+ return { content, primitive };
67
+ }
68
+ function evaluateTailInteger(polynomial, variables, values) {
69
+ const evaluated = evaluateTail(polynomial, variables, values);
70
+ if (!evaluated.isConstant()) {
71
+ throw new Error((0, errors_1.message)('polyWangLeadingEvaluationInteger'));
72
+ }
73
+ return evaluated.constantTerm();
74
+ }
75
+ function wangNonDivisors(values, specializedContent, leadingContent) {
76
+ const previous = [specializedContent * leadingContent];
77
+ for (const value of values) {
78
+ let remaining = value < 0n ? -value : value;
79
+ for (let index = previous.length - 1; index >= 0; index--) {
80
+ let divisor = previous[index];
81
+ if (divisor < 0n) {
82
+ divisor = -divisor;
83
+ }
84
+ while (divisor !== 1n) {
85
+ divisor = (0, bigint_1.GCD)(divisor, remaining);
86
+ remaining /= divisor;
87
+ }
88
+ }
89
+ if (remaining === 1n) {
90
+ return false;
91
+ }
92
+ previous.push(value < 0n ? -value : value);
93
+ }
94
+ return true;
95
+ }
96
+ function productPolynomials(polynomials, variableCount) {
97
+ let result = SparsePolynomial_1.SparsePolynomial.constant(variableCount, 1n);
98
+ for (const polynomial of polynomials) {
99
+ result = result.multiply(polynomial);
100
+ }
101
+ return result;
102
+ }
103
+ function multivariateMignotteBound(polynomial, variables) {
104
+ let degreeSum = 0n;
105
+ for (const variableIndex of variables) {
106
+ degreeSum += polynomial.degree(variableIndex) ?? 0n;
107
+ }
108
+ const leading = polynomial.leadingTerm('lex');
109
+ if (leading === null) {
110
+ return 0n;
111
+ }
112
+ const leadingAbsolute = leading.coefficient < 0n ? -leading.coefficient : leading.coefficient;
113
+ return ((0, bigint_1.ceilIntegerSquareRoot)(degreeSum + 1n) *
114
+ (1n << degreeSum) *
115
+ polynomial.maxAbsoluteCoefficient() *
116
+ leadingAbsolute);
117
+ }
118
+ function testWangSpecializationPrepared(polynomial, variables, values, mainVariable, originalDegree) {
119
+ const evaluated = evaluateTail(polynomial, variables, values);
120
+ if (evaluated.degree(mainVariable) !== originalDegree) {
121
+ return null;
122
+ }
123
+ const normalized = normalizeSpecialization(evaluated);
124
+ if (normalized.primitive.isConstant()) {
125
+ return null;
126
+ }
127
+ const derivative = normalized.primitive.derivative(mainVariable);
128
+ const gcd = (0, SparsePolynomialGcd_1.sparsePolynomialGcd)(normalized.primitive, derivative, [mainVariable]);
129
+ if (!gcd.isConstant()) {
130
+ return null;
131
+ }
132
+ return {
133
+ values: [...values],
134
+ content: normalized.content,
135
+ polynomial: normalized.primitive,
136
+ };
137
+ }
138
+ function factorWangSpecialization(specialization, mainVariable) {
139
+ return {
140
+ ...specialization,
141
+ factors: (0, SparsePolynomialFactor_1.factorSquareFreeUnivariateInteger)(specialization.polynomial, mainVariable),
142
+ };
143
+ }
144
+ /**
145
+ * Tests one Wang/EEZ specialization.
146
+ *
147
+ * The first selected variable remains symbolic and every later variable is replaced by
148
+ * the corresponding integer value. A usable specialization preserves the degree in the
149
+ * main variable and has square-free primitive part.
150
+ */
151
+ function testWangEvaluationPoint(polynomial, variables, values) {
152
+ assertWangVariables(polynomial, variables);
153
+ if (values.length !== variables.length - 1) {
154
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang evaluation', requirement: (0, errors_1.message)('polyReqOneValuePerNonMainVariable') }));
155
+ }
156
+ if (polynomial.isZero()) {
157
+ return null;
158
+ }
159
+ const mainVariable = variables[0];
160
+ const originalDegree = polynomial.degree(mainVariable);
161
+ if (originalDegree === null || originalDegree === 0n) {
162
+ return null;
163
+ }
164
+ const specialization = testWangSpecializationPrepared(polynomial, variables, values, mainVariable, originalDegree);
165
+ return specialization === null
166
+ ? null
167
+ : factorWangSpecialization(specialization, mainVariable);
168
+ }
169
+ function visitEvaluationShell(valueCount, radius, visitor) {
170
+ const values = new Array(valueCount).fill(0n);
171
+ function visit(index, touchesBoundary) {
172
+ if (index === valueCount) {
173
+ return touchesBoundary && visitor(values);
174
+ }
175
+ for (let value = -radius; value <= radius; value++) {
176
+ values[index] = value;
177
+ if (visit(index + 1, touchesBoundary || value === -radius || value === radius)) {
178
+ return true;
179
+ }
180
+ }
181
+ return false;
182
+ }
183
+ return visit(0, radius === 0n);
184
+ }
185
+ function factorWangLeadingCoefficient(polynomial, variables) {
186
+ const mainVariable = variables[0];
187
+ const tailVariables = variables.slice(1);
188
+ const leadingCoefficient = polynomial.leadingCoefficientIn(mainVariable);
189
+ if (leadingCoefficient === null) {
190
+ return null;
191
+ }
192
+ const activeTailVariables = tailVariables.filter(variableIndex => (leadingCoefficient.degree(variableIndex) ?? 0n) > 0n);
193
+ if (activeTailVariables.length <= 1) {
194
+ return (0, SparsePolynomialFactor_1.factorUnivariateInteger)(leadingCoefficient, activeTailVariables[0] ?? tailVariables[0]);
195
+ }
196
+ return factorMultivariateInteger(leadingCoefficient, activeTailVariables);
197
+ }
198
+ function testWangConfigurationWithLeadingFactorization(polynomial, variables, values, leadingFactorization, mainVariable, originalDegree) {
199
+ const specialization = testWangSpecializationPrepared(polynomial, variables, values, mainVariable, originalDegree);
200
+ if (specialization === null) {
201
+ return null;
202
+ }
203
+ const leadingValues = leadingFactorization.factors.map(entry => evaluateTailInteger(entry.factor, variables, values));
204
+ if (!wangNonDivisors(leadingValues, specialization.content, leadingFactorization.content)) {
205
+ return null;
206
+ }
207
+ const evaluation = factorWangSpecialization(specialization, mainVariable);
208
+ const assigned = [];
209
+ const usedLeadingFactors = new Array(leadingFactorization.factors.length).fill(false);
210
+ let remainingContent = evaluation.content;
211
+ const specializedFactors = evaluation.factors.map(factor => factor);
212
+ for (const specializedFactor of specializedFactors) {
213
+ const factorLeading = specializedFactor.leadingCoefficientIn(mainVariable);
214
+ if (factorLeading === null || !factorLeading.isConstant()) {
215
+ throw new Error((0, errors_1.message)('polyWangSpecializedLeadingInteger'));
216
+ }
217
+ let dividend = factorLeading.constantTerm() * remainingContent;
218
+ let assignedLeading = SparsePolynomial_1.SparsePolynomial.constant(polynomial.variableCount, 1n);
219
+ for (let index = leadingFactorization.factors.length - 1; index >= 0; index--) {
220
+ const evaluatedFactor = leadingValues[index];
221
+ if (evaluatedFactor === 0n) {
222
+ return null;
223
+ }
224
+ let exponent = 0n;
225
+ while (dividend % evaluatedFactor === 0n) {
226
+ dividend /= evaluatedFactor;
227
+ exponent++;
228
+ }
229
+ if (exponent > 0n) {
230
+ assignedLeading = assignedLeading.multiply(leadingFactorization.factors[index].factor.pow(exponent));
231
+ usedLeadingFactors[index] = true;
232
+ }
233
+ }
234
+ assigned.push(assignedLeading);
235
+ }
236
+ if (usedLeadingFactors.some(used => !used)) {
237
+ return null;
238
+ }
239
+ const adjustedFactors = [];
240
+ const adjustedLeading = [];
241
+ for (let index = 0; index < assigned.length; index++) {
242
+ let leading = assigned[index];
243
+ let specializedFactor = specializedFactors[index];
244
+ const evaluatedLeading = evaluateTailInteger(leading, variables, values);
245
+ const specializedLeading = specializedFactor
246
+ .leadingCoefficientIn(mainVariable)
247
+ ?.constantTerm();
248
+ if (specializedLeading === undefined || evaluatedLeading === 0n) {
249
+ return null;
250
+ }
251
+ if (remainingContent === 1n) {
252
+ if (specializedLeading % evaluatedLeading !== 0n) {
253
+ return null;
254
+ }
255
+ leading = leading.scale(specializedLeading / evaluatedLeading);
256
+ }
257
+ else {
258
+ const divisor = (0, bigint_1.GCD)(specializedLeading, evaluatedLeading);
259
+ const factorScale = evaluatedLeading / divisor;
260
+ const leadingScale = specializedLeading / divisor;
261
+ if (factorScale === 0n || remainingContent % factorScale !== 0n) {
262
+ return null;
263
+ }
264
+ specializedFactor = specializedFactor.scale(factorScale);
265
+ remainingContent /= factorScale;
266
+ leading = leading.scale(leadingScale);
267
+ }
268
+ adjustedFactors.push(specializedFactor);
269
+ adjustedLeading.push(leading);
270
+ }
271
+ let targetPolynomial = polynomial;
272
+ if (remainingContent !== 1n) {
273
+ adjustedFactors.forEach((factor, index) => {
274
+ adjustedFactors[index] = factor.scale(remainingContent);
275
+ adjustedLeading[index] = adjustedLeading[index].scale(remainingContent);
276
+ });
277
+ targetPolynomial = targetPolynomial.scale(remainingContent ** BigInt(adjustedFactors.length - 1));
278
+ }
279
+ const targetLeading = targetPolynomial.leadingCoefficientIn(mainVariable);
280
+ if (targetLeading === null ||
281
+ !productPolynomials(adjustedLeading, polynomial.variableCount).equals(targetLeading)) {
282
+ return null;
283
+ }
284
+ const specializedTarget = evaluateTail(targetPolynomial, variables, values);
285
+ if (!productPolynomials(adjustedFactors, polynomial.variableCount).equals(specializedTarget)) {
286
+ return null;
287
+ }
288
+ for (let index = 0; index < adjustedFactors.length; index++) {
289
+ const factorLeading = adjustedFactors[index].leadingCoefficientIn(mainVariable);
290
+ if (factorLeading === null ||
291
+ !evaluateTail(adjustedLeading[index], variables, values).equals(factorLeading)) {
292
+ return null;
293
+ }
294
+ }
295
+ return {
296
+ evaluation,
297
+ polynomial: targetPolynomial,
298
+ factors: adjustedFactors,
299
+ leadingCoefficients: adjustedLeading,
300
+ };
301
+ }
302
+ /**
303
+ * Builds a Wang configuration with reconstructed factor leading coefficients.
304
+ *
305
+ * The main-variable leading coefficient is factored recursively over the tail
306
+ * variables. A single active tail variable uses the univariate factorizer; larger
307
+ * coefficient rings recurse through multivariate factorization.
308
+ */
309
+ function testWangConfiguration(polynomial, variables, values) {
310
+ assertWangVariables(polynomial, variables);
311
+ if (values.length !== variables.length - 1) {
312
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqOneValuePerTailVariable') }));
313
+ }
314
+ if (polynomial.content() !== 1n) {
315
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqPrimitivePolynomial') }));
316
+ }
317
+ const leadingTerm = polynomial.leadingTerm('lex');
318
+ if (leadingTerm === null || leadingTerm.coefficient < 0n) {
319
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqPositiveLexLeadingSign') }));
320
+ }
321
+ const mainVariable = variables[0];
322
+ const originalDegree = polynomial.degree(mainVariable);
323
+ if (originalDegree === null || originalDegree === 0n) {
324
+ return null;
325
+ }
326
+ const leadingFactorization = factorWangLeadingCoefficient(polynomial, variables);
327
+ if (leadingFactorization === null) {
328
+ return null;
329
+ }
330
+ return testWangConfigurationWithLeadingFactorization(polynomial, variables, values, leadingFactorization, mainVariable, originalDegree);
331
+ }
332
+ /** Builds a bivariate Wang configuration through the general reconstruction path. */
333
+ function testWangBivariateConfiguration(polynomial, variables, value) {
334
+ if (variables.length !== 2) {
335
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Bivariate Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqExactlyTwoSelectedVariables') }));
336
+ }
337
+ return testWangConfiguration(polynomial, variables, [value]);
338
+ }
339
+ /** Lifts a Wang configuration using the reusable multivariate Hensel implementation. */
340
+ function liftWangConfiguration(configuration, variables, prime) {
341
+ if (variables.length < 2) {
342
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang lifting', requirement: (0, errors_1.message)('polyReqAtLeastTwoSelectedVariables') }));
343
+ }
344
+ return (0, ModularSparsePolynomialFactor_1.henselLiftMultivariateFactors)(configuration.polynomial, configuration.factors, configuration.leadingCoefficients, variables, configuration.evaluation.values, prime);
345
+ }
346
+ /** Lifts one bivariate Wang configuration modulo a prime. */
347
+ function liftWangBivariateConfiguration(configuration, variables, prime) {
348
+ if (variables.length !== 2) {
349
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Bivariate Wang lifting', requirement: (0, errors_1.message)('polyReqExactlyTwoVariables') }));
350
+ }
351
+ return liftWangConfiguration(configuration, variables, prime);
352
+ }
353
+ /**
354
+ * Factors a primitive square-free multivariate integer polynomial.
355
+ *
356
+ * A Wang configuration supplies the specialized factors and reconstructed leading
357
+ * coefficients. Modular lifts are retried with increasing primes until centered integer
358
+ * factors reconstruct the original polynomial exactly.
359
+ */
360
+ function factorSquareFreeMultivariateInteger(polynomial, variables) {
361
+ assertWangVariables(polynomial, variables);
362
+ if (polynomial.isZero()) {
363
+ throw new RangeError((0, errors_1.message)('polyCannotFactorZero', { operation: 'Wang factorization' }));
364
+ }
365
+ if (polynomial.content() !== 1n) {
366
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang factorization', requirement: (0, errors_1.message)('polyReqPrimitivePolynomial') }));
367
+ }
368
+ const leading = polynomial.leadingTerm('lex');
369
+ if (leading === null || leading.coefficient < 0n) {
370
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang factorization', requirement: (0, errors_1.message)('polyReqPositiveLexLeadingSign') }));
371
+ }
372
+ const mainVariable = variables[0];
373
+ const derivative = polynomial.derivative(mainVariable);
374
+ if (!(0, SparsePolynomialGcd_1.sparsePolynomialGcd)(polynomial, derivative, variables).isConstant()) {
375
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang factorization', requirement: (0, errors_1.message)('polyReqSquareFreeMainVariable') }));
376
+ }
377
+ const { originalDegree, leadingFactorization, } = prepareWangConfigurationSearch(polynomial, variables);
378
+ let radius = 0n;
379
+ let minimumFactorCount = null;
380
+ let configurations = [];
381
+ while (true) {
382
+ let irreducible = false;
383
+ visitEvaluationShell(variables.length - 1, radius, values => {
384
+ const candidate = testWangConfigurationWithLeadingFactorization(polynomial, variables, values, leadingFactorization, mainVariable, originalDegree);
385
+ if (candidate === null) {
386
+ return false;
387
+ }
388
+ if (candidate.factors.length === 1) {
389
+ irreducible = true;
390
+ return true;
391
+ }
392
+ if (minimumFactorCount === null ||
393
+ candidate.factors.length < minimumFactorCount) {
394
+ minimumFactorCount = candidate.factors.length;
395
+ configurations = [];
396
+ }
397
+ if (candidate.factors.length !== minimumFactorCount) {
398
+ return false;
399
+ }
400
+ let maxTailDegree = 0n;
401
+ for (const variableIndex of variables.slice(1)) {
402
+ const degree = candidate.polynomial.degree(variableIndex) ?? 0n;
403
+ if (degree > maxTailDegree) {
404
+ maxTailDegree = degree;
405
+ }
406
+ }
407
+ const coefficientBound = multivariateMignotteBound(candidate.polynomial, variables);
408
+ let primeStart = 2n * coefficientBound + 1n;
409
+ if (primeStart < INITIAL_WANG_LIFT_PRIME) {
410
+ primeStart = INITIAL_WANG_LIFT_PRIME;
411
+ }
412
+ if (primeStart <= maxTailDegree) {
413
+ primeStart = maxTailDegree + 1n;
414
+ }
415
+ configurations.push({
416
+ configuration: candidate,
417
+ prime: (0, primeFactor_1.nextPrimeBig)(primeStart),
418
+ });
419
+ return false;
420
+ });
421
+ if (irreducible) {
422
+ return [polynomial];
423
+ }
424
+ const retry = [];
425
+ for (const state of configurations) {
426
+ const lifted = liftWangConfiguration(state.configuration, variables, state.prime);
427
+ if (lifted === null) {
428
+ retry.push({
429
+ configuration: state.configuration,
430
+ prime: (0, primeFactor_1.nextPrimeBig)(state.prime + 1n),
431
+ });
432
+ continue;
433
+ }
434
+ const reconstruction = productPolynomials(lifted, polynomial.variableCount);
435
+ if (reconstruction.equals(polynomial)) {
436
+ return lifted;
437
+ }
438
+ }
439
+ configurations = retry;
440
+ radius++;
441
+ }
442
+ }
443
+ /** Factors a primitive square-free bivariate polynomial over the integers. */
444
+ function factorSquareFreeBivariateInteger(polynomial, variables) {
445
+ if (variables.length !== 2) {
446
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Bivariate Wang factorization', requirement: (0, errors_1.message)('polyReqExactlyTwoSelectedVariables') }));
447
+ }
448
+ return factorSquareFreeMultivariateInteger(polynomial, variables);
449
+ }
450
+ /**
451
+ * Completely factors a multivariate integer polynomial.
452
+ *
453
+ * Numeric content is returned separately. Main-variable content is factored in the
454
+ * remaining variables before the primitive portion enters Wang lifting.
455
+ */
456
+ function factorMultivariateInteger(polynomial, variables) {
457
+ assertWangVariables(polynomial, variables);
458
+ const squareFree = (0, SparsePolynomialFactor_1.squareFreeFactorizationMultivariate)(polynomial, variables);
459
+ if (squareFree.content === 0n || squareFree.factors.length === 0) {
460
+ return squareFree;
461
+ }
462
+ const mainVariable = variables[0];
463
+ const coefficientVariables = variables.slice(1);
464
+ const factors = [];
465
+ for (const entry of squareFree.factors) {
466
+ const variableContent = (0, SparsePolynomialFactor_1.contentInVariable)(entry.factor, mainVariable, coefficientVariables);
467
+ const primitive = entry.factor.divideExact(variableContent);
468
+ if (primitive === null) {
469
+ throw new Error((0, errors_1.message)('polyMultivariateContentDivisionFailed'));
470
+ }
471
+ if (!variableContent.isConstant()) {
472
+ const activeContentVariables = coefficientVariables.filter(variableIndex => (variableContent.degree(variableIndex) ?? 0n) > 0n);
473
+ let contentFactorization;
474
+ if (activeContentVariables.length === 1) {
475
+ contentFactorization = (0, SparsePolynomialFactor_1.factorUnivariateInteger)(variableContent, activeContentVariables[0]);
476
+ }
477
+ else if (activeContentVariables.length > 1) {
478
+ contentFactorization = factorMultivariateInteger(variableContent, activeContentVariables);
479
+ }
480
+ else {
481
+ throw new Error((0, errors_1.message)('polyMultivariateContentVariableMissing'));
482
+ }
483
+ for (const contentEntry of contentFactorization.factors) {
484
+ factors.push({
485
+ factor: contentEntry.factor,
486
+ multiplicity: entry.multiplicity * contentEntry.multiplicity,
487
+ });
488
+ }
489
+ }
490
+ if (!primitive.isConstant()) {
491
+ for (const irreducible of factorSquareFreeMultivariateInteger(primitive, variables)) {
492
+ factors.push({
493
+ factor: irreducible,
494
+ multiplicity: entry.multiplicity,
495
+ });
496
+ }
497
+ }
498
+ }
499
+ let reconstruction = SparsePolynomial_1.SparsePolynomial.constant(polynomial.variableCount, squareFree.content);
500
+ for (const entry of factors) {
501
+ reconstruction = reconstruction.multiply(entry.factor.pow(entry.multiplicity));
502
+ }
503
+ if (!reconstruction.equals(polynomial)) {
504
+ throw new Error((0, errors_1.message)('polyMultivariateReconstructionFailed'));
505
+ }
506
+ return {
507
+ content: squareFree.content,
508
+ factors,
509
+ };
510
+ }
511
+ /** Completely factors a bivariate integer polynomial. */
512
+ function factorBivariateInteger(polynomial, variables) {
513
+ if (variables.length !== 2) {
514
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Complete bivariate factorization', requirement: (0, errors_1.message)('polyReqExactlyTwoSelectedVariables') }));
515
+ }
516
+ return factorMultivariateInteger(polynomial, variables);
517
+ }
518
+ function prepareWangConfigurationSearch(polynomial, variables) {
519
+ assertWangVariables(polynomial, variables);
520
+ if (polynomial.content() !== 1n) {
521
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqPrimitivePolynomial') }));
522
+ }
523
+ const leadingTerm = polynomial.leadingTerm('lex');
524
+ if (leadingTerm === null || leadingTerm.coefficient < 0n) {
525
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang leading-coefficient reconstruction', requirement: (0, errors_1.message)('polyReqPositiveLexLeadingSign') }));
526
+ }
527
+ const mainVariable = variables[0];
528
+ const originalDegree = polynomial.degree(mainVariable);
529
+ if (originalDegree === null || originalDegree === 0n) {
530
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang configuration search', requirement: (0, errors_1.message)('polyReqPositiveDegreeMainVariable') }));
531
+ }
532
+ const leadingFactorization = factorWangLeadingCoefficient(polynomial, variables);
533
+ if (leadingFactorization === null) {
534
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang configuration search', requirement: (0, errors_1.message)('polyReqPositiveDegreeMainVariable') }));
535
+ }
536
+ return {
537
+ mainVariable,
538
+ originalDegree,
539
+ leadingFactorization,
540
+ };
541
+ }
542
+ /**
543
+ * Finds the nearest Wang configuration whose leading coefficients can be reconstructed
544
+ * from the specialized factorization.
545
+ */
546
+ function findWangConfiguration(polynomial, variables) {
547
+ const { mainVariable, originalDegree, leadingFactorization, } = prepareWangConfigurationSearch(polynomial, variables);
548
+ let radius = 0n;
549
+ while (true) {
550
+ let found = null;
551
+ visitEvaluationShell(variables.length - 1, radius, values => {
552
+ const candidate = testWangConfigurationWithLeadingFactorization(polynomial, variables, values, leadingFactorization, mainVariable, originalDegree);
553
+ if (candidate === null) {
554
+ return false;
555
+ }
556
+ found = candidate;
557
+ return true;
558
+ });
559
+ if (found !== null) {
560
+ return found;
561
+ }
562
+ radius++;
563
+ }
564
+ }
565
+ /** Finds the nearest bivariate Wang configuration. */
566
+ function findWangBivariateConfiguration(polynomial, variables) {
567
+ if (variables.length !== 2) {
568
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Bivariate Wang configuration search', requirement: (0, errors_1.message)('polyReqExactlyTwoSelectedVariables') }));
569
+ }
570
+ return findWangConfiguration(polynomial, variables);
571
+ }
572
+ /**
573
+ * Finds the nearest usable Wang/EEZ evaluation point in deterministic integer shells.
574
+ *
575
+ * The origin is tested first, followed by the boundary of [-1,1]^n, [-2,2]^n, and so
576
+ * on. Search continues until a specialization preserves leading degree and is square-free.
577
+ */
578
+ function findWangEvaluationPoint(polynomial, variables) {
579
+ assertWangVariables(polynomial, variables);
580
+ if (polynomial.isZero()) {
581
+ throw new RangeError((0, errors_1.message)('polyWangCannotSpecializeZero'));
582
+ }
583
+ const mainVariable = variables[0];
584
+ const originalDegree = polynomial.degree(mainVariable);
585
+ if (originalDegree === null || originalDegree === 0n) {
586
+ throw new RangeError((0, errors_1.message)('polyRequires', { operation: 'Wang evaluation search', requirement: (0, errors_1.message)('polyReqPositiveDegreeMainVariable') }));
587
+ }
588
+ let radius = 0n;
589
+ while (true) {
590
+ let found = null;
591
+ visitEvaluationShell(variables.length - 1, radius, values => {
592
+ const candidate = testWangSpecializationPrepared(polynomial, variables, values, mainVariable, originalDegree);
593
+ if (candidate === null) {
594
+ return false;
595
+ }
596
+ found = factorWangSpecialization(candidate, mainVariable);
597
+ return true;
598
+ });
599
+ if (found !== null) {
600
+ return found;
601
+ }
602
+ radius++;
603
+ }
604
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @module modularGcd
3
+ *
4
+ * Greatest common divisors for sparse polynomials over a modular field.
5
+ *
6
+ * External references consulted for finite-field Euclidean GCD and recursive
7
+ * evaluation/interpolation:
8
+ * - SymPy finite-field polynomial GCD:
9
+ * https://github.com/sympy/sympy/blob/120ee85f346f6292b763cc195afda4f907260d4a/sympy/polys/galoistools.py
10
+ * - SymPy sparse univariate modular GCD bridge:
11
+ * https://github.com/sympy/sympy/blob/120ee85f346f6292b763cc195afda4f907260d4a/sympy/polys/zippel.py
12
+ */
13
+ import { ModularSparsePolynomial } from './ModularSparsePolynomial';
14
+ /**
15
+ * Computes the monic GCD of two univariate polynomials over the same modular field.
16
+ *
17
+ * The polynomial ring may retain additional variable coordinates, but neither input
18
+ * may depend on variables other than variableIndex.
19
+ */
20
+ export declare function modularGcdUnivariate(left: ModularSparsePolynomial, right: ModularSparsePolynomial, variableIndex: number): ModularSparsePolynomial;
21
+ /**
22
+ * Computes a multivariate GCD over a prime field using recursive
23
+ * evaluation and interpolation.
24
+ *
25
+ * variables must follow polynomial-ring order and contain every active variable
26
+ * in both inputs exactly once. Dormant ring coordinates may be omitted.
27
+ */
28
+ export declare function modularGcdFiniteField(left: ModularSparsePolynomial, right: ModularSparsePolynomial, variables: readonly number[]): ModularSparsePolynomial | null;
29
+ /**
30
+ * Computes a bivariate GCD over a prime field by evaluation and interpolation.
31
+ */
32
+ export declare function modularGcdBivariate(left: ModularSparsePolynomial, right: ModularSparsePolynomial, mainVariable: number, interpolationVariable: number): ModularSparsePolynomial | null;
33
+ /**
34
+ * Computes a trivariate GCD over a prime field by recursively specializing the
35
+ * last selected variable and reconstructing from bivariate GCD images.
36
+ *
37
+ * The selected variables must follow their polynomial-ring order. Other ring
38
+ * coordinates may remain dormant.
39
+ */
40
+ export declare function modularGcdTrivariate(left: ModularSparsePolynomial, right: ModularSparsePolynomial, mainVariable: number, secondaryVariable: number, interpolationVariable: number): ModularSparsePolynomial | null;