mathjs 9.3.2 → 9.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (410) hide show
  1. package/HISTORY.md +22 -0
  2. package/README.md +1 -0
  3. package/bin/cli.js +11 -11
  4. package/docs/expressions/parsing.md +21 -4
  5. package/docs/reference/functions/complex.md +5 -49
  6. package/docs/reference/functions/eigs.md +12 -12
  7. package/docs/reference/functions/flatten.md +1 -0
  8. package/docs/reference/functions/matrixFromColumns.md +1 -1
  9. package/docs/reference/functions/matrixFromFunction.md +12 -0
  10. package/docs/reference/functions/matrixFromRows.md +1 -1
  11. package/docs/reference/functions.md +4 -1
  12. package/examples/advanced/custom_scope_objects.js +115 -0
  13. package/lib/browser/math.js +10 -10
  14. package/lib/browser/math.js.map +1 -1
  15. package/lib/cjs/core/create.js +8 -7
  16. package/lib/cjs/core/function/import.js +9 -7
  17. package/lib/cjs/core/function/typed.js +6 -1
  18. package/lib/cjs/defaultInstance.js +3 -3
  19. package/lib/cjs/entry/allFactoriesAny.js +3 -3
  20. package/lib/cjs/entry/allFactoriesNumber.js +3 -3
  21. package/lib/cjs/entry/configReadonly.js +5 -4
  22. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +51 -0
  23. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromColumns.generated.js +29 -0
  24. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromFunction.generated.js +26 -0
  25. package/lib/cjs/entry/dependenciesAny/dependenciesMatrixFromRows.generated.js +29 -0
  26. package/lib/cjs/entry/dependenciesAny.generated.js +24 -0
  27. package/lib/cjs/entry/impureFunctionsAny.generated.js +22 -17
  28. package/lib/cjs/entry/impureFunctionsNumber.generated.js +11 -9
  29. package/lib/cjs/entry/pureFunctionsAny.generated.js +78 -41
  30. package/lib/cjs/expression/Parser.js +22 -15
  31. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +9 -0
  32. package/lib/cjs/expression/embeddedDocs/function/matrix/column.js +1 -1
  33. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromColumns.js +15 -0
  34. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromFunction.js +15 -0
  35. package/lib/cjs/expression/embeddedDocs/function/matrix/matrixFromRows.js +15 -0
  36. package/lib/cjs/expression/embeddedDocs/function/matrix/row.js +1 -1
  37. package/lib/cjs/expression/function/evaluate.js +6 -4
  38. package/lib/cjs/expression/keywords.js +1 -3
  39. package/lib/cjs/expression/node/AccessorNode.js +1 -0
  40. package/lib/cjs/expression/node/AssignmentNode.js +6 -3
  41. package/lib/cjs/expression/node/FunctionAssignmentNode.js +2 -4
  42. package/lib/cjs/expression/node/FunctionNode.js +76 -46
  43. package/lib/cjs/expression/node/IndexNode.js +5 -13
  44. package/lib/cjs/expression/node/Node.js +15 -9
  45. package/lib/cjs/expression/node/ObjectNode.js +5 -3
  46. package/lib/cjs/expression/node/SymbolNode.js +2 -2
  47. package/lib/cjs/expression/node/utils/access.js +5 -3
  48. package/lib/cjs/expression/node/utils/assign.js +5 -3
  49. package/lib/cjs/expression/parse.js +10 -14
  50. package/lib/cjs/expression/transform/utils/compileInlineExpression.js +5 -3
  51. package/lib/cjs/factoriesAny.js +24 -0
  52. package/lib/cjs/function/algebra/decomposition/qr.js +5 -3
  53. package/lib/cjs/function/algebra/simplify/resolve.js +7 -1
  54. package/lib/cjs/function/algebra/simplify.js +20 -14
  55. package/lib/cjs/function/algebra/solver/lsolveAll.js +6 -16
  56. package/lib/cjs/function/algebra/solver/usolveAll.js +6 -16
  57. package/lib/cjs/function/arithmetic/ceil.js +6 -16
  58. package/lib/cjs/function/arithmetic/floor.js +6 -16
  59. package/lib/cjs/function/arithmetic/norm.js +2 -2
  60. package/lib/cjs/function/arithmetic/pow.js +9 -7
  61. package/lib/cjs/function/arithmetic/round.js +7 -5
  62. package/lib/cjs/function/complex/im.js +3 -0
  63. package/lib/cjs/function/complex/re.js +3 -0
  64. package/lib/cjs/function/matrix/eigs/complexEigs.js +631 -0
  65. package/lib/cjs/function/matrix/eigs/realSymetric.js +341 -0
  66. package/lib/cjs/function/matrix/eigs.js +188 -334
  67. package/lib/cjs/function/matrix/flatten.js +1 -0
  68. package/lib/cjs/function/matrix/matrixFromColumns.js +118 -0
  69. package/lib/cjs/function/matrix/matrixFromFunction.js +85 -0
  70. package/lib/cjs/function/matrix/matrixFromRows.js +108 -0
  71. package/lib/cjs/function/probability/pickRandom.js +1 -1
  72. package/lib/cjs/function/probability/util/seededRNG.js +2 -2
  73. package/lib/cjs/function/relational/compareNatural.js +2 -2
  74. package/lib/cjs/header.js +2 -2
  75. package/lib/cjs/plain/bignumber/index.js +2 -2
  76. package/lib/cjs/type/bignumber/BigNumber.js +2 -2
  77. package/lib/cjs/type/complex/Complex.js +5 -5
  78. package/lib/cjs/type/fraction/Fraction.js +2 -2
  79. package/lib/cjs/type/matrix/DenseMatrix.js +138 -0
  80. package/lib/cjs/type/matrix/Matrix.js +10 -0
  81. package/lib/cjs/type/matrix/SparseMatrix.js +77 -3
  82. package/lib/cjs/type/matrix/function/matrix.js +2 -1
  83. package/lib/cjs/type/unit/Unit.js +15 -13
  84. package/lib/cjs/utils/array.js +1 -1
  85. package/lib/cjs/utils/customs.js +18 -4
  86. package/lib/cjs/utils/emitter.js +2 -2
  87. package/lib/cjs/utils/function.js +6 -2
  88. package/lib/cjs/utils/is.js +7 -5
  89. package/lib/cjs/utils/latex.js +2 -2
  90. package/lib/cjs/utils/map.js +197 -0
  91. package/lib/cjs/utils/object.js +6 -5
  92. package/lib/cjs/utils/scope.js +33 -0
  93. package/lib/cjs/utils/snapshot.js +17 -16
  94. package/lib/cjs/utils/string.js +6 -4
  95. package/lib/cjs/version.js +1 -1
  96. package/lib/esm/constants.js +15 -15
  97. package/lib/esm/core/create.js +1 -2
  98. package/lib/esm/core/function/typed.js +5 -1
  99. package/lib/esm/entry/configReadonly.js +1 -2
  100. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +34 -0
  101. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromColumns.generated.js +16 -0
  102. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromFunction.generated.js +14 -0
  103. package/lib/esm/entry/dependenciesAny/dependenciesMatrixFromRows.generated.js +16 -0
  104. package/lib/esm/entry/dependenciesAny.generated.js +3 -0
  105. package/lib/esm/entry/impureFunctionsAny.generated.js +13 -10
  106. package/lib/esm/entry/impureFunctionsNumber.generated.js +1 -1
  107. package/lib/esm/entry/pureFunctionsAny.generated.js +66 -32
  108. package/lib/esm/expression/Help.js +1 -1
  109. package/lib/esm/expression/Parser.js +23 -15
  110. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
  111. package/lib/esm/expression/embeddedDocs/function/matrix/column.js +1 -1
  112. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromColumns.js +8 -0
  113. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromFunction.js +8 -0
  114. package/lib/esm/expression/embeddedDocs/function/matrix/matrixFromRows.js +8 -0
  115. package/lib/esm/expression/embeddedDocs/function/matrix/row.js +1 -1
  116. package/lib/esm/expression/function/compile.js +1 -1
  117. package/lib/esm/expression/function/evaluate.js +6 -5
  118. package/lib/esm/expression/function/help.js +1 -1
  119. package/lib/esm/expression/function/parser.js +1 -1
  120. package/lib/esm/expression/keywords.js +1 -3
  121. package/lib/esm/expression/node/AccessorNode.js +2 -1
  122. package/lib/esm/expression/node/ArrayNode.js +1 -1
  123. package/lib/esm/expression/node/AssignmentNode.js +7 -4
  124. package/lib/esm/expression/node/BlockNode.js +1 -1
  125. package/lib/esm/expression/node/ConditionalNode.js +1 -1
  126. package/lib/esm/expression/node/ConstantNode.js +1 -1
  127. package/lib/esm/expression/node/FunctionAssignmentNode.js +3 -4
  128. package/lib/esm/expression/node/FunctionNode.js +57 -39
  129. package/lib/esm/expression/node/IndexNode.js +1 -1
  130. package/lib/esm/expression/node/Node.js +7 -8
  131. package/lib/esm/expression/node/ObjectNode.js +1 -1
  132. package/lib/esm/expression/node/OperatorNode.js +1 -1
  133. package/lib/esm/expression/node/ParenthesisNode.js +1 -1
  134. package/lib/esm/expression/node/RangeNode.js +1 -1
  135. package/lib/esm/expression/node/RelationalNode.js +1 -1
  136. package/lib/esm/expression/node/SymbolNode.js +3 -3
  137. package/lib/esm/expression/parse.js +2 -3
  138. package/lib/esm/expression/transform/apply.transform.js +1 -1
  139. package/lib/esm/expression/transform/column.transform.js +1 -1
  140. package/lib/esm/expression/transform/concat.transform.js +1 -1
  141. package/lib/esm/expression/transform/diff.transform.js +1 -1
  142. package/lib/esm/expression/transform/filter.transform.js +1 -1
  143. package/lib/esm/expression/transform/forEach.transform.js +1 -1
  144. package/lib/esm/expression/transform/index.transform.js +1 -1
  145. package/lib/esm/expression/transform/map.transform.js +1 -1
  146. package/lib/esm/expression/transform/max.transform.js +1 -1
  147. package/lib/esm/expression/transform/mean.transform.js +1 -1
  148. package/lib/esm/expression/transform/min.transform.js +1 -1
  149. package/lib/esm/expression/transform/range.transform.js +1 -1
  150. package/lib/esm/expression/transform/row.transform.js +1 -1
  151. package/lib/esm/expression/transform/std.transform.js +1 -1
  152. package/lib/esm/expression/transform/subset.transform.js +1 -1
  153. package/lib/esm/expression/transform/sum.transform.js +1 -1
  154. package/lib/esm/expression/transform/utils/compileInlineExpression.js +4 -3
  155. package/lib/esm/expression/transform/variance.transform.js +1 -1
  156. package/lib/esm/factoriesAny.js +3 -0
  157. package/lib/esm/factoriesNumber.js +1 -1
  158. package/lib/esm/function/algebra/decomposition/lup.js +1 -1
  159. package/lib/esm/function/algebra/decomposition/qr.js +2 -3
  160. package/lib/esm/function/algebra/decomposition/slu.js +1 -1
  161. package/lib/esm/function/algebra/derivative.js +1 -1
  162. package/lib/esm/function/algebra/rationalize.js +1 -1
  163. package/lib/esm/function/algebra/simplify/resolve.js +7 -2
  164. package/lib/esm/function/algebra/simplify/simplifyConstant.js +1 -1
  165. package/lib/esm/function/algebra/simplify/simplifyCore.js +1 -1
  166. package/lib/esm/function/algebra/simplify/util.js +1 -1
  167. package/lib/esm/function/algebra/simplify.js +16 -12
  168. package/lib/esm/function/algebra/solver/lsolve.js +1 -1
  169. package/lib/esm/function/algebra/solver/lsolveAll.js +1 -1
  170. package/lib/esm/function/algebra/solver/lusolve.js +1 -1
  171. package/lib/esm/function/algebra/solver/usolve.js +1 -1
  172. package/lib/esm/function/algebra/solver/usolveAll.js +1 -1
  173. package/lib/esm/function/algebra/sparse/csAmd.js +1 -1
  174. package/lib/esm/function/algebra/sparse/csChol.js +1 -1
  175. package/lib/esm/function/algebra/sparse/csCounts.js +1 -1
  176. package/lib/esm/function/algebra/sparse/csLu.js +1 -1
  177. package/lib/esm/function/algebra/sparse/csSpsolve.js +1 -1
  178. package/lib/esm/function/algebra/sparse/csSqr.js +1 -1
  179. package/lib/esm/function/algebra/sparse/csSymperm.js +1 -1
  180. package/lib/esm/function/arithmetic/abs.js +1 -1
  181. package/lib/esm/function/arithmetic/add.js +1 -1
  182. package/lib/esm/function/arithmetic/addScalar.js +1 -1
  183. package/lib/esm/function/arithmetic/cbrt.js +1 -1
  184. package/lib/esm/function/arithmetic/ceil.js +1 -1
  185. package/lib/esm/function/arithmetic/cube.js +1 -1
  186. package/lib/esm/function/arithmetic/divide.js +1 -1
  187. package/lib/esm/function/arithmetic/divideScalar.js +1 -1
  188. package/lib/esm/function/arithmetic/dotDivide.js +1 -1
  189. package/lib/esm/function/arithmetic/dotMultiply.js +1 -1
  190. package/lib/esm/function/arithmetic/dotPow.js +1 -1
  191. package/lib/esm/function/arithmetic/exp.js +1 -1
  192. package/lib/esm/function/arithmetic/expm1.js +1 -1
  193. package/lib/esm/function/arithmetic/fix.js +1 -1
  194. package/lib/esm/function/arithmetic/floor.js +1 -1
  195. package/lib/esm/function/arithmetic/gcd.js +1 -1
  196. package/lib/esm/function/arithmetic/hypot.js +1 -1
  197. package/lib/esm/function/arithmetic/lcm.js +1 -1
  198. package/lib/esm/function/arithmetic/log.js +1 -1
  199. package/lib/esm/function/arithmetic/log10.js +1 -1
  200. package/lib/esm/function/arithmetic/log1p.js +1 -1
  201. package/lib/esm/function/arithmetic/log2.js +1 -1
  202. package/lib/esm/function/arithmetic/mod.js +1 -1
  203. package/lib/esm/function/arithmetic/multiply.js +1 -1
  204. package/lib/esm/function/arithmetic/multiplyScalar.js +1 -1
  205. package/lib/esm/function/arithmetic/norm.js +3 -3
  206. package/lib/esm/function/arithmetic/nthRoot.js +2 -2
  207. package/lib/esm/function/arithmetic/nthRoots.js +1 -1
  208. package/lib/esm/function/arithmetic/pow.js +10 -8
  209. package/lib/esm/function/arithmetic/round.js +6 -6
  210. package/lib/esm/function/arithmetic/sign.js +1 -1
  211. package/lib/esm/function/arithmetic/sqrt.js +1 -1
  212. package/lib/esm/function/arithmetic/square.js +1 -1
  213. package/lib/esm/function/arithmetic/subtract.js +1 -1
  214. package/lib/esm/function/arithmetic/unaryMinus.js +1 -1
  215. package/lib/esm/function/arithmetic/unaryPlus.js +1 -1
  216. package/lib/esm/function/arithmetic/xgcd.js +1 -1
  217. package/lib/esm/function/bitwise/bitAnd.js +1 -1
  218. package/lib/esm/function/bitwise/bitNot.js +1 -1
  219. package/lib/esm/function/bitwise/bitOr.js +1 -1
  220. package/lib/esm/function/bitwise/bitXor.js +1 -1
  221. package/lib/esm/function/bitwise/leftShift.js +1 -1
  222. package/lib/esm/function/bitwise/rightArithShift.js +1 -1
  223. package/lib/esm/function/bitwise/rightLogShift.js +1 -1
  224. package/lib/esm/function/combinatorics/bellNumbers.js +1 -1
  225. package/lib/esm/function/combinatorics/catalan.js +1 -1
  226. package/lib/esm/function/combinatorics/composition.js +1 -1
  227. package/lib/esm/function/combinatorics/stirlingS2.js +1 -1
  228. package/lib/esm/function/complex/arg.js +1 -1
  229. package/lib/esm/function/complex/conj.js +1 -1
  230. package/lib/esm/function/complex/im.js +4 -1
  231. package/lib/esm/function/complex/re.js +4 -1
  232. package/lib/esm/function/geometry/distance.js +1 -1
  233. package/lib/esm/function/geometry/intersect.js +1 -1
  234. package/lib/esm/function/logical/and.js +1 -1
  235. package/lib/esm/function/logical/not.js +1 -1
  236. package/lib/esm/function/logical/or.js +1 -1
  237. package/lib/esm/function/logical/xor.js +1 -1
  238. package/lib/esm/function/matrix/apply.js +1 -1
  239. package/lib/esm/function/matrix/column.js +1 -1
  240. package/lib/esm/function/matrix/concat.js +1 -1
  241. package/lib/esm/function/matrix/count.js +1 -1
  242. package/lib/esm/function/matrix/cross.js +1 -1
  243. package/lib/esm/function/matrix/ctranspose.js +1 -1
  244. package/lib/esm/function/matrix/det.js +1 -1
  245. package/lib/esm/function/matrix/diag.js +1 -1
  246. package/lib/esm/function/matrix/diff.js +1 -1
  247. package/lib/esm/function/matrix/dot.js +1 -1
  248. package/lib/esm/function/matrix/eigs/complexEigs.js +586 -0
  249. package/lib/esm/function/matrix/eigs/realSymetric.js +335 -0
  250. package/lib/esm/function/matrix/eigs.js +187 -335
  251. package/lib/esm/function/matrix/expm.js +1 -1
  252. package/lib/esm/function/matrix/filter.js +1 -1
  253. package/lib/esm/function/matrix/flatten.js +2 -1
  254. package/lib/esm/function/matrix/forEach.js +1 -1
  255. package/lib/esm/function/matrix/getMatrixDataType.js +1 -1
  256. package/lib/esm/function/matrix/identity.js +1 -1
  257. package/lib/esm/function/matrix/inv.js +1 -1
  258. package/lib/esm/function/matrix/kron.js +1 -1
  259. package/lib/esm/function/matrix/map.js +1 -1
  260. package/lib/esm/function/matrix/matrixFromColumns.js +93 -0
  261. package/lib/esm/function/matrix/matrixFromFunction.js +78 -0
  262. package/lib/esm/function/matrix/matrixFromRows.js +83 -0
  263. package/lib/esm/function/matrix/ones.js +1 -1
  264. package/lib/esm/function/matrix/partitionSelect.js +1 -1
  265. package/lib/esm/function/matrix/range.js +1 -1
  266. package/lib/esm/function/matrix/reshape.js +1 -1
  267. package/lib/esm/function/matrix/resize.js +1 -1
  268. package/lib/esm/function/matrix/rotate.js +1 -1
  269. package/lib/esm/function/matrix/rotationMatrix.js +1 -1
  270. package/lib/esm/function/matrix/row.js +1 -1
  271. package/lib/esm/function/matrix/size.js +1 -1
  272. package/lib/esm/function/matrix/sort.js +1 -1
  273. package/lib/esm/function/matrix/sqrtm.js +1 -1
  274. package/lib/esm/function/matrix/squeeze.js +1 -1
  275. package/lib/esm/function/matrix/subset.js +1 -1
  276. package/lib/esm/function/matrix/trace.js +1 -1
  277. package/lib/esm/function/matrix/transpose.js +1 -1
  278. package/lib/esm/function/matrix/zeros.js +1 -1
  279. package/lib/esm/function/probability/combinations.js +1 -1
  280. package/lib/esm/function/probability/combinationsWithRep.js +1 -1
  281. package/lib/esm/function/probability/factorial.js +1 -1
  282. package/lib/esm/function/probability/gamma.js +1 -1
  283. package/lib/esm/function/probability/kldivergence.js +1 -1
  284. package/lib/esm/function/probability/multinomial.js +1 -1
  285. package/lib/esm/function/probability/permutations.js +1 -1
  286. package/lib/esm/function/probability/pickRandom.js +2 -2
  287. package/lib/esm/function/probability/random.js +2 -2
  288. package/lib/esm/function/probability/randomInt.js +1 -1
  289. package/lib/esm/function/relational/compare.js +2 -2
  290. package/lib/esm/function/relational/compareNatural.js +1 -1
  291. package/lib/esm/function/relational/compareText.js +2 -2
  292. package/lib/esm/function/relational/deepEqual.js +1 -1
  293. package/lib/esm/function/relational/equal.js +2 -2
  294. package/lib/esm/function/relational/equalScalar.js +2 -2
  295. package/lib/esm/function/relational/equalText.js +1 -1
  296. package/lib/esm/function/relational/larger.js +2 -2
  297. package/lib/esm/function/relational/largerEq.js +2 -2
  298. package/lib/esm/function/relational/smaller.js +2 -2
  299. package/lib/esm/function/relational/smallerEq.js +2 -2
  300. package/lib/esm/function/relational/unequal.js +2 -2
  301. package/lib/esm/function/set/setCartesian.js +1 -1
  302. package/lib/esm/function/set/setDifference.js +1 -1
  303. package/lib/esm/function/set/setDistinct.js +1 -1
  304. package/lib/esm/function/set/setIntersect.js +1 -1
  305. package/lib/esm/function/set/setIsSubset.js +1 -1
  306. package/lib/esm/function/set/setMultiplicity.js +1 -1
  307. package/lib/esm/function/set/setPowerset.js +1 -1
  308. package/lib/esm/function/set/setSize.js +1 -1
  309. package/lib/esm/function/set/setSymDifference.js +1 -1
  310. package/lib/esm/function/set/setUnion.js +1 -1
  311. package/lib/esm/function/special/erf.js +1 -1
  312. package/lib/esm/function/statistics/mad.js +1 -1
  313. package/lib/esm/function/statistics/max.js +1 -1
  314. package/lib/esm/function/statistics/mean.js +1 -1
  315. package/lib/esm/function/statistics/median.js +1 -1
  316. package/lib/esm/function/statistics/min.js +1 -1
  317. package/lib/esm/function/statistics/mode.js +1 -1
  318. package/lib/esm/function/statistics/prod.js +1 -1
  319. package/lib/esm/function/statistics/quantileSeq.js +1 -1
  320. package/lib/esm/function/statistics/std.js +1 -1
  321. package/lib/esm/function/statistics/sum.js +1 -1
  322. package/lib/esm/function/statistics/variance.js +1 -1
  323. package/lib/esm/function/string/bin.js +1 -1
  324. package/lib/esm/function/string/format.js +1 -1
  325. package/lib/esm/function/string/hex.js +1 -1
  326. package/lib/esm/function/string/oct.js +1 -1
  327. package/lib/esm/function/string/print.js +1 -1
  328. package/lib/esm/function/trigonometry/acos.js +1 -1
  329. package/lib/esm/function/trigonometry/acosh.js +1 -1
  330. package/lib/esm/function/trigonometry/acot.js +1 -1
  331. package/lib/esm/function/trigonometry/acoth.js +1 -1
  332. package/lib/esm/function/trigonometry/acsc.js +1 -1
  333. package/lib/esm/function/trigonometry/acsch.js +1 -1
  334. package/lib/esm/function/trigonometry/asec.js +1 -1
  335. package/lib/esm/function/trigonometry/asech.js +1 -1
  336. package/lib/esm/function/trigonometry/asin.js +1 -1
  337. package/lib/esm/function/trigonometry/asinh.js +1 -1
  338. package/lib/esm/function/trigonometry/atan.js +1 -1
  339. package/lib/esm/function/trigonometry/atan2.js +1 -1
  340. package/lib/esm/function/trigonometry/atanh.js +1 -1
  341. package/lib/esm/function/trigonometry/cos.js +1 -1
  342. package/lib/esm/function/trigonometry/cosh.js +1 -1
  343. package/lib/esm/function/trigonometry/cot.js +1 -1
  344. package/lib/esm/function/trigonometry/coth.js +1 -1
  345. package/lib/esm/function/trigonometry/csc.js +1 -1
  346. package/lib/esm/function/trigonometry/csch.js +1 -1
  347. package/lib/esm/function/trigonometry/sec.js +1 -1
  348. package/lib/esm/function/trigonometry/sech.js +1 -1
  349. package/lib/esm/function/trigonometry/sin.js +1 -1
  350. package/lib/esm/function/trigonometry/sinh.js +1 -1
  351. package/lib/esm/function/trigonometry/tan.js +1 -1
  352. package/lib/esm/function/trigonometry/tanh.js +1 -1
  353. package/lib/esm/function/unit/to.js +1 -1
  354. package/lib/esm/function/utils/clone.js +1 -1
  355. package/lib/esm/function/utils/hasNumericValue.js +1 -1
  356. package/lib/esm/function/utils/isInteger.js +1 -1
  357. package/lib/esm/function/utils/isNaN.js +1 -1
  358. package/lib/esm/function/utils/isNegative.js +1 -1
  359. package/lib/esm/function/utils/isNumeric.js +1 -1
  360. package/lib/esm/function/utils/isPositive.js +1 -1
  361. package/lib/esm/function/utils/isPrime.js +1 -1
  362. package/lib/esm/function/utils/isZero.js +1 -1
  363. package/lib/esm/function/utils/numeric.js +1 -1
  364. package/lib/esm/function/utils/typeOf.js +1 -1
  365. package/lib/esm/json/reviver.js +1 -1
  366. package/lib/esm/type/bignumber/BigNumber.js +1 -1
  367. package/lib/esm/type/bignumber/function/bignumber.js +1 -1
  368. package/lib/esm/type/boolean.js +1 -1
  369. package/lib/esm/type/chain/Chain.js +1 -1
  370. package/lib/esm/type/chain/function/chain.js +1 -1
  371. package/lib/esm/type/complex/function/complex.js +1 -1
  372. package/lib/esm/type/fraction/function/fraction.js +1 -1
  373. package/lib/esm/type/matrix/DenseMatrix.js +75 -1
  374. package/lib/esm/type/matrix/FibonacciHeap.js +1 -1
  375. package/lib/esm/type/matrix/ImmutableDenseMatrix.js +1 -1
  376. package/lib/esm/type/matrix/Matrix.js +10 -0
  377. package/lib/esm/type/matrix/MatrixIndex.js +1 -1
  378. package/lib/esm/type/matrix/Spa.js +1 -1
  379. package/lib/esm/type/matrix/SparseMatrix.js +37 -3
  380. package/lib/esm/type/matrix/function/index.js +1 -1
  381. package/lib/esm/type/matrix/function/matrix.js +3 -2
  382. package/lib/esm/type/matrix/function/sparse.js +1 -1
  383. package/lib/esm/type/matrix/utils/algorithm01.js +1 -1
  384. package/lib/esm/type/matrix/utils/algorithm02.js +1 -1
  385. package/lib/esm/type/matrix/utils/algorithm03.js +1 -1
  386. package/lib/esm/type/matrix/utils/algorithm04.js +1 -1
  387. package/lib/esm/type/matrix/utils/algorithm05.js +1 -1
  388. package/lib/esm/type/matrix/utils/algorithm06.js +1 -1
  389. package/lib/esm/type/matrix/utils/algorithm07.js +1 -1
  390. package/lib/esm/type/matrix/utils/algorithm08.js +1 -1
  391. package/lib/esm/type/matrix/utils/algorithm09.js +1 -1
  392. package/lib/esm/type/matrix/utils/algorithm10.js +1 -1
  393. package/lib/esm/type/matrix/utils/algorithm11.js +1 -1
  394. package/lib/esm/type/matrix/utils/algorithm12.js +1 -1
  395. package/lib/esm/type/matrix/utils/algorithm13.js +1 -1
  396. package/lib/esm/type/matrix/utils/algorithm14.js +1 -1
  397. package/lib/esm/type/number.js +1 -1
  398. package/lib/esm/type/string.js +1 -1
  399. package/lib/esm/type/unit/Unit.js +4 -5
  400. package/lib/esm/type/unit/function/createUnit.js +1 -1
  401. package/lib/esm/type/unit/function/splitUnit.js +1 -1
  402. package/lib/esm/type/unit/function/unit.js +1 -1
  403. package/lib/esm/type/unit/physicalConstants.js +2 -2
  404. package/lib/esm/utils/array.js +1 -1
  405. package/lib/esm/utils/customs.js +10 -0
  406. package/lib/esm/utils/map.js +135 -0
  407. package/lib/esm/utils/scope.js +26 -0
  408. package/lib/esm/utils/snapshot.js +3 -4
  409. package/lib/esm/version.js +1 -1
  410. package/package.json +18 -9
