mathjs 10.4.2 → 10.4.3

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.
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.stirlingS2Dependencies = void 0;
7
7
 
8
+ var _dependenciesBignumberGenerated = require("./dependenciesBignumber.generated.js");
9
+
8
10
  var _dependenciesAddScalarGenerated = require("./dependenciesAddScalar.generated.js");
9
11
 
10
12
  var _dependenciesCombinationsGenerated = require("./dependenciesCombinations.generated.js");
@@ -21,6 +23,8 @@ var _dependenciesLargerGenerated = require("./dependenciesLarger.generated.js");
21
23
 
22
24
  var _dependenciesMultiplyScalarGenerated = require("./dependenciesMultiplyScalar.generated.js");
23
25
 
26
+ var _dependenciesNumberGenerated = require("./dependenciesNumber.generated.js");
27
+
24
28
  var _dependenciesPowGenerated = require("./dependenciesPow.generated.js");
25
29
 
26
30
  var _dependenciesSubtractGenerated = require("./dependenciesSubtract.generated.js");
@@ -34,6 +38,7 @@ var _factoriesAny = require("../../factoriesAny.js");
34
38
  * DON'T MAKE CHANGES HERE
35
39
  */
36
40
  var stirlingS2Dependencies = {
41
+ bignumberDependencies: _dependenciesBignumberGenerated.bignumberDependencies,
37
42
  addScalarDependencies: _dependenciesAddScalarGenerated.addScalarDependencies,
38
43
  combinationsDependencies: _dependenciesCombinationsGenerated.combinationsDependencies,
39
44
  divideScalarDependencies: _dependenciesDivideScalarGenerated.divideScalarDependencies,
@@ -42,6 +47,7 @@ var stirlingS2Dependencies = {
42
47
  isNegativeDependencies: _dependenciesIsNegativeGenerated.isNegativeDependencies,
43
48
  largerDependencies: _dependenciesLargerGenerated.largerDependencies,
44
49
  multiplyScalarDependencies: _dependenciesMultiplyScalarGenerated.multiplyScalarDependencies,
50
+ numberDependencies: _dependenciesNumberGenerated.numberDependencies,
45
51
  powDependencies: _dependenciesPowGenerated.powDependencies,
46
52
  subtractDependencies: _dependenciesSubtractGenerated.subtractDependencies,
47
53
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
@@ -21,6 +21,8 @@ var _dependenciesLargerGenerated = require("./dependenciesLarger.generated.js");
21
21
 
22
22
  var _dependenciesMultiplyScalarGenerated = require("./dependenciesMultiplyScalar.generated.js");
23
23
 
24
+ var _dependenciesNumberGenerated = require("./dependenciesNumber.generated.js");
25
+
24
26
  var _dependenciesPowGenerated = require("./dependenciesPow.generated.js");
25
27
 
26
28
  var _dependenciesSubtractGenerated = require("./dependenciesSubtract.generated.js");
@@ -42,6 +44,7 @@ var stirlingS2Dependencies = {
42
44
  isNegativeDependencies: _dependenciesIsNegativeGenerated.isNegativeDependencies,
43
45
  largerDependencies: _dependenciesLargerGenerated.largerDependencies,
44
46
  multiplyScalarDependencies: _dependenciesMultiplyScalarGenerated.multiplyScalarDependencies,
47
+ numberDependencies: _dependenciesNumberGenerated.numberDependencies,
45
48
  powDependencies: _dependenciesPowGenerated.powDependencies,
46
49
  subtractDependencies: _dependenciesSubtractGenerated.subtractDependencies,
47
50
  typedDependencies: _dependenciesTypedGenerated.typedDependencies,
@@ -1619,6 +1619,7 @@ var speedOfLight = /* #__PURE__ */(0, _factoriesAny.createSpeedOfLight)({
1619
1619
  });
1620
1620
  exports.speedOfLight = speedOfLight;
1621
1621
  var stirlingS2 = /* #__PURE__ */(0, _factoriesAny.createStirlingS2)({
1622
+ bignumber: bignumber,
1622
1623
  addScalar: addScalar,
1623
1624
  combinations: combinations,
1624
1625
  divideScalar: divideScalar,
@@ -1627,6 +1628,7 @@ var stirlingS2 = /* #__PURE__ */(0, _factoriesAny.createStirlingS2)({
1627
1628
  isNegative: isNegative,
1628
1629
  larger: larger,
1629
1630
  multiplyScalar: multiplyScalar,
1631
+ number: number,
1630
1632
  pow: pow,
1631
1633
  subtract: subtract,
1632
1634
  typed: typed
@@ -542,6 +542,7 @@ var stirlingS2 = /* #__PURE__ */(0, _factoriesNumber.createStirlingS2)({
542
542
  isNegative: isNegative,
543
543
  larger: larger,
544
544
  multiplyScalar: multiplyScalar,
545
+ number: number,
545
546
  pow: pow,
546
547
  subtract: subtract,
547
548
  typed: typed
@@ -1040,7 +1040,7 @@ var createDivideScalar = /* #__PURE__ */createNumberFactory('divideScalar', _ind
1040
1040
  exports.createDivideScalar = createDivideScalar;
1041
1041
  var createPow = /* #__PURE__ */createNumberFactory('pow', _index.powNumber);
1042
1042
  exports.createPow = createPow;
1043
- var createLog = /* #__PURE__ */createNumberFactory('log', _index.logNumber);
1043
+ var createLog = /* #__PURE__ */createNumberOptionalSecondArgFactory('log', _index.logNumber);
1044
1044
  exports.createLog = createLog;
1045
1045
  var createLog1p = /* #__PURE__ */createNumberFactory('log1p', _index.log1pNumber);
1046
1046
  exports.createLog1p = createLog1p;
@@ -1166,10 +1166,20 @@ exports.createIsZero = createIsZero;
1166
1166
  var createIsNaN = /* #__PURE__ */createNumberFactory('isNaN', _index.isNaNNumber);
1167
1167
  exports.createIsNaN = createIsNaN;
1168
1168
 
1169
- // helper function to create a factory function for a function which only needs typed-function
1169
+ // helper functions to create a factory function for a function which only needs typed-function
1170
1170
  function createNumberFactory(name, fn) {
1171
1171
  return (0, _factory.factory)(name, ['typed'], function (_ref) {
1172
1172
  var typed = _ref.typed;
1173
1173
  return typed(fn);
1174
1174
  });
1175
+ }
1176
+
1177
+ function createNumberOptionalSecondArgFactory(name, fn) {
1178
+ return (0, _factory.factory)(name, ['typed'], function (_ref2) {
1179
+ var typed = _ref2.typed;
1180
+ return typed({
1181
+ number: fn,
1182
+ 'number,number': fn
1183
+ });
1184
+ });
1175
1185
  }
@@ -7,8 +7,10 @@ exports.createStirlingS2 = void 0;
7
7
 
8
8
  var _factory = require("../../utils/factory.js");
9
9
 
10
+ var _is = require("../../utils/is.js");
11
+
10
12
  var name = 'stirlingS2';
11
- var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'larger'];
13
+ var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'number', '?bignumber', 'larger'];
12
14
  var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
13
15
  var typed = _ref.typed,
14
16
  addScalar = _ref.addScalar,
@@ -20,15 +22,22 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
20
22
  combinations = _ref.combinations,
21
23
  isNegative = _ref.isNegative,
22
24
  isInteger = _ref.isInteger,
25
+ number = _ref.number,
26
+ bignumber = _ref.bignumber,
23
27
  larger = _ref.larger;
24
-
28
+ var smallCache = [];
29
+ var bigCache = [];
25
30
  /**
26
31
  * The Stirling numbers of the second kind, counts the number of ways to partition
27
32
  * a set of n labelled objects into k nonempty unlabelled subsets.
28
33
  * stirlingS2 only takes integer arguments.
29
34
  * The following condition must be enforced: k <= n.
30
35
  *
31
- * If n = k or k = 1, then s(n,k) = 1
36
+ * If n = k or k = 1 <= n, then s(n,k) = 1
37
+ * If k = 0 < n, then s(n,k) = 0
38
+ *
39
+ * Note that if either n or k is supplied as a BigNumber, the result will be
40
+ * as well.
32
41
  *
33
42
  * Syntax:
34
43
  *
@@ -46,26 +55,47 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
46
55
  * @param {Number | BigNumber} k Number of objects in the subset
47
56
  * @return {Number | BigNumber} S(n,k)
48
57
  */
58
+
49
59
  return typed(name, {
50
60
  'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {
51
61
  if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) {
52
62
  throw new TypeError('Non-negative integer value expected in function stirlingS2');
53
63
  } else if (larger(k, n)) {
54
64
  throw new TypeError('k must be less than or equal to n in function stirlingS2');
55
- } // 1/k! Sum(i=0 -> k) [(-1)^(k-i)*C(k,j)* i^n]
65
+ }
66
+
67
+ var big = !((0, _is.isNumber)(n) && (0, _is.isNumber)(k));
68
+ var cache = big ? bigCache : smallCache;
69
+ var make = big ? bignumber : number;
70
+ var nn = number(n);
71
+ var nk = number(k);
72
+ /* See if we already have the value: */
73
+
74
+ if (cache[nn] && cache[nn].length > nk) {
75
+ return cache[nn][nk];
76
+ }
77
+ /* Fill the cache */
78
+
56
79
 
80
+ for (var m = 0; m <= nn; ++m) {
81
+ if (!cache[m]) {
82
+ cache[m] = [m === 0 ? make(1) : make(0)];
83
+ }
57
84
 
58
- var kFactorial = factorial(k);
59
- var result = 0;
85
+ if (m === 0) continue;
86
+ var row = cache[m];
87
+ var prev = cache[m - 1];
60
88
 
61
- for (var i = 0; i <= k; i++) {
62
- var negativeOne = pow(-1, subtract(k, i));
63
- var kChooseI = combinations(k, i);
64
- var iPower = pow(i, n);
65
- result = addScalar(result, multiplyScalar(multiplyScalar(kChooseI, iPower), negativeOne));
89
+ for (var i = row.length; i <= m && i <= nk; ++i) {
90
+ if (i === m) {
91
+ row[i] = 1;
92
+ } else {
93
+ row[i] = addScalar(multiplyScalar(make(i), prev[i]), prev[i - 1]);
94
+ }
95
+ }
66
96
  }
67
97
 
68
- return divideScalar(result, kFactorial);
98
+ return cache[nn][nk];
69
99
  }
70
100
  });
71
101
  });
package/lib/cjs/header.js CHANGED
@@ -6,8 +6,8 @@
6
6
  * It features real and complex numbers, units, matrices, a large set of
7
7
  * mathematical functions, and a flexible expression parser.
8
8
  *
9
- * @version 10.4.2
10
- * @date 2022-03-29
9
+ * @version 10.4.3
10
+ * @date 2022-04-08
11
11
  *
12
12
  * @license
13
13
  * Copyright (C) 2013-2022 Jos de Jong <wjosdejong@gmail.com>
@@ -178,22 +178,26 @@ function lcmNumber(a, b) {
178
178
 
179
179
  lcmNumber.signature = n2;
180
180
  /**
181
- * Calculate the logarithm of a value.
181
+ * Calculate the logarithm of a value, optionally to a given base.
182
182
  * @param {number} x
183
+ * @param {number | null | undefined} base
183
184
  * @return {number}
184
185
  */
185
186
 
186
- function logNumber(x) {
187
+ function logNumber(x, y) {
188
+ if (y) {
189
+ return Math.log(x) / Math.log(y);
190
+ }
191
+
187
192
  return Math.log(x);
188
193
  }
189
-
190
- logNumber.signature = n1;
191
194
  /**
192
195
  * Calculate the 10-base logarithm of a number
193
196
  * @param {number} x
194
197
  * @return {number}
195
198
  */
196
199
 
200
+
197
201
  function log10Number(x) {
198
202
  return (0, _number.log10)(x);
199
203
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = void 0;
7
- var version = '10.4.2'; // Note: This file is automatically generated when building math.js.
7
+ var version = '10.4.3'; // Note: This file is automatically generated when building math.js.
8
8
  // Changes made in this file will be overwritten.
9
9
 
10
10
  exports.version = version;
@@ -2,6 +2,7 @@
2
2
  * THIS FILE IS AUTO-GENERATED
3
3
  * DON'T MAKE CHANGES HERE
4
4
  */
5
+ import { bignumberDependencies } from './dependenciesBignumber.generated.js';
5
6
  import { addScalarDependencies } from './dependenciesAddScalar.generated.js';
6
7
  import { combinationsDependencies } from './dependenciesCombinations.generated.js';
7
8
  import { divideScalarDependencies } from './dependenciesDivideScalar.generated.js';
@@ -10,11 +11,13 @@ import { isIntegerDependencies } from './dependenciesIsInteger.generated.js';
10
11
  import { isNegativeDependencies } from './dependenciesIsNegative.generated.js';
11
12
  import { largerDependencies } from './dependenciesLarger.generated.js';
12
13
  import { multiplyScalarDependencies } from './dependenciesMultiplyScalar.generated.js';
14
+ import { numberDependencies } from './dependenciesNumber.generated.js';
13
15
  import { powDependencies } from './dependenciesPow.generated.js';
14
16
  import { subtractDependencies } from './dependenciesSubtract.generated.js';
15
17
  import { typedDependencies } from './dependenciesTyped.generated.js';
16
18
  import { createStirlingS2 } from '../../factoriesAny.js';
17
19
  export var stirlingS2Dependencies = {
20
+ bignumberDependencies,
18
21
  addScalarDependencies,
19
22
  combinationsDependencies,
20
23
  divideScalarDependencies,
@@ -23,6 +26,7 @@ export var stirlingS2Dependencies = {
23
26
  isNegativeDependencies,
24
27
  largerDependencies,
25
28
  multiplyScalarDependencies,
29
+ numberDependencies,
26
30
  powDependencies,
27
31
  subtractDependencies,
28
32
  typedDependencies,
@@ -10,6 +10,7 @@ import { isIntegerDependencies } from './dependenciesIsInteger.generated.js';
10
10
  import { isNegativeDependencies } from './dependenciesIsNegative.generated.js';
11
11
  import { largerDependencies } from './dependenciesLarger.generated.js';
12
12
  import { multiplyScalarDependencies } from './dependenciesMultiplyScalar.generated.js';
13
+ import { numberDependencies } from './dependenciesNumber.generated.js';
13
14
  import { powDependencies } from './dependenciesPow.generated.js';
14
15
  import { subtractDependencies } from './dependenciesSubtract.generated.js';
15
16
  import { typedDependencies } from './dependenciesTyped.generated.js';
@@ -23,6 +24,7 @@ export var stirlingS2Dependencies = {
23
24
  isNegativeDependencies,
24
25
  largerDependencies,
25
26
  multiplyScalarDependencies,
27
+ numberDependencies,
26
28
  powDependencies,
27
29
  subtractDependencies,
28
30
  typedDependencies,
@@ -1339,6 +1339,7 @@ export var speedOfLight = /* #__PURE__ */createSpeedOfLight({
1339
1339
  config
1340
1340
  });
1341
1341
  export var stirlingS2 = /* #__PURE__ */createStirlingS2({
1342
+ bignumber,
1342
1343
  addScalar,
1343
1344
  combinations,
1344
1345
  divideScalar,
@@ -1347,6 +1348,7 @@ export var stirlingS2 = /* #__PURE__ */createStirlingS2({
1347
1348
  isNegative,
1348
1349
  larger,
1349
1350
  multiplyScalar,
1351
+ number,
1350
1352
  pow,
1351
1353
  subtract,
1352
1354
  typed
@@ -400,6 +400,7 @@ export var stirlingS2 = /* #__PURE__ */createStirlingS2({
400
400
  isNegative,
401
401
  larger,
402
402
  multiplyScalar,
403
+ number,
403
404
  pow,
404
405
  subtract,
405
406
  typed
@@ -46,7 +46,7 @@ export var createXgcd = /* #__PURE__ */createNumberFactory('xgcd', xgcdNumber);
46
46
  export var createDivideScalar = /* #__PURE__ */createNumberFactory('divideScalar', divideNumber);
47
47
  export var createPow = /* #__PURE__ */createNumberFactory('pow', powNumber);
48
48
  export { createRoundNumber as createRound } from './function/arithmetic/round.js';
49
- export var createLog = /* #__PURE__ */createNumberFactory('log', logNumber);
49
+ export var createLog = /* #__PURE__ */createNumberOptionalSecondArgFactory('log', logNumber);
50
50
  export var createLog1p = /* #__PURE__ */createNumberFactory('log1p', log1pNumber);
51
51
  export var createAdd = /* #__PURE__ */createNumberFactory('add', addNumber);
52
52
  export { createHypot } from './function/arithmetic/hypot.js';
@@ -212,7 +212,7 @@ export { createIsPrime } from './function/utils/isPrime.js';
212
212
  export { createNumeric } from './function/utils/numeric.js'; // json
213
213
 
214
214
  export { createReviver } from './json/reviver.js';
215
- export { createReplacer } from './json/replacer.js'; // helper function to create a factory function for a function which only needs typed-function
215
+ export { createReplacer } from './json/replacer.js'; // helper functions to create a factory function for a function which only needs typed-function
216
216
 
217
217
  function createNumberFactory(name, fn) {
218
218
  return factory(name, ['typed'], _ref => {
@@ -221,4 +221,16 @@ function createNumberFactory(name, fn) {
221
221
  } = _ref;
222
222
  return typed(fn);
223
223
  });
224
+ }
225
+
226
+ function createNumberOptionalSecondArgFactory(name, fn) {
227
+ return factory(name, ['typed'], _ref2 => {
228
+ var {
229
+ typed
230
+ } = _ref2;
231
+ return typed({
232
+ number: fn,
233
+ 'number,number': fn
234
+ });
235
+ });
224
236
  }
@@ -1,6 +1,7 @@
1
1
  import { factory } from '../../utils/factory.js';
2
+ import { isNumber } from '../../utils/is.js';
2
3
  var name = 'stirlingS2';
3
- var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'larger'];
4
+ var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'number', '?bignumber', 'larger'];
4
5
  export var createStirlingS2 = /* #__PURE__ */factory(name, dependencies, _ref => {
5
6
  var {
6
7
  typed,
@@ -13,16 +14,23 @@ export var createStirlingS2 = /* #__PURE__ */factory(name, dependencies, _ref =>
13
14
  combinations,
14
15
  isNegative,
15
16
  isInteger,
17
+ number,
18
+ bignumber,
16
19
  larger
17
20
  } = _ref;
18
-
21
+ var smallCache = [];
22
+ var bigCache = [];
19
23
  /**
20
24
  * The Stirling numbers of the second kind, counts the number of ways to partition
21
25
  * a set of n labelled objects into k nonempty unlabelled subsets.
22
26
  * stirlingS2 only takes integer arguments.
23
27
  * The following condition must be enforced: k <= n.
24
28
  *
25
- * If n = k or k = 1, then s(n,k) = 1
29
+ * If n = k or k = 1 <= n, then s(n,k) = 1
30
+ * If k = 0 < n, then s(n,k) = 0
31
+ *
32
+ * Note that if either n or k is supplied as a BigNumber, the result will be
33
+ * as well.
26
34
  *
27
35
  * Syntax:
28
36
  *
@@ -40,26 +48,47 @@ export var createStirlingS2 = /* #__PURE__ */factory(name, dependencies, _ref =>
40
48
  * @param {Number | BigNumber} k Number of objects in the subset
41
49
  * @return {Number | BigNumber} S(n,k)
42
50
  */
51
+
43
52
  return typed(name, {
44
53
  'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {
45
54
  if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) {
46
55
  throw new TypeError('Non-negative integer value expected in function stirlingS2');
47
56
  } else if (larger(k, n)) {
48
57
  throw new TypeError('k must be less than or equal to n in function stirlingS2');
49
- } // 1/k! Sum(i=0 -> k) [(-1)^(k-i)*C(k,j)* i^n]
58
+ }
59
+
60
+ var big = !(isNumber(n) && isNumber(k));
61
+ var cache = big ? bigCache : smallCache;
62
+ var make = big ? bignumber : number;
63
+ var nn = number(n);
64
+ var nk = number(k);
65
+ /* See if we already have the value: */
66
+
67
+ if (cache[nn] && cache[nn].length > nk) {
68
+ return cache[nn][nk];
69
+ }
70
+ /* Fill the cache */
71
+
50
72
 
73
+ for (var m = 0; m <= nn; ++m) {
74
+ if (!cache[m]) {
75
+ cache[m] = [m === 0 ? make(1) : make(0)];
76
+ }
51
77
 
52
- var kFactorial = factorial(k);
53
- var result = 0;
78
+ if (m === 0) continue;
79
+ var row = cache[m];
80
+ var prev = cache[m - 1];
54
81
 
55
- for (var i = 0; i <= k; i++) {
56
- var negativeOne = pow(-1, subtract(k, i));
57
- var kChooseI = combinations(k, i);
58
- var iPower = pow(i, n);
59
- result = addScalar(result, multiplyScalar(multiplyScalar(kChooseI, iPower), negativeOne));
82
+ for (var i = row.length; i <= m && i <= nk; ++i) {
83
+ if (i === m) {
84
+ row[i] = 1;
85
+ } else {
86
+ row[i] = addScalar(multiplyScalar(make(i), prev[i]), prev[i - 1]);
87
+ }
88
+ }
60
89
  }
61
90
 
62
- return divideScalar(result, kFactorial);
91
+ return cache[nn][nk];
63
92
  }
64
93
  });
65
94
  });
@@ -112,15 +112,19 @@ export function lcmNumber(a, b) {
112
112
  }
113
113
  lcmNumber.signature = n2;
114
114
  /**
115
- * Calculate the logarithm of a value.
115
+ * Calculate the logarithm of a value, optionally to a given base.
116
116
  * @param {number} x
117
+ * @param {number | null | undefined} base
117
118
  * @return {number}
118
119
  */
119
120
 
120
- export function logNumber(x) {
121
+ export function logNumber(x, y) {
122
+ if (y) {
123
+ return Math.log(x) / Math.log(y);
124
+ }
125
+
121
126
  return Math.log(x);
122
127
  }
123
- logNumber.signature = n1;
124
128
  /**
125
129
  * Calculate the 10-base logarithm of a number
126
130
  * @param {number} x
@@ -1,2 +1,2 @@
1
- export var version = '10.4.2'; // Note: This file is automatically generated when building math.js.
1
+ export var version = '10.4.3'; // 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.4.2",
3
+ "version": "10.4.3",
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",