mathjs 10.0.0 → 10.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. package/HISTORY.md +37 -0
  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/simplify.md +8 -5
  9. package/docs/reference/functions.md +1 -0
  10. package/examples/expressions.js +1 -1
  11. package/lib/browser/math.js +7 -7
  12. package/lib/browser/math.js.map +1 -1
  13. package/lib/cjs/entry/dependenciesAny/dependenciesIntersect.generated.js +6 -0
  14. package/lib/cjs/entry/dependenciesAny/dependenciesInvmod.generated.js +41 -0
  15. package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +15 -0
  16. package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +15 -0
  17. package/lib/cjs/entry/dependenciesAny.generated.js +8 -0
  18. package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +15 -0
  19. package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +15 -0
  20. package/lib/cjs/entry/impureFunctionsAny.generated.js +11 -0
  21. package/lib/cjs/entry/impureFunctionsNumber.generated.js +10 -0
  22. package/lib/cjs/entry/pureFunctionsAny.generated.js +16 -2
  23. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -1
  24. package/lib/cjs/expression/embeddedDocs/function/arithmetic/invmod.js +15 -0
  25. package/lib/cjs/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  26. package/lib/cjs/factoriesAny.js +8 -0
  27. package/lib/cjs/function/algebra/rationalize.js +18 -4
  28. package/lib/cjs/function/algebra/simplify/simplifyConstant.js +223 -29
  29. package/lib/cjs/function/algebra/simplify/simplifyCore.js +34 -6
  30. package/lib/cjs/function/algebra/simplify.js +103 -30
  31. package/lib/cjs/function/arithmetic/invmod.js +73 -0
  32. package/lib/cjs/function/arithmetic/round.js +2 -2
  33. package/lib/cjs/function/geometry/intersect.js +12 -13
  34. package/lib/cjs/function/probability/gamma.js +28 -30
  35. package/lib/cjs/header.js +3 -3
  36. package/lib/cjs/type/matrix/SparseMatrix.js +19 -15
  37. package/lib/cjs/type/unit/Unit.js +2 -2
  38. package/lib/cjs/utils/number.js +1 -1
  39. package/lib/cjs/utils/snapshot.js +2 -2
  40. package/lib/cjs/version.js +1 -1
  41. package/lib/esm/entry/dependenciesAny/dependenciesIntersect.generated.js +4 -0
  42. package/lib/esm/entry/dependenciesAny/dependenciesInvmod.generated.js +24 -0
  43. package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +10 -0
  44. package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +10 -0
  45. package/lib/esm/entry/dependenciesAny.generated.js +1 -0
  46. package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +10 -0
  47. package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +10 -0
  48. package/lib/esm/entry/impureFunctionsAny.generated.js +12 -1
  49. package/lib/esm/entry/impureFunctionsNumber.generated.js +10 -0
  50. package/lib/esm/entry/pureFunctionsAny.generated.js +14 -1
  51. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -1
  52. package/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js +8 -0
  53. package/lib/esm/expression/embeddedDocs/function/matrix/forEach.js +1 -1
  54. package/lib/esm/factoriesAny.js +1 -0
  55. package/lib/esm/function/algebra/rationalize.js +18 -4
  56. package/lib/esm/function/algebra/simplify/simplifyConstant.js +197 -29
  57. package/lib/esm/function/algebra/simplify/simplifyCore.js +35 -7
  58. package/lib/esm/function/algebra/simplify.js +103 -30
  59. package/lib/esm/function/arithmetic/invmod.js +57 -0
  60. package/lib/esm/function/arithmetic/round.js +2 -2
  61. package/lib/esm/function/geometry/intersect.js +12 -12
  62. package/lib/esm/function/probability/gamma.js +28 -30
  63. package/lib/esm/header.js +1 -1
  64. package/lib/esm/type/matrix/SparseMatrix.js +19 -15
  65. package/lib/esm/type/unit/Unit.js +2 -2
  66. package/lib/esm/utils/number.js +1 -1
  67. package/lib/esm/utils/snapshot.js +2 -2
  68. package/lib/esm/version.js +1 -1
  69. package/package.json +15 -14
  70. package/types/index.d.ts +4 -4
