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.
- package/HISTORY.md +15 -0
- package/NOTICE +1 -1
- package/README.md +7 -7
- package/bin/cli.js +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +5 -5
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesRandomInt.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRandomInt.generated.js +2 -0
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +1 -1
- package/lib/cjs/entry/pureFunctionsAny.generated.js +3 -0
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +5 -4
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/sign.js +1 -1
- package/lib/cjs/function/algebra/derivative.js +64 -77
- package/lib/cjs/function/arithmetic/log.js +12 -5
- package/lib/cjs/function/arithmetic/log10.js +15 -7
- package/lib/cjs/function/arithmetic/log2.js +9 -4
- package/lib/cjs/function/probability/randomInt.js +26 -3
- package/lib/cjs/function/relational/larger.js +12 -4
- package/lib/cjs/function/relational/smaller.js +12 -4
- package/lib/cjs/function/statistics/max.js +1 -1
- package/lib/cjs/function/statistics/min.js +1 -1
- package/lib/cjs/function/string/print.js +2 -2
- package/lib/cjs/function/utils/isInteger.js +1 -1
- package/lib/cjs/header.js +3 -3
- package/lib/cjs/utils/bigint.js +33 -0
- package/lib/cjs/utils/number.js +7 -19
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesLarger.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesRandomInt.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSmaller.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRandomInt.generated.js +2 -0
- package/lib/esm/entry/impureFunctionsNumber.generated.js +2 -2
- package/lib/esm/entry/pureFunctionsAny.generated.js +3 -0
- package/lib/esm/entry/pureFunctionsNumber.generated.js +6 -5
- package/lib/esm/expression/embeddedDocs/function/arithmetic/sign.js +1 -1
- package/lib/esm/function/algebra/derivative.js +64 -77
- package/lib/esm/function/arithmetic/log.js +12 -5
- package/lib/esm/function/arithmetic/log10.js +16 -8
- package/lib/esm/function/arithmetic/log2.js +9 -4
- package/lib/esm/function/probability/randomInt.js +26 -3
- package/lib/esm/function/relational/larger.js +12 -4
- package/lib/esm/function/relational/smaller.js +12 -4
- package/lib/esm/function/statistics/max.js +1 -1
- package/lib/esm/function/statistics/min.js +1 -1
- package/lib/esm/function/string/print.js +2 -2
- package/lib/esm/function/utils/isInteger.js +1 -1
- package/lib/esm/header.js +1 -1
- package/lib/esm/utils/bigint.js +27 -0
- package/lib/esm/utils/number.js +6 -17
- package/lib/esm/version.js +1 -1
- package/package.json +19 -17
- 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>
|
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
|
70
|
-
|
71
|
-
|
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
|
-
|
92
|
-
|
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
|
-
*
|
137
|
-
*
|
138
|
-
*
|
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 {
|
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
|
-
|
150
|
-
|
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
|
-
'
|
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
|
-
|
159
|
-
constNodes[node] = true;
|
160
|
-
return true;
|
161
|
-
}
|
162
|
-
return false;
|
164
|
+
return node.name !== varName;
|
163
165
|
},
|
164
|
-
'
|
165
|
-
return
|
166
|
+
'function, ParenthesisNode, string': function (isConst, node, varName) {
|
167
|
+
return isConst(node.content, varName);
|
166
168
|
},
|
167
|
-
'
|
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
|
173
|
+
return isConst(node.expr, varName);
|
173
174
|
},
|
174
|
-
'
|
175
|
-
|
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 {
|
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,
|
188
|
+
'ConstantNode, function': function () {
|
198
189
|
return createConstantNode(0);
|
199
190
|
},
|
200
|
-
'SymbolNode,
|
201
|
-
if (
|
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,
|
207
|
-
return new ParenthesisNode(_derivative(node.content,
|
197
|
+
'ParenthesisNode, function': function (node, isConst) {
|
198
|
+
return new ParenthesisNode(_derivative(node.content, isConst));
|
208
199
|
},
|
209
|
-
'FunctionAssignmentNode,
|
210
|
-
if (
|
200
|
+
'FunctionAssignmentNode, function': function (node, isConst) {
|
201
|
+
if (isConst(node)) {
|
211
202
|
return createConstantNode(0);
|
212
203
|
}
|
213
|
-
return _derivative(node.expr,
|
204
|
+
return _derivative(node.expr, isConst);
|
214
205
|
},
|
215
|
-
'FunctionNode,
|
216
|
-
if (
|
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 &&
|
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]])]),
|
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]]),
|
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,
|
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,
|
420
|
-
if (
|
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,
|
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],
|
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],
|
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
|
430
|
+
return isConst(arg);
|
444
431
|
});
|
445
432
|
if (constantTerms.length > 0) {
|
446
433
|
const nonConstantTerms = node.args.filter(function (arg) {
|
447
|
-
return
|
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,
|
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,
|
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 (
|
467
|
-
return new OperatorNode('/', 'divide', [_derivative(arg0,
|
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 (
|
472
|
-
return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1,
|
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,
|
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 (
|
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(),
|
475
|
+
return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [arg0.clone()]), _derivative(arg1.clone(), isConst)])]);
|
489
476
|
}
|
490
|
-
if (
|
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,
|
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,
|
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,
|
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
|
68
|
+
return complexLogNumber(x);
|
61
69
|
}
|
62
70
|
},
|
63
|
-
|
64
|
-
|
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
|
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
|
58
|
+
return complexLogNumber(x);
|
50
59
|
}
|
51
60
|
},
|
52
|
-
|
53
|
-
|
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
|
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
|
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
|
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
|
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,
|
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
|
});
|