@@ -0,0 +1,586 @@
1
+ import { clone } from '../../../utils/object.js';
2
+ export function createComplexEigs(_ref) {
3
+ var {
4
+ addScalar,
5
+ subtract,
6
+ flatten,
7
+ multiply,
8
+ multiplyScalar,
9
+ divideScalar,
10
+ sqrt,
11
+ abs,
12
+ bignumber,
13
+ diag,
14
+ inv,
15
+ qr,
16
+ usolveAll,
17
+ equal,
18
+ complex,
19
+ larger,
20
+ smaller,
21
+ round,
22
+ log10,
23
+ transpose,
24
+ matrixFromColumns
25
+ } = _ref;
26
+
27
+ /**
28
+ * @param {number[][]} arr the matrix to find eigenvalues of
29
+ * @param {number} N size of the matrix
30
+ * @param {number|BigNumber} prec precision, anything lower will be considered zero
31
+ * @param {'number'|'BigNumber'|'Complex'} type
32
+ * @param {boolean} findVectors should we find eigenvectors?
33
+ *
34
+ * @returns {{ values: number[], vectors: number[][] }}
35
+ */
36
+ function complexEigs(arr, N, prec, type, findVectors) {
37
+ if (findVectors === undefined) {
38
+ findVectors = true;
39
+ } // TODO check if any row/col are zero except the diagonal
40
+ // make sure corresponding rows and columns have similar magnitude
41
+ // important because of numerical stability
42
+
43
+
44
+ var R = balance(arr, N, prec, type, findVectors); // R is the row transformation matrix
45
+ // A' = R A R⁻¹, A is the original matrix
46
+ // (if findVectors is false, R is undefined)
47
+ // TODO if magnitudes of elements vary over many orders,
48
+ // move greatest elements to the top left corner
49
+ // using similarity transformations, reduce the matrix
50
+ // to Hessenberg form (upper triangular plus one subdiagonal row)
51
+ // updates the transformation matrix R with new row operationsq
52
+
53
+ reduceToHessenberg(arr, N, prec, type, findVectors, R); // find eigenvalues
54
+
55
+ var {
56
+ values,
57
+ C
58
+ } = iterateUntilTriangular(arr, N, prec, type, findVectors); // values is the list of eigenvalues, C is the column
59
+ // transformation matrix that transforms the hessenberg
60
+ // matrix to upper triangular
61
+ // compose transformations A → hess. and hess. → triang.
62
+
63
+ C = multiply(inv(R), C);
64
+ var vectors;
65
+
66
+ if (findVectors) {
67
+ vectors = findEigenvectors(arr, N, C, values, prec);
68
+ vectors = matrixFromColumns(...vectors);
69
+ }
70
+
71
+ return {
72
+ values,
73
+ vectors
74
+ };
75
+ }
76
+ /**
77
+ * @param {number[][]} arr
78
+ * @param {number} N
79
+ * @param {number} prec
80
+ * @param {'number'|'BigNumber'|'Complex'} type
81
+ * @returns {number[][]}
82
+ */
83
+
84
+
85
+ function balance(arr, N, prec, type, findVectors) {
86
+ var big = type === 'BigNumber';
87
+ var cplx = type === 'Complex';
88
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
89
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1; // base of the floating-point arithmetic
90
+
91
+ var radix = big ? bignumber(10) : 2;
92
+ var radixSq = multiplyScalar(radix, radix); // the diagonal transformation matrix R
93
+
94
+ var Rdiag;
95
+
96
+ if (findVectors) {
97
+ Rdiag = Array(N).fill(one);
98
+ } // this isn't the only time we loop thru the matrix...
99
+
100
+
101
+ var last = false;
102
+
103
+ while (!last) {
104
+ // ...haha I'm joking! unless...
105
+ last = true;
106
+
107
+ for (var i = 0; i < N; i++) {
108
+ // compute the taxicab norm of i-th column and row
109
+ // TODO optimize for complex numbers
110
+ var colNorm = zero;
111
+ var rowNorm = zero;
112
+
113
+ for (var j = 0; j < N; j++) {
114
+ if (i === j) continue;
115
+ var c = abs(arr[i][j]);
116
+ colNorm = addScalar(colNorm, c);
117
+ rowNorm = addScalar(rowNorm, c);
118
+ }
119
+
120
+ if (!equal(colNorm, 0) && !equal(rowNorm, 0)) {
121
+ // find integer power closest to balancing the matrix
122
+ // (we want to scale only by integer powers of radix,
123
+ // so that we don't lose any precision due to round-off)
124
+ var f = one;
125
+ var _c = colNorm;
126
+ var rowDivRadix = divideScalar(rowNorm, radix);
127
+ var rowMulRadix = multiplyScalar(rowNorm, radix);
128
+
129
+ while (smaller(_c, rowDivRadix)) {
130
+ _c = multiplyScalar(_c, radixSq);
131
+ f = multiplyScalar(f, radix);
132
+ }
133
+
134
+ while (larger(_c, rowMulRadix)) {
135
+ _c = divideScalar(_c, radixSq);
136
+ f = divideScalar(f, radix);
137
+ } // check whether balancing is needed
138
+ // condition = (c + rowNorm) / f < 0.95 * (colNorm + rowNorm)
139
+
140
+
141
+ var condition = smaller(divideScalar(addScalar(_c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95)); // apply balancing similarity transformation
142
+
143
+ if (condition) {
144
+ // we should loop once again to check whether
145
+ // another rebalancing is needed
146
+ last = false;
147
+ var g = divideScalar(1, f);
148
+
149
+ for (var _j = 0; _j < N; _j++) {
150
+ if (i === _j) {
151
+ continue;
152
+ }
153
+
154
+ arr[i][_j] = multiplyScalar(arr[i][_j], f);
155
+ arr[_j][i] = multiplyScalar(arr[_j][i], g);
156
+ } // keep track of transformations
157
+
158
+
159
+ if (findVectors) {
160
+ Rdiag[i] = multiplyScalar(Rdiag[i], f);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ } // return the diagonal row transformation matrix
166
+
167
+
168
+ return diag(Rdiag);
169
+ }
170
+ /**
171
+ * @param {number[][]} arr
172
+ * @param {number} N
173
+ * @param {number} prec
174
+ * @param {'number'|'BigNumber'|'Complex'} type
175
+ * @param {boolean} findVectors
176
+ * @param {number[][]} R the row transformation matrix that will be modified
177
+ */
178
+
179
+
180
+ function reduceToHessenberg(arr, N, prec, type, findVectors, R) {
181
+ var big = type === 'BigNumber';
182
+ var cplx = type === 'Complex';
183
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
184
+
185
+ if (big) {
186
+ prec = bignumber(prec);
187
+ }
188
+
189
+ for (var i = 0; i < N - 2; i++) {
190
+ // Find the largest subdiag element in the i-th col
191
+ var maxIndex = 0;
192
+ var max = zero;
193
+
194
+ for (var j = i + 1; j < N; j++) {
195
+ var el = arr[j][i];
196
+
197
+ if (smaller(abs(max), abs(el))) {
198
+ max = el;
199
+ maxIndex = j;
200
+ }
201
+ } // This col is pivoted, no need to do anything
202
+
203
+
204
+ if (smaller(abs(max), prec)) {
205
+ continue;
206
+ }
207
+
208
+ if (maxIndex !== i + 1) {
209
+ // Interchange maxIndex-th and (i+1)-th row
210
+ var tmp1 = arr[maxIndex];
211
+ arr[maxIndex] = arr[i + 1];
212
+ arr[i + 1] = tmp1; // Interchange maxIndex-th and (i+1)-th column
213
+
214
+ for (var _j2 = 0; _j2 < N; _j2++) {
215
+ var tmp2 = arr[_j2][maxIndex];
216
+ arr[_j2][maxIndex] = arr[_j2][i + 1];
217
+ arr[_j2][i + 1] = tmp2;
218
+ } // keep track of transformations
219
+
220
+
221
+ if (findVectors) {
222
+ var tmp3 = R[maxIndex];
223
+ R[maxIndex] = R[i + 1];
224
+ R[i + 1] = tmp3;
225
+ }
226
+ } // Reduce following rows and columns
227
+
228
+
229
+ for (var _j3 = i + 2; _j3 < N; _j3++) {
230
+ var n = divideScalar(arr[_j3][i], max);
231
+
232
+ if (n === 0) {
233
+ continue;
234
+ } // from j-th row subtract n-times (i+1)th row
235
+
236
+
237
+ for (var k = 0; k < N; k++) {
238
+ arr[_j3][k] = subtract(arr[_j3][k], multiplyScalar(n, arr[i + 1][k]));
239
+ } // to (i+1)th column add n-times j-th column
240
+
241
+
242
+ for (var _k = 0; _k < N; _k++) {
243
+ arr[_k][i + 1] = addScalar(arr[_k][i + 1], multiplyScalar(n, arr[_k][_j3]));
244
+ } // keep track of transformations
245
+
246
+
247
+ if (findVectors) {
248
+ for (var _k2 = 0; _k2 < N; _k2++) {
249
+ R[_j3][_k2] = subtract(R[_j3][_k2], multiplyScalar(n, R[i + 1][_k2]));
250
+ }
251
+ }
252
+ }
253
+ }
254
+
255
+ return R;
256
+ }
257
+ /**
258
+ * @returns {{values: values, C: Matrix}}
259
+ * @see Press, Wiliams: Numerical recipes in Fortran 77
260
+ * @see https://en.wikipedia.org/wiki/QR_algorithm
261
+ */
262
+
263
+
264
+ function iterateUntilTriangular(A, N, prec, type, findVectors) {
265
+ var big = type === 'BigNumber';
266
+ var cplx = type === 'Complex';
267
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1;
268
+
269
+ if (big) {
270
+ prec = bignumber(prec);
271
+ } // The Francis Algorithm
272
+ // The core idea of this algorithm is that doing successive
273
+ // A' = Q⁺AQ transformations will eventually converge to block-
274
+ // upper-triangular with diagonal blocks either 1x1 or 2x2.
275
+ // The Q here is the one from the QR decomposition, A = QR.
276
+ // Since the eigenvalues of a block-upper-triangular matrix are
277
+ // the eigenvalues of its diagonal blocks and we know how to find
278
+ // eigenvalues of a 2x2 matrix, we know the eigenvalues of A.
279
+
280
+
281
+ var arr = clone(A); // the list of converged eigenvalues
282
+
283
+ var lambdas = []; // size of arr, which will get smaller as eigenvalues converge
284
+
285
+ var n = N; // the diagonal of the block-diagonal matrix that turns
286
+ // converged 2x2 matrices into upper triangular matrices
287
+
288
+ var Sdiag = []; // N×N matrix describing the overall transformation done during the QR algorithm
289
+
290
+ var Qtotal = findVectors ? diag(Array(N).fill(one)) : undefined; // n×n matrix describing the QR transformations done since last convergence
291
+
292
+ var Qpartial = findVectors ? diag(Array(n).fill(one)) : undefined; // last eigenvalue converged before this many steps
293
+
294
+ var lastConvergenceBefore = 0;
295
+
296
+ while (lastConvergenceBefore <= 100) {
297
+ lastConvergenceBefore += 1; // TODO if the convergence is slow, do something clever
298
+ // Perform the factorization
299
+
300
+ var k = 0; // TODO set close to an eigenvalue
301
+
302
+ for (var i = 0; i < n; i++) {
303
+ arr[i][i] = subtract(arr[i][i], k);
304
+ } // TODO do an implicit QR transformation
305
+
306
+
307
+ var {
308
+ Q,
309
+ R
310
+ } = qr(arr);
311
+ arr = multiply(R, Q);
312
+
313
+ for (var _i = 0; _i < n; _i++) {
314
+ arr[_i][_i] = addScalar(arr[_i][_i], k);
315
+ } // keep track of transformations
316
+
317
+
318
+ if (findVectors) {
319
+ Qpartial = multiply(Qpartial, Q);
320
+ } // The rightmost diagonal element converged to an eigenvalue
321
+
322
+
323
+ if (n === 1 || smaller(abs(arr[n - 1][n - 2]), prec)) {
324
+ lastConvergenceBefore = 0;
325
+ lambdas.push(arr[n - 1][n - 1]); // keep track of transformations
326
+
327
+ if (findVectors) {
328
+ Sdiag.unshift([[1]]);
329
+ inflateMatrix(Qpartial, N);
330
+ Qtotal = multiply(Qtotal, Qpartial);
331
+
332
+ if (n > 1) {
333
+ Qpartial = diag(Array(n - 1).fill(one));
334
+ }
335
+ } // reduce the matrix size
336
+
337
+
338
+ n -= 1;
339
+ arr.pop();
340
+
341
+ for (var _i2 = 0; _i2 < n; _i2++) {
342
+ arr[_i2].pop();
343
+ } // The rightmost diagonal 2x2 block converged
344
+
345
+ } else if (n === 2 || smaller(abs(arr[n - 2][n - 3]), prec)) {
346
+ lastConvergenceBefore = 0;
347
+ var ll = eigenvalues2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1]);
348
+ lambdas.push(...ll); // keep track of transformations
349
+
350
+ if (findVectors) {
351
+ Sdiag.unshift(jordanBase2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1], ll[0], ll[1], prec, type));
352
+ inflateMatrix(Qpartial, N);
353
+ Qtotal = multiply(Qtotal, Qpartial);
354
+
355
+ if (n > 2) {
356
+ Qpartial = diag(Array(n - 2).fill(one));
357
+ }
358
+ } // reduce the matrix size
359
+
360
+
361
+ n -= 2;
362
+ arr.pop();
363
+ arr.pop();
364
+
365
+ for (var _i3 = 0; _i3 < n; _i3++) {
366
+ arr[_i3].pop();
367
+
368
+ arr[_i3].pop();
369
+ }
370
+ }
371
+
372
+ if (n === 0) {
373
+ break;
374
+ }
375
+ } // standard sorting
376
+
377
+
378
+ lambdas.sort((a, b) => +subtract(abs(a), abs(b))); // the algorithm didn't converge
379
+
380
+ if (lastConvergenceBefore > 100) {
381
+ var err = Error('The eigenvalues failed to converge. Only found these eigenvalues: ' + lambdas.join(', '));
382
+ err.values = lambdas;
383
+ err.vectors = [];
384
+ throw err;
385
+ } // combine the overall QR transformation Qtotal with the subsequent
386
+ // transformation S that turns the diagonal 2x2 blocks to upper triangular
387
+
388
+
389
+ var C = findVectors ? multiply(Qtotal, blockDiag(Sdiag, N)) : undefined;
390
+ return {
391
+ values: lambdas,
392
+ C
393
+ };
394
+ }
395
+ /**
396
+ * @param {Matrix} A original matrix
397
+ * @param {number} N size of A
398
+ * @param {Matrix} C column transformation matrix that turns A into upper triangular
399
+ * @param {number[]} values array of eigenvalues of A
400
+ * @returns {number[][]} eigenvalues
401
+ */
402
+
403
+
404
+ function findEigenvectors(A, N, C, values, prec) {
405
+ var Cinv = inv(C);
406
+ var U = multiply(Cinv, A, C); // turn values into a kind of "multiset"
407
+ // this way it is easier to find eigenvectors
408
+
409
+ var uniqueValues = [];
410
+ var multiplicities = [];
411
+
412
+ for (var λ of values) {
413
+ var i = indexOf(uniqueValues, λ, equal);
414
+
415
+ if (i === -1) {
416
+ // a dirty trick that helps us find more vectors
417
+ // TODO with iterative algorithm this can be removed
418
+ // Note: the round around log10 is needed to prevent rounding off errors in IE
419
+ var rounded = round(λ, subtract(-1, round(log10(prec))));
420
+ uniqueValues.push(rounded);
421
+ multiplicities.push(1);
422
+ } else {
423
+ multiplicities[i] += 1;
424
+ }
425
+ } // find eigenvectors by solving U − λE = 0
426
+ // TODO replace with an iterative eigenvector algorithm
427
+ // (this one might fail for imprecise eigenvalues)
428
+
429
+
430
+ var vectors = [];
431
+ var len = uniqueValues.length;
432
+ var b = Array(N).fill(0);
433
+ var E = diag(Array(N).fill(1)); // eigenvalues for which usolve failed (due to numerical error)
434
+
435
+ var failedLambdas = [];
436
+
437
+ for (var _i4 = 0; _i4 < len; _i4++) {
438
+ var _λ = uniqueValues[_i4];
439
+ var solutions = usolveAll(subtract(U, multiply(_λ, E)), b);
440
+ solutions = solutions.map(v => multiply(C, v));
441
+ solutions.shift(); // ignore the null vector
442
+ // looks like we missed something
443
+
444
+ if (solutions.length < multiplicities[_i4]) {
445
+ failedLambdas.push(_λ);
446
+ }
447
+
448
+ vectors.push(...solutions.map(v => flatten(v)));
449
+ }
450
+
451
+ if (failedLambdas.length !== 0) {
452
+ var err = new Error('Failed to find eigenvectors for the following eigenvalues: ' + failedLambdas.join(', '));
453
+ err.values = values;
454
+ err.vectors = vectors;
455
+ throw err;
456
+ }
457
+
458
+ return vectors;
459
+ }
460
+ /**
461
+ * Compute the eigenvalues of an 2x2 matrix
462
+ * @return {[number,number]}
463
+ */
464
+
465
+
466
+ function eigenvalues2x2(a, b, c, d) {
467
+ // λ± = ½ trA ± ½ √( tr²A - 4 detA )
468
+ var trA = addScalar(a, d);
469
+ var detA = subtract(multiplyScalar(a, d), multiplyScalar(b, c));
470
+ var x = multiplyScalar(trA, 0.5);
471
+ var y = multiplyScalar(sqrt(subtract(multiplyScalar(trA, trA), multiplyScalar(4, detA))), 0.5);
472
+ return [addScalar(x, y), subtract(x, y)];
473
+ }
474
+ /**
475
+ * For an 2x2 matrix compute the transformation matrix S,
476
+ * so that SAS⁻¹ is an upper triangular matrix
477
+ * @return {[[number,number],[number,number]]}
478
+ * @see https://math.berkeley.edu/~ogus/old/Math_54-05/webfoils/jordan.pdf
479
+ * @see http://people.math.harvard.edu/~knill/teaching/math21b2004/exhibits/2dmatrices/index.html
480
+ */
481
+
482
+
483
+ function jordanBase2x2(a, b, c, d, l1, l2, prec, type) {
484
+ var big = type === 'BigNumber';
485
+ var cplx = type === 'Complex';
486
+ var zero = big ? bignumber(0) : cplx ? complex(0) : 0;
487
+ var one = big ? bignumber(1) : cplx ? complex(1) : 1; // matrix is already upper triangular
488
+ // return an identity matrix
489
+
490
+ if (smaller(abs(c), prec)) {
491
+ return [[one, zero], [zero, one]];
492
+ } // matrix is diagonalizable
493
+ // return its eigenvectors as columns
494
+
495
+
496
+ if (larger(abs(subtract(l1, l2)), prec)) {
497
+ return [[subtract(l1, d), subtract(l2, d)], [c, c]];
498
+ } // matrix is not diagonalizable
499
+ // compute off-diagonal elements of N = A - λI
500
+ // N₁₂ = 0 ⇒ S = ( N⃗₁, I⃗₁ )
501
+ // N₁₂ ≠ 0 ⇒ S = ( N⃗₂, I⃗₂ )
502
+
503
+
504
+ var na = subtract(a, l1);
505
+ var nb = subtract(b, l1);
506
+ var nc = subtract(c, l1);
507
+ var nd = subtract(d, l1);
508
+
509
+ if (smaller(abs(nb), prec)) {
510
+ return [[na, one], [nc, zero]];
511
+ } else {
512
+ return [[nb, zero], [nd, one]];
513
+ }
514
+ }
515
+ /**
516
+ * Enlarge the matrix from n×n to N×N, setting the new
517
+ * elements to 1 on diagonal and 0 elsewhere
518
+ */
519
+
520
+
521
+ function inflateMatrix(arr, N) {
522
+ // add columns
523
+ for (var i = 0; i < arr.length; i++) {
524
+ arr[i].push(...Array(N - arr[i].length).fill(0));
525
+ } // add rows
526
+
527
+
528
+ for (var _i5 = arr.length; _i5 < N; _i5++) {
529
+ arr.push(Array(N).fill(0));
530
+ arr[_i5][_i5] = 1;
531
+ }
532
+
533
+ return arr;
534
+ }
535
+ /**
536
+ * Create a block-diagonal matrix with the given square matrices on the diagonal
537
+ * @param {Matrix[] | number[][][]} arr array of matrices to be placed on the diagonal
538
+ * @param {number} N the size of the resulting matrix
539
+ */
540
+
541
+
542
+ function blockDiag(arr, N) {
543
+ var M = [];
544
+
545
+ for (var i = 0; i < N; i++) {
546
+ M[i] = Array(N).fill(0);
547
+ }
548
+
549
+ var I = 0;
550
+
551
+ for (var sub of arr) {
552
+ var n = sub.length;
553
+
554
+ for (var _i6 = 0; _i6 < n; _i6++) {
555
+ for (var j = 0; j < n; j++) {
556
+ M[I + _i6][I + j] = sub[_i6][j];
557
+ }
558
+ }
559
+
560
+ I += n;
561
+ }
562
+
563
+ return M;
564
+ }
565
+ /**
566
+ * Finds the index of an element in an array using a custom equality function
567
+ * @template T
568
+ * @param {Array<T>} arr array in which to search
569
+ * @param {T} el the element to find
570
+ * @param {function(T, T): boolean} fn the equality function, first argument is an element of `arr`, the second is always `el`
571
+ * @returns {number} the index of `el`, or -1 when it's not in `arr`
572
+ */
573
+
574
+
575
+ function indexOf(arr, el, fn) {
576
+ for (var i = 0; i < arr.length; i++) {
577
+ if (fn(arr[i], el)) {
578
+ return i;
579
+ }
580
+ }
581
+
582
+ return -1;
583
+ }
584
+
585
+ return complexEigs;
586
+ }