@@ -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({
@@ -107,11 +121,14 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
107
121
  * - [Symbolic computation - Simplification (Wikipedia)](https://en.wikipedia.org/wiki/Symbolic_computation#Simplification)
108
122
  *
109
123
  * An optional `options` argument can be passed as last argument of `simplify`.
110
- * There is currently one option available:
111
- * - `exactFractions`: a boolean which is `true` by default.
112
- * - `fractionsLimit`: when `exactFractions` is true, a fraction will be returned
113
- * only when both numerator and denominator are smaller than `fractionsLimit`.
114
- * Default value is 10000.
124
+ * Currently available options (defaults in parentheses):
125
+ * - `consoleDebug` (false): whether to write the expression being simplified
126
+ and any changes to it, along with the rule responsible, to console
127
+ * - `exactFractions` (true): whether to try to convert all constants to
128
+ exact rational numbers.
129
+ * - `fractionsLimit` (10000): when `exactFractions` is true, constants will
130
+ be expressed as fractions only when both numerator and denominator
131
+ are smaller than `fractionsLimit`.
115
132
  *
116
133
  * Syntax:
117
134
  *
@@ -181,6 +198,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
181
198
  return this(expr, rules, createMap(scope), options);
182
199
  },
183
200
  'Node, Array, Map, Object': function NodeArrayMapObject(expr, rules, scope, options) {
201
+ var debug = options.consoleDebug;
184
202
  rules = _buildRules(rules);
185
203
  var res = resolve(expr, scope);
186
204
  res = removeParens(res);
@@ -193,12 +211,33 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
193
211
  visited[str] = true;
194
212
  _lastsym = 0; // counter for placeholder symbols
195
213
 
214
+ var laststr = str;
215
+ if (debug) console.log('Working on: ', str);
216
+
196
217
  for (var i = 0; i < rules.length; i++) {
218
+ var rulestr = '';
219
+
197
220
  if (typeof rules[i] === 'function') {
198
221
  res = rules[i](res, options);
222
+ if (debug) rulestr = rules[i].name;
199
223
  } else {
200
224
  flatten(res);
201
225
  res = applyRule(res, rules[i]);
226
+
227
+ if (debug) {
228
+ rulestr = "".concat(rules[i].l.toString(), " -> ").concat(rules[i].r.toString());
229
+ }
230
+ }
231
+
232
+ if (debug) {
233
+ var newstr = res.toString({
234
+ parenthesis: 'all'
235
+ });
236
+
237
+ if (newstr !== laststr) {
238
+ console.log('Applying', rulestr, 'produced', newstr);
239
+ laststr = newstr;
240
+ }
202
241
  }
203
242
 
204
243
  unflattenl(res); // using left-heavy binary tree here since custom rule functions may expect it
@@ -262,17 +301,19 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
262
301
  l: 'log(e)',
263
302
  r: '1'
264
303
  }, // temporary rules
304
+ // Note initially we tend constants to the right because like-term
305
+ // collection prefers the left, and we would rather collect nonconstants
265
306
  {
266
307
  l: 'n-n1',
267
308
  r: 'n+-n1'
268
309
  }, // temporarily replace 'subtract' so we can further flatten the 'add' operator
269
310
  {
270
311
  l: '-(c*v)',
271
- r: '(-c) * v'
312
+ r: 'v * (-c)'
272
313
  }, // make non-constant terms positive
273
314
  {
274
315
  l: '-v',
275
- r: '(-1) * v'
316
+ r: 'v * (-1)'
276
317
  }, {
277
318
  l: 'n/n1^n2',
278
319
  r: 'n*n1^-n2'
@@ -280,7 +321,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
280
321
  {
281
322
  l: 'n/n1',
282
323
  r: 'n*n1^-1'
283
- }, // expand nested exponentiation
324
+ }, simplifyConstant, // expand nested exponentiation
284
325
  {
285
326
  l: '(n ^ n1) ^ n2',
286
327
  r: 'n ^ (n1 * n2)'
@@ -302,20 +343,29 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
302
343
  l: 'n+-n',
303
344
  r: '0'
304
345
  }, {
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
346
+ l: 'v*n + v',
347
+ r: 'v*(n+1)'
348
+ }, // NOTE: leftmost position is special:
349
+ {
350
+ l: 'n3*n1 + n3*n2',
351
+ r: 'n3*(n1+n2)'
352
+ }, // All sub-monomials tried there.
353
+ {
354
+ l: 'n*c + c',
355
+ r: '(n+1)*c'
356
+ }, // remove parenthesis in the case of negating a quantity
357
+ // (It might seem this rule should precede collecting like terms,
358
+ // but putting it after gives another chance of noticing like terms,
359
+ // and any new like terms produced by this will be collected
360
+ // on the next pass through all the rules.)
361
+ {
362
+ l: 'n1 + (n2 + n3)*(-1)',
363
+ r: 'n1 + n2*(-1) + n3*(-1)'
364
+ }, // make factors positive (and undo 'make non-constant terms positive')
311
365
  {
312
- l: 'n1 + -1 * (n2 + n3)',
313
- r: 'n1 + -1 * n2 + -1 * n3'
314
- }, simplifyConstant, {
315
366
  l: '(-n)*n1',
316
367
  r: '-(n*n1)'
317
- }, // make factors positive (and undo 'make non-constant terms positive')
318
- // ordering of constants
368
+ }, // final ordering of constants
319
369
  {
320
370
  l: 'c+v',
321
371
  r: 'v+c',
@@ -365,6 +415,9 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
365
415
  {
366
416
  l: 'n1/(n2/n3)',
367
417
  r: '(n1*n3)/n2'
418
+ }, {
419
+ l: 'n1/(-n2)',
420
+ r: '-n1/n2'
368
421
  }];
369
422
  /**
370
423
  * Parse the string array of rules into nodes
@@ -416,7 +469,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
416
469
  };
417
470
 
418
471
  if (rule.context) {
419
- newRule.evaluate = rule.context;
472
+ newRule.context = rule.context;
420
473
  }
421
474
 
422
475
  if (rule.evaluate) {
@@ -460,6 +513,14 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
460
513
  function _getExpandPlaceholderSymbol() {
461
514
  return new SymbolNode('_p' + _lastsym++);
462
515
  }
516
+
517
+ function mapRule(nodes, rule) {
518
+ if (nodes) {
519
+ for (var i = 0; i < nodes.length; ++i) {
520
+ nodes[i] = applyRule(nodes[i], rule);
521
+ }
522
+ }
523
+ }
463
524
  /**
464
525
  * Returns a simplfied form of node, or the original node if no simplification was possible.
465
526
  *
@@ -473,19 +534,31 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
473
534
  // console.log('Entering applyRule(' + node.toString() + ')')
474
535
  // Do not clone node unless we find a match
475
536
  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
537
+ // If a child could not be simplified, applying the rule to it
538
+ // will have no effect since the node is returned unchanged
478
539
 
479
540
  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
- }
541
+ mapRule(res.args, rule);
485
542
  } else if (res instanceof ParenthesisNode) {
486
543
  if (res.content) {
487
544
  res.content = applyRule(res.content, rule);
488
545
  }
546
+ } else if (res instanceof ArrayNode) {
547
+ mapRule(res.items, rule);
548
+ } else if (res instanceof AccessorNode) {
549
+ if (res.object) {
550
+ res.object = applyRule(res.object, rule);
551
+ }
552
+
553
+ if (res.index) {
554
+ res.index = applyRule(res.index, rule);
555
+ }
556
+ } else if (res instanceof IndexNode) {
557
+ mapRule(res.dimensions, rule);
558
+ } else if (res instanceof ObjectNode) {
559
+ for (var prop in res.properties) {
560
+ res.properties[prop] = applyRule(res.properties[prop], rule);
561
+ }
489
562
  } // Try to match a rule against this node
490
563
 
491
564
 
@@ -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 = '10.0.0'; // Note: This file is automatically generated when building math.js.
1
+ export var version = '10.1.1'; // 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": "10.0.0",
3
+ "version": "10.1.1",
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,43 +25,43 @@
25
25
  "unit"
26
26
  ],
27
27
  "dependencies": {
28
- "@babel/runtime": "^7.16.0",
28
+ "@babel/runtime": "^7.16.7",
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.16.0",
40
- "@babel/plugin-transform-object-assign": "7.16.0",
41
- "@babel/plugin-transform-runtime": "7.16.0",
42
- "@babel/preset-env": "7.16.0",
43
- "@babel/register": "7.16.0",
39
+ "@babel/core": "7.16.12",
40
+ "@babel/plugin-transform-object-assign": "7.16.7",
41
+ "@babel/plugin-transform-runtime": "7.16.10",
42
+ "@babel/preset-env": "7.16.11",
43
+ "@babel/register": "7.16.9",
44
44
  "babel-loader": "8.2.3",
45
45
  "benchmark": "2.1.4",
46
46
  "codecov": "3.8.3",
47
- "core-js": "3.19.1",
47
+ "core-js": "3.21.0",
48
48
  "del": "6.0.0",
49
- "dtslint": "4.2.0",
49
+ "dtslint": "4.2.1",
50
50
  "expr-eval": "2.0.2",
51
- "fancy-log": "1.3.3",
51
+ "fancy-log": "2.0.0",
52
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
57
  "jsep": "1.2.0",
58
- "karma": "6.3.7",
58
+ "karma": "6.3.13",
59
59
  "karma-browserstack-launcher": "1.6.0",
60
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",
64
- "math-expression-evaluator": "1.3.8",
64
+ "math-expression-evaluator": "1.3.14",
65
65
  "mkdirp": "1.0.4",
66
66
  "mocha": "8.4.0",
67
67
  "ndarray": "1.0.19",
@@ -74,7 +74,7 @@
74
74
  "pad-right": "0.2.2",
75
75
  "standard": "16.0.4",
76
76
  "sylvester": "0.0.21",
77
- "typescript": "4.4.4",
77
+ "typescript": "4.5.5",
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",