mathjs 14.0.0 → 14.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 (55) hide show
  1. package/HISTORY.md +15 -0
  2. package/NOTICE +1 -1
  3. package/README.md +7 -7
  4. package/bin/cli.js +1 -1
  5. package/lib/browser/math.js +1 -1
  6. package/lib/browser/math.js.LICENSE.txt +5 -5
  7. package/lib/browser/math.js.map +1 -1
  8. package/lib/cjs/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
  9. package/lib/cjs/entry/dependenciesAny/dependenciesRandomInt.generated.js +2 -0
  10. package/lib/cjs/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
  11. package/lib/cjs/entry/dependenciesNumber/dependenciesRandomInt.generated.js +2 -0
  12. package/lib/cjs/entry/impureFunctionsNumber.generated.js +1 -1
  13. package/lib/cjs/entry/pureFunctionsAny.generated.js +3 -0
  14. package/lib/cjs/entry/pureFunctionsNumber.generated.js +5 -4
  15. package/lib/cjs/expression/embeddedDocs/function/arithmetic/sign.js +1 -1
  16. package/lib/cjs/function/algebra/derivative.js +64 -77
  17. package/lib/cjs/function/arithmetic/log.js +12 -5
  18. package/lib/cjs/function/arithmetic/log10.js +15 -7
  19. package/lib/cjs/function/arithmetic/log2.js +9 -4
  20. package/lib/cjs/function/probability/randomInt.js +26 -3
  21. package/lib/cjs/function/relational/larger.js +12 -4
  22. package/lib/cjs/function/relational/smaller.js +12 -4
  23. package/lib/cjs/function/statistics/max.js +1 -1
  24. package/lib/cjs/function/statistics/min.js +1 -1
  25. package/lib/cjs/function/string/print.js +2 -2
  26. package/lib/cjs/function/utils/isInteger.js +1 -1
  27. package/lib/cjs/header.js +3 -3
  28. package/lib/cjs/utils/bigint.js +33 -0
  29. package/lib/cjs/utils/number.js +7 -19
  30. package/lib/cjs/version.js +1 -1
  31. package/lib/esm/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
  32. package/lib/esm/entry/dependenciesAny/dependenciesRandomInt.generated.js +2 -0
  33. package/lib/esm/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
  34. package/lib/esm/entry/dependenciesNumber/dependenciesRandomInt.generated.js +2 -0
  35. package/lib/esm/entry/impureFunctionsNumber.generated.js +2 -2
  36. package/lib/esm/entry/pureFunctionsAny.generated.js +3 -0
  37. package/lib/esm/entry/pureFunctionsNumber.generated.js +6 -5
  38. package/lib/esm/expression/embeddedDocs/function/arithmetic/sign.js +1 -1
  39. package/lib/esm/function/algebra/derivative.js +64 -77
  40. package/lib/esm/function/arithmetic/log.js +12 -5
  41. package/lib/esm/function/arithmetic/log10.js +16 -8
  42. package/lib/esm/function/arithmetic/log2.js +9 -4
  43. package/lib/esm/function/probability/randomInt.js +26 -3
  44. package/lib/esm/function/relational/larger.js +12 -4
  45. package/lib/esm/function/relational/smaller.js +12 -4
  46. package/lib/esm/function/statistics/max.js +1 -1
  47. package/lib/esm/function/statistics/min.js +1 -1
  48. package/lib/esm/function/string/print.js +2 -2
  49. package/lib/esm/function/utils/isInteger.js +1 -1
  50. package/lib/esm/header.js +1 -1
  51. package/lib/esm/utils/bigint.js +27 -0
  52. package/lib/esm/utils/number.js +6 -17
  53. package/lib/esm/version.js +1 -1
  54. package/package.json +19 -17
  55. package/types/index.d.ts +5 -8
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.largerDependencies = void 0;
7
7
  var _dependenciesDenseMatrixClassGenerated = require("./dependenciesDenseMatrixClass.generated.js");
8
8
  var _dependenciesSparseMatrixClassGenerated = require("./dependenciesSparseMatrixClass.generated.js");
9
+ var _dependenciesBignumberGenerated = require("./dependenciesBignumber.generated.js");
9
10
  var _dependenciesConcatGenerated = require("./dependenciesConcat.generated.js");
10
11
  var _dependenciesMatrixGenerated = require("./dependenciesMatrix.generated.js");
11
12
  var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
