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