nerdamer 1.1.13 → 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/LICENSE.md +184 -0
  2. package/README.md +293 -312
  3. package/dist/bundle.js +2 -0
  4. package/dist/bundle.js.LICENSE.txt +7 -0
  5. package/dist/parser.js +2 -0
  6. package/dist/parser.js.LICENSE.txt +7 -0
  7. package/docs-data/parser-functions.json +1960 -0
  8. package/index.d.ts +10 -426
  9. package/output/algebra/adapters.d.ts +33 -0
  10. package/output/algebra/adapters.js +109 -0
  11. package/output/algebra/algorithms/arith.d.ts +84 -0
  12. package/output/algebra/algorithms/arith.js +323 -0
  13. package/output/algebra/algorithms/factor.d.ts +3 -0
  14. package/output/algebra/algorithms/factor.js +5 -0
  15. package/output/algebra/algorithms/factorMultivariate.d.ts +23 -0
  16. package/output/algebra/algorithms/factorMultivariate.js +2393 -0
  17. package/output/algebra/algorithms/factorUnivariate.d.ts +72 -0
  18. package/output/algebra/algorithms/factorUnivariate.js +1072 -0
  19. package/output/algebra/algorithms/gcd.d.ts +22 -0
  20. package/output/algebra/algorithms/gcd.js +690 -0
  21. package/output/algebra/algorithms/groebnerBase.d.ts +157 -0
  22. package/output/algebra/algorithms/groebnerBase.js +1166 -0
  23. package/output/algebra/algorithms/multiPoly/MultiPoly.d.ts +137 -0
  24. package/output/algebra/algorithms/multiPoly/MultiPoly.js +346 -0
  25. package/output/algebra/algorithms/poly.d.ts +228 -0
  26. package/output/algebra/algorithms/poly.js +1299 -0
  27. package/output/algebra/algorithms/rational.d.ts +17 -0
  28. package/output/algebra/algorithms/rational.js +115 -0
  29. package/output/algebra/factor/factor.d.ts +62 -0
  30. package/output/algebra/factor/factor.js +158 -0
  31. package/output/algebra/gcd/gcd.d.ts +29 -0
  32. package/output/algebra/gcd/gcd.js +141 -0
  33. package/output/algebra/groebner.d.ts +21 -0
  34. package/output/algebra/groebner.js +42 -0
  35. package/output/algebra/partfrac.d.ts +19 -0
  36. package/output/algebra/partfrac.js +398 -0
  37. package/output/algebra/polynomialize.d.ts +20 -0
  38. package/output/algebra/polynomialize.js +24 -0
  39. package/output/algebra/simplify/complexsimp.d.ts +7 -0
  40. package/output/algebra/simplify/complexsimp.js +24 -0
  41. package/output/algebra/simplify/factorCommon.d.ts +13 -0
  42. package/output/algebra/simplify/factorCommon.js +136 -0
  43. package/output/algebra/simplify/funcsimp.d.ts +26 -0
  44. package/output/algebra/simplify/funcsimp.js +633 -0
  45. package/output/algebra/simplify/invtrigrewrite.d.ts +10 -0
  46. package/output/algebra/simplify/invtrigrewrite.js +96 -0
  47. package/output/algebra/simplify/ratsimp.d.ts +21 -0
  48. package/output/algebra/simplify/ratsimp.js +140 -0
  49. package/output/algebra/simplify/simplify.d.ts +25 -0
  50. package/output/algebra/simplify/simplify.js +228 -0
  51. package/output/algebra/simplify/trigreduce.d.ts +38 -0
  52. package/output/algebra/simplify/trigreduce.js +424 -0
  53. package/output/algebra/simplify/trigrewrite.d.ts +17 -0
  54. package/output/algebra/simplify/trigrewrite.js +156 -0
  55. package/output/algebra/simplify/trigsimp.d.ts +11 -0
  56. package/output/algebra/simplify/trigsimp.js +369 -0
  57. package/output/algebra/simplify/utils.d.ts +32 -0
  58. package/output/algebra/simplify/utils.js +56 -0
  59. package/output/algebra/utils.d.ts +32 -0
  60. package/output/algebra/utils.js +48 -0
  61. package/output/api/advanced.d.ts +7 -0
  62. package/output/api/advanced.js +18 -0
  63. package/output/api/algebra.d.ts +17 -0
  64. package/output/api/algebra.js +32 -0
  65. package/output/api/assumptions.d.ts +4 -0
  66. package/output/api/assumptions.js +11 -0
  67. package/output/api/calculus.d.ts +9 -0
  68. package/output/api/calculus.js +21 -0
  69. package/output/api/core.d.ts +17 -0
  70. package/output/api/core.js +41 -0
  71. package/output/api/debug.d.ts +16 -0
  72. package/output/api/debug.js +23 -0
  73. package/output/api/parser.d.ts +85 -0
  74. package/output/api/parser.js +16 -0
  75. package/output/api/solve.d.ts +10 -0
  76. package/output/api/solve.js +16 -0
  77. package/output/api/structures.d.ts +10 -0
  78. package/output/api/structures.js +22 -0
  79. package/output/calculus/derivative/diff.d.ts +30 -0
  80. package/output/calculus/derivative/diff.js +238 -0
  81. package/output/calculus/fresnel.d.ts +16 -0
  82. package/output/calculus/fresnel.js +39 -0
  83. package/output/calculus/integrate/byParts.d.ts +18 -0
  84. package/output/calculus/integrate/byParts.js +339 -0
  85. package/output/calculus/integrate/bySubstitution.d.ts +135 -0
  86. package/output/calculus/integrate/bySubstitution.js +411 -0
  87. package/output/calculus/integrate/integrate.d.ts +38 -0
  88. package/output/calculus/integrate/integrate.js +652 -0
  89. package/output/calculus/integrate/integrationTable.d.ts +2 -0
  90. package/output/calculus/integrate/integrationTable.js +914 -0
  91. package/output/calculus/integrate/utils.d.ts +28 -0
  92. package/output/calculus/integrate/utils.js +96 -0
  93. package/output/calculus/laplace/ilaplace.d.ts +31 -0
  94. package/output/calculus/laplace/ilaplace.js +192 -0
  95. package/output/calculus/laplace/ilaplaceTable.d.ts +2 -0
  96. package/output/calculus/laplace/ilaplaceTable.js +200 -0
  97. package/output/calculus/laplace/laplace.d.ts +22 -0
  98. package/output/calculus/laplace/laplace.js +109 -0
  99. package/output/calculus/laplace/laplaceTable.d.ts +2 -0
  100. package/output/calculus/laplace/laplaceTable.js +187 -0
  101. package/output/calculus/limit/limit.d.ts +35 -0
  102. package/output/calculus/limit/limit.js +1183 -0
  103. package/output/calculus/limit/limitsTable.d.ts +2 -0
  104. package/output/calculus/limit/limitsTable.js +7 -0
  105. package/output/core/Settings.d.ts +32 -0
  106. package/output/core/Settings.js +68 -0
  107. package/output/core/adapters.d.ts +18 -0
  108. package/output/core/adapters.js +40 -0
  109. package/output/core/classes/assumption/Assumption.d.ts +218 -0
  110. package/output/core/classes/assumption/Assumption.js +605 -0
  111. package/output/core/classes/assumption/assertiveFunctions.d.ts +6 -0
  112. package/output/core/classes/assumption/assertiveFunctions.js +64 -0
  113. package/output/core/classes/assumption/assume.d.ts +90 -0
  114. package/output/core/classes/assumption/assume.js +145 -0
  115. package/output/core/classes/collection/Collection.d.ts +107 -0
  116. package/output/core/classes/collection/Collection.js +231 -0
  117. package/output/core/classes/complex/Complex.d.ts +99 -0
  118. package/output/core/classes/complex/Complex.js +135 -0
  119. package/output/core/classes/decimalSet/DecimalSet.d.ts +226 -0
  120. package/output/core/classes/decimalSet/DecimalSet.js +453 -0
  121. package/output/core/classes/dictionary/Dictionary.d.ts +102 -0
  122. package/output/core/classes/dictionary/Dictionary.js +213 -0
  123. package/output/core/classes/equation/Equation.d.ts +256 -0
  124. package/output/core/classes/equation/Equation.js +350 -0
  125. package/output/core/classes/expression/CoeffObject.d.ts +100 -0
  126. package/output/core/classes/expression/CoeffObject.js +198 -0
  127. package/output/core/classes/expression/Expression.d.ts +1674 -0
  128. package/output/core/classes/expression/Expression.js +2332 -0
  129. package/output/core/classes/expression/analysis.d.ts +25 -0
  130. package/output/core/classes/expression/analysis.js +218 -0
  131. package/output/core/classes/expression/collect.d.ts +9 -0
  132. package/output/core/classes/expression/collect.js +49 -0
  133. package/output/core/classes/expression/format.d.ts +45 -0
  134. package/output/core/classes/expression/format.js +217 -0
  135. package/output/core/classes/expression/products.d.ts +23 -0
  136. package/output/core/classes/expression/products.js +115 -0
  137. package/output/core/classes/expression/shortcuts.d.ts +35 -0
  138. package/output/core/classes/expression/shortcuts.js +129 -0
  139. package/output/core/classes/expression/traversal.d.ts +31 -0
  140. package/output/core/classes/expression/traversal.js +216 -0
  141. package/output/core/classes/expression/trig.d.ts +25 -0
  142. package/output/core/classes/expression/trig.js +40 -0
  143. package/output/core/classes/expression/utils.d.ts +52 -0
  144. package/output/core/classes/expression/utils.js +189 -0
  145. package/output/core/classes/lookupTable/LookupTable.d.ts +12 -0
  146. package/output/core/classes/lookupTable/LookupTable.js +55 -0
  147. package/output/core/classes/matrix/Matrix.d.ts +227 -0
  148. package/output/core/classes/matrix/Matrix.js +889 -0
  149. package/output/core/classes/matrix/Sylvester.d.ts +11 -0
  150. package/output/core/classes/matrix/Sylvester.js +54 -0
  151. package/output/core/classes/matrix/functions.d.ts +26 -0
  152. package/output/core/classes/matrix/functions.js +52 -0
  153. package/output/core/classes/matrix/utils.d.ts +9 -0
  154. package/output/core/classes/matrix/utils.js +22 -0
  155. package/output/core/classes/parser/Parser.d.ts +480 -0
  156. package/output/core/classes/parser/Parser.js +1812 -0
  157. package/output/core/classes/parser/Token.d.ts +58 -0
  158. package/output/core/classes/parser/Token.js +137 -0
  159. package/output/core/classes/parser/constants.d.ts +160 -0
  160. package/output/core/classes/parser/constants.js +227 -0
  161. package/output/core/classes/parser/helpers.d.ts +21 -0
  162. package/output/core/classes/parser/helpers.js +42 -0
  163. package/output/core/classes/parser/operations/add.d.ts +15 -0
  164. package/output/core/classes/parser/operations/add.js +238 -0
  165. package/output/core/classes/parser/operations/comma.d.ts +7 -0
  166. package/output/core/classes/parser/operations/comma.js +11 -0
  167. package/output/core/classes/parser/operations/compare.d.ts +21 -0
  168. package/output/core/classes/parser/operations/compare.js +461 -0
  169. package/output/core/classes/parser/operations/divide.d.ts +2 -0
  170. package/output/core/classes/parser/operations/divide.js +72 -0
  171. package/output/core/classes/parser/operations/functions.d.ts +46 -0
  172. package/output/core/classes/parser/operations/functions.js +430 -0
  173. package/output/core/classes/parser/operations/multiply.d.ts +11 -0
  174. package/output/core/classes/parser/operations/multiply.js +321 -0
  175. package/output/core/classes/parser/operations/power.d.ts +48 -0
  176. package/output/core/classes/parser/operations/power.js +673 -0
  177. package/output/core/classes/parser/operations/subtract.d.ts +3 -0
  178. package/output/core/classes/parser/operations/subtract.js +35 -0
  179. package/output/core/classes/parser/preprocess.d.ts +14 -0
  180. package/output/core/classes/parser/preprocess.js +259 -0
  181. package/output/core/classes/parser/scripting/controlFlow.d.ts +121 -0
  182. package/output/core/classes/parser/scripting/controlFlow.js +355 -0
  183. package/output/core/classes/parser/scripting/evaluate.d.ts +10 -0
  184. package/output/core/classes/parser/scripting/evaluate.js +112 -0
  185. package/output/core/classes/parser/scripting/functions.d.ts +14 -0
  186. package/output/core/classes/parser/scripting/functions.js +59 -0
  187. package/output/core/classes/parser/scripting/scope.d.ts +35 -0
  188. package/output/core/classes/parser/scripting/scope.js +155 -0
  189. package/output/core/classes/parser/types.d.ts +125 -0
  190. package/output/core/classes/parser/types.js +2 -0
  191. package/output/core/classes/parser/wrappers/IndexedReference.d.ts +31 -0
  192. package/output/core/classes/parser/wrappers/IndexedReference.js +68 -0
  193. package/output/core/classes/parser/wrappers/KeyValuePair.d.ts +24 -0
  194. package/output/core/classes/parser/wrappers/KeyValuePair.js +51 -0
  195. package/output/core/classes/polynomial/Polynomial.d.ts +500 -0
  196. package/output/core/classes/polynomial/Polynomial.js +1149 -0
  197. package/output/core/classes/polynomial/Term.d.ts +222 -0
  198. package/output/core/classes/polynomial/Term.js +430 -0
  199. package/output/core/classes/polynomial/functions.d.ts +69 -0
  200. package/output/core/classes/polynomial/functions.js +126 -0
  201. package/output/core/classes/polynomial/utils.d.ts +62 -0
  202. package/output/core/classes/polynomial/utils.js +206 -0
  203. package/output/core/classes/rational/Rational.d.ts +504 -0
  204. package/output/core/classes/rational/Rational.js +779 -0
  205. package/output/core/classes/seq/SEQ.d.ts +13 -0
  206. package/output/core/classes/seq/SEQ.js +137 -0
  207. package/output/core/classes/valuesSet/ValuesSet.d.ts +179 -0
  208. package/output/core/classes/valuesSet/ValuesSet.js +381 -0
  209. package/output/core/classes/vector/Vector.d.ts +222 -0
  210. package/output/core/classes/vector/Vector.js +497 -0
  211. package/output/core/classes/vector/functions.d.ts +28 -0
  212. package/output/core/classes/vector/functions.js +47 -0
  213. package/output/core/common/classes/MathematicalAggregate.d.ts +53 -0
  214. package/output/core/common/classes/MathematicalAggregate.js +140 -0
  215. package/output/core/common/classes/Scope.d.ts +62 -0
  216. package/output/core/common/classes/Scope.js +122 -0
  217. package/output/core/common/classes/StructuredEntity.d.ts +55 -0
  218. package/output/core/common/classes/StructuredEntity.js +151 -0
  219. package/output/core/common/common.d.ts +63 -0
  220. package/output/core/common/common.js +279 -0
  221. package/output/core/common/functions/functions.d.ts +14 -0
  222. package/output/core/common/functions/functions.js +33 -0
  223. package/output/core/common/functions/structuredEntityUtils.d.ts +27 -0
  224. package/output/core/common/functions/structuredEntityUtils.js +40 -0
  225. package/output/core/converters/BaseConverter.d.ts +97 -0
  226. package/output/core/converters/BaseConverter.js +405 -0
  227. package/output/core/converters/Converter.d.ts +111 -0
  228. package/output/core/converters/Converter.js +802 -0
  229. package/output/core/converters/Pattern.d.ts +71 -0
  230. package/output/core/converters/Pattern.js +302 -0
  231. package/output/core/dispatch.d.ts +34 -0
  232. package/output/core/dispatch.js +304 -0
  233. package/output/core/errors.d.ts +531 -0
  234. package/output/core/errors.js +621 -0
  235. package/output/core/functions/bigint/bigint.d.ts +121 -0
  236. package/output/core/functions/bigint/bigint.js +392 -0
  237. package/output/core/functions/bigint/primeFactor.d.ts +49 -0
  238. package/output/core/functions/bigint/primeFactor.js +267 -0
  239. package/output/core/functions/bigint/primes.d.ts +1 -0
  240. package/output/core/functions/bigint/primes.js +11 -0
  241. package/output/core/functions/build/definitions.d.ts +12 -0
  242. package/output/core/functions/build/definitions.js +133 -0
  243. package/output/core/functions/build/index.d.ts +32 -0
  244. package/output/core/functions/build/index.js +136 -0
  245. package/output/core/functions/complex.d.ts +90 -0
  246. package/output/core/functions/complex.js +482 -0
  247. package/output/core/functions/decimal.d.ts +24 -0
  248. package/output/core/functions/decimal.js +664 -0
  249. package/output/core/functions/expand/expand.d.ts +42 -0
  250. package/output/core/functions/expand/expand.js +376 -0
  251. package/output/core/functions/fresnelNumeric.d.ts +12 -0
  252. package/output/core/functions/fresnelNumeric.js +123 -0
  253. package/output/core/functions/numeric.d.ts +140 -0
  254. package/output/core/functions/numeric.js +790 -0
  255. package/output/core/functions/rationalNormalization.d.ts +11 -0
  256. package/output/core/functions/rationalNormalization.js +117 -0
  257. package/output/core/functions/setFunction.d.ts +19 -0
  258. package/output/core/functions/setFunction.js +75 -0
  259. package/output/core/functions/string.d.ts +26 -0
  260. package/output/core/functions/string.js +101 -0
  261. package/output/core/functions/subst.d.ts +90 -0
  262. package/output/core/functions/subst.js +498 -0
  263. package/output/core/functions/utils.d.ts +24 -0
  264. package/output/core/functions/utils.js +51 -0
  265. package/output/core/types.d.ts +48 -0
  266. package/output/core/types.js +2 -0
  267. package/output/index.d.ts +339 -0
  268. package/output/index.js +715 -0
  269. package/output/math/defint/defintDecimal.d.ts +37 -0
  270. package/output/math/defint/defintDecimal.js +320 -0
  271. package/output/math/defint/defintNative.d.ts +57 -0
  272. package/output/math/defint/defintNative.js +292 -0
  273. package/output/math/geometry.d.ts +8 -0
  274. package/output/math/geometry.js +32 -0
  275. package/output/math/math.d.ts +655 -0
  276. package/output/math/math.js +1811 -0
  277. package/output/math/trig.d.ts +518 -0
  278. package/output/math/trig.js +1444 -0
  279. package/output/math/trunc.d.ts +19 -0
  280. package/output/math/trunc.js +36 -0
  281. package/output/math/utils.d.ts +60 -0
  282. package/output/math/utils.js +180 -0
  283. package/output/solve/classes/DecimalMatrix.d.ts +17 -0
  284. package/output/solve/classes/DecimalMatrix.js +86 -0
  285. package/output/solve/classes/FunctionSolver.d.ts +135 -0
  286. package/output/solve/classes/FunctionSolver.js +433 -0
  287. package/output/solve/classes/MultivariateSolver.d.ts +84 -0
  288. package/output/solve/classes/MultivariateSolver.js +240 -0
  289. package/output/solve/classes/PolynomialSolver.d.ts +85 -0
  290. package/output/solve/classes/PolynomialSolver.js +292 -0
  291. package/output/solve/classes/SolutionSet.d.ts +153 -0
  292. package/output/solve/classes/SolutionSet.js +357 -0
  293. package/output/solve/classes/Solver.d.ts +17 -0
  294. package/output/solve/classes/Solver.js +132 -0
  295. package/output/solve/classes/SymbolicSolver.d.ts +74 -0
  296. package/output/solve/classes/SymbolicSolver.js +601 -0
  297. package/output/solve/linsolve.d.ts +51 -0
  298. package/output/solve/linsolve.js +225 -0
  299. package/output/solve/solve.d.ts +34 -0
  300. package/output/solve/solve.js +260 -0
  301. package/output/solve/solveSystem.d.ts +31 -0
  302. package/output/solve/solveSystem.js +290 -0
  303. package/output/solve/utils.d.ts +9 -0
  304. package/output/solve/utils.js +62 -0
  305. package/output/utils/array.d.ts +42 -0
  306. package/output/utils/array.js +98 -0
  307. package/output/utils/debug.d.ts +131 -0
  308. package/output/utils/debug.js +295 -0
  309. package/output/utils/decimal.d.ts +3 -0
  310. package/output/utils/decimal.js +16 -0
  311. package/output/utils/numeric.d.ts +14 -0
  312. package/output/utils/numeric.js +51 -0
  313. package/output/utils/object.d.ts +26 -0
  314. package/output/utils/object.js +56 -0
  315. package/package.json +213 -57
  316. package/.travis.yml +0 -3
  317. package/Algebra.js +0 -4568
  318. package/BREAKING_CHANGES.md +0 -5
  319. package/CODE_OF_CONDUCT.md +0 -46
  320. package/CONTRIBUTING.md +0 -14
  321. package/Calculus.js +0 -2675
  322. package/Extra.js +0 -622
  323. package/Solve.js +0 -1783
  324. package/all.js +0 -16
  325. package/all.min.js +0 -1
  326. package/gulpfile.js +0 -16
  327. package/index.html +0 -158
  328. package/license.txt +0 -19
  329. package/nerdamer.core.js +0 -12510
  330. package/spec/LaTeX.spec.js +0 -302
  331. package/spec/TeXConvert.spec.js +0 -8
  332. package/spec/algebra.spec.js +0 -287
  333. package/spec/basic_parser.spec.js +0 -134
  334. package/spec/build.spec.js +0 -131
  335. package/spec/calculus.spec.js +0 -183
  336. package/spec/core.spec.js +0 -2970
  337. package/spec/extra.spec.js +0 -54
  338. package/spec/solve.spec.js +0 -126
  339. package/spec/support/jasmine.json +0 -11
  340. package/spec/support/utils.js +0 -42
  341. package/spec/text.spec.js +0 -132