@@ -18,6 +19,7 @@ var _factoriesAny = require("../../factoriesAny.js");
18
19
  const largerDependencies = exports.largerDependencies = {
19
20
  DenseMatrixDependencies: _dependenciesDenseMatrixClassGenerated.DenseMatrixDependencies,
20
21
  SparseMatrixDependencies: _dependenciesSparseMatrixClassGenerated.SparseMatrixDependencies,
22
+ bignumberDependencies: _dependenciesBignumberGenerated.bignumberDependencies,
21
23
  concatDependencies: _dependenciesConcatGenerated.concatDependencies,
22
24
  matrixDependencies: _dependenciesMatrixGenerated.matrixDependencies,
23
25
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.randomIntDependencies = void 0;
7
+ var _dependenciesLog2Generated = require("./dependenciesLog2.generated.js");
7
8
  var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
8
9
  var _factoriesAny = require("../../factoriesAny.js");
9
10
  /**
@@ -12,6 +13,7 @@ var _factoriesAny = require("../../factoriesAny.js");
12
13
  */
13
14
 
14
15
  const randomIntDependencies = exports.randomIntDependencies = {
16
+ log2Dependencies: _dependenciesLog2Generated.log2Dependencies,
15
17
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
16
18
  createRandomInt: _factoriesAny.createRandomInt
17
19
  };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.smallerDependencies = void 0;
7
7
  var _dependenciesDenseMatrixClassGenerated = require("./dependenciesDenseMatrixClass.generated.js");
8
8
  var _dependenciesSparseMatrixClassGenerated = require("./dependenciesSparseMatrixClass.generated.js");
9
+ var _dependenciesBignumberGenerated = require("./dependenciesBignumber.generated.js");
9
10
  var _dependenciesConcatGenerated = require("./dependenciesConcat.generated.js");
10
11
  var _dependenciesMatrixGenerated = require("./dependenciesMatrix.generated.js");
11
12
  var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
@@ -18,6 +19,7 @@ var _factoriesAny = require("../../factoriesAny.js");
18
19
  const smallerDependencies = exports.smallerDependencies = {
19
20
  DenseMatrixDependencies: _dependenciesDenseMatrixClassGenerated.DenseMatrixDependencies,
20
21
  SparseMatrixDependencies: _dependenciesSparseMatrixClassGenerated.SparseMatrixDependencies,
22
+ bignumberDependencies: _dependenciesBignumberGenerated.bignumberDependencies,
21
23
  concatDependencies: _dependenciesConcatGenerated.concatDependencies,
22
24
  matrixDependencies: _dependenciesMatrixGenerated.matrixDependencies,
23
25
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.randomIntDependencies = void 0;
7
+ var _dependenciesLog2Generated = require("./dependenciesLog2.generated.js");
7
8
  var _dependenciesTypedGenerated = require("./dependenciesTyped.generated.js");
8
9
  var _factoriesNumber = require("../../factoriesNumber.js");
9
10
  /**
@@ -12,6 +13,7 @@ var _factoriesNumber = require("../../factoriesNumber.js");
12
13
  */
13
14
 
14
15
  const randomIntDependencies = exports.randomIntDependencies = {
16
+ log2Dependencies: _dependenciesLog2Generated.log2Dependencies,
15
17
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
16
18
  createRandomInt: _factoriesNumber.createRandomInt
17
19
  };
@@ -339,7 +339,6 @@ const parser = exports.parser = (0, _factoriesNumber.createParser)({
339
339
  multiplyScalar: _pureFunctionsNumberGenerated.multiplyScalar,
340
340
  nthRoot: _pureFunctionsNumberGenerated.nthRoot,
341
341
  pickRandom: _pureFunctionsNumberGenerated.pickRandom,
342
- randomInt: _pureFunctionsNumberGenerated.randomInt,
343
342
  rightArithShift: _pureFunctionsNumberGenerated.rightArithShift,
344
343
  sec: _pureFunctionsNumberGenerated.sec,
345
344
  sinh: _pureFunctionsNumberGenerated.sinh,
@@ -362,6 +361,7 @@ const parser = exports.parser = (0, _factoriesNumber.createParser)({
362
361
  norm: _pureFunctionsNumberGenerated.norm,
363
362
  partitionSelect: _pureFunctionsNumberGenerated.partitionSelect,
364
363
  print: _pureFunctionsNumberGenerated.print,
364
+ randomInt: _pureFunctionsNumberGenerated.randomInt,
365
365
  round: _pureFunctionsNumberGenerated.round,
366
366
  smaller: _pureFunctionsNumberGenerated.smaller,
367
367
  subtractScalar: _pureFunctionsNumberGenerated.subtractScalar,
@@ -352,6 +352,7 @@ const isPrime = exports.isPrime = /* #__PURE__ */(0, _factoriesAny.createIsPrime
352
352
  });
353
353
  const randomInt = exports.randomInt = /* #__PURE__ */(0, _factoriesAny.createRandomInt)({
354
354
  config: _configReadonly.config,
355
+ log2,
355
356
  typed
356
357
  });
357
358
  const sech = exports.sech = /* #__PURE__ */(0, _factoriesAny.createSech)({
@@ -612,6 +613,7 @@ const round = exports.round = /* #__PURE__ */(0, _factoriesAny.createRound)({
612
613
  const smaller = exports.smaller = /* #__PURE__ */(0, _factoriesAny.createSmaller)({
613
614
  DenseMatrix,
614
615
  SparseMatrix,
616
+ bignumber,
615
617
  concat,
616
618
  config: _configReadonly.config,
617
619
  matrix,
@@ -791,6 +793,7 @@ const Index = exports.Index = /* #__PURE__ */(0, _factoriesAny.createIndexClass)
791
793
  const larger = exports.larger = /* #__PURE__ */(0, _factoriesAny.createLarger)({
792
794
  DenseMatrix,
793
795
  SparseMatrix,
796
+ bignumber,
794
797
  concat,
795
798
  config: _configReadonly.config,
796
799
  matrix,
@@ -302,10 +302,6 @@ const pickRandom = exports.pickRandom = /* #__PURE__ */(0, _factoriesNumber.crea
302
302
  config: _configReadonly.config,
303
303
  typed
304
304
  });
305
- const randomInt = exports.randomInt = /* #__PURE__ */(0, _factoriesNumber.createRandomInt)({
306
- config: _configReadonly.config,
307
- typed
308
- });
309
305
  const rightArithShift = exports.rightArithShift = /* #__PURE__ */(0, _factoriesNumber.createRightArithShift)({
310
306
  typed
311
307
  });
@@ -382,6 +378,11 @@ const partitionSelect = exports.partitionSelect = /* #__PURE__ */(0, _factoriesN
382
378
  const print = exports.print = /* #__PURE__ */(0, _factoriesNumber.createPrint)({
383
379
  typed
384
380
  });
381
+ const randomInt = exports.randomInt = /* #__PURE__ */(0, _factoriesNumber.createRandomInt)({
382
+ config: _configReadonly.config,
383
+ log2,
384
+ typed
385
+ });
385
386
  const round = exports.round = /* #__PURE__ */(0, _factoriesNumber.createRound)({
386
387
  typed
387
388
  });
@@ -8,7 +8,7 @@ const signDocs = exports.signDocs = {
8
8
  name: 'sign',
9
9
  category: 'Arithmetic',
10
10
  syntax: ['sign(x)'],
11
- description: 'Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.',
11
+ description: 'Compute the sign of a value. The sign of a value x is 1 when x>0, -1 when x<0, and 0 when x=0.',
12
12
  examples: ['sign(3.5)', 'sign(-4.2)', 'sign(0)'],
13
13
  seealso: ['abs']
14
14
  };
@@ -66,9 +66,18 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
66
66
  let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
67
67
  simplify: true
68
68
  };
69
- const constNodes = {};
70
- constTag(constNodes, expr, variable.name);
71
- const res = _derivative(expr, constNodes);
69
+ const cache = new Map();
70
+ const variableName = variable.name;
71
+ function isConstCached(node) {
72
+ const cached = cache.get(node);
73
+ if (cached !== undefined) {
74
+ return cached;
75
+ }
76
+ const res = _isConst(isConstCached, node, variableName);
77
+ cache.set(node, res);
78
+ return res;
79
+ }
80
+ const res = _derivative(expr, isConstCached);
72
81
  return options.simplify ? simplify(res) : res;
73
82
  }
74
83
  function parseIdentifier(string) {
@@ -88,9 +97,8 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
88
97
  'Node, SymbolNode, ConstantNode': function (expr, variable, {order}) {
89
98
  let res = expr
90
99
  for (let i = 0; i < order; i++) {
91
- let constNodes = {}
92
- constTag(constNodes, expr, variable.name)
93
- res = _derivative(res, constNodes)
100
+ <create caching isConst>
101
+ res = _derivative(res, isConst)
94
102
  }
95
103
  return res
96
104
  }
@@ -133,56 +141,39 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
133
141
  });
134
142
 
135
143
  /**
136
- * Does a depth-first search on the expression tree to identify what Nodes
137
- * are constants (e.g. 2 + 2), and stores the ones that are constants in
138
- * constNodes. Classification is done as follows:
144
+ * Checks if a node is constants (e.g. 2 + 2).
145
+ * Accepts (usually memoized) version of self as the first parameter for recursive calls.
146
+ * Classification is done as follows:
139
147
  *
140
148
  * 1. ConstantNodes are constants.
141
149
  * 2. If there exists a SymbolNode, of which we are differentiating over,
142
150
  * in the subtree it is not constant.
143
151
  *
144
- * @param {Object} constNodes Holds the nodes that are constant
152
+ * @param {function} isConst Function that tells whether sub-expression is a constant
145
153
  * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node
146
154
  * @param {string} varName Variable that we are differentiating
147
155
  * @return {boolean} if node is constant
148
156
  */
149
- // TODO: can we rewrite constTag into a pure function?
150
- const constTag = typed('constTag', {
151
- 'Object, ConstantNode, string': function (constNodes, node) {
152
- constNodes[node] = true;
157
+ const _isConst = typed('_isConst', {
158
+ 'function, ConstantNode, string': function () {
153
159
  return true;
154
160
  },
155
- 'Object, SymbolNode, string': function (constNodes, node, varName) {
161
+ 'function, SymbolNode, string': function (isConst, node, varName) {
156
162
  // Treat other variables like constants. For reasoning, see:
157
163
  // https://en.wikipedia.org/wiki/Partial_derivative
158
- if (node.name !== varName) {
159
- constNodes[node] = true;
160
- return true;
161
- }
162
- return false;
164
+ return node.name !== varName;
163
165
  },
164
- 'Object, ParenthesisNode, string': function (constNodes, node, varName) {
165
- return constTag(constNodes, node.content, varName);
166
+ 'function, ParenthesisNode, string': function (isConst, node, varName) {
167
+ return isConst(node.content, varName);
166
168
  },
167
- 'Object, FunctionAssignmentNode, string': function (constNodes, node, varName) {
169
+ 'function, FunctionAssignmentNode, string': function (isConst, node, varName) {
168
170
  if (!node.params.includes(varName)) {
169
- constNodes[node] = true;
170
171
  return true;
171
172
  }
172
- return constTag(constNodes, node.expr, varName);
173
+ return isConst(node.expr, varName);
173
174
  },
174
- 'Object, FunctionNode | OperatorNode, string': function (constNodes, node, varName) {
175
- if (node.args.length > 0) {
176
- let isConst = constTag(constNodes, node.args[0], varName);
177
- for (let i = 1; i < node.args.length; ++i) {
178
- isConst = constTag(constNodes, node.args[i], varName) && isConst;
179
- }
180
- if (isConst) {
181
- constNodes[node] = true;
182
- return true;
183
- }
184
- }
185
- return false;
175
+ 'function, FunctionNode | OperatorNode, string': function (isConst, node, varName) {
176
+ return node.args.every(arg => isConst(arg, varName));
186
177
  }
187
178
  });
188
179
 
@@ -190,30 +181,30 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
190
181
  * Applies differentiation rules.
191
182
  *
192
183
  * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node
193
- * @param {Object} constNodes Holds the nodes that are constant
184
+ * @param {function} isConst Function that tells if a node is constant
194
185
  * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr`
195
186
  */
196
187
  const _derivative = typed('_derivative', {
197
- 'ConstantNode, Object': function (node) {
188
+ 'ConstantNode, function': function () {
198
189
  return createConstantNode(0);
199
190
  },
200
- 'SymbolNode, Object': function (node, constNodes) {
201
- if (constNodes[node] !== undefined) {
191
+ 'SymbolNode, function': function (node, isConst) {
192
+ if (isConst(node)) {
202
193
  return createConstantNode(0);
203
194
  }
204
195
  return createConstantNode(1);
205
196
  },
206
- 'ParenthesisNode, Object': function (node, constNodes) {
207
- return new ParenthesisNode(_derivative(node.content, constNodes));
197
+ 'ParenthesisNode, function': function (node, isConst) {
198
+ return new ParenthesisNode(_derivative(node.content, isConst));
208
199
  },
209
- 'FunctionAssignmentNode, Object': function (node, constNodes) {
210
- if (constNodes[node] !== undefined) {
200
+ 'FunctionAssignmentNode, function': function (node, isConst) {
201
+ if (isConst(node)) {
211
202
  return createConstantNode(0);
212
203
  }
213
- return _derivative(node.expr, constNodes);
204
+ return _derivative(node.expr, isConst);
214
205
  },
215
- 'FunctionNode, Object': function (node, constNodes) {
216
- if (constNodes[node] !== undefined) {
206
+ 'FunctionNode, function': function (node, isConst) {
207
+ if (isConst(node)) {
217
208
  return createConstantNode(0);
218
209
  }
219
210
  const arg0 = node.args[0];
@@ -237,10 +228,7 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
237
228
  } else if (node.args.length === 2) {
238
229
  // Rearrange from nthRoot(x, a) -> x^(1/a)
239
230
  arg1 = new OperatorNode('/', 'divide', [createConstantNode(1), node.args[1]]);
240
-
241
- // Is a variable?
242
- constNodes[arg1] = constNodes[node.args[1]];
243
- return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), constNodes);
231
+ return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), isConst);
244
232
  }
245
233
  break;
246
234
  case 'log10':
@@ -251,20 +239,19 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
251
239
  // d/dx(log(x)) = 1 / x
252
240
  funcDerivative = arg0.clone();
253
241
  div = true;
254
- } else if (node.args.length === 1 && arg1 || node.args.length === 2 && constNodes[node.args[1]] !== undefined) {
242
+ } else if (node.args.length === 1 && arg1 || node.args.length === 2 && isConst(node.args[1])) {
255
243
  // d/dx(log(x, c)) = 1 / (x*ln(c))
256
244
  funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('log', [arg1 || node.args[1]])]);
257
245
  div = true;
258
246
  } else if (node.args.length === 2) {
259
247
  // d/dx(log(f(x), g(x))) = d/dx(log(f(x)) / log(g(x)))
260
- return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]), constNodes);
248
+ return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]), isConst);
261
249
  }
262
250
  break;
263
251
  case 'pow':
264
252
  if (node.args.length === 2) {
265
- constNodes[arg1] = constNodes[node.args[1]];
266
253
  // Pass to pow operator node parser
267
- return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), constNodes);
254
+ return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), isConst);
268
255
  }
269
256
  break;
270
257
  case 'exp':
@@ -410,51 +397,51 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
410
397
  /* Apply chain rule to all functions:
411
398
  F(x) = f(g(x))
412
399
  F'(x) = g'(x)*f'(g(x)) */
413
- let chainDerivative = _derivative(arg0, constNodes);
400
+ let chainDerivative = _derivative(arg0, isConst);
414
401
  if (negative) {
415
402
  chainDerivative = new OperatorNode('-', 'unaryMinus', [chainDerivative]);
416
403
  }
417
404
  return new OperatorNode(op, func, [chainDerivative, funcDerivative]);
418
405
  },
419
- 'OperatorNode, Object': function (node, constNodes) {
420
- if (constNodes[node] !== undefined) {
406
+ 'OperatorNode, function': function (node, isConst) {
407
+ if (isConst(node)) {
421
408
  return createConstantNode(0);
422
409
  }
423
410
  if (node.op === '+') {
424
411
  // d/dx(sum(f(x)) = sum(f'(x))
425
412
  return new OperatorNode(node.op, node.fn, node.args.map(function (arg) {
426
- return _derivative(arg, constNodes);
413
+ return _derivative(arg, isConst);
427
414
  }));
428
415
  }
429
416
  if (node.op === '-') {
430
417
  // d/dx(+/-f(x)) = +/-f'(x)
431
418
  if (node.isUnary()) {
432
- return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes)]);
419
+ return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], isConst)]);
433
420
  }
434
421
 
435
422
  // Linearity of differentiation, d/dx(f(x) +/- g(x)) = f'(x) +/- g'(x)
436
423
  if (node.isBinary()) {
437
- return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes), _derivative(node.args[1], constNodes)]);
424
+ return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], isConst), _derivative(node.args[1], isConst)]);
438
425
  }
439
426
  }
440
427
  if (node.op === '*') {
441
428
  // d/dx(c*f(x)) = c*f'(x)
442
429
  const constantTerms = node.args.filter(function (arg) {
443
- return constNodes[arg] !== undefined;
430
+ return isConst(arg);
444
431
  });
445
432
  if (constantTerms.length > 0) {
446
433
  const nonConstantTerms = node.args.filter(function (arg) {
447
- return constNodes[arg] === undefined;
434
+ return !isConst(arg);
448
435
  });
449
436
  const nonConstantNode = nonConstantTerms.length === 1 ? nonConstantTerms[0] : new OperatorNode('*', 'multiply', nonConstantTerms);
450
- const newArgs = constantTerms.concat(_derivative(nonConstantNode, constNodes));
437
+ const newArgs = constantTerms.concat(_derivative(nonConstantNode, isConst));
451
438
  return new OperatorNode('*', 'multiply', newArgs);
452
439
  }
453
440
 
454
441
  // Product Rule, d/dx(f(x)*g(x)) = f'(x)*g(x) + f(x)*g'(x)
455
442
  return new OperatorNode('+', 'add', node.args.map(function (argOuter) {
456
443
  return new OperatorNode('*', 'multiply', node.args.map(function (argInner) {
457
- return argInner === argOuter ? _derivative(argInner, constNodes) : argInner.clone();
444
+ return argInner === argOuter ? _derivative(argInner, isConst) : argInner.clone();
458
445
  }));
459
446
  }));
460
447
  }
@@ -463,31 +450,31 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
463
450
  const arg1 = node.args[1];
464
451
 
465
452
  // d/dx(f(x) / c) = f'(x) / c
466
- if (constNodes[arg1] !== undefined) {
467
- return new OperatorNode('/', 'divide', [_derivative(arg0, constNodes), arg1]);
453
+ if (isConst(arg1)) {
454
+ return new OperatorNode('/', 'divide', [_derivative(arg0, isConst), arg1]);
468
455
  }
469
456
 
470
457
  // Reciprocal Rule, d/dx(c / f(x)) = -c(f'(x)/f(x)^2)
471
- if (constNodes[arg0] !== undefined) {
472
- return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1, constNodes), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])])]);
458
+ if (isConst(arg0)) {
459
+ return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1, isConst), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])])]);
473
460
  }
474
461
 
475
462
  // Quotient rule, d/dx(f(x) / g(x)) = (f'(x)g(x) - f(x)g'(x)) / g(x)^2
476
- return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0, constNodes), arg1.clone()]), new OperatorNode('*', 'multiply', [arg0.clone(), _derivative(arg1, constNodes)])]), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])]);
463
+ return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0, isConst), arg1.clone()]), new OperatorNode('*', 'multiply', [arg0.clone(), _derivative(arg1, isConst)])]), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])]);
477
464
  }
478
465
  if (node.op === '^' && node.isBinary()) {
479
466
  const arg0 = node.args[0];
480
467
  const arg1 = node.args[1];
481
- if (constNodes[arg0] !== undefined) {
468
+ if (isConst(arg0)) {
482
469
  // If is secretly constant; 0^f(x) = 1 (in JS), 1^f(x) = 1
483
470
  if ((0, _is.isConstantNode)(arg0) && (isZero(arg0.value) || equal(arg0.value, 1))) {
484
471
  return createConstantNode(0);
485
472
  }
486
473
 
487
474
  // d/dx(c^f(x)) = c^f(x)*ln(c)*f'(x)
488
- return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [arg0.clone()]), _derivative(arg1.clone(), constNodes)])]);
475
+ return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [arg0.clone()]), _derivative(arg1.clone(), isConst)])]);
489
476
  }
490
- if (constNodes[arg1] !== undefined) {
477
+ if (isConst(arg1)) {
491
478
  if ((0, _is.isConstantNode)(arg1)) {
492
479
  // If is secretly constant; f(x)^0 = 1 -> d/dx(1) = 0
493
480
  if (isZero(arg1.value)) {
@@ -495,17 +482,17 @@ const createDerivative = exports.createDerivative = /* #__PURE__ */(0, _factory.
495
482
  }
496
483
  // Ignore exponent; f(x)^1 = f(x)
497
484
  if (equal(arg1.value, 1)) {
498
- return _derivative(arg0, constNodes);
485
+ return _derivative(arg0, isConst);
499
486
  }
500
487
  }
501
488
 
502
489
  // Elementary Power Rule, d/dx(f(x)^c) = c*f'(x)*f(x)^(c-1)
503
490
  const powMinusOne = new OperatorNode('^', 'pow', [arg0.clone(), new OperatorNode('-', 'subtract', [arg1, createConstantNode(1)])]);
504
- return new OperatorNode('*', 'multiply', [arg1.clone(), new OperatorNode('*', 'multiply', [_derivative(arg0, constNodes), powMinusOne])]);
491
+ return new OperatorNode('*', 'multiply', [arg1.clone(), new OperatorNode('*', 'multiply', [_derivative(arg0, isConst), powMinusOne])]);
505
492
  }
506
493
 
507
494
  // Functional Power Rule, d/dx(f^g) = f^g*[f'*(g/f) + g'ln(f)]
508
- return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [arg0.clone(), arg1.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(arg0, constNodes), new OperatorNode('/', 'divide', [arg1.clone(), arg0.clone()])]), new OperatorNode('*', 'multiply', [_derivative(arg1, constNodes), new FunctionNode('log', [arg0.clone()])])])]);
495
+ return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [arg0.clone(), arg1.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(arg0, isConst), new OperatorNode('/', 'divide', [arg1.clone(), arg0.clone()])]), new OperatorNode('*', 'multiply', [_derivative(arg1, isConst), new FunctionNode('log', [arg0.clone()])])])]);
509
496
  }
510
497
  throw new Error('Cannot process operator "' + node.op + '" in derivative: ' + 'the operator is not supported, undefined, or the number of arguments passed to it are not supported');
511
498
  }
@@ -5,9 +5,11 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createLog = void 0;
7
7
  var _factory = require("../../utils/factory.js");
8
+ var _bigint = require("../../utils/bigint.js");
8
9
  var _index = require("../../plain/number/index.js");
9
10
  const name = 'log';
10
11
  const dependencies = ['config', 'typed', 'typeOf', 'divideScalar', 'Complex'];
12
+ const nlg16 = Math.log(16);
11
13
  const createLog = exports.createLog = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
12
14
  let {
13
15
  typed,
@@ -51,24 +53,29 @@ const createLog = exports.createLog = /* #__PURE__ */(0, _factory.factory)(name,
51
53
  * @return {number | BigNumber | Fraction | Complex}
52
54
  * Returns the logarithm of `x`
53
55
  */
56
+ function complexLog(c) {
57
+ return c.log();
58
+ }
59
+ function complexLogNumber(x) {
60
+ return complexLog(new Complex(x, 0));
61
+ }
54
62
  return typed(name, {
55
63
  number: function (x) {
56
64
  if (x >= 0 || config.predictable) {
57
65
  return (0, _index.logNumber)(x);
58
66
  } else {
59
67
  // negative value -> complex value computation
60
- return new Complex(x, 0).log();
68
+ return complexLogNumber(x);
61
69
  }
62
70
  },
63
- Complex: function (x) {
64
- return x.log();
65
- },
71
+ bigint: (0, _bigint.promoteLogarithm)(nlg16, _index.logNumber, config, complexLogNumber),
72
+ Complex: complexLog,
66
73
  BigNumber: function (x) {
67
74
  if (!x.isNegative() || config.predictable) {
68
75
  return x.ln();
69
76
  } else {
70
77
  // downgrade to number, return Complex valued result
71
- return new Complex(x.toNumber(), 0).log();
78
+ return complexLogNumber(x.toNumber());
72
79
  }
73
80
  },
74
81
  'any, any': typed.referToSelf(self => (x, base) => {
@@ -4,11 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createLog10 = void 0;
7
- var _factory = require("../../utils/factory.js");
8
- var _collection = require("../../utils/collection.js");
9
7
  var _index = require("../../plain/number/index.js");
8
+ var _bigint = require("../../utils/bigint.js");
9
+ var _collection = require("../../utils/collection.js");
10
+ var _factory = require("../../utils/factory.js");
10
11
  const name = 'log10';
11
12
  const dependencies = ['typed', 'config', 'Complex'];
13
+ const log16 = (0, _index.log10Number)(16);
12
14
  const createLog10 = exports.createLog10 = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
13
15
  let {
14
16
  typed,
@@ -40,24 +42,30 @@ const createLog10 = exports.createLog10 = /* #__PURE__ */(0, _factory.factory)(n
40
42
  * @return {number | BigNumber | Complex | Array | Matrix}
41
43
  * Returns the 10-base logarithm of `x`
42
44
  */
45
+
46
+ function complexLog(c) {
47
+ return c.log().div(Math.LN10);
48
+ }
49
+ function complexLogNumber(x) {
50
+ return complexLog(new Complex(x, 0));
51
+ }
43
52
  return typed(name, {
44
53
  number: function (x) {
45
54
  if (x >= 0 || config.predictable) {
46
55
  return (0, _index.log10Number)(x);
47
56
  } else {
48
57
  // negative value -> complex value computation
49
- return new Complex(x, 0).log().div(Math.LN10);
58
+ return complexLogNumber(x);
50
59
  }
51
60
  },
52
- Complex: function (x) {
53
- return new Complex(x).log().div(Math.LN10);
54
- },
61
+ bigint: (0, _bigint.promoteLogarithm)(log16, _index.log10Number, config, complexLogNumber),
62
+ Complex: complexLog,
55
63
  BigNumber: function (x) {
56
64
  if (!x.isNegative() || config.predictable) {
57
65
  return x.log();
58
66
  } else {
59
67
  // downgrade to number, return Complex valued result
60
- return new Complex(x.toNumber(), 0).log().div(Math.LN10);
68
+ return complexLogNumber(x.toNumber());
61
69
  }
62
70
  },
63
71
  'Array | Matrix': typed.referToSelf(self => x => (0, _collection.deepMap)(x, self))
@@ -4,9 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createLog2 = void 0;
7
- var _factory = require("../../utils/factory.js");
8
- var _collection = require("../../utils/collection.js");
9
7
  var _index = require("../../plain/number/index.js");
8
+ var _bigint = require("../../utils/bigint.js");
9
+ var _collection = require("../../utils/collection.js");
10
+ var _factory = require("../../utils/factory.js");
10
11
  const name = 'log2';
11
12
  const dependencies = ['typed', 'config', 'Complex'];
12
13
  const createLog2 = exports.createLog2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
@@ -40,22 +41,26 @@ const createLog2 = exports.createLog2 = /* #__PURE__ */(0, _factory.factory)(nam
40
41
  * @return {number | BigNumber | Complex | Array | Matrix}
41
42
  * Returns the 2-base logarithm of `x`
42
43
  */
44
+ function complexLog2Number(x) {
45
+ return _log2Complex(new Complex(x, 0));
46
+ }
43
47
  return typed(name, {
44
48
  number: function (x) {
45
49
  if (x >= 0 || config.predictable) {
46
50
  return (0, _index.log2Number)(x);
47
51
  } else {
48
52
  // negative value -> complex value computation
49
- return _log2Complex(new Complex(x, 0));
53
+ return complexLog2Number(x);
50
54
  }
51
55
  },
56
+ bigint: (0, _bigint.promoteLogarithm)(4, _index.log2Number, config, complexLog2Number),
52
57
  Complex: _log2Complex,
53
58
  BigNumber: function (x) {
54
59
  if (!x.isNegative() || config.predictable) {
55
60
  return x.log(2);
56
61
  } else {
57
62
  // downgrade to number, return Complex valued result
58
- return _log2Complex(new Complex(x.toNumber(), 0));
63
+ return complexLog2Number(x.toNumber());
59
64
  }
60
65
  },
61
66
  'Array | Matrix': typed.referToSelf(self => x => (0, _collection.deepMap)(x, self))
@@ -9,11 +9,13 @@ var _randomMatrix = require("./util/randomMatrix.js");
9
9
  var _seededRNG = require("./util/seededRNG.js");
10
10
  var _is = require("../../utils/is.js");
11
11
  const name = 'randomInt';
12
- const dependencies = ['typed', 'config', '?on'];
12
+ const dependencies = ['typed', 'config', 'log2', '?on'];
13
+ const simpleCutoff = 2n ** 30n;
13
14
  const createRandomInt = exports.createRandomInt = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
14
15
  let {
15
16
  typed,
16
17
  config,
18
+ log2,
17
19
  on
18
20
  } = _ref;
19
21
  // seeded pseudo random number generator
@@ -32,7 +34,7 @@ const createRandomInt = exports.createRandomInt = /* #__PURE__ */(0, _factory.fa
32
34
  *
33
35
  * Syntax:
34
36
  *
35
- * math.randomInt() // generate a random integer between 0 and 1
37
+ * math.randomInt() // generate either 0 or 1, randomly
36
38
  * math.randomInt(max) // generate a random integer between 0 and max
37
39
  * math.randomInt(min, max) // generate a random integer between min and max
38
40
  * math.randomInt(size) // generate a matrix with random integer between 0 and 1
@@ -56,9 +58,11 @@ const createRandomInt = exports.createRandomInt = /* #__PURE__ */(0, _factory.fa
56
58
  * @return {number | Array | Matrix} A random integer value
57
59
  */
58
60
  return typed(name, {
59
- '': () => _randomInt(0, 1),
61
+ '': () => _randomInt(0, 2),
60
62
  number: max => _randomInt(0, max),
61
63
  'number, number': (min, max) => _randomInt(min, max),
64
+ bigint: max => _randomBigint(0n, max),
65
+ 'bigint, bigint': _randomBigint,
62
66
  'Array | Matrix': size => _randomIntMatrix(size, 0, 1),
63
67
  'Array | Matrix, number': (size, max) => _randomIntMatrix(size, 0, max),
64
68
  'Array | Matrix, number, number': (size, min, max) => _randomIntMatrix(size, min, max)
@@ -70,4 +74,23 @@ const createRandomInt = exports.createRandomInt = /* #__PURE__ */(0, _factory.fa
70
74
  function _randomInt(min, max) {
71
75
  return Math.floor(min + rng() * (max - min));
72
76
  }
77
+ function _randomBigint(min, max) {
78
+ const width = max - min; // number of choices
79
+ if (width <= simpleCutoff) {
80
+ // do it with number type
81
+ return min + BigInt(_randomInt(0, Number(width)));
82
+ }
83
+ // Too big to choose accurately that way. Instead, choose the correct
84
+ // number of random bits to cover the width, and repeat until the
85
+ // resulting number falls within the width
86
+ const bits = log2(width);
87
+ let picked = width;
88
+ while (picked >= width) {
89
+ picked = 0n;
90
+ for (let i = 0; i < bits; ++i) {
91
+ picked = 2n * picked + (rng() < 0.5 ? 0n : 1n);
92
+ }
93
+ }
94
+ return min + picked;
95
+ }
73
96
  });