mathjs 10.0.0 → 10.1.1
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +37 -0
- package/NOTICE +1 -1
- package/README.md +10 -2
- package/bin/cli.js +1 -1
- package/docs/expressions/syntax.md +1 -1
- package/docs/reference/constants.md +1 -1
- package/docs/reference/functions/invmod.md +41 -0
- package/docs/reference/functions/simplify.md +8 -5
- package/docs/reference/functions.md +1 -0
- package/examples/expressions.js +1 -1
- package/lib/browser/math.js +7 -7
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesIntersect.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesInvmod.generated.js +41 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesRationalize.generated.js +15 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplify.generated.js +15 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +8 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesRationalize.generated.js +15 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplify.generated.js +15 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +11 -0
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +10 -0
- package/lib/cjs/entry/pureFunctionsAny.generated.js +16 -2
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -1
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/invmod.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/matrix/forEach.js +1 -1
- package/lib/cjs/factoriesAny.js +8 -0
- package/lib/cjs/function/algebra/rationalize.js +18 -4
- package/lib/cjs/function/algebra/simplify/simplifyConstant.js +223 -29
- package/lib/cjs/function/algebra/simplify/simplifyCore.js +34 -6
- package/lib/cjs/function/algebra/simplify.js +103 -30
- package/lib/cjs/function/arithmetic/invmod.js +73 -0
- package/lib/cjs/function/arithmetic/round.js +2 -2
- package/lib/cjs/function/geometry/intersect.js +12 -13
- package/lib/cjs/function/probability/gamma.js +28 -30
- package/lib/cjs/header.js +3 -3
- package/lib/cjs/type/matrix/SparseMatrix.js +19 -15
- package/lib/cjs/type/unit/Unit.js +2 -2
- package/lib/cjs/utils/number.js +1 -1
- package/lib/cjs/utils/snapshot.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesIntersect.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesInvmod.generated.js +24 -0
- package/lib/esm/entry/dependenciesAny/dependenciesRationalize.generated.js +10 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplify.generated.js +10 -0
- package/lib/esm/entry/dependenciesAny.generated.js +1 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesRationalize.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplify.generated.js +10 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +12 -1
- package/lib/esm/entry/impureFunctionsNumber.generated.js +10 -0
- package/lib/esm/entry/pureFunctionsAny.generated.js +14 -1
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -1
- package/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/matrix/forEach.js +1 -1
- package/lib/esm/factoriesAny.js +1 -0
- package/lib/esm/function/algebra/rationalize.js +18 -4
- package/lib/esm/function/algebra/simplify/simplifyConstant.js +197 -29
- package/lib/esm/function/algebra/simplify/simplifyCore.js +35 -7
- package/lib/esm/function/algebra/simplify.js +103 -30
- package/lib/esm/function/arithmetic/invmod.js +57 -0
- package/lib/esm/function/arithmetic/round.js +2 -2
- package/lib/esm/function/geometry/intersect.js +12 -12
- package/lib/esm/function/probability/gamma.js +28 -30
- package/lib/esm/header.js +1 -1
- package/lib/esm/type/matrix/SparseMatrix.js +19 -15
- package/lib/esm/type/unit/Unit.js +2 -2
- package/lib/esm/utils/number.js +1 -1
- package/lib/esm/utils/snapshot.js +2 -2
- package/lib/esm/version.js +1 -1
- package/package.json +15 -14
- package/types/index.d.ts +4 -4
@@ -7,7 +7,7 @@ import { createResolve } from './simplify/resolve.js';
|
|
7
7
|
import { hasOwnProperty } from '../../utils/object.js';
|
8
8
|
import { createEmptyMap, createMap } from '../../utils/map.js';
|
9
9
|
var name = 'simplify';
|
10
|
-
var dependencies = ['config', 'typed', 'parse', 'add', 'subtract', 'multiply', 'divide', 'pow', 'isZero', 'equal', '?fraction', '?bignumber', 'mathWithTransform', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];
|
10
|
+
var dependencies = ['config', 'typed', 'parse', 'add', 'subtract', 'multiply', 'divide', 'pow', 'isZero', 'equal', '?fraction', '?bignumber', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];
|
11
11
|
export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
12
12
|
var {
|
13
13
|
config,
|
@@ -23,8 +23,13 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
23
23
|
fraction,
|
24
24
|
bignumber,
|
25
25
|
mathWithTransform,
|
26
|
+
matrix,
|
27
|
+
AccessorNode,
|
28
|
+
ArrayNode,
|
26
29
|
ConstantNode,
|
27
30
|
FunctionNode,
|
31
|
+
IndexNode,
|
32
|
+
ObjectNode,
|
28
33
|
OperatorNode,
|
29
34
|
ParenthesisNode,
|
30
35
|
SymbolNode
|
@@ -33,11 +38,16 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
33
38
|
typed,
|
34
39
|
config,
|
35
40
|
mathWithTransform,
|
41
|
+
matrix,
|
36
42
|
fraction,
|
37
43
|
bignumber,
|
44
|
+
AccessorNode,
|
45
|
+
ArrayNode,
|
38
46
|
ConstantNode,
|
39
|
-
OperatorNode,
|
40
47
|
FunctionNode,
|
48
|
+
IndexNode,
|
49
|
+
ObjectNode,
|
50
|
+
OperatorNode,
|
41
51
|
SymbolNode
|
42
52
|
});
|
43
53
|
var simplifyCore = createSimplifyCore({
|
@@ -48,9 +58,13 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
48
58
|
multiply,
|
49
59
|
divide,
|
50
60
|
pow,
|
61
|
+
AccessorNode,
|
62
|
+
ArrayNode,
|
51
63
|
ConstantNode,
|
52
|
-
OperatorNode,
|
53
64
|
FunctionNode,
|
65
|
+
IndexNode,
|
66
|
+
ObjectNode,
|
67
|
+
OperatorNode,
|
54
68
|
ParenthesisNode
|
55
69
|
});
|
56
70
|
var resolve = createResolve({
|
@@ -107,11 +121,14 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
107
121
|
* - [Symbolic computation - Simplification (Wikipedia)](https://en.wikipedia.org/wiki/Symbolic_computation#Simplification)
|
108
122
|
*
|
109
123
|
* An optional `options` argument can be passed as last argument of `simplify`.
|
110
|
-
*
|
111
|
-
* - `
|
112
|
-
|
113
|
-
*
|
114
|
-
|
124
|
+
* Currently available options (defaults in parentheses):
|
125
|
+
* - `consoleDebug` (false): whether to write the expression being simplified
|
126
|
+
and any changes to it, along with the rule responsible, to console
|
127
|
+
* - `exactFractions` (true): whether to try to convert all constants to
|
128
|
+
exact rational numbers.
|
129
|
+
* - `fractionsLimit` (10000): when `exactFractions` is true, constants will
|
130
|
+
be expressed as fractions only when both numerator and denominator
|
131
|
+
are smaller than `fractionsLimit`.
|
115
132
|
*
|
116
133
|
* Syntax:
|
117
134
|
*
|
@@ -181,6 +198,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
181
198
|
return this(expr, rules, createMap(scope), options);
|
182
199
|
},
|
183
200
|
'Node, Array, Map, Object': function NodeArrayMapObject(expr, rules, scope, options) {
|
201
|
+
var debug = options.consoleDebug;
|
184
202
|
rules = _buildRules(rules);
|
185
203
|
var res = resolve(expr, scope);
|
186
204
|
res = removeParens(res);
|
@@ -193,12 +211,33 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
193
211
|
visited[str] = true;
|
194
212
|
_lastsym = 0; // counter for placeholder symbols
|
195
213
|
|
214
|
+
var laststr = str;
|
215
|
+
if (debug) console.log('Working on: ', str);
|
216
|
+
|
196
217
|
for (var i = 0; i < rules.length; i++) {
|
218
|
+
var rulestr = '';
|
219
|
+
|
197
220
|
if (typeof rules[i] === 'function') {
|
198
221
|
res = rules[i](res, options);
|
222
|
+
if (debug) rulestr = rules[i].name;
|
199
223
|
} else {
|
200
224
|
flatten(res);
|
201
225
|
res = applyRule(res, rules[i]);
|
226
|
+
|
227
|
+
if (debug) {
|
228
|
+
rulestr = "".concat(rules[i].l.toString(), " -> ").concat(rules[i].r.toString());
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
if (debug) {
|
233
|
+
var newstr = res.toString({
|
234
|
+
parenthesis: 'all'
|
235
|
+
});
|
236
|
+
|
237
|
+
if (newstr !== laststr) {
|
238
|
+
console.log('Applying', rulestr, 'produced', newstr);
|
239
|
+
laststr = newstr;
|
240
|
+
}
|
202
241
|
}
|
203
242
|
|
204
243
|
unflattenl(res); // using left-heavy binary tree here since custom rule functions may expect it
|
@@ -262,17 +301,19 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
262
301
|
l: 'log(e)',
|
263
302
|
r: '1'
|
264
303
|
}, // temporary rules
|
304
|
+
// Note initially we tend constants to the right because like-term
|
305
|
+
// collection prefers the left, and we would rather collect nonconstants
|
265
306
|
{
|
266
307
|
l: 'n-n1',
|
267
308
|
r: 'n+-n1'
|
268
309
|
}, // temporarily replace 'subtract' so we can further flatten the 'add' operator
|
269
310
|
{
|
270
311
|
l: '-(c*v)',
|
271
|
-
r: '(-c)
|
312
|
+
r: 'v * (-c)'
|
272
313
|
}, // make non-constant terms positive
|
273
314
|
{
|
274
315
|
l: '-v',
|
275
|
-
r: '(-1)
|
316
|
+
r: 'v * (-1)'
|
276
317
|
}, {
|
277
318
|
l: 'n/n1^n2',
|
278
319
|
r: 'n*n1^-n2'
|
@@ -280,7 +321,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
280
321
|
{
|
281
322
|
l: 'n/n1',
|
282
323
|
r: 'n*n1^-1'
|
283
|
-
}, // expand nested exponentiation
|
324
|
+
}, simplifyConstant, // expand nested exponentiation
|
284
325
|
{
|
285
326
|
l: '(n ^ n1) ^ n2',
|
286
327
|
r: 'n ^ (n1 * n2)'
|
@@ -302,20 +343,29 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
302
343
|
l: 'n+-n',
|
303
344
|
r: '0'
|
304
345
|
}, {
|
305
|
-
l: '
|
306
|
-
r: '(
|
307
|
-
},
|
308
|
-
|
309
|
-
|
310
|
-
|
346
|
+
l: 'v*n + v',
|
347
|
+
r: 'v*(n+1)'
|
348
|
+
}, // NOTE: leftmost position is special:
|
349
|
+
{
|
350
|
+
l: 'n3*n1 + n3*n2',
|
351
|
+
r: 'n3*(n1+n2)'
|
352
|
+
}, // All sub-monomials tried there.
|
353
|
+
{
|
354
|
+
l: 'n*c + c',
|
355
|
+
r: '(n+1)*c'
|
356
|
+
}, // remove parenthesis in the case of negating a quantity
|
357
|
+
// (It might seem this rule should precede collecting like terms,
|
358
|
+
// but putting it after gives another chance of noticing like terms,
|
359
|
+
// and any new like terms produced by this will be collected
|
360
|
+
// on the next pass through all the rules.)
|
361
|
+
{
|
362
|
+
l: 'n1 + (n2 + n3)*(-1)',
|
363
|
+
r: 'n1 + n2*(-1) + n3*(-1)'
|
364
|
+
}, // make factors positive (and undo 'make non-constant terms positive')
|
311
365
|
{
|
312
|
-
l: 'n1 + -1 * (n2 + n3)',
|
313
|
-
r: 'n1 + -1 * n2 + -1 * n3'
|
314
|
-
}, simplifyConstant, {
|
315
366
|
l: '(-n)*n1',
|
316
367
|
r: '-(n*n1)'
|
317
|
-
}, //
|
318
|
-
// ordering of constants
|
368
|
+
}, // final ordering of constants
|
319
369
|
{
|
320
370
|
l: 'c+v',
|
321
371
|
r: 'v+c',
|
@@ -365,6 +415,9 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
365
415
|
{
|
366
416
|
l: 'n1/(n2/n3)',
|
367
417
|
r: '(n1*n3)/n2'
|
418
|
+
}, {
|
419
|
+
l: 'n1/(-n2)',
|
420
|
+
r: '-n1/n2'
|
368
421
|
}];
|
369
422
|
/**
|
370
423
|
* Parse the string array of rules into nodes
|
@@ -416,7 +469,7 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
416
469
|
};
|
417
470
|
|
418
471
|
if (rule.context) {
|
419
|
-
newRule.
|
472
|
+
newRule.context = rule.context;
|
420
473
|
}
|
421
474
|
|
422
475
|
if (rule.evaluate) {
|
@@ -460,6 +513,14 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
460
513
|
function _getExpandPlaceholderSymbol() {
|
461
514
|
return new SymbolNode('_p' + _lastsym++);
|
462
515
|
}
|
516
|
+
|
517
|
+
function mapRule(nodes, rule) {
|
518
|
+
if (nodes) {
|
519
|
+
for (var i = 0; i < nodes.length; ++i) {
|
520
|
+
nodes[i] = applyRule(nodes[i], rule);
|
521
|
+
}
|
522
|
+
}
|
523
|
+
}
|
463
524
|
/**
|
464
525
|
* Returns a simplfied form of node, or the original node if no simplification was possible.
|
465
526
|
*
|
@@ -473,19 +534,31 @@ export var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
473
534
|
// console.log('Entering applyRule(' + node.toString() + ')')
|
474
535
|
// Do not clone node unless we find a match
|
475
536
|
var res = node; // First replace our child nodes with their simplified versions
|
476
|
-
// If a child could not be simplified, the
|
477
|
-
// no effect since the node is returned unchanged
|
537
|
+
// If a child could not be simplified, applying the rule to it
|
538
|
+
// will have no effect since the node is returned unchanged
|
478
539
|
|
479
540
|
if (res instanceof OperatorNode || res instanceof FunctionNode) {
|
480
|
-
|
481
|
-
for (var i = 0; i < res.args.length; i++) {
|
482
|
-
res.args[i] = applyRule(res.args[i], rule);
|
483
|
-
}
|
484
|
-
}
|
541
|
+
mapRule(res.args, rule);
|
485
542
|
} else if (res instanceof ParenthesisNode) {
|
486
543
|
if (res.content) {
|
487
544
|
res.content = applyRule(res.content, rule);
|
488
545
|
}
|
546
|
+
} else if (res instanceof ArrayNode) {
|
547
|
+
mapRule(res.items, rule);
|
548
|
+
} else if (res instanceof AccessorNode) {
|
549
|
+
if (res.object) {
|
550
|
+
res.object = applyRule(res.object, rule);
|
551
|
+
}
|
552
|
+
|
553
|
+
if (res.index) {
|
554
|
+
res.index = applyRule(res.index, rule);
|
555
|
+
}
|
556
|
+
} else if (res instanceof IndexNode) {
|
557
|
+
mapRule(res.dimensions, rule);
|
558
|
+
} else if (res instanceof ObjectNode) {
|
559
|
+
for (var prop in res.properties) {
|
560
|
+
res.properties[prop] = applyRule(res.properties[prop], rule);
|
561
|
+
}
|
489
562
|
} // Try to match a rule against this node
|
490
563
|
|
491
564
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
import { factory } from '../../utils/factory.js';
|
2
|
+
var name = 'invmod';
|
3
|
+
var dependencies = ['typed', 'config', 'BigNumber', 'xgcd', 'equal', 'smaller', 'mod', 'add', 'isInteger'];
|
4
|
+
export var createInvmod = /* #__PURE__ */factory(name, dependencies, _ref => {
|
5
|
+
var {
|
6
|
+
typed,
|
7
|
+
config,
|
8
|
+
BigNumber,
|
9
|
+
xgcd,
|
10
|
+
equal,
|
11
|
+
smaller,
|
12
|
+
mod,
|
13
|
+
add,
|
14
|
+
isInteger
|
15
|
+
} = _ref;
|
16
|
+
|
17
|
+
/**
|
18
|
+
* Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation `ax ≣ 1 (mod b)`
|
19
|
+
* See https://en.wikipedia.org/wiki/Modular_multiplicative_inverse.
|
20
|
+
*
|
21
|
+
* Syntax:
|
22
|
+
*
|
23
|
+
* math.invmod(a, b)
|
24
|
+
*
|
25
|
+
* Examples:
|
26
|
+
*
|
27
|
+
* math.invmod(8, 12) // returns NaN
|
28
|
+
* math.invmod(7, 13) // return 2
|
29
|
+
* math.invmod(15151, 15122) // returns 10429
|
30
|
+
*
|
31
|
+
* See also:
|
32
|
+
*
|
33
|
+
* gcd, xgcd
|
34
|
+
*
|
35
|
+
* @param {number | BigNumber} a An integer number
|
36
|
+
* @param {number | BigNumber} b An integer number
|
37
|
+
* @return {number | BigNumber } Returns an integer number
|
38
|
+
* where `invmod(a,b)*a ≣ 1 (mod b)`
|
39
|
+
*/
|
40
|
+
return typed(name, {
|
41
|
+
'number, number': invmod,
|
42
|
+
'BigNumber, BigNumber': invmod
|
43
|
+
});
|
44
|
+
|
45
|
+
function invmod(a, b) {
|
46
|
+
if (!isInteger(a) || !isInteger(b)) throw new Error('Parameters in function invmod must be integer numbers');
|
47
|
+
a = mod(a, b);
|
48
|
+
if (equal(b, 0)) throw new Error('Divisor must be non zero');
|
49
|
+
var res = xgcd(a, b);
|
50
|
+
res = res.valueOf();
|
51
|
+
var [gcd, inv] = res;
|
52
|
+
if (!equal(gcd, BigNumber(1))) return NaN;
|
53
|
+
inv = mod(inv, b);
|
54
|
+
if (smaller(inv, BigNumber(0))) inv = add(inv, b);
|
55
|
+
return inv;
|
56
|
+
}
|
57
|
+
});
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
2
2
|
|
3
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
3
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
4
4
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
5
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
6
6
|
|
7
7
|
import { factory } from '../../utils/factory.js';
|
8
8
|
import { deepMap } from '../../utils/collection.js';
|
@@ -1,7 +1,6 @@
|
|
1
|
-
import { isBigNumber } from '../../utils/is.js';
|
2
1
|
import { factory } from '../../utils/factory.js';
|
3
2
|
var name = 'intersect';
|
4
|
-
var dependencies = ['typed', 'config', 'abs', 'add', 'addScalar', 'matrix', 'multiply', 'multiplyScalar', 'divideScalar', 'subtract', 'smaller', 'equalScalar', 'flatten'];
|
3
|
+
var dependencies = ['typed', 'config', 'abs', 'add', 'addScalar', 'matrix', 'multiply', 'multiplyScalar', 'divideScalar', 'subtract', 'smaller', 'equalScalar', 'flatten', 'isZero', 'isNumeric'];
|
5
4
|
export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref => {
|
6
5
|
var {
|
7
6
|
typed,
|
@@ -16,7 +15,9 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
16
15
|
subtract,
|
17
16
|
smaller,
|
18
17
|
equalScalar,
|
19
|
-
flatten
|
18
|
+
flatten,
|
19
|
+
isZero,
|
20
|
+
isNumeric
|
20
21
|
} = _ref;
|
21
22
|
|
22
23
|
/**
|
@@ -142,21 +143,16 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
142
143
|
return arr;
|
143
144
|
}
|
144
145
|
|
145
|
-
function _isNumeric(a) {
|
146
|
-
// intersect supports numbers and bignumbers
|
147
|
-
return typeof a === 'number' || isBigNumber(a);
|
148
|
-
}
|
149
|
-
|
150
146
|
function _2d(x) {
|
151
|
-
return x.length === 2 &&
|
147
|
+
return x.length === 2 && isNumeric(x[0]) && isNumeric(x[1]);
|
152
148
|
}
|
153
149
|
|
154
150
|
function _3d(x) {
|
155
|
-
return x.length === 3 &&
|
151
|
+
return x.length === 3 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]);
|
156
152
|
}
|
157
153
|
|
158
154
|
function _4d(x) {
|
159
|
-
return x.length === 4 &&
|
155
|
+
return x.length === 4 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]) && isNumeric(x[3]);
|
160
156
|
}
|
161
157
|
|
162
158
|
function _intersect2d(p1a, p1b, p2a, p2b) {
|
@@ -165,6 +161,7 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
165
161
|
var d1 = subtract(o1, p1b);
|
166
162
|
var d2 = subtract(o2, p2b);
|
167
163
|
var det = subtract(multiplyScalar(d1[0], d2[1]), multiplyScalar(d2[0], d1[1]));
|
164
|
+
if (isZero(det)) return null;
|
168
165
|
|
169
166
|
if (smaller(abs(det), config.epsilon)) {
|
170
167
|
return null;
|
@@ -197,7 +194,10 @@ export var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref =>
|
|
197
194
|
|
198
195
|
var d2121 = _intersect3dHelper(x2, x1, x2, x1, y2, y1, y2, y1, z2, z1, z2, z1);
|
199
196
|
|
200
|
-
var
|
197
|
+
var numerator = subtract(multiplyScalar(d1343, d4321), multiplyScalar(d1321, d4343));
|
198
|
+
var denominator = subtract(multiplyScalar(d2121, d4343), multiplyScalar(d4321, d4321));
|
199
|
+
if (isZero(denominator)) return null;
|
200
|
+
var ta = divideScalar(numerator, denominator);
|
201
201
|
var tb = divideScalar(addScalar(d1343, multiplyScalar(ta, d4321)), d4343);
|
202
202
|
var pax = addScalar(x1, multiplyScalar(ta, subtract(x2, x1)));
|
203
203
|
var pay = addScalar(y1, multiplyScalar(ta, subtract(y2, y1)));
|
@@ -41,44 +41,42 @@ export var createGamma = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
41
41
|
Complex: function Complex(n) {
|
42
42
|
if (n.im === 0) {
|
43
43
|
return this(n.re);
|
44
|
-
}
|
44
|
+
} // Lanczos approximation doesn't work well with real part lower than 0.5
|
45
|
+
// So reflection formula is required
|
46
|
+
|
47
|
+
|
48
|
+
if (n.re < 0.5) {
|
49
|
+
// Euler's reflection formula
|
50
|
+
// gamma(1-z) * gamma(z) = PI / sin(PI * z)
|
51
|
+
// real part of Z should not be integer [sin(PI) == 0 -> 1/0 - undefined]
|
52
|
+
// thanks to imperfect sin implementation sin(PI * n) != 0
|
53
|
+
// we can safely use it anyway
|
54
|
+
var _t = new _Complex(1 - n.re, -n.im);
|
55
|
+
|
56
|
+
var r = new _Complex(Math.PI * n.re, Math.PI * n.im);
|
57
|
+
return new _Complex(Math.PI).div(r.sin()).div(this(_t));
|
58
|
+
} // Lanczos approximation
|
59
|
+
// z -= 1
|
60
|
+
|
45
61
|
|
46
|
-
n = new _Complex(n.re - 1, n.im);
|
47
|
-
|
62
|
+
n = new _Complex(n.re - 1, n.im); // x = gammaPval[0]
|
63
|
+
|
64
|
+
var x = new _Complex(gammaP[0], 0); // for (i, gammaPval) in enumerate(gammaP):
|
48
65
|
|
49
66
|
for (var i = 1; i < gammaP.length; ++i) {
|
50
|
-
|
67
|
+
// x += gammaPval / (z + i)
|
68
|
+
var gammaPval = new _Complex(gammaP[i], 0);
|
69
|
+
x = x.add(gammaPval.div(n.add(i)));
|
70
|
+
} // t = z + gammaG + 0.5
|
51
71
|
|
52
|
-
var den = real * real + n.im * n.im;
|
53
72
|
|
54
|
-
|
55
|
-
x.re += gammaP[i] * real / den;
|
56
|
-
x.im += -(gammaP[i] * n.im) / den;
|
57
|
-
} else {
|
58
|
-
x.re = gammaP[i] < 0 ? -Infinity : Infinity;
|
59
|
-
}
|
60
|
-
}
|
73
|
+
var t = new _Complex(n.re + gammaG + 0.5, n.im); // y = sqrt(2 * pi) * t ** (z + 0.5) * exp(-t) * x
|
61
74
|
|
62
|
-
var t = new _Complex(n.re + gammaG + 0.5, n.im);
|
63
75
|
var twoPiSqrt = Math.sqrt(2 * Math.PI);
|
64
|
-
n.
|
65
|
-
var
|
66
|
-
|
67
|
-
if (result.im === 0) {
|
68
|
-
// sqrt(2*PI)*result
|
69
|
-
result.re *= twoPiSqrt;
|
70
|
-
} else if (result.re === 0) {
|
71
|
-
result.im *= twoPiSqrt;
|
72
|
-
} else {
|
73
|
-
result.re *= twoPiSqrt;
|
74
|
-
result.im *= twoPiSqrt;
|
75
|
-
}
|
76
|
-
|
77
|
-
var r = Math.exp(-t.re); // exp(-t)
|
76
|
+
var tpow = t.pow(n.add(0.5));
|
77
|
+
var expt = t.neg().exp(); // y = [x] * [sqrt(2 * pi)] * [t ** (z + 0.5)] * [exp(-t)]
|
78
78
|
|
79
|
-
|
80
|
-
t.im = r * Math.sin(-t.im);
|
81
|
-
return multiplyScalar(multiplyScalar(result, t), x);
|
79
|
+
return x.mul(twoPiSqrt).mul(tpow).mul(expt);
|
82
80
|
},
|
83
81
|
BigNumber: function BigNumber(n) {
|
84
82
|
if (n.isInteger()) {
|
package/lib/esm/header.js
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
* @date @@date
|
11
11
|
*
|
12
12
|
* @license
|
13
|
-
* Copyright (C) 2013-
|
13
|
+
* Copyright (C) 2013-2022 Jos de Jong <wjosdejong@gmail.com>
|
14
14
|
*
|
15
15
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
16
16
|
* use this file except in compliance with the License. You may obtain a copy
|
@@ -417,23 +417,27 @@ export var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies,
|
|
417
417
|
|
418
418
|
if (!deepStrictEqual(iSize, sSize)) {
|
419
419
|
throw new DimensionError(iSize, sSize, '>');
|
420
|
-
} //
|
420
|
+
} // insert the sub matrix
|
421
421
|
|
422
422
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
423
|
+
if (iSize.length === 1) {
|
424
|
+
// if the replacement index only has 1 dimension, go trough each one and set its value
|
425
|
+
var range = index.dimension(0);
|
426
|
+
range.forEach(function (dataIndex, subIndex) {
|
427
|
+
validateIndex(dataIndex);
|
428
|
+
matrix.set([dataIndex, 0], submatrix[subIndex[0]], defaultValue);
|
429
|
+
});
|
430
|
+
} else {
|
431
|
+
// if the replacement index has 2 dimensions, go through each one and set the value in the correct index
|
432
|
+
var firstDimensionRange = index.dimension(0);
|
433
|
+
var secondDimensionRange = index.dimension(1);
|
434
|
+
firstDimensionRange.forEach(function (firstDataIndex, firstSubIndex) {
|
435
|
+
validateIndex(firstDataIndex);
|
436
|
+
secondDimensionRange.forEach(function (secondDataIndex, secondSubIndex) {
|
437
|
+
validateIndex(secondDataIndex);
|
438
|
+
matrix.set([firstDataIndex, secondDataIndex], submatrix[firstSubIndex[0]][secondSubIndex[0]], defaultValue);
|
439
|
+
});
|
440
|
+
});
|
437
441
|
}
|
438
442
|
}
|
439
443
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
3
3
|
|
4
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
4
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
5
5
|
|
6
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
6
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
7
7
|
|
8
8
|
import { isComplex, isUnit, typeOf } from '../../utils/is.js';
|
9
9
|
import { factory } from '../../utils/factory.js';
|
package/lib/esm/utils/number.js
CHANGED
@@ -318,7 +318,7 @@ export function format(value, options) {
|
|
318
318
|
|
319
319
|
export function splitNumber(value) {
|
320
320
|
// parse the input value
|
321
|
-
var match = String(value).toLowerCase().match(/^
|
321
|
+
var match = String(value).toLowerCase().match(/^(-?)(\d+\.?\d*)(e([+-]?\d+))?$/);
|
322
322
|
|
323
323
|
if (!match) {
|
324
324
|
throw new SyntaxError('Invalid number ' + value);
|
@@ -1,9 +1,9 @@
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
2
2
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
3
3
|
|
4
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
4
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
5
5
|
|
6
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
6
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
7
7
|
|
8
8
|
/**
|
9
9
|
* This file contains helper methods to create expected snapshot structures
|
package/lib/esm/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export var version = '10.
|
1
|
+
export var version = '10.1.1'; // Note: This file is automatically generated when building math.js.
|
2
2
|
// Changes made in this file will be overwritten.
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "mathjs",
|
3
|
-
"version": "10.
|
3
|
+
"version": "10.1.1",
|
4
4
|
"description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
|
5
5
|
"author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
|
6
6
|
"homepage": "https://mathjs.org",
|
@@ -25,43 +25,43 @@
|
|
25
25
|
"unit"
|
26
26
|
],
|
27
27
|
"dependencies": {
|
28
|
-
"@babel/runtime": "^7.16.
|
28
|
+
"@babel/runtime": "^7.16.7",
|
29
29
|
"complex.js": "^2.0.15",
|
30
30
|
"decimal.js": "^10.3.1",
|
31
31
|
"escape-latex": "^1.2.0",
|
32
|
-
"fraction.js": "^4.1.
|
32
|
+
"fraction.js": "^4.1.2",
|
33
33
|
"javascript-natural-sort": "^0.7.1",
|
34
34
|
"seedrandom": "^3.0.5",
|
35
35
|
"tiny-emitter": "^2.1.0",
|
36
36
|
"typed-function": "^2.0.0"
|
37
37
|
},
|
38
38
|
"devDependencies": {
|
39
|
-
"@babel/core": "7.16.
|
40
|
-
"@babel/plugin-transform-object-assign": "7.16.
|
41
|
-
"@babel/plugin-transform-runtime": "7.16.
|
42
|
-
"@babel/preset-env": "7.16.
|
43
|
-
"@babel/register": "7.16.
|
39
|
+
"@babel/core": "7.16.12",
|
40
|
+
"@babel/plugin-transform-object-assign": "7.16.7",
|
41
|
+
"@babel/plugin-transform-runtime": "7.16.10",
|
42
|
+
"@babel/preset-env": "7.16.11",
|
43
|
+
"@babel/register": "7.16.9",
|
44
44
|
"babel-loader": "8.2.3",
|
45
45
|
"benchmark": "2.1.4",
|
46
46
|
"codecov": "3.8.3",
|
47
|
-
"core-js": "3.
|
47
|
+
"core-js": "3.21.0",
|
48
48
|
"del": "6.0.0",
|
49
|
-
"dtslint": "4.2.
|
49
|
+
"dtslint": "4.2.1",
|
50
50
|
"expr-eval": "2.0.2",
|
51
|
-
"fancy-log": "
|
51
|
+
"fancy-log": "2.0.0",
|
52
52
|
"glob": "7.2.0",
|
53
53
|
"gulp": "4.0.2",
|
54
54
|
"gulp-babel": "8.0.0",
|
55
55
|
"handlebars": "4.7.7",
|
56
56
|
"istanbul": "0.4.5",
|
57
57
|
"jsep": "1.2.0",
|
58
|
-
"karma": "6.3.
|
58
|
+
"karma": "6.3.13",
|
59
59
|
"karma-browserstack-launcher": "1.6.0",
|
60
60
|
"karma-firefox-launcher": "2.1.2",
|
61
61
|
"karma-mocha": "2.0.1",
|
62
62
|
"karma-mocha-reporter": "2.2.5",
|
63
63
|
"karma-webpack": "4.0.2",
|
64
|
-
"math-expression-evaluator": "1.3.
|
64
|
+
"math-expression-evaluator": "1.3.14",
|
65
65
|
"mkdirp": "1.0.4",
|
66
66
|
"mocha": "8.4.0",
|
67
67
|
"ndarray": "1.0.19",
|
@@ -74,7 +74,7 @@
|
|
74
74
|
"pad-right": "0.2.2",
|
75
75
|
"standard": "16.0.4",
|
76
76
|
"sylvester": "0.0.21",
|
77
|
-
"typescript": "4.
|
77
|
+
"typescript": "4.5.5",
|
78
78
|
"webpack": "4.46.0",
|
79
79
|
"zeros": "1.0.0"
|
80
80
|
},
|
@@ -131,6 +131,7 @@
|
|
131
131
|
"compile": "gulp --gulpfile gulpfile.cjs compile",
|
132
132
|
"watch": "gulp --gulpfile gulpfile.cjs watch",
|
133
133
|
"lint": "standard --env=mocha --env=worker",
|
134
|
+
"format": "npm run lint -- --fix",
|
134
135
|
"validate:ascii": "gulp --gulpfile gulpfile.cjs validate:ascii",
|
135
136
|
"test": "npm run test:src && npm run lint",
|
136
137
|
"test:src": "mocha test/unit-tests",
|