mathjs 14.0.0 → 14.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
  });