mathjs 10.0.0 → 10.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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",