mathjs 9.5.2 → 10.1.0

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 (101) hide show
  1. package/HISTORY.md +43 -1
  2. package/NOTICE +1 -1
  3. package/README.md +10 -2
  4. package/bin/cli.js +1 -1
  5. package/docs/expressions/syntax.md +1 -1
  6. package/docs/reference/constants.md +1 -1
  7. package/docs/reference/functions/invmod.md +41 -0
  8. package/docs/reference/functions.md +1 -0
  9. package/examples/expressions.js +1 -1
  10. package/lib/browser/math.js +7 -7
  11. package/lib/browser/math.js.map +1 -1
  12. package/lib/cjs/constants.js +1 -1
  13. package/lib/cjs/core/function/config.js +1 -1
  14. package/lib/cjs/core/function/import.js +2 -1
  15. package/lib/cjs/entry/dependenciesAny/dependenciesIntersect.generated.js +6 -0
  16. package/lib/cjs/entry/dependenciesAny/dependenciesInvmod.generated.js +41 -0
  17. package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +15 -0
  18. package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +15 -0
  19. package/lib/cjs/entry/dependenciesAny.generated.js +1002 -994
  20. package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +15 -0
  21. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +15 -0
  22. package/lib/cjs/entry/dependenciesNumber.generated.js +581 -581
  23. package/lib/cjs/entry/impureFunctionsAny.generated.js +325 -313
  24. package/lib/cjs/entry/impureFunctionsNumber.generated.js +233 -222
  25. package/lib/cjs/entry/mainAny.js +8 -8
  26. package/lib/cjs/entry/mainNumber.js +8 -8
  27. package/lib/cjs/entry/pureFunctionsAny.generated.js +1111 -1097
  28. package/lib/cjs/entry/pureFunctionsNumber.generated.js +375 -375
  29. package/lib/cjs/entry/typeChecks.js +12 -12
  30. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -1
  31. package/lib/cjs/expression/embeddedDocs/function/arithmetic/invmod.js +15 -0
  32. package/lib/cjs/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  33. package/lib/cjs/expression/operators.js +1 -1
  34. package/lib/cjs/factoriesAny.js +668 -660
  35. package/lib/cjs/factoriesNumber.js +268 -237
  36. package/lib/cjs/function/algebra/rationalize.js +18 -4
  37. package/lib/cjs/function/algebra/simplify/simplifyConstant.js +223 -29
  38. package/lib/cjs/function/algebra/simplify/simplifyCore.js +34 -6
  39. package/lib/cjs/function/algebra/simplify.js +73 -22
  40. package/lib/cjs/function/arithmetic/invmod.js +73 -0
  41. package/lib/cjs/function/arithmetic/round.js +2 -2
  42. package/lib/cjs/function/geometry/intersect.js +12 -13
  43. package/lib/cjs/function/probability/gamma.js +28 -30
  44. package/lib/cjs/header.js +3 -3
  45. package/lib/cjs/plain/bignumber/arithmetic.js +2 -2
  46. package/lib/cjs/plain/number/arithmetic.js +10 -10
  47. package/lib/cjs/plain/number/constants.js +1 -1
  48. package/lib/cjs/plain/number/logical.js +1 -1
  49. package/lib/cjs/plain/number/probability.js +2 -1
  50. package/lib/cjs/plain/number/trigonometry.js +1 -1
  51. package/lib/cjs/plain/number/utils.js +1 -1
  52. package/lib/cjs/type/matrix/SparseMatrix.js +19 -15
  53. package/lib/cjs/type/unit/Unit.js +2 -2
  54. package/lib/cjs/type/unit/physicalConstants.js +1 -1
  55. package/lib/cjs/utils/array.js +14 -14
  56. package/lib/cjs/utils/bignumber/bitwise.js +1 -1
  57. package/lib/cjs/utils/customs.js +5 -5
  58. package/lib/cjs/utils/factory.js +3 -3
  59. package/lib/cjs/utils/function.js +1 -1
  60. package/lib/cjs/utils/is.js +23 -23
  61. package/lib/cjs/utils/latex.js +2 -1
  62. package/lib/cjs/utils/map.js +3 -3
  63. package/lib/cjs/utils/noop.js +1 -1
  64. package/lib/cjs/utils/number.js +11 -7
  65. package/lib/cjs/utils/object.js +8 -8
  66. package/lib/cjs/utils/snapshot.js +3 -3
  67. package/lib/cjs/utils/string.js +2 -2
  68. package/lib/cjs/version.js +1 -1
  69. package/lib/esm/core/function/import.js +2 -1
  70. package/lib/esm/entry/dependenciesAny/dependenciesIntersect.generated.js +4 -0
  71. package/lib/esm/entry/dependenciesAny/dependenciesInvmod.generated.js +24 -0
  72. package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +10 -0
  73. package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +10 -0
  74. package/lib/esm/entry/dependenciesAny.generated.js +271 -270
  75. package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +10 -0
  76. package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +10 -0
  77. package/lib/esm/entry/dependenciesNumber.generated.js +163 -163
  78. package/lib/esm/entry/impureFunctionsAny.generated.js +312 -301
  79. package/lib/esm/entry/impureFunctionsNumber.generated.js +221 -211
  80. package/lib/esm/entry/pureFunctionsAny.generated.js +827 -814
  81. package/lib/esm/entry/pureFunctionsNumber.generated.js +234 -234
  82. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -1
  83. package/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js +8 -0
  84. package/lib/esm/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  85. package/lib/esm/factoriesAny.js +1 -0
  86. package/lib/esm/function/algebra/rationalize.js +18 -4
  87. package/lib/esm/function/algebra/simplify/simplifyConstant.js +197 -29
  88. package/lib/esm/function/algebra/simplify/simplifyCore.js +35 -7
  89. package/lib/esm/function/algebra/simplify.js +73 -22
  90. package/lib/esm/function/arithmetic/invmod.js +57 -0
  91. package/lib/esm/function/arithmetic/round.js +2 -2
  92. package/lib/esm/function/geometry/intersect.js +12 -12
  93. package/lib/esm/function/probability/gamma.js +28 -30
  94. package/lib/esm/header.js +1 -1
  95. package/lib/esm/type/matrix/SparseMatrix.js +19 -15
  96. package/lib/esm/type/unit/Unit.js +2 -2
  97. package/lib/esm/utils/number.js +1 -1
  98. package/lib/esm/utils/snapshot.js +2 -2
  99. package/lib/esm/version.js +1 -1
  100. package/package.json +18 -17
  101. package/types/index.d.ts +250 -71
