powiaina_num.js 0.2.0-alpha.4 → 0.2.0-alpha.4.2

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.
@@ -94,7 +94,7 @@ function compareTuples() {
94
94
  function replaceETo10(str) {
95
95
  // 使用正则表达式匹配 (e^数字) 的模式
96
96
  // 正则解释:\(e\^(\d+)\) 匹配 (e^数字),其中 \d+ 匹配一个或多个数字
97
- return str.replace(/\(e\^(\d+)\)/g, '(10^)^$1 ').replace(/(\d+)\x20*PT/g, '(10^)^$1 ');
97
+ return str.replace(/\(e\^(\d+)\)/g, "(10^)^$1 ").replace(/(\d+)\x20*PT/g, "(10^)^$1 ");
98
98
  }
99
99
  /**
100
100
  * 把一个字符串很长的数进行以10为底的对数
@@ -241,6 +241,23 @@ function d_lambertw(z) {
241
241
  }
242
242
  throw Error("Iteration failed to converge: " + z);
243
243
  }
244
+ function arraySortFunction(a, b) {
245
+ return compareTuples([a.megota, a.expans, a.arrow], [b.megota, b.expans, b.arrow]);
246
+ }
247
+ /**
248
+ * Merge arrays in arrow,expans,megota is all same.
249
+ * @param x an object has `array` key.
250
+ */
251
+ function mergeSameArrays(x) {
252
+ for (var i = 1; i < x.array.length - 1; ++i) {
253
+ if (x.array[i].arrow == x.array[i + 1].arrow && x.array[i].expans == x.array[i + 1].expans && x.array[i].megota == x.array[i + 1].megota) {
254
+ // same array's merge
255
+ x.array[i].repeat += x.array[i + 1].repeat;
256
+ x.array.splice(i + 1, 1);
257
+ --i;
258
+ }
259
+ }
260
+ }
244
261
  var PowiainaNum = /*#__PURE__*/function () {
245
262
  /**
246
263
  * Constructor of PowiainaNum class,
@@ -312,6 +329,10 @@ var PowiainaNum = /*#__PURE__*/function () {
312
329
  b = x;
313
330
  a = y;
314
331
  }
332
+ var temp = a.toNumber() + b.toNumber();
333
+ if (isFinite(temp) && temp !== 0) {
334
+ return PowiainaNum.fromNumber(temp);
335
+ }
315
336
  var mult = 1;
316
337
  if (!a.small && !b.small && !((_a = a.array[1]) === null || _a === void 0 ? void 0 : _a.repeat) && !((_b = b.array[1]) === null || _b === void 0 ? void 0 : _b.repeat) && a.sign == b.sign) {
317
338
  return new PowiainaNum((a.array[0].repeat + b.array[0].repeat) * a.sign);
@@ -353,7 +374,7 @@ var PowiainaNum = /*#__PURE__*/function () {
353
374
  var y = new PowiainaNum(other);
354
375
  // inf * -inf = -inf
355
376
  if (x.eq(PowiainaNum.POSITIVE_INFINITY) && y.eq(PowiainaNum.NEGATIVE_INFINITY) || y.eq(PowiainaNum.POSITIVE_INFINITY) && x.eq(PowiainaNum.NEGATIVE_INFINITY)) return PowiainaNum.NEGATIVE_INFINITY.clone();
356
- if (x.isInfiNaN() && y.eq(PowiainaNum.ZERO) && y.isInfiNaN() && x.eq(PowiainaNum.ZERO)) return PowiainaNum.NaN.clone();
377
+ if (x.isInfiNaN() && y.isZero() || y.isInfiNaN() && x.isZero()) return PowiainaNum.NaN.clone();
357
378
  if (x.eq(PowiainaNum.NEGATIVE_INFINITY) && y.eq(PowiainaNum.NEGATIVE_INFINITY)) return PowiainaNum.POSITIVE_INFINITY.clone();
358
379
  // inf & nan check
359
380
  if (!x.isFinite()) return x.clone();
@@ -369,6 +390,11 @@ var PowiainaNum = /*#__PURE__*/function () {
369
390
  a.sign = x.sign*y.sign as -1|0| 1;
370
391
  return a;
371
392
  })(); */
393
+ // calculate use number directly using number
394
+ var t = x.toNumber() * y.toNumber();
395
+ if (isFinite(t) && t !== 0) {
396
+ return PowiainaNum.fromNumber(t);
397
+ }
372
398
  var r;
373
399
  r = x.abs().log10().add(y.abs().log10()).pow10();
374
400
  r.sign = x.sign * y.sign;
@@ -412,6 +438,7 @@ var PowiainaNum = /*#__PURE__*/function () {
412
438
  key: "pow",
413
439
  value: function pow(x) {
414
440
  var other = new PowiainaNum(x);
441
+ if (this.eq(1)) return PowiainaNum.ONE.clone();
415
442
  if (!other.isFinite()) return other.clone();
416
443
  if (!this.isFinite()) return this.clone();
417
444
  if (this.eq(10)) return other.pow10();
@@ -432,8 +459,19 @@ var PowiainaNum = /*#__PURE__*/function () {
432
459
  // optimize?
433
460
  return PowiainaNum.fromNumber(t);
434
461
  }
435
- // log10(a^b) = b log10(a)
436
- return this.log10().mul(other).pow10();
462
+ if (this.isZero() && other.isZero()) {
463
+ return PowiainaNum.ONE.clone();
464
+ }
465
+ if (this.isZero()) return PowiainaNum.ZERO.clone();
466
+ if (other.isZero()) return PowiainaNum.ONE.clone();
467
+ // if this<0, check other' rec is oddd
468
+ if (this.gt(0)) {
469
+ // log10(a^b) = b log10(a)
470
+ return this.log10().mul(other).pow10();
471
+ } else if (other.rec().mod(2).eq(1)) {
472
+ return this.neg().log10().mul(other).pow10().neg();
473
+ }
474
+ return PowiainaNum.NaN.clone();
437
475
  }
438
476
  }, {
439
477
  key: "pow_base",
@@ -467,6 +505,7 @@ var PowiainaNum = /*#__PURE__*/function () {
467
505
  var other = new PowiainaNum(other2);
468
506
  var payl = new PowiainaNum(payload);
469
507
  if (t.isNaN() || other.isNaN() || payl.isNaN()) return PowiainaNum.NaN.clone();
508
+ if (t.eq(1)) return PowiainaNum.ONE.clone();
470
509
  if (payl.neq(PowiainaNum.ONE)) other = other.add(payl.slog(t));
471
510
  var negln;
472
511
  if (other.isInfi() && other.sign > 0) {
@@ -693,7 +732,7 @@ var PowiainaNum = /*#__PURE__*/function () {
693
732
  * and gamma(x) = (x - 1)! for nonnegative integer x, so the factorial for non-whole numbers is defined using the gamma function.
694
733
  */
695
734
  //[Code from break_eternity.js]
696
- //from HyperCalc source code
735
+ //from HyperCalc source code
697
736
  function gamma() {
698
737
  if (this.small) {
699
738
  return this.rec();
@@ -741,13 +780,13 @@ var PowiainaNum = /*#__PURE__*/function () {
741
780
  key: "lambertw",
742
781
  value:
743
782
  /**
744
- * The Lambert W function, also called the omega function or product logarithm, is the solution W(x) === x*e^x.
745
- * https://en.wikipedia.org/wiki/Lambert_W_function
746
- *
747
- * This is a multi-valued function in the complex plane, but only two branches matter for real numbers: the "principal branch" W0, and the "non-principal branch" W_-1.
748
- * W_0 works for any number >= -1/e, but W_-1 only works for nonpositive numbers >= -1/e.
749
- * The "principal" parameter, which is true by default, decides which branch we're looking for: W_0 is used if principal is true, W_-1 is used if principal is false.
750
- */
783
+ * The Lambert W function, also called the omega function or product logarithm, is the solution W(x) === x*e^x.
784
+ * https://en.wikipedia.org/wiki/Lambert_W_function
785
+ *
786
+ * This is a multi-valued function in the complex plane, but only two branches matter for real numbers: the "principal branch" W0, and the "non-principal branch" W_-1.
787
+ * W_0 works for any number >= -1/e, but W_-1 only works for nonpositive numbers >= -1/e.
788
+ * The "principal" parameter, which is true by default, decides which branch we're looking for: W_0 is used if principal is true, W_-1 is used if principal is false.
789
+ */
751
790
  //Code from break_eternity.js
752
791
  //Some special values, for testing: https://en.wikipedia.org/wiki/Lambert_W_function#Special_values
753
792
  function lambertw() {
@@ -1023,6 +1062,17 @@ var PowiainaNum = /*#__PURE__*/function () {
1023
1062
  value: function powerExpansion(other) {
1024
1063
  return this.expansionArrow(3)(other);
1025
1064
  }
1065
+ }, {
1066
+ key: "explosion",
1067
+ value: function explosion(other) {
1068
+ return PowiainaNum.BEAF(this, other, 1, 3);
1069
+ }
1070
+ }, {
1071
+ key: "megotion",
1072
+ value: function megotion(other) {
1073
+ console.warn("This function is unstable when calculating numbers");
1074
+ return PowiainaNum.BEAF(this, other, 1, 1, 2);
1075
+ }
1026
1076
  }, {
1027
1077
  key: "max",
1028
1078
  value: function max() {
@@ -1072,6 +1122,47 @@ var PowiainaNum = /*#__PURE__*/function () {
1072
1122
  var other = new PowiainaNum(x).abs();
1073
1123
  return this.abs().cmp(other);
1074
1124
  }
1125
+ }, {
1126
+ key: "sin",
1127
+ value: function sin() {
1128
+ var x = this.clone();
1129
+ if (x.isneg()) {
1130
+ return x.neg().sin().neg();
1131
+ }
1132
+ var y = x.mod(7074237752028440);
1133
+ return PowiainaNum.fromNumber(Math.sin(y.toNumber()));
1134
+ }
1135
+ }, {
1136
+ key: "cos",
1137
+ value: function cos() {
1138
+ return this.sub(Math.PI / 2).sin();
1139
+ }
1140
+ }, {
1141
+ key: "tan",
1142
+ value: function tan() {
1143
+ return this.sin().div(this.cos());
1144
+ }
1145
+ }, {
1146
+ key: "cot",
1147
+ value: function cot() {
1148
+ return this.cos().div(this.sin());
1149
+ }
1150
+ }, {
1151
+ key: "sec",
1152
+ value: function sec() {
1153
+ return this.cos().rec();
1154
+ }
1155
+ }, {
1156
+ key: "csc",
1157
+ value: function csc() {
1158
+ return this.sin().rec();
1159
+ }
1160
+ // public asin_abs(): PowiainaNum {
1161
+ // const t = this.clone().abs();
1162
+ // if (t.lte(1)) {
1163
+ // return PowiainaNum.fromNumber(Math.asin(t.toNumber()));
1164
+ // }
1165
+ // }
1075
1166
  }, {
1076
1167
  key: "neg",
1077
1168
  value: function neg() {
@@ -1326,9 +1417,7 @@ var PowiainaNum = /*#__PURE__*/function () {
1326
1417
  do {
1327
1418
  renormalize = false;
1328
1419
  // Sort arrays.
1329
- this.array.sort(function (a, b) {
1330
- return compareTuples([a.megota, a.expans, a.arrow], [b.megota, b.expans, b.arrow]);
1331
- });
1420
+ this.array.sort(arraySortFunction);
1332
1421
  for (i = 1; i < x.array.length - 1; ++i) {
1333
1422
  if (x.array[i].arrow == x.array[i + 1].arrow && x.array[i].expans == x.array[i + 1].expans && x.array[i].megota == x.array[i + 1].megota) {
1334
1423
  // same array's merge
@@ -1372,7 +1461,7 @@ var PowiainaNum = /*#__PURE__*/function () {
1372
1461
  renormalize = true;
1373
1462
  }
1374
1463
  while (x.array.length >= 2 && x.array[0].repeat == 1 && x.array[1].repeat) {
1375
- // for any 10{X}10{X} 1, turn into 10{X}10
1464
+ // for any 10{X}10{X} 1, turn into 10{X}10
1376
1465
  // [1, [R=sth, A=sth, E=sth, M=sth]]
1377
1466
  if (x.array[1].repeat > 1) {
1378
1467
  x.array[1].repeat--;
@@ -1716,6 +1805,146 @@ var PowiainaNum = /*#__PURE__*/function () {
1716
1805
  value: function powerExpansion(t, other) {
1717
1806
  return new PowiainaNum(t).powerExpansion(other);
1718
1807
  }
1808
+ }, {
1809
+ key: "BEAF",
1810
+ value: function BEAF(base2, power2) {
1811
+ for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {
1812
+ args[_key6 - 2] = arguments[_key6];
1813
+ }
1814
+ console.warn("This function is unstable when calculating numbers greater than *megotion*");
1815
+ var base = new PowiainaNum(base2);
1816
+ var power = new PowiainaNum(power2);
1817
+ function readArg(a) {
1818
+ var _a;
1819
+ return new PowiainaNum((_a = args[a]) !== null && _a !== void 0 ? _a : 1);
1820
+ }
1821
+ if (base.eq(1)) return new PowiainaNum(1);
1822
+ if (power.eq(1)) return new PowiainaNum(base);
1823
+ if (power.isZero()) return new PowiainaNum(1);
1824
+ if (base.lt(0)) return PowiainaNum.NaN.clone();
1825
+ // check infinite
1826
+ var sufpowiaina = args.slice(4);
1827
+ if (sufpowiaina.filter(function (f) {
1828
+ return new PowiainaNum(f).gte(2);
1829
+ }).length > 0) {
1830
+ return PowiainaNum.POSITIVE_INFINITY;
1831
+ }
1832
+ if (readArg(0).eq(1) && readArg(1).eq(1) && readArg(2).eq(1)) {
1833
+ return base.pow(power);
1834
+ }
1835
+ if (readArg(0).eq(2) && readArg(1).eq(1) && readArg(2).eq(1)) {
1836
+ return base.tetrate(power);
1837
+ }
1838
+ if (readArg(1).eq(1) && readArg(2).eq(1)) {
1839
+ return base.arrow(readArg(0))(power);
1840
+ }
1841
+ if (readArg(1).eq(2) && readArg(2).eq(1)) {
1842
+ return base.expansionArrow(readArg(0))(power);
1843
+ }
1844
+ readArg(0).toNumber();
1845
+ var expans = readArg(1);
1846
+ var megota = readArg(2);
1847
+ function convertOperator(arrows, expans, megota) {
1848
+ var a = arrows;
1849
+ var e = expans;
1850
+ var m = megota;
1851
+ if (a == 0 && e > 1) {
1852
+ return [1 / 0, e - 1, m];
1853
+ }
1854
+ if (a == 0 && e == 1 && m > 1) {
1855
+ return [1, 1 / 0, m - 1];
1856
+ }
1857
+ return [a, e, m];
1858
+ }
1859
+ if (megota.gt(MSI)) {
1860
+ throw new Error("Not implemented megota > MSI");
1861
+ }
1862
+ function infToBang(x) {
1863
+ if (!isFinite(x)) return "!";
1864
+ return x.toString();
1865
+ }
1866
+ function getMSIForm(arrow, expans, megota) {
1867
+ return "10{".concat(infToBang(arrow), ",").concat(infToBang(expans), ",").concat(megota, "}").concat(MSI);
1868
+ }
1869
+ var t = base.clone();
1870
+ var arrows = new PowiainaNum(readArg(0));
1871
+ return function (other2, _r, _r2) {
1872
+ var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
1873
+ var other = new PowiainaNum(other2);
1874
+ var r;
1875
+ if (t.isNaN() || other.isNaN()) return PowiainaNum.NaN.clone();
1876
+ if (other.lt(PowiainaNum.ZERO)) return PowiainaNum.NaN.clone();
1877
+ if (t.eq(PowiainaNum.ZERO)) {
1878
+ if (other.eq(PowiainaNum.ONE)) return PowiainaNum.ZERO.clone();
1879
+ return PowiainaNum.NaN.clone();
1880
+ }
1881
+ if (t.eq(PowiainaNum.ONE)) return PowiainaNum.ONE.clone();
1882
+ if (other.eq(PowiainaNum.ZERO)) return PowiainaNum.ONE.clone();
1883
+ if (other.eq(PowiainaNum.ONE)) return t.clone();
1884
+ if (arrows.eq(0)) {
1885
+ return PowiainaNum.BEAF(t, t, power, expans.sub(1), megota);
1886
+ // {this, this, power, expans-1, megota}
1887
+ }
1888
+ if (expans.eq(0)) {
1889
+ return PowiainaNum.BEAF(t, t, t, power, megota.sub(1));
1890
+ }
1891
+ // expans > 9e15, that using 10{?, x}, x=expans;
1892
+ if (expans.gt(MSI)) {
1893
+ r = new PowiainaNum(expans);
1894
+ r.setOperator(r.getOperator(1, Infinity, megota.toNumber()) + 1, 1, Infinity, megota.toNumber());
1895
+ return r;
1896
+ }
1897
+ // arrow > 9e15, that using 10{x,2}, x=arrow;
1898
+ if (arrows.gt(PowiainaNum.MSI)) {
1899
+ r = arrows.clone();
1900
+ r.setOperator(r.getOperator(Infinity, expans.toNumber(), megota.toNumber()) + 1, Infinity, expans.toNumber(), megota.toNumber());
1901
+ return r;
1902
+ }
1903
+ var arrowsNum = arrows.toNumber();
1904
+ // arrow < 9e15
1905
+ // 10{x}2 = 10{x-1}10
1906
+ if (other.eq(2)) return PowiainaNum.BEAF(t, t, arrowsNum - 1, expans, megota);
1907
+ if (t.max(other).gt(getMSIForm(arrowsNum + 1, expans.toNumber(), megota.toNumber()))) return t.max(other);
1908
+ if (t.gt(getMSIForm(arrowsNum, expans.toNumber(), megota.toNumber())) || other.gt(MSI)) {
1909
+ if (t.gt(getMSIForm(arrowsNum, expans.toNumber(), megota.toNumber()))) {
1910
+ r = t.clone();
1911
+ r.setOperator(r.getOperator(arrowsNum, expans.toNumber(), megota.toNumber()) - 1, arrowsNum, expans.toNumber(), megota.toNumber());
1912
+ r.normalize();
1913
+ } else if (t.gt(getMSIForm.apply(void 0, _toConsumableArray(convertOperator(arrowsNum - 1, expans.toNumber(), megota.toNumber()))))) {
1914
+ r = new PowiainaNum(t.getOperator.apply(t, _toConsumableArray(convertOperator(arrowsNum - 1, expans.toNumber(), megota.toNumber()))));
1915
+ } else {
1916
+ r = PowiainaNum.ZERO;
1917
+ }
1918
+ var j = r.add(other);
1919
+ j.setOperator(j.getOperator(arrowsNum, expans.toNumber(), megota.toNumber()) + 1, arrowsNum, expans.toNumber(), megota.toNumber());
1920
+ j.normalize();
1921
+ return j;
1922
+ }
1923
+ if (depth >= PowiainaNum.maxOps + 10) {
1924
+ return new PowiainaNum({
1925
+ small: false,
1926
+ sign: 1,
1927
+ layer: 0,
1928
+ array: [newOperator(10, 0), newOperator(1, arrowsNum, expans.toNumber(), megota.toNumber())]
1929
+ });
1930
+ }
1931
+ var y = other.toNumber();
1932
+ var f = Math.floor(y);
1933
+ var arrows_m1 = arrows.sub(PowiainaNum.ONE);
1934
+ r = PowiainaNum.BEAF(t, y - f, arrows_m1.toNumber(), expans, megota);
1935
+ var i = 0;
1936
+ for (var m = new PowiainaNum(getMSIForm.apply(void 0, _toConsumableArray(convertOperator(arrowsNum - 1, expans.toNumber(), megota.toNumber())))); f !== 0 && r.lt(m) && i < 100; i++) {
1937
+ if (f > 0) {
1938
+ r = PowiainaNum.BEAF(base, r, arrows_m1.toNumber(), expans, megota);
1939
+ --f;
1940
+ }
1941
+ }
1942
+ if (i == 100) f = 0;
1943
+ (_r = r).setOperator.apply(_r, [(_r2 = r).getOperator.apply(_r2, _toConsumableArray(convertOperator(arrowsNum - 1, expans.toNumber(), megota.toNumber()))) + f].concat(_toConsumableArray(convertOperator(arrowsNum - 1, expans.toNumber(), megota.toNumber()))));
1944
+ r.normalize();
1945
+ return r;
1946
+ }(power);
1947
+ }
1719
1948
  /**
1720
1949
  * Select the largest number of arguments.
1721
1950
  */
@@ -1723,8 +1952,8 @@ var PowiainaNum = /*#__PURE__*/function () {
1723
1952
  key: "max",
1724
1953
  value: function max() {
1725
1954
  var max = PowiainaNum.NEGATIVE_INFINITY;
1726
- for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
1727
- args[_key6] = arguments[_key6];
1955
+ for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
1956
+ args[_key7] = arguments[_key7];
1728
1957
  }
1729
1958
  for (var i = 0; i < args.length; i++) {
1730
1959
  if (max.lt(args[i])) {
@@ -1740,8 +1969,8 @@ var PowiainaNum = /*#__PURE__*/function () {
1740
1969
  key: "min",
1741
1970
  value: function min() {
1742
1971
  var max = PowiainaNum.POSITIVE_INFINITY;
1743
- for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
1744
- args[_key7] = arguments[_key7];
1972
+ for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
1973
+ args[_key8] = arguments[_key8];
1745
1974
  }
1746
1975
  for (var i = 0; i < args.length; i++) {
1747
1976
  if (max.gt(args[i])) {
@@ -1799,7 +2028,9 @@ var PowiainaNum = /*#__PURE__*/function () {
1799
2028
  return obj;
1800
2029
  } else if (x > 0) obj.sign = 1;
1801
2030
  var y = Math.abs(x);
1802
- if (y >= MSI_REC && y < 1) {
2031
+ if (y == Infinity) {
2032
+ obj.array = [newOperator(Infinity, 0)];
2033
+ } else if (y >= MSI_REC && y < 1) {
1803
2034
  obj.small = true;
1804
2035
  obj.array = [newOperator(1 / y, 0)];
1805
2036
  } else if (y < MSI_REC) {
@@ -1998,7 +2229,7 @@ var PowiainaNum = /*#__PURE__*/function () {
1998
2229
  }
1999
2230
  x.array[0].repeat = b[0];
2000
2231
  if (b[1]) {
2001
- if (x.array.length >= 2 && x.array[1].arrow == 1) x.array[1].repeat += b[1];else x.array.splice(1, 0, newOperator(b[1], 1, 1, 1));
2232
+ if (x.array.length >= 2 && x.array[1].arrow == 1 && x.array[1].expans == 1 && x.array[1].megota == 1) x.array[1].repeat += b[1];else x.array.splice(1, 0, newOperator(b[1], 1, 1, 1));
2002
2233
  }
2003
2234
  }
2004
2235
  if (negateIt) x.sign *= -1;
@@ -2233,5 +2464,6 @@ PowiainaNum.SQRT1_2 = new PowiainaNum(Math.SQRT1_2);
2233
2464
  PowiainaNum.SQRT2 = new PowiainaNum(Math.SQRT2);
2234
2465
  PowiainaNum.maxOps = 100;
2235
2466
  PowiainaNum.arrowFuncMap = new Map();
2467
+ PowiainaNum.POW_2_44_MOD_PI = 1.701173079953;
2236
2468
 
2237
- export { PowiainaNum as default };
2469
+ export { arraySortFunction, PowiainaNum as default, mergeSameArrays };