@@ -0,0 +1,914 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tableOfIntegrals = void 0;
4
+ const Expression_1 = require("../../core/classes/expression/Expression");
5
+ const shortcuts_1 = require("../../core/classes/expression/shortcuts");
6
+ const LookupTable_1 = require("../../core/classes/lookupTable/LookupTable");
7
+ const math_1 = require("../../math/math");
8
+ const integrate_1 = require("./integrate");
9
+ const trigTable = {
10
+ // cos(x)
11
+ 'a1*cos(a2*x1^n1)^n2': (p, depth) => {
12
+ if (p.get('n1').isOne()) {
13
+ const n2 = p.get('n2');
14
+ if (n2.isOne()) {
15
+ return p.fromPattern('(a1*sin(a2*x1))/a2');
16
+ }
17
+ else if (n2.isEven()) {
18
+ // Rewrite using double angle identity and expand
19
+ const f = p.fromPattern('a1*((1+cos(2*a2*x1^n1))/2)^(n2/2)').expand();
20
+ // Ship it
21
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
22
+ }
23
+ else {
24
+ //Rewrite using double angle but break off one cos
25
+ const f = p
26
+ .fromPattern('a1*cos(a2*x1^n1)*((1+cos(2*a2*x1^n1))/2)^((n2-1)/2)')
27
+ .expand();
28
+ // Ship
29
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
30
+ }
31
+ }
32
+ },
33
+ // sin(x)
34
+ 'a1*sin(a2*x1^n1)^n2': (p, depth) => {
35
+ if (p.get('n1').isOne()) {
36
+ const n2 = p.get('n2');
37
+ if (n2.isOne()) {
38
+ return p.fromPattern('-((a1*cos(a2*x1))/a2)');
39
+ }
40
+ else if (n2.isEven()) {
41
+ // Rewrite using double angle identity and expand
42
+ const f = p.fromPattern('a1*((1-cos(2*a2*x1^n1))/2)^(n2/2)').expand();
43
+ // Ship it
44
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
45
+ }
46
+ else {
47
+ //Rewrite using double angle but break off one cos
48
+ const f = p
49
+ .fromPattern('a1*sin(a2*x1^n1)*((1-cos(2*a2*x1^n1))/2)^((n2-1)/2)')
50
+ .expand();
51
+ // Ship
52
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
53
+ }
54
+ }
55
+ },
56
+ // tan(x)
57
+ 'a1*tan(a2*x1^n1)^n2': (p, depth) => {
58
+ if (p.get('n1').isOne()) {
59
+ const n2 = p.get('n2');
60
+ if (n2.isOne()) {
61
+ return p.fromPattern('(a1*log(sec(a2*x1)))/a2');
62
+ }
63
+ else if (n2.isEven()) {
64
+ // tan^n = tan^(n-2)*(sec^2-1)
65
+ const f = p.fromPattern('a1*tan(a2*x1)^(n2-2)*(sec(a2*x1)^2-1)').expand();
66
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
67
+ }
68
+ else {
69
+ // ∫tan^n = tan^(n-1)/(a2*(n-1)) - ∫tan^(n-2)
70
+ const head = p.fromPattern('(a1*tan(a2*x1)^(n2-1))/(a2*(n2-1))');
71
+ const tail = (0, integrate_1.integrate)(p.fromPattern('-a1*tan(a2*x1)^(n2-2)'), p.get('x1'), depth);
72
+ return head.plus(tail);
73
+ }
74
+ }
75
+ },
76
+ // sec(x)
77
+ 'a1*sec(a2*x1^n1)^n2': (p, depth) => {
78
+ if (p.get('n1').isOne()) {
79
+ const n2 = p.get('n2');
80
+ if (n2.isOne()) {
81
+ return p.fromPattern('(a1*log(tan(a2*x1)+sec(a2*x1)))/a2');
82
+ }
83
+ // ∫sec^n = sec^(n-2)tan/(a2*(n-1)) + ((n-2)/(n-1))∫sec^(n-2)
84
+ const head = p.fromPattern('(a1*sec(a2*x1)^(n2-2)*tan(a2*x1))/(a2*(n2-1))');
85
+ const tail = (0, integrate_1.integrate)(p.fromPattern('a1*((n2-2)/(n2-1))*sec(a2*x1)^(n2-2)'), p.get('x1'), depth);
86
+ return head.plus(tail);
87
+ }
88
+ },
89
+ // csc(x)
90
+ 'a1*csc(a2*x1^n1)^n2': (p, depth) => {
91
+ if (p.get('n1').isOne()) {
92
+ const n2 = p.get('n2');
93
+ if (n2.isOne()) {
94
+ return p.fromPattern('-(a1*log(csc(a2*x1)+cot(a2*x1)))/a2');
95
+ }
96
+ // ∫csc^n = -csc^(n-2)cot/(a2*(n-1)) - ((n-2)/(n-1))∫csc^(n-2)
97
+ const head = p.fromPattern('-(a1*csc(a2*x1)^(n2-2)*cot(a2*x1))/(a2*(n2-1))');
98
+ const tail = (0, integrate_1.integrate)(p.fromPattern('-a1*((n2-2)/(n2-1))*csc(a2*x1)^(n2-2)'), p.get('x1'), depth);
99
+ return head.plus(tail);
100
+ }
101
+ },
102
+ // cot(x)
103
+ 'a1*cot(a2*x1^n1)^n2': (p, depth) => {
104
+ if (p.get('n1').isOne()) {
105
+ const n2 = p.get('n2');
106
+ if (n2.isOne()) {
107
+ return p.fromPattern('(a1*log(sin(a2*x1)))/a2');
108
+ }
109
+ else if (n2.isEven()) {
110
+ // cot^n = cot^(n-2)*(csc^2-1)
111
+ const f = p.fromPattern('a1*cot(a2*x1)^(n2-2)*(csc(a2*x1)^2-1)').expand();
112
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
113
+ }
114
+ else {
115
+ // ∫cot^n = -cot^(n-1)/(a2*(n-1)) - ∫cot^(n-2)
116
+ const head = p.fromPattern('-(a1*cot(a2*x1)^(n2-1))/(a2*(n2-1))');
117
+ const tail = (0, integrate_1.integrate)(p.fromPattern('-a1*cot(a2*x1)^(n2-2)'), p.get('x1'), depth);
118
+ return head.plus(tail);
119
+ }
120
+ }
121
+ },
122
+ // cos(a*x)*cos(b*x)
123
+ 'a1*cos(a2*x1^n1)^n2*cos(a3*x1^n3)^n4': (p, depth) => {
124
+ if (p.get('n1').isOne() && p.get('n3').isOne()) {
125
+ const n2 = p.get('n2');
126
+ const n4 = p.get('n4');
127
+ if (!n2.isOne()) {
128
+ let f;
129
+ if (n2.isEven()) {
130
+ f = p.fromPattern('a1*((1+cos(2*a2*x1))/2)^(n2/2)*cos(a3*x1)^n4').expand();
131
+ }
132
+ else {
133
+ f = p
134
+ .fromPattern('a1*cos(a2*x1)*((1+cos(2*a2*x1))/2)^((n2-1)/2)*cos(a3*x1)^n4')
135
+ .expand();
136
+ }
137
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
138
+ }
139
+ if (!n4.isOne()) {
140
+ let f;
141
+ if (n4.isEven()) {
142
+ f = p.fromPattern('a1*cos(a2*x1)^n2*((1+cos(2*a3*x1))/2)^(n4/2)').expand();
143
+ }
144
+ else {
145
+ f = p
146
+ .fromPattern('a1*cos(a2*x1)^n2*cos(a3*x1)*((1+cos(2*a3*x1))/2)^((n4-1)/2)')
147
+ .expand();
148
+ }
149
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
150
+ }
151
+ if (p.get('a2').eq(p.get('a3'))) {
152
+ return p.fromPattern('(a1*x1)/2+(a1*sin(2*a2*x1))/(4*a2)');
153
+ }
154
+ return p.fromPattern('a1*(sin((a2+a3)*x1)/(2*(a2+a3))+sin((a2-a3)*x1)/(2*(a2-a3)))');
155
+ }
156
+ },
157
+ // sin(a*x)*sin(b*x), with powers allowed
158
+ 'a1*sin(a2*x1^n1)^n2*sin(a3*x1^n3)^n4': (p, depth) => {
159
+ if (p.get('n1').isOne() && p.get('n3').isOne()) {
160
+ const n2 = p.get('n2');
161
+ const n4 = p.get('n4');
162
+ // Reduce left power first
163
+ if (!n2.isOne()) {
164
+ let f;
165
+ if (n2.isEven()) {
166
+ f = p.fromPattern('a1*((1-cos(2*a2*x1))/2)^(n2/2)*sin(a3*x1)^n4').expand();
167
+ }
168
+ else {
169
+ f = p
170
+ .fromPattern('a1*sin(a2*x1)*((1-cos(2*a2*x1))/2)^((n2-1)/2)*sin(a3*x1)^n4')
171
+ .expand();
172
+ }
173
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
174
+ }
175
+ // Reduce right power
176
+ if (!n4.isOne()) {
177
+ let f;
178
+ if (n4.isEven()) {
179
+ f = p.fromPattern('a1*sin(a2*x1)^n2*((1-cos(2*a3*x1))/2)^(n4/2)').expand();
180
+ }
181
+ else {
182
+ f = p
183
+ .fromPattern('a1*sin(a2*x1)^n2*sin(a3*x1)*((1-cos(2*a3*x1))/2)^((n4-1)/2)')
184
+ .expand();
185
+ }
186
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
187
+ }
188
+ // Same frequency: sin(a*x)*sin(a*x) = sin(a*x)^2
189
+ if (p.get('a2').eq(p.get('a3'))) {
190
+ return p.fromPattern('(a1*x1)/2-(a1*sin(2*a2*x1))/(4*a2)');
191
+ }
192
+ // Base product-to-sum case
193
+ return p.fromPattern('a1*(sin((a2-a3)*x1)/(2*(a2-a3))-sin((a2+a3)*x1)/(2*(a2+a3)))');
194
+ }
195
+ },
196
+ // sin(x)*cos(x)
197
+ 'a1*cos(a2*x1^n1)^n2*sin(a3*x1^n3)^n4': (p, depth) => {
198
+ if (p.get('n1').isOne() && p.get('n3').isOne()) {
199
+ const n2 = p.get('n2');
200
+ const n4 = p.get('n4');
201
+ // Reduce left power first
202
+ if (!n2.isOne()) {
203
+ let f;
204
+ if (n2.isEven()) {
205
+ f = p.fromPattern('a1*((1+cos(2*a2*x1))/2)^(n2/2)*sin(a3*x1)^n4').expand();
206
+ }
207
+ else {
208
+ f = p
209
+ .fromPattern('a1*cos(a2*x1)*((1+cos(2*a2*x1))/2)^((n2-1)/2)*sin(a3*x1)^n4')
210
+ .expand();
211
+ }
212
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
213
+ }
214
+ // Reduce right power
215
+ if (!n4.isOne()) {
216
+ let f;
217
+ if (n4.isEven()) {
218
+ f = p.fromPattern('a1*cos(a2*x1)^n2*((1-cos(2*a3*x1))/2)^(n4/2)').expand();
219
+ }
220
+ else {
221
+ f = p
222
+ .fromPattern('a1*cos(a2*x1)^n2*sin(a3*x1)*((1-cos(2*a3*x1))/2)^((n4-1)/2)')
223
+ .expand();
224
+ }
225
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
226
+ }
227
+ // Same frequency: cos(a*x)*sin(a*x)
228
+ if (p.get('a2').eq(p.get('a3'))) {
229
+ return p.fromPattern('-(a1*cos(2*a2*x1))/(4*a2)');
230
+ }
231
+ // Base product-to-sum case
232
+ return p.fromPattern('a1*(-cos((a2+a3)*x1)/(2*(a2+a3))+cos((a2-a3)*x1)/(2*(a2-a3)))');
233
+ }
234
+ },
235
+ // sec(x)*tan(x)
236
+ 'a1*sec(a2*x1^n1)^n2*tan(a3*x1^n3)^n4': p => {
237
+ if (p.get('n1').isOne() &&
238
+ p.get('n3').isOne() &&
239
+ p.get('n2').isOne() &&
240
+ p.get('n4').isOne() &&
241
+ p.get('a2').eq(p.get('a3'))) {
242
+ return p.fromPattern('(a1*sec(a2*x1))/a2');
243
+ }
244
+ },
245
+ // csc(x)*cot(x)
246
+ 'a1*cot(a2*x1^n1)^n2*csc(a3*x1^n3)^n4': p => {
247
+ if (p.get('n1').isOne() &&
248
+ p.get('n3').isOne() &&
249
+ p.get('n2').isOne() &&
250
+ p.get('n4').isOne() &&
251
+ p.get('a2').eq(p.get('a3'))) {
252
+ return p.fromPattern('-(a1*csc(a2*x1))/a2');
253
+ }
254
+ },
255
+ // 1/cos = sec
256
+ 'a1/(cos(a2*x1^n1)^n2)': p => {
257
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
258
+ return p.fromPattern('(a1*log(tan(a2*x1)+sec(a2*x1)))/a2');
259
+ }
260
+ },
261
+ // 1/sin = csc
262
+ 'a1/(sin(a2*x1^n1)^n2)': p => {
263
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
264
+ return p.fromPattern('-(a1*log(csc(a2*x1)+cot(a2*x1)))/a2');
265
+ }
266
+ },
267
+ // 1/tan = cot
268
+ 'a1/(tan(a2*x1^n1)^n2)': p => {
269
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
270
+ return p.fromPattern('(a1*log(sin(a2*x1)))/a2');
271
+ }
272
+ },
273
+ // 1/sec = cos
274
+ 'a1/(sec(a2*x1^n1)^n2)': p => {
275
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
276
+ return p.fromPattern('(a1*sin(a2*x1))/a2');
277
+ }
278
+ },
279
+ // 1/csc = sin
280
+ 'a1/(csc(a2*x1^n1)^n2)': p => {
281
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
282
+ return p.fromPattern('-((a1*cos(a2*x1))/a2)');
283
+ }
284
+ },
285
+ // 1/cot = tan
286
+ 'a1/(cot(a2*x1^n1)^n2)': p => {
287
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
288
+ return p.fromPattern('(a1*log(sec(a2*x1)))/a2');
289
+ }
290
+ },
291
+ // ---- Composite trig: f(a*(b*x + c)) ----
292
+ // sin(a*(bx+c))
293
+ 'a1*sin(a2*(a3*x1^n1+a4)^n2)^n3': p => {
294
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
295
+ return p.fromPattern('-((a1*cos(a2*(a3*x1+a4)))/(a2*a3))');
296
+ }
297
+ },
298
+ // cos(a*(bx+c))
299
+ 'a1*cos(a2*(a3*x1^n1+a4)^n2)^n3': p => {
300
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
301
+ return p.fromPattern('(a1*sin(a2*(a3*x1+a4)))/(a2*a3)');
302
+ }
303
+ },
304
+ // tan(a*(bx+c))
305
+ 'a1*tan(a2*(a3*x1^n1+a4)^n2)^n3': p => {
306
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
307
+ return p.fromPattern('(a1*log(sec(a2*(a3*x1+a4))))/(a2*a3)');
308
+ }
309
+ },
310
+ // sec(a*(bx+c))
311
+ 'a1*sec(a2*(a3*x1^n1+a4)^n2)^n3': p => {
312
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
313
+ return p.fromPattern('(a1*log(tan(a2*(a3*x1+a4))+sec(a2*(a3*x1+a4))))/(a2*a3)');
314
+ }
315
+ },
316
+ // csc(a*(bx+c))
317
+ 'a1*csc(a2*(a3*x1^n1+a4)^n2)^n3': p => {
318
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
319
+ return p.fromPattern('-(a1*log(csc(a2*(a3*x1+a4))+cot(a2*(a3*x1+a4))))/(a2*a3)');
320
+ }
321
+ },
322
+ // cot(a*(bx+c))
323
+ 'a1*cot(a2*(a3*x1^n1+a4)^n2)^n3': p => {
324
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
325
+ return p.fromPattern('(a1*log(sin(a2*(a3*x1+a4))))/(a2*a3)');
326
+ }
327
+ },
328
+ };
329
+ const invTrigTable = {
330
+ // acos(x)
331
+ 'a1*acos(a2*x1^n1)^n2': p => {
332
+ if (p.get('n1').isOne()) {
333
+ if (p.get('n2').isOne()) {
334
+ return p.fromPattern('(a1*(a2*x1*acos(a2*x1)-sqrt(1-a2^2*x1^2)))/a2');
335
+ }
336
+ }
337
+ },
338
+ // asin(x)
339
+ 'a1*asin(a2*x1^n1)^n2': p => {
340
+ if (p.get('n1').isOne()) {
341
+ if (p.get('n2').isOne()) {
342
+ return p.fromPattern('(a1*(a2*x1*asin(a2*x1)+sqrt(1-a2^2*x1^2)))/a2');
343
+ }
344
+ }
345
+ },
346
+ // atan(x)
347
+ 'a1*atan(a2*x1^n1)^n2': p => {
348
+ if (p.get('n1').isOne()) {
349
+ if (p.get('n2').isOne()) {
350
+ return p.fromPattern('(a1*(a2*x1*atan(a2*x1)-log(a2^2*x1^2+1)/2))/a2');
351
+ }
352
+ }
353
+ },
354
+ // asec(x)
355
+ 'a1*asec(a2*x1^n1)^n2': p => {
356
+ if (p.get('n1').isOne()) {
357
+ if (p.get('n2').isOne()) {
358
+ return p.fromPattern('(a1*(a2*x1*asec(a2*x1)-log(sqrt(1-1/(a2^2*x1^2))+1)/2+log(1-sqrt(1-1/(a2^2*x1^2)))/2))/a2');
359
+ }
360
+ }
361
+ },
362
+ // acsc(x)
363
+ 'a1*acsc(a2*x1^n1)^n2': p => {
364
+ if (p.get('n1').isOne()) {
365
+ if (p.get('n2').isOne()) {
366
+ return p.fromPattern('(a1*(a2*x1*acsc(a2*x1)+log(sqrt(1-1/(a2^2*x1^2))+1)/2-log(1-sqrt(1-1/(a2^2*x1^2)))/2))/a2');
367
+ }
368
+ }
369
+ },
370
+ // acot(x)
371
+ 'a1*acot(a2*x1^n1)^n2': p => {
372
+ if (p.get('n1').isOne()) {
373
+ if (p.get('n2').isOne()) {
374
+ return p.fromPattern('(a1*(log(a2^2*x1^2+1)/2+a2*x1*acot(a2*x1)))/a2');
375
+ }
376
+ }
377
+ },
378
+ };
379
+ const hyperbolicTrigTable = {
380
+ // cosh(x)
381
+ 'a1*cosh(a2*x1^n1)^n2': p => {
382
+ if (p.get('n1').isOne()) {
383
+ if (p.get('n2').isOne()) {
384
+ return p.fromPattern('(a1*sinh(a2*x1))/a2');
385
+ }
386
+ }
387
+ },
388
+ // sinh(x)
389
+ 'a1*sinh(a2*x1^n1)^n2': p => {
390
+ if (p.get('n1').isOne()) {
391
+ if (p.get('n2').isOne()) {
392
+ return p.fromPattern('(a1*cosh(a2*x1))/a2');
393
+ }
394
+ }
395
+ },
396
+ // tanh(x)
397
+ 'a1*tanh(a2*x1^n1)^n2': p => {
398
+ if (p.get('n1').isOne()) {
399
+ if (p.get('n2').isOne()) {
400
+ return p.fromPattern('(a1*log(cosh(a2*x1)))/a2');
401
+ }
402
+ }
403
+ },
404
+ // sech(x) and sech(x)^2
405
+ 'a1*sech(a2*x1^n1)^n2': p => {
406
+ if (p.get('n1').isOne()) {
407
+ if (p.get('n2').isOne()) {
408
+ return p.fromPattern('(a1*atan(sinh(a2*x1)))/a2');
409
+ }
410
+ else if (p.get('n2').eq(2)) {
411
+ return p.fromPattern('(a1*tanh(a2*x1))/a2');
412
+ }
413
+ }
414
+ },
415
+ // csch(x) and csch(x)^2
416
+ 'a1*csch(a2*x1^n1)^n2': p => {
417
+ if (p.get('n1').isOne()) {
418
+ if (p.get('n2').isOne()) {
419
+ return p.fromPattern('(a1*log(tanh((a2*x1)/2)))/a2');
420
+ }
421
+ else if (p.get('n2').eq(2)) {
422
+ return p.fromPattern('-(a1*coth(a2*x1))/a2');
423
+ }
424
+ }
425
+ },
426
+ // coth(x)
427
+ 'a1*coth(a2*x1^n1)^n2': p => {
428
+ if (p.get('n1').isOne()) {
429
+ if (p.get('n2').isOne()) {
430
+ return p.fromPattern('(a1*log(sinh(a2*x1)))/a2');
431
+ }
432
+ }
433
+ },
434
+ // sinh(u)
435
+ 'a1*sinh(a2*(a3*x1^n1+a4)^n2)^n3': p => {
436
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
437
+ return p.fromPattern('(a1*cosh(a2*(a3*x1+a4)))/(a2*a3)');
438
+ }
439
+ },
440
+ // cosh(u)
441
+ 'a1*cosh(a2*(a3*x1^n1+a4)^n2)^n3': p => {
442
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
443
+ return p.fromPattern('(a1*sinh(a2*(a3*x1+a4)))/(a2*a3)');
444
+ }
445
+ },
446
+ // tanh(u)
447
+ 'a1*tanh(a2*(a3*x1^n1+a4)^n2)^n3': p => {
448
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
449
+ return p.fromPattern('(a1*log(cosh(a2*(a3*x1+a4))))/(a2*a3)');
450
+ }
451
+ },
452
+ // coth(u)
453
+ 'a1*coth(a2*(a3*x1^n1+a4)^n2)^n3': p => {
454
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
455
+ return p.fromPattern('(a1*log(sinh(a2*(a3*x1+a4))))/(a2*a3)');
456
+ }
457
+ },
458
+ // sech(u) and sech(u)^2
459
+ 'a1*sech(a2*(a3*x1^n1+a4)^n2)^n3': p => {
460
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
461
+ if (p.get('n3').isOne()) {
462
+ return p.fromPattern('(a1*atan(sinh(a2*(a3*x1+a4))))/(a2*a3)');
463
+ }
464
+ else if (p.get('n3').eq(2)) {
465
+ return p.fromPattern('(a1*tanh(a2*(a3*x1+a4)))/(a2*a3)');
466
+ }
467
+ }
468
+ },
469
+ // csch(u) and csch(u)^2
470
+ 'a1*csch(a2*(a3*x1^n1+a4)^n2)^n3': p => {
471
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
472
+ if (p.get('n3').isOne()) {
473
+ return p.fromPattern('(a1*log(tanh((a2*(a3*x1+a4))/2)))/(a2*a3)');
474
+ }
475
+ else if (p.get('n3').eq(2)) {
476
+ return p.fromPattern('-(a1*coth(a2*(a3*x1+a4)))/(a2*a3)');
477
+ }
478
+ }
479
+ },
480
+ // sech(u)*tanh(u)
481
+ 'a1*sech(a2*(a3*x1^n1+a4)^n2)^n3*tanh(a5*(a6*x1^n4+a7)^n5)^n6': p => {
482
+ if (p.get('n1').isOne() &&
483
+ p.get('n2').isOne() &&
484
+ p.get('n3').isOne() &&
485
+ p.get('n4').isOne() &&
486
+ p.get('n5').isOne() &&
487
+ p.get('n6').isOne() &&
488
+ p.get('a2').eq(p.get('a5')) &&
489
+ p.get('a3').eq(p.get('a6')) &&
490
+ p.get('a4').eq(p.get('a7'))) {
491
+ return p.fromPattern('-(a1*sech(a2*(a3*x1+a4)))/(a2*a3)');
492
+ }
493
+ },
494
+ // csch(u)*coth(u)
495
+ 'a1*coth(a2*(a3*x1^n1+a4)^n2)^n3*csch(a5*(a6*x1^n4+a7)^n5)^n6': p => {
496
+ if (p.get('n1').isOne() &&
497
+ p.get('n2').isOne() &&
498
+ p.get('n3').isOne() &&
499
+ p.get('n4').isOne() &&
500
+ p.get('n5').isOne() &&
501
+ p.get('n6').isOne() &&
502
+ p.get('a2').eq(p.get('a5')) &&
503
+ p.get('a3').eq(p.get('a6')) &&
504
+ p.get('a4').eq(p.get('a7'))) {
505
+ return p.fromPattern('-(a1*csch(a2*(a3*x1+a4)))/(a2*a3)');
506
+ }
507
+ },
508
+ // cosh(u)^n * sinh(u)^m
509
+ 'a1*cosh(a2*x1^n1)^n2*sinh(a3*x1^n3)^n4': (p, depth) => {
510
+ if (p.get('n1').isOne() && p.get('n3').isOne() && p.get('a2').eq(p.get('a3'))) {
511
+ const n2 = p.get('n2');
512
+ const n4 = p.get('n4');
513
+ if (n4.isOne()) {
514
+ return p.fromPattern('(a1*cosh(a2*x1)^(n2+1))/(a2*(n2+1))');
515
+ }
516
+ if (n2.isOne()) {
517
+ return p.fromPattern('(a1*sinh(a2*x1)^(n4+1))/(a2*(n4+1))');
518
+ }
519
+ if (n4.isOdd()) {
520
+ const f = p
521
+ .fromPattern('a1*cosh(a2*x1)^n2*(cosh(a2*x1)^2-1)^((n4-1)/2)*sinh(a2*x1)')
522
+ .expand();
523
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
524
+ }
525
+ if (n2.isOdd()) {
526
+ const f = p
527
+ .fromPattern('a1*(1+sinh(a2*x1)^2)^((n2-1)/2)*sinh(a2*x1)^n4*cosh(a2*x1)')
528
+ .expand();
529
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
530
+ }
531
+ }
532
+ },
533
+ // sech(u)^n * tanh(u)^m
534
+ 'a1*sech(a2*x1^n1)^n2*tanh(a3*x1^n3)^n4': (p, depth) => {
535
+ if (p.get('n1').isOne() && p.get('n3').isOne() && p.get('a2').eq(p.get('a3'))) {
536
+ const n2 = p.get('n2');
537
+ const n4 = p.get('n4');
538
+ if (n4.isOne()) {
539
+ return p.fromPattern('-(a1*sech(a2*x1)^n2)/(a2*n2)');
540
+ }
541
+ if (n2.eq(2)) {
542
+ return p.fromPattern('(a1*tanh(a2*x1)^(n4+1))/(a2*(n4+1))');
543
+ }
544
+ if (n4.isOdd()) {
545
+ const f = p
546
+ .fromPattern('a1*sech(a2*x1)^n2*(1-sech(a2*x1)^2)^((n4-1)/2)*tanh(a2*x1)')
547
+ .expand();
548
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
549
+ }
550
+ if (n2.isEven()) {
551
+ const f = p
552
+ .fromPattern('a1*(1-tanh(a2*x1)^2)^((n2-2)/2)*sech(a2*x1)^2*tanh(a2*x1)^n4')
553
+ .expand();
554
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
555
+ }
556
+ }
557
+ },
558
+ // coth(u)^n * csch(u)^m
559
+ 'a1*coth(a2*x1^n1)^n2*csch(a3*x1^n3)^n4': (p, depth) => {
560
+ if (p.get('n1').isOne() && p.get('n3').isOne() && p.get('a2').eq(p.get('a3'))) {
561
+ const n2 = p.get('n2');
562
+ const n4 = p.get('n4');
563
+ if (n2.isOne()) {
564
+ return p.fromPattern('-(a1*csch(a2*x1)^n4)/(a2*n4)');
565
+ }
566
+ if (n4.eq(2)) {
567
+ return p.fromPattern('-(a1*coth(a2*x1)^(n2+1))/(a2*(n2+1))');
568
+ }
569
+ if (n2.isOdd()) {
570
+ const f = p
571
+ .fromPattern('a1*(1+csch(a2*x1)^2)^((n2-1)/2)*csch(a2*x1)^n4*coth(a2*x1)')
572
+ .expand();
573
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
574
+ }
575
+ if (n4.isEven()) {
576
+ const f = p
577
+ .fromPattern('a1*coth(a2*x1)^n2*(coth(a2*x1)^2-1)^((n4-2)/2)*csch(a2*x1)^2')
578
+ .expand();
579
+ return (0, integrate_1.integrate)(f, p.get('x1'), depth);
580
+ }
581
+ }
582
+ },
583
+ };
584
+ const invHyperbolicTrigTable = {
585
+ // acosh(x)
586
+ 'a1*acosh(a2*x1^n1)^n2': p => {
587
+ if (p.get('n1').isOne()) {
588
+ if (p.get('n2').isOne()) {
589
+ return p.fromPattern('(a1*(a2*x1*acosh(a2*x1)-sqrt(a2^2*x1^2-1)))/a2');
590
+ }
591
+ }
592
+ },
593
+ // asinh(x)
594
+ 'a1*asinh(a2*x1^n1)^n2': p => {
595
+ if (p.get('n1').isOne()) {
596
+ if (p.get('n2').isOne()) {
597
+ return p.fromPattern('(a1*(a2*x1*asinh(a2*x1)-sqrt(a2^2*x1^2+1)))/a2');
598
+ }
599
+ }
600
+ },
601
+ // atanh(x)
602
+ 'a1*atanh(a2*x1^n1)^n2': p => {
603
+ if (p.get('n1').isOne()) {
604
+ if (p.get('n2').isOne()) {
605
+ return p.fromPattern('(a1*(log(1-a2^2*x1^2)/2+a2*x1*atanh(a2*x1)))/a2');
606
+ }
607
+ }
608
+ },
609
+ // asech(x)
610
+ 'a1*asech(a2*x1^n1)^n2': p => {
611
+ if (p.get('n1').isOne()) {
612
+ if (p.get('n2').isOne()) {
613
+ return p.fromPattern('(a1*(a2*x1*asech(a2*x1)-atan(sqrt(1/(a2^2*x1^2)-1))))/a2');
614
+ }
615
+ }
616
+ },
617
+ // acsch(x)
618
+ 'a1*acsch(a2*x1^n1)^n2': p => {
619
+ if (p.get('n1').isOne()) {
620
+ if (p.get('n2').isOne()) {
621
+ return p.fromPattern('(a1*(a2*x1*acsch(a2*x1)+log(sqrt(1/(a2^2*x1^2)+1)+1)/2-log(sqrt(1/(a2^2*x1^2)+1)-1)/2))/a2');
622
+ }
623
+ }
624
+ },
625
+ // acoth(x)
626
+ 'a1*acoth(a2*x1^n1)^n2': p => {
627
+ if (p.get('n1').isOne()) {
628
+ if (p.get('n2').isOne()) {
629
+ return p.fromPattern('(a1*(log(1-a2^2*x1^2)/2+a2*x1*acoth(a2*x1)))/a2');
630
+ }
631
+ }
632
+ },
633
+ };
634
+ const powerLogTable = {
635
+ // log(x)
636
+ 'a1*log(a2*x1^n1)^n2': p => {
637
+ if (p.get('n1').isOne()) {
638
+ if (p.get('n2').isOne()) {
639
+ return p.fromPattern('(a1*(a2*x1*log(a2*x1)-a2*x1))/a2');
640
+ }
641
+ }
642
+ },
643
+ // log(x)/x
644
+ '(a1*log(a2*x1^n2)^n3)/x1^n1': p => {
645
+ if (p.get('n2').isOne()) {
646
+ if (p.get('n3').isOne()) {
647
+ if (p.get('n1').isOne()) {
648
+ return p.fromPattern('a1*log(x1)*log(a2*x1)-(a1*log(x1)^2)/2');
649
+ }
650
+ else {
651
+ return p.fromPattern('(a1*x1^(1-n1)*log(a2*x1))/(1-n1)-(a1*x1^(1-n1))/(1-n1)^2');
652
+ }
653
+ }
654
+ }
655
+ },
656
+ // log(x)*x
657
+ 'a1*x1^n1*log(a2*x1^n2)^n3': p => {
658
+ if (p.get('n2').isOne()) {
659
+ if (p.get('n3').isOne()) {
660
+ return p.fromPattern('(a1*x1^(n1+1)*log(a2*x1))/(n1+1)-(a1*x1^(n1+1))/(n1+1)^2');
661
+ }
662
+ }
663
+ },
664
+ // x^2
665
+ 'a1*x1^n1': p => {
666
+ return p.fromPattern('(a1*x1^(n1+1))/(n1+1)');
667
+ },
668
+ // 1/x
669
+ 'a1/x1^n1': p => {
670
+ if (p.get('n1').isOne()) {
671
+ return p.fromPattern(`a1*log(x1)`);
672
+ }
673
+ else {
674
+ return p.fromPattern('(a1*x1^(-n1+1))/(-n1+1)');
675
+ }
676
+ },
677
+ // (a*x+b)^n
678
+ 'a1*(a2*x1^n1+a3)^n2': p => {
679
+ if (p.get('n1').isOne()) {
680
+ return p.fromPattern(`(a1*(a2*x1+a3)^(n2+1))/(a2*(n2+1))`);
681
+ }
682
+ },
683
+ // 1/(a*x+b)^n
684
+ // 1/(a*x+b)^n
685
+ 'a1/((a2*x1^n1+a3)^n2)': p => {
686
+ if (p.get('n1').isOne()) {
687
+ if (p.get('n2').isOne()) {
688
+ return p.fromPattern('(a1*log(a2*x1+a3))/a2');
689
+ }
690
+ else {
691
+ return p.fromPattern('(a1*(a2*x1+a3)^(-n2+1))/(a2*(-n2+1))');
692
+ }
693
+ }
694
+ },
695
+ // 1/(a*x^n+b)^m
696
+ 'a1*log(a2*(a3*x1^n1+a4)^n2)^n3': p => {
697
+ // We can eliminate certain options from the beginning as they'll never be handled by lookup
698
+ // All cases assume a linear sum with m=1. For m>1 we'll use IBP.
699
+ if (p.get('n3').isOne()) {
700
+ // Assume a linear sum
701
+ if (p.get('n2').isOne()) {
702
+ const n1 = p.get('n1');
703
+ // Deal with 1/(a*x+b)
704
+ if (n1.isOne()) {
705
+ return p.fromPattern(`(a1*(a2*(a3*x1+a4)*log(a2*(a3*x1+a4))-a2*(a3*x1+a4)))/(a2*a3)`);
706
+ }
707
+ else {
708
+ const s = p.get('a3').times(p.get('a4'));
709
+ if (s.lt((0, shortcuts_1.zero)())) {
710
+ if (n1.eq((0, shortcuts_1.two)())) {
711
+ return p.fromPattern('a1*(x1*log(a2*(a3*x1^2+a4))-2*a3*(x1/a3-(a4*log((2*a3*x1-2*sqrt(-(a3*a4)))/(2*a3*x1+2*sqrt(-(a3*a4)))))/(2*a3*sqrt(-(a3*a4)))))');
712
+ }
713
+ else if (n1.eq((0, shortcuts_1.three)())) {
714
+ return p.fromPattern(`a1*(x1*log(a2*(a3*x1^3+a4))-3*a3*((${Expression_1.Expression.Img()}*a4^(1/3)*log((2*a3^(2/3)*x1-sqrt(3)*${Expression_1.Expression.Img()}*` +
715
+ `a3^(1/3)*a4^(1/3)-a3^(1/3)*a4^(1/3))/(2*a3^(2/3)*x1+sqrt(3)*${Expression_1.Expression.Img()}*a3^(1/3)*a4^(1/3)-a3^(1/3)*a4^(1/3))))/(2*sqrt(3)*a3^(4/3))` +
716
+ `+(a4^(1/3)*log(a3^(2/3)*x1^2-a3^(1/3)*a4^(1/3)*x1+a4^(2/3)))/(6*a3^(4/3))-(a4^(1/3)*log((a3^(1/3)*x1+a4^(1/3))/a3^(1/3)))/(3*a3^(4/3))+x1/a3))`);
717
+ }
718
+ }
719
+ else {
720
+ if (n1.eq((0, shortcuts_1.two)())) {
721
+ return p.fromPattern('a1*(x1*log(a2*(a3*x1^2+a4))-2*a3*(x1/a3-(a4*atan((a3*x1)/sqrt(a3*a4)))/(a3*sqrt(a3*a4))))');
722
+ }
723
+ else if (n1.eq((0, shortcuts_1.three)())) {
724
+ return p.fromPattern(`a1*(x1*log(a2*(a3*x1^3+a4))-3*a3*((${Expression_1.Expression.Img()}*a4^(1/3)*log((2*a3^(2/3)*x1-sqrt(3)*${Expression_1.Expression.Img()}*` +
725
+ `a3^(1/3)*a4^(1/3)-a3^(1/3)*a4^(1/3))/(2*a3^(2/3)*x1+sqrt(3)*${Expression_1.Expression.Img()}*a3^(1/3)*a4^(1/3)-a3^(1/3)*a4^(1/3))))/(2*sqrt(3)*a3^(4/3))` +
726
+ `+(a4^(1/3)*log(a3^(2/3)*x1^2-a3^(1/3)*a4^(1/3)*x1+a4^(2/3)))/(6*a3^(4/3))-(a4^(1/3)*log((a3^(1/3)*x1+a4^(1/3))/a3^(1/3)))/(3*a3^(4/3))+x1/a3))`);
727
+ }
728
+ }
729
+ }
730
+ }
731
+ }
732
+ },
733
+ };
734
+ const exponentialTable = {
735
+ // e^x, 2^x, ...
736
+ 'a1*(a2)^(a3*x1^n1)': p => {
737
+ if (p.get('n1').isOne()) {
738
+ return p.fromPattern('(a1*a2^(a3*x1))/(log(a2)*a3)');
739
+ }
740
+ },
741
+ // e^(a*(bx+c)), 2^(a*(bx+c)), ...
742
+ 'a1*(a2)^(a3*(a4*x1^n1+a5)^n2)': p => {
743
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
744
+ return p.fromPattern('(a1*a2^(a3*(a4*x1+a5)))/(log(a2)*a3*a4)');
745
+ }
746
+ },
747
+ };
748
+ const knownProductsTable = {
749
+ // e^x*cos(x)
750
+ 'a1*(a2)^(a3*x1^n1)*cos(a4*x1^n2)^n3': p => {
751
+ if (p.get('n1').isOne()) {
752
+ if (p.get('n2').isOne()) {
753
+ if (p.get('n3').isOne()) {
754
+ return p.fromPattern('(a1*(e^(log(a2)*a3*x1)*a4*sin(a4*x1)+e^(log(a2)*a3*x1)*log(a2)*a3*cos(a4*x1)))/(a4^2+log(a2)^2*a3^2)');
755
+ }
756
+ }
757
+ }
758
+ },
759
+ // e^x*sin(x)
760
+ 'a1*(a2)^(a3*x1^n1)*sin(a4*x1^n2)^n3': p => {
761
+ if (p.get('n1').isOne()) {
762
+ if (p.get('n2').isOne()) {
763
+ if (p.get('n3').isOne()) {
764
+ return p.fromPattern('(a1*(e^(log(a2)*a3*x1)*log(a2)*a3*sin(a4*x1)-e^(log(a2)*a3*x1)*a4*cos(a4*x1)))/(a4^2+log(a2)^2*a3^2)');
765
+ }
766
+ }
767
+ }
768
+ },
769
+ // e^x*cosh(x)
770
+ 'a1*(a2)^(a3*x1^n1)*cosh(a4*x1^n2)^n3': p => {
771
+ if (p.get('n1').isOne()) {
772
+ if (p.get('n2').isOne()) {
773
+ if (p.get('n3').isOne()) {
774
+ return p.fromPattern('(a1*(x1-e^(-((-((log(a2)*a3)/a4)-1)*a4*x1))/((-((log(a2)*a3)/a4)-1)*a4)))/2');
775
+ }
776
+ }
777
+ }
778
+ },
779
+ // e^x*sinh(x)
780
+ 'a1*(a2)^(a3*x1^n1)*sinh(a4*x1^n2)^n3': p => {
781
+ if (p.get('n1').isOne()) {
782
+ if (p.get('n2').isOne()) {
783
+ if (p.get('n3').isOne()) {
784
+ return p.fromPattern('(a1*(-x1-e^(-((-((log(a2)*a3)/a4)-1)*a4*x1))/((-((log(a2)*a3)/a4)-1)*a4)))/2');
785
+ }
786
+ }
787
+ }
788
+ },
789
+ // e^x*x
790
+ 'a1*(a2)^(a3*x1^n1)*x1^n2': p => {
791
+ if (p.get('n1').isOne()) {
792
+ const n2 = p.get('n2');
793
+ if (n2.isOne()) {
794
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)*a3*x1-1))/(log(a2)^2*a3^2)');
795
+ }
796
+ else if (n2.eq((0, shortcuts_1.two)())) {
797
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)^2*a3^2*x1^2-2*log(a2)*a3*x1+2))/(log(a2)^3*a3^3)');
798
+ }
799
+ else if (n2.eq((0, shortcuts_1.three)())) {
800
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)^3*a3^3*x1^3-3*log(a2)^2*a3^2*x1^2+6*log(a2)*a3*x1-6))/(log(a2)^4*a3^4)');
801
+ }
802
+ else if (n2.eq((0, shortcuts_1.four)())) {
803
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)^4*a3^4*x1^4-4*log(a2)^3*a3^3*x1^3+12*log(a2)^2*a3^2*x1^2-24*log(a2)*a3*x1+24))/(log(a2)^5*a3^5)');
804
+ }
805
+ else if (n2.eq((0, shortcuts_1.five)())) {
806
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)^5*a3^5*x1^5-5*log(a2)^4*a3^4*x1^4+20*log(a2)^3*a3^3*x1^3-' +
807
+ '60*log(a2)^2*a3^2*x1^2+120*log(a2)*a3*x1-120))/(log(a2)^6*a3^6)');
808
+ }
809
+ else if (n2.eq((0, shortcuts_1.six)())) {
810
+ return p.fromPattern('(e^(log(a2)*a3*x1)*a1*(log(a2)^6*a3^6*x1^6-6*log(a2)^5*a3^5*x1^5+30*log(a2)^4*a3^4*x1^4-' +
811
+ '120*log(a2)^3*a3^3*x1^3+360*log(a2)^2*a3^2*x1^2-720*log(a2)*a3*x1+720))/(log(a2)^7*a3^7)');
812
+ }
813
+ // Switch to IBP after this
814
+ }
815
+ },
816
+ };
817
+ /**
818
+ * Special function integrals.
819
+ *
820
+ * These handle integrands of the form f(x)/x that arise as IBP remainders
821
+ * when integrating log(x)·g(x). They map directly to the standard special
822
+ * functions: sine integral Si, cosine integral Ci, and exponential integral Ei.
823
+ *
824
+ * Patterns are matched after constant stripping, so the multiplier a1
825
+ * captures any leading coefficient.
826
+ */
827
+ const specialFunctionTable = {
828
+ // ∫ sin(a*x)/x dx = Si(a*x)
829
+ '(a1*sin(a2*x1^n2)^n3)/x1^n1': p => {
830
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
831
+ return (0, math_1.Si)(p.fromPattern('a2*x1')).times(p.get('a1'));
832
+ }
833
+ },
834
+ // ∫ cos(a*x)/x dx = Ci(a*x)
835
+ '(a1*cos(a2*x1^n2)^n3)/x1^n1': p => {
836
+ if (p.get('n1').isOne() && p.get('n2').isOne() && p.get('n3').isOne()) {
837
+ return (0, math_1.Ci)(p.fromPattern('a2*x1')).times(p.get('a1'));
838
+ }
839
+ },
840
+ // ∫ e^(a*x)/x dx = Ei(a*x) (generalized: a2^(a3*x)/x = Ei(log(a2)*a3*x))
841
+ '(a1*(a2)^(a3*x1^n1))/x1^n2': p => {
842
+ if (p.get('n1').isOne() && p.get('n2').isOne()) {
843
+ return (0, math_1.Ei)(p.fromPattern('log(a2)*a3*x1')).times(p.get('a1'));
844
+ }
845
+ },
846
+ };
847
+ const knownIntegralsTable = {
848
+ // sqrt(a-b*x^2)
849
+ 'a1*(-a2*x1^n1+a3)^n2': p => {
850
+ if (p.get('n1').eq(2) && p.get('n2').isHalf()) {
851
+ return p.fromPattern('(a1*x1*(-a2*x1^2+a3)^(1/2))/2+(a1*a3*asin((a2^(1/2)*x1)/(a3^(1/2))))/(2*a2^(1/2))');
852
+ }
853
+ },
854
+ // diff(atanh(x)) and diff(asin(x))
855
+ 'a1/((-a2*x1^n1+a3)^n2)': p => {
856
+ if (p.get('n1').eq(2) && p.get('n2').isOne()) {
857
+ return p.fromPattern('(a1/(a2^(1/2)*a3^(1/2)))*atanh((a2^(1/2)*x1)/(a3^(1/2)))');
858
+ }
859
+ else if (p.get('n1').eq(2) && p.get('n2').isHalf()) {
860
+ return p.fromPattern('(a1/a2^(1/2))*asin((a2^(1/2)*x1)/(a3^(1/2)))');
861
+ }
862
+ },
863
+ // diff(acos(x))
864
+ '-a1/((-a2*x1^n1+a3)^n2)': p => {
865
+ if (p.get('n1').eq(2) && p.get('n2').isHalf()) {
866
+ return p.fromPattern('(a1/a2^(1/2))*acos((a2^(1/2)*x1)/(a3^(1/2)))');
867
+ }
868
+ },
869
+ // diff(atan(x)) and diff(asinh(x))
870
+ 'a1/((a2*x1^n1+a3)^n2)': p => {
871
+ if (p.get('n1').eq(2) && p.get('n2').isOne()) {
872
+ return p.fromPattern('(a1/(a2^(1/2)*a3^(1/2)))*atan((a2^(1/2)*x1)/(a3^(1/2)))');
873
+ }
874
+ else if (p.get('n1').eq(2) && p.get('n2').isHalf()) {
875
+ return p.fromPattern('(a1/a2^(1/2))*asinh((a2^(1/2)*x1)/(a3^(1/2)))');
876
+ }
877
+ },
878
+ // diff(acot(x))
879
+ '-a1/((a2*x1^n1+a3)^n2)': p => {
880
+ if (p.get('n1').eq(2) && p.get('n2').isOne()) {
881
+ return p.fromPattern('(a1/(a2^(1/2)*a3^(1/2)))*acot((a2^(1/2)*x1)/(a3^(1/2)))');
882
+ }
883
+ },
884
+ // diff(asec(x))
885
+ 'a1/(x1^n1*(-a2/x1^n2+a3)^n3)': p => {
886
+ if (p.get('n1').isOne() && p.get('n2').eq(2) && p.get('n3').isHalf()) {
887
+ return p.fromPattern('(a1/a3^(1/2))*asec((a3^(1/2)*x1)/(a2^(1/2)))');
888
+ }
889
+ },
890
+ // diff(acsc(x))
891
+ '-a1/(x1^n1*(-a2/x1^n2+a3)^n3)': p => {
892
+ if (p.get('n1').isOne() && p.get('n2').eq(2) && p.get('n3').isHalf()) {
893
+ return p.fromPattern('(a1/a3^(1/2))*acsc((a3^(1/2)*x1)/(a2^(1/2)))');
894
+ }
895
+ },
896
+ // diff(acsch(x))
897
+ // -1/(x*sqrt(1+1/x^2)) -> -acsch(x^-1)
898
+ // after constant stripping: 1/(x*sqrt(1+1/x^2))
899
+ 'a1/(x1^n1*(a2/x1^n2+a3)^n3)': p => {
900
+ if (p.get('n1').isOne() && p.get('n2').eq(2) && p.get('n3').eq(1 / 2)) {
901
+ return p.fromPattern('a1*acsch((sqrt(a2/a3))/x1)/sqrt(a2*a3)');
902
+ }
903
+ },
904
+ };
905
+ exports.tableOfIntegrals = new LookupTable_1.LookupTable();
906
+ exports.tableOfIntegrals.addEntries(trigTable);
907
+ exports.tableOfIntegrals.addEntries(invTrigTable);
908
+ exports.tableOfIntegrals.addEntries(powerLogTable);
909
+ exports.tableOfIntegrals.addEntries(exponentialTable);
910
+ exports.tableOfIntegrals.addEntries(hyperbolicTrigTable);
911
+ exports.tableOfIntegrals.addEntries(invHyperbolicTrigTable);
912
+ exports.tableOfIntegrals.addEntries(knownProductsTable);
913
+ exports.tableOfIntegrals.addEntries(knownIntegralsTable);
914
+ exports.tableOfIntegrals.addEntries(specialFunctionTable);