@@ -7,7 +7,7 @@ import { createResolve } from './simplify/resolve.js';
7
7
  import { hasOwnProperty } from '../../utils/object.js';
8
8
  import { createEmptyMap, createMap } from '../../utils/map.js';
9
9
  var name = 'simplify';
10
- var dependencies = ['config', 'typed', 'parse', 'add', 'subtract', 'multiply', 'divide', 'pow', 'isZero', 'equal', '?fraction', '?bignumber', 'mathWithTransform', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];
10
+ var dependencies = ['config', 'typed', 'parse', 'add', 'subtract', 'multiply', 'divide', 'pow', 'isZero', 'equal', '?fraction', '?bignumber', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];
11
11
  export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
12
12
  var {
13
13
  config,
@@ -23,8 +23,13 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
23
23
  fraction,
24
24
  bignumber,
25
25
  mathWithTransform,
26
+ matrix,
27
+ AccessorNode,
28
+ ArrayNode,
26
29
  ConstantNode,
27
30
  FunctionNode,
31
+ IndexNode,
32
+ ObjectNode,
28
33
  OperatorNode,
29
34
  ParenthesisNode,
30
35
  SymbolNode
@@ -33,11 +38,16 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
33
38
  typed,
34
39
  config,
35
40
  mathWithTransform,
41
+ matrix,
36
42
  fraction,
37
43
  bignumber,
44
+ AccessorNode,
45
+ ArrayNode,
38
46
  ConstantNode,
39
- OperatorNode,
40
47
  FunctionNode,
48
+ IndexNode,
49
+ ObjectNode,
50
+ OperatorNode,
41
51
  SymbolNode
42
52
  });
43
53
  var simplifyCore = createSimplifyCore({
@@ -48,9 +58,13 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
48
58
  multiply,
49
59
  divide,
50
60
  pow,
61
+ AccessorNode,
62
+ ArrayNode,
51
63
  ConstantNode,
52
- OperatorNode,
53
64
  FunctionNode,
65
+ IndexNode,
66
+ ObjectNode,
67
+ OperatorNode,
54
68
  ParenthesisNode
55
69
  });
56
70
  var resolve = createResolve({
@@ -262,17 +276,19 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
262
276
  l: 'log(e)',
263
277
  r: '1'
264
278
  }, // temporary rules
279
+ // Note initially we tend constants to the right because like-term
280
+ // collection prefers the left, and we would rather collect nonconstants
265
281
  {
266
282
  l: 'n-n1',
267
283
  r: 'n+-n1'
268
284
  }, // temporarily replace 'subtract' so we can further flatten the 'add' operator
269
285
  {
270
286
  l: '-(c*v)',
271
- r: '(-c) * v'
287
+ r: 'v * (-c)'
272
288
  }, // make non-constant terms positive
273
289
  {
274
290
  l: '-v',
275
- r: '(-1) * v'
291
+ r: 'v * (-1)'
276
292
  }, {
277
293
  l: 'n/n1^n2',
278
294
  r: 'n*n1^-n2'
@@ -280,6 +296,17 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
280
296
  {
281
297
  l: 'n/n1',
282
298
  r: 'n*n1^-1'
299
+ }, // remove parenthesis in the case of negating a quantity
300
+ {
301
+ l: 'n1 + (n2 + n3)*(-1)',
302
+ r: 'n1 + n2*(-1) + n3*(-1)'
303
+ }, // subsume resulting -1 into constants where possible
304
+ {
305
+ l: '(-1) * c',
306
+ r: '-c'
307
+ }, {
308
+ l: '(-1) * (-c)',
309
+ r: 'c'
283
310
  }, // expand nested exponentiation
284
311
  {
285
312
  l: '(n ^ n1) ^ n2',
@@ -302,20 +329,21 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
302
329
  l: 'n+-n',
303
330
  r: '0'
304
331
  }, {
305
- l: 'n1*n2 + n2',
306
- r: '(n1+1)*n2'
307
- }, {
308
- l: 'n1*n3 + n2*n3',
309
- r: '(n1+n2)*n3'
310
- }, // remove parenthesis in the case of negating a quantitiy
332
+ l: 'v*n + v',
333
+ r: 'v*(n+1)'
334
+ }, // NOTE: leftmost position is special:
311
335
  {
312
- l: 'n1 + -1 * (n2 + n3)',
313
- r: 'n1 + -1 * n2 + -1 * n3'
336
+ l: 'n3*n1 + n3*n2',
337
+ r: 'n3*(n1+n2)'
338
+ }, // All sub-monomials tried there.
339
+ {
340
+ l: 'n*c + c',
341
+ r: '(n+1)*c'
314
342
  }, simplifyConstant, {
315
343
  l: '(-n)*n1',
316
344
  r: '-(n*n1)'
317
345
  }, // make factors positive (and undo 'make non-constant terms positive')
318
- // ordering of constants
346
+ // final ordering of constants
319
347
  {
320
348
  l: 'c+v',
321
349
  r: 'v+c',
@@ -365,6 +393,9 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
365
393
  {
366
394
  l: 'n1/(n2/n3)',
367
395
  r: '(n1*n3)/n2'
396
+ }, {
397
+ l: 'n1/(-n2)',
398
+ r: '-n1/n2'
368
399
  }];
369
400
  /**
370
401
  * Parse the string array of rules into nodes
@@ -416,7 +447,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
416
447
  };
417
448
 
418
449
  if (rule.context) {
419
- newRule.evaluate = rule.context;
450
+ newRule.context = rule.context;
420
451
  }
421
452
 
422
453
  if (rule.evaluate) {
@@ -460,6 +491,14 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
460
491
  function _getExpandPlaceholderSymbol() {
461
492
  return new SymbolNode('_p' + _lastsym++);
462
493
  }
494
+
495
+ function mapRule(nodes, rule) {
496
+ if (nodes) {
497
+ for (var i = 0; i < nodes.length; ++i) {
498
+ nodes[i] = applyRule(nodes[i], rule);
499
+ }
500
+ }
501
+ }
463
502
  /**
464
503
  * Returns a simplfied form of node, or the original node if no simplification was possible.
465
504
  *
@@ -473,19 +512,31 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
473
512
  // console.log('Entering applyRule(' + node.toString() + ')')
474
513
  // Do not clone node unless we find a match
475
514
  var res = node; // First replace our child nodes with their simplified versions
476
- // If a child could not be simplified, the assignments will have
477
- // no effect since the node is returned unchanged
515
+ // If a child could not be simplified, applying the rule to it
516
+ // will have no effect since the node is returned unchanged
478
517
 
479
518
  if (res instanceof OperatorNode || res instanceof FunctionNode) {
480
- if (res.args) {
481
- for (var i = 0; i < res.args.length; i++) {
482
- res.args[i] = applyRule(res.args[i], rule);
483
- }
484
- }
519
+ mapRule(res.args, rule);
485
520
  } else if (res instanceof ParenthesisNode) {
486
521
  if (res.content) {
487
522
  res.content = applyRule(res.content, rule);
488
523
  }
524
+ } else if (res instanceof ArrayNode) {
525
+ mapRule(res.items, rule);
526
+ } else if (res instanceof AccessorNode) {
527
+ if (res.object) {
528
+ res.object = applyRule(res.object, rule);
529
+ }
530
+
531
+ if (res.index) {
532
+ res.index = applyRule(res.index, rule);
533
+ }
534
+ } else if (res instanceof IndexNode) {
535
+ mapRule(res.dimensions, rule);
536
+ } else if (res instanceof ObjectNode) {
537
+ for (var prop in res.properties) {
538
+ res.properties[prop] = applyRule(res.properties[prop], rule);
539
+ }
489
540
  } // Try to match a rule against this node
490
541
 
491
542
 
@@ -0,0 +1,57 @@
1
+ import { factory } from '../../utils/factory.js';
2
+ var name = 'invmod';
3
+ var dependencies = ['typed', 'config', 'BigNumber', 'xgcd', 'equal', 'smaller', 'mod', 'add', 'isInteger'];
4
+ export var createInvmod = /* #__PURE__ */factory(name, dependencies, _ref => {
5
+ var {
6
+ typed,
7
+ config,
8
+ BigNumber,
9
+ xgcd,
10
+ equal,
11
+ smaller,
12
+ mod,
13
+ add,
14
+ isInteger
15
+ } = _ref;
16
+
17
+ /**
18
+ * Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation `ax ≣ 1 (mod b)`
19
+ * See https://en.wikipedia.org/wiki/Modular_multiplicative_inverse.
20
+ *
21
+ * Syntax:
22
+ *
23
+ * math.invmod(a, b)
24
+ *
25
+ * Examples:
26
+ *
27
+ * math.invmod(8, 12) // returns NaN
28
+ * math.invmod(7, 13) // return 2
29
+ * math.invmod(15151, 15122) // returns 10429
30
+ *
31
+ * See also:
32
+ *
33
+ * gcd, xgcd
34
+ *
35
+ * @param {number | BigNumber} a An integer number
36
+ * @param {number | BigNumber} b An integer number
37
+ * @return {number | BigNumber } Returns an integer number
38
+ * where `invmod(a,b)*a ≣ 1 (mod b)`
39
+ */
40
+ return typed(name, {
41
+ 'number, number': invmod,
42
+ 'BigNumber, BigNumber': invmod
43
+ });
44
+
45
+ function invmod(a, b) {
46
+ if (!isInteger(a) || !isInteger(b)) throw new Error('Parameters in function invmod must be integer numbers');
47
+ a = mod(a, b);
48
+ if (equal(b, 0)) throw new Error('Divisor must be non zero');
49
+ var res = xgcd(a, b);
50
+ res = res.valueOf();
51
+ var [gcd, inv] = res;
52
+ if (!equal(gcd, BigNumber(1))) return NaN;
53
+ inv = mod(inv, b);
54
+ if (smaller(inv, BigNumber(0))) inv = add(inv, b);
55
+ return inv;
56
+ }
57
+ });
@@ -1,8 +1,8 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
 
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
3
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
4
 
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
 
7
7
  import { factory } from '../../utils/factory.js';
8
8
  import { deepMap } from '../../utils/collection.js';
@@ -1,7 +1,6 @@
1
- import { isBigNumber } from '../../utils/is.js';
2
1
  import { factory } from '../../utils/factory.js';
3
2
  var name = 'intersect';
4
- var dependencies = ['typed', 'config', 'abs', 'add', 'addScalar', 'matrix', 'multiply', 'multiplyScalar', 'divideScalar', 'subtract', 'smaller', 'equalScalar', 'flatten'];
3
+ var dependencies = ['typed', 'config', 'abs', 'add', 'addScalar', 'matrix', 'multiply', 'multiplyScalar', 'divideScalar', 'subtract', 'smaller', 'equalScalar', 'flatten', 'isZero', 'isNumeric'];
5
4
  export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref => {
6
5
  var {
7
6
  typed,
@@ -16,7 +15,9 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
16
15
  subtract,
17
16
  smaller,
18
17
  equalScalar,
19
- flatten
18
+ flatten,
19
+ isZero,
20
+ isNumeric
20
21
  } = _ref;
21
22
 
22
23
  /**
@@ -142,21 +143,16 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
142
143
  return arr;
143
144
  }
144
145
 
145
- function _isNumeric(a) {
146
- // intersect supports numbers and bignumbers
147
- return typeof a === 'number' || isBigNumber(a);
148
- }
149
-
150
146
  function _2d(x) {
151
- return x.length === 2 && _isNumeric(x[0]) && _isNumeric(x[1]);
147
+ return x.length === 2 && isNumeric(x[0]) && isNumeric(x[1]);
152
148
  }
153
149
 
154
150
  function _3d(x) {
155
- return x.length === 3 && _isNumeric(x[0]) && _isNumeric(x[1]) && _isNumeric(x[2]);
151
+ return x.length === 3 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]);
156
152
  }
157
153
 
158
154
  function _4d(x) {
159
- return x.length === 4 && _isNumeric(x[0]) && _isNumeric(x[1]) && _isNumeric(x[2]) && _isNumeric(x[3]);
155
+ return x.length === 4 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]) && isNumeric(x[3]);
160
156
  }
161
157
 
162
158
  function _intersect2d(p1a, p1b, p2a, p2b) {
@@ -165,6 +161,7 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
165
161
  var d1 = subtract(o1, p1b);
166
162
  var d2 = subtract(o2, p2b);
167
163
  var det = subtract(multiplyScalar(d1[0], d2[1]), multiplyScalar(d2[0], d1[1]));
164
+ if (isZero(det)) return null;
168
165
 
169
166
  if (smaller(abs(det), config.epsilon)) {
170
167
  return null;
@@ -197,7 +194,10 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
197
194
 
198
195
  var d2121 = _intersect3dHelper(x2, x1, x2, x1, y2, y1, y2, y1, z2, z1, z2, z1);
199
196
 
200
- var ta = divideScalar(subtract(multiplyScalar(d1343, d4321), multiplyScalar(d1321, d4343)), subtract(multiplyScalar(d2121, d4343), multiplyScalar(d4321, d4321)));
197
+ var numerator = subtract(multiplyScalar(d1343, d4321), multiplyScalar(d1321, d4343));
198
+ var denominator = subtract(multiplyScalar(d2121, d4343), multiplyScalar(d4321, d4321));
199
+ if (isZero(denominator)) return null;
200
+ var ta = divideScalar(numerator, denominator);
201
201
  var tb = divideScalar(addScalar(d1343, multiplyScalar(ta, d4321)), d4343);
202
202
  var pax = addScalar(x1, multiplyScalar(ta, subtract(x2, x1)));
203
203
  var pay = addScalar(y1, multiplyScalar(ta, subtract(y2, y1)));
@@ -41,44 +41,42 @@ export var createGamma = /* #__PURE__ */factory(name, dependencies, _ref => {
41
41
  Complex: function Complex(n) {
42
42
  if (n.im === 0) {
43
43
  return this(n.re);
44
- }
44
+ } // Lanczos approximation doesn't work well with real part lower than 0.5
45
+ // So reflection formula is required
46
+
47
+
48
+ if (n.re < 0.5) {
49
+ // Euler's reflection formula
50
+ // gamma(1-z) * gamma(z) = PI / sin(PI * z)
51
+ // real part of Z should not be integer [sin(PI) == 0 -> 1/0 - undefined]
52
+ // thanks to imperfect sin implementation sin(PI * n) != 0
53
+ // we can safely use it anyway
54
+ var _t = new _Complex(1 - n.re, -n.im);
55
+
56
+ var r = new _Complex(Math.PI * n.re, Math.PI * n.im);
57
+ return new _Complex(Math.PI).div(r.sin()).div(this(_t));
58
+ } // Lanczos approximation
59
+ // z -= 1
60
+
45
61
 
46
- n = new _Complex(n.re - 1, n.im);
47
- var x = new _Complex(gammaP[0], 0);
62
+ n = new _Complex(n.re - 1, n.im); // x = gammaPval[0]
63
+
64
+ var x = new _Complex(gammaP[0], 0); // for (i, gammaPval) in enumerate(gammaP):
48
65
 
49
66
  for (var i = 1; i < gammaP.length; ++i) {
50
- var real = n.re + i; // x += p[i]/(n+i)
67
+ // x += gammaPval / (z + i)
68
+ var gammaPval = new _Complex(gammaP[i], 0);
69
+ x = x.add(gammaPval.div(n.add(i)));
70
+ } // t = z + gammaG + 0.5
51
71
 
52
- var den = real * real + n.im * n.im;
53
72
 
54
- if (den !== 0) {
55
- x.re += gammaP[i] * real / den;
56
- x.im += -(gammaP[i] * n.im) / den;
57
- } else {
58
- x.re = gammaP[i] < 0 ? -Infinity : Infinity;
59
- }
60
- }
73
+ var t = new _Complex(n.re + gammaG + 0.5, n.im); // y = sqrt(2 * pi) * t ** (z + 0.5) * exp(-t) * x
61
74
 
62
- var t = new _Complex(n.re + gammaG + 0.5, n.im);
63
75
  var twoPiSqrt = Math.sqrt(2 * Math.PI);
64
- n.re += 0.5;
65
- var result = pow(t, n);
66
-
67
- if (result.im === 0) {
68
- // sqrt(2*PI)*result
69
- result.re *= twoPiSqrt;
70
- } else if (result.re === 0) {
71
- result.im *= twoPiSqrt;
72
- } else {
73
- result.re *= twoPiSqrt;
74
- result.im *= twoPiSqrt;
75
- }
76
-
77
- var r = Math.exp(-t.re); // exp(-t)
76
+ var tpow = t.pow(n.add(0.5));
77
+ var expt = t.neg().exp(); // y = [x] * [sqrt(2 * pi)] * [t ** (z + 0.5)] * [exp(-t)]
78
78
 
79
- t.re = r * Math.cos(-t.im);
80
- t.im = r * Math.sin(-t.im);
81
- return multiplyScalar(multiplyScalar(result, t), x);
79
+ return x.mul(twoPiSqrt).mul(tpow).mul(expt);
82
80
  },
83
81
  BigNumber: function BigNumber(n) {
84
82
  if (n.isInteger()) {
package/lib/esm/header.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * @date @@date
11
11
  *
12
12
  * @license
13
- * Copyright (C) 2013-2021 Jos de Jong <wjosdejong@gmail.com>
13
+ * Copyright (C) 2013-2022 Jos de Jong <wjosdejong@gmail.com>
14
14
  *
15
15
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
16
16
  * use this file except in compliance with the License. You may obtain a copy
@@ -417,23 +417,27 @@ export var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies,
417
417
 
418
418
  if (!deepStrictEqual(iSize, sSize)) {
419
419
  throw new DimensionError(iSize, sSize, '>');
420
- } // offsets
420
+ } // insert the sub matrix
421
421
 
422
422
 
423
- var x0 = index.min()[0];
424
- var y0 = index.min()[1]; // submatrix rows and columns
425
-
426
- var m = sSize[0];
427
- var n = sSize[1]; // loop submatrix
428
-
429
- for (var x = 0; x < m; x++) {
430
- // loop columns
431
- for (var y = 0; y < n; y++) {
432
- // value at i, j
433
- var v = submatrix[x][y]; // invoke set (zero value will remove entry from matrix)
434
-
435
- matrix.set([x + x0, y + y0], v, defaultValue);
436
- }
423
+ if (iSize.length === 1) {
424
+ // if the replacement index only has 1 dimension, go trough each one and set its value
425
+ var range = index.dimension(0);
426
+ range.forEach(function (dataIndex, subIndex) {
427
+ validateIndex(dataIndex);
428
+ matrix.set([dataIndex, 0], submatrix[subIndex[0]], defaultValue);
429
+ });
430
+ } else {
431
+ // if the replacement index has 2 dimensions, go through each one and set the value in the correct index
432
+ var firstDimensionRange = index.dimension(0);
433
+ var secondDimensionRange = index.dimension(1);
434
+ firstDimensionRange.forEach(function (firstDataIndex, firstSubIndex) {
435
+ validateIndex(firstDataIndex);
436
+ secondDimensionRange.forEach(function (secondDataIndex, secondSubIndex) {
437
+ validateIndex(secondDataIndex);
438
+ matrix.set([firstDataIndex, secondDataIndex], submatrix[firstSubIndex[0]][secondSubIndex[0]], defaultValue);
439
+ });
440
+ });
437
441
  }
438
442
  }
439
443
 
@@ -1,9 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
 
4
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
5
 
6
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
7
 
8
8
  import { isComplex, isUnit, typeOf } from '../../utils/is.js';
9
9
  import { factory } from '../../utils/factory.js';
@@ -318,7 +318,7 @@ export function format(value, options) {
318
318
 
319
319
  export function splitNumber(value) {
320
320
  // parse the input value
321
- var match = String(value).toLowerCase().match(/^0*?(-?)(\d+\.?\d*)(e([+-]?\d+))?$/);
321
+ var match = String(value).toLowerCase().match(/^(-?)(\d+\.?\d*)(e([+-]?\d+))?$/);
322
322
 
323
323
  if (!match) {
324
324
  throw new SyntaxError('Invalid number ' + value);
@@ -1,9 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
 
4
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
4
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
5
5
 
6
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
7
 
8
8
  /**
9
9
  * This file contains helper methods to create expected snapshot structures
@@ -1,2 +1,2 @@
1
- export var version = '9.5.2'; // Note: This file is automatically generated when building math.js.
1
+ export var version = '10.1.0'; // Note: This file is automatically generated when building math.js.
2
2
  // Changes made in this file will be overwritten.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mathjs",
3
- "version": "9.5.2",
3
+ "version": "10.1.0",
4
4
  "description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
5
5
  "author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
6
6
  "homepage": "https://mathjs.org",
@@ -25,39 +25,39 @@
25
25
  "unit"
26
26
  ],
27
27
  "dependencies": {
28
- "@babel/runtime": "^7.15.4",
28
+ "@babel/runtime": "^7.16.5",
29
29
  "complex.js": "^2.0.15",
30
30
  "decimal.js": "^10.3.1",
31
31
  "escape-latex": "^1.2.0",
32
- "fraction.js": "^4.1.1",
32
+ "fraction.js": "^4.1.2",
33
33
  "javascript-natural-sort": "^0.7.1",
34
34
  "seedrandom": "^3.0.5",
35
35
  "tiny-emitter": "^2.1.0",
36
36
  "typed-function": "^2.0.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@babel/core": "7.15.5",
40
- "@babel/plugin-transform-object-assign": "7.14.5",
41
- "@babel/plugin-transform-runtime": "7.15.0",
42
- "@babel/preset-env": "7.15.6",
43
- "@babel/register": "7.15.3",
44
- "babel-loader": "8.2.2",
39
+ "@babel/core": "7.16.5",
40
+ "@babel/plugin-transform-object-assign": "7.16.5",
41
+ "@babel/plugin-transform-runtime": "7.16.5",
42
+ "@babel/preset-env": "7.16.5",
43
+ "@babel/register": "7.16.5",
44
+ "babel-loader": "8.2.3",
45
45
  "benchmark": "2.1.4",
46
46
  "codecov": "3.8.3",
47
- "core-js": "3.17.3",
47
+ "core-js": "3.20.1",
48
48
  "del": "6.0.0",
49
- "dtslint": "4.1.6",
49
+ "dtslint": "4.2.1",
50
50
  "expr-eval": "2.0.2",
51
51
  "fancy-log": "1.3.3",
52
- "glob": "7.1.7",
52
+ "glob": "7.2.0",
53
53
  "gulp": "4.0.2",
54
54
  "gulp-babel": "8.0.0",
55
55
  "handlebars": "4.7.7",
56
56
  "istanbul": "0.4.5",
57
- "jsep": "1.0.3",
58
- "karma": "6.3.4",
57
+ "jsep": "1.2.0",
58
+ "karma": "6.3.9",
59
59
  "karma-browserstack-launcher": "1.6.0",
60
- "karma-firefox-launcher": "2.1.1",
60
+ "karma-firefox-launcher": "2.1.2",
61
61
  "karma-mocha": "2.0.1",
62
62
  "karma-mocha-reporter": "2.2.5",
63
63
  "karma-webpack": "4.0.2",
@@ -72,9 +72,9 @@
72
72
  "numericjs": "1.2.6",
73
73
  "nyc": "15.1.0",
74
74
  "pad-right": "0.2.2",
75
- "standard": "16.0.3",
75
+ "standard": "16.0.4",
76
76
  "sylvester": "0.0.21",
77
- "typescript": "4.4.3",
77
+ "typescript": "4.5.4",
78
78
  "webpack": "4.46.0",
79
79
  "zeros": "1.0.0"
80
80
  },
@@ -131,6 +131,7 @@
131
131
  "compile": "gulp --gulpfile gulpfile.cjs compile",
132
132
  "watch": "gulp --gulpfile gulpfile.cjs watch",
133
133
  "lint": "standard --env=mocha --env=worker",
134
+ "format": "npm run lint -- --fix",
134
135
  "validate:ascii": "gulp --gulpfile gulpfile.cjs validate:ascii",
135
136
  "test": "npm run test:src && npm run lint",
136
137
  "test:src": "mocha test/unit-tests",