powiaina_num.js 0.2.21 → 0.2.23

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.
@@ -173,6 +173,10 @@ function parseLegacyPowiainaNumString(str) {
173
173
  }
174
174
  return null;
175
175
  }
176
+ /**
177
+ * 如果左边小于右边的,返回-1,等于就是0,大于就是1
178
+ * @returns
179
+ */
176
180
  function compareTuples() {
177
181
  for (var _len = arguments.length, tuples = new Array(_len), _key = 0; _key < _len; _key++) {
178
182
  tuples[_key] = arguments[_key];
@@ -1143,6 +1147,7 @@ var PowiainaNum = /*#__PURE__*/function () {
1143
1147
  key: "omegalog",
1144
1148
  value: function omegalog() {
1145
1149
  var bbase = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
1150
+ var EPSILON = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1e-6;
1146
1151
  var target = this;
1147
1152
  var dis = target.clone();
1148
1153
  if (dis.isInfiNaN()) return dis;
@@ -1161,9 +1166,12 @@ var PowiainaNum = /*#__PURE__*/function () {
1161
1166
  // // @ts-expect-error
1162
1167
  // let zero = new PowiainaNum(dis.array[dis.arr01.length - 1][0]);
1163
1168
  // return zero;
1164
- // } else if (target.lt(PowiainaNum.pentate(bbase, 2))) {
1165
- // return new PowiainaNum(target).anyarrow_log(3)(bbase);
1166
- // } else {
1169
+ // }
1170
+ // else
1171
+ if (target.lt(PowiainaNum.pentate(bbase, 2))) {
1172
+ return new PowiainaNum(target).anyarrow_log(3)(bbase);
1173
+ }
1174
+ // else {
1167
1175
  // let addTest = 8;
1168
1176
  // let target = 0;
1169
1177
  // while (addTest >= 10 ** -10) {
@@ -1174,18 +1182,39 @@ var PowiainaNum = /*#__PURE__*/function () {
1174
1182
  // }
1175
1183
  // return new PowiainaNum(target);
1176
1184
  // }
1177
- var clonedOperators = [];
1178
- for (var i = 0; i < target.array.length; i++) {
1179
- clonedOperators[i] = {
1180
- arrow: target.array[i].arrow,
1181
- expans: target.array[i].expans,
1182
- megota: target.array[i].megota,
1183
- repeat: target.array[i].repeat,
1184
- valuereplaced: target.array[i].valuereplaced
1185
- };
1185
+ if (bbase == 10) {
1186
+ var clonedOperators = [];
1187
+ for (var i = 0; i < target.array.length; i++) {
1188
+ clonedOperators[i] = {
1189
+ arrow: target.array[i].arrow,
1190
+ expans: target.array[i].expans,
1191
+ megota: target.array[i].megota,
1192
+ repeat: target.array[i].repeat,
1193
+ valuereplaced: target.array[i].valuereplaced
1194
+ };
1195
+ }
1196
+ var _result = PowiainaNum.omegacollect(clonedOperators);
1197
+ return new PowiainaNum(_result[1].arrow - 1 + Math.log(_result[0].repeat / 2) / Math.log(5));
1198
+ }
1199
+ var left = 2;
1200
+ var right = 9007199254740991;
1201
+ var result = NaN;
1202
+ while (left <= right) {
1203
+ var mid = Math.floor((left + right) / 2);
1204
+ var comparison = PowiainaNum.arrFrac(bbase, mid).cmp(target);
1205
+ if (comparison === 0) {
1206
+ return new PowiainaNum(mid);
1207
+ } else if (comparison < 0) {
1208
+ result = mid;
1209
+ left = mid + 1;
1210
+ } else {
1211
+ right = mid - 1;
1212
+ }
1213
+ if (Math.abs(left - right) <= EPSILON) {
1214
+ return new PowiainaNum(mid);
1215
+ }
1186
1216
  }
1187
- var result = PowiainaNum.omegacollect(clonedOperators);
1188
- return result[1].arrow - 1 + Math.log(result[0].repeat / 2) / Math.log(5);
1217
+ return new PowiainaNum(result);
1189
1218
  // if (dis.arr01[dis.array.length - 1][0] >= 98) {
1190
1219
  // // @ts-expect-error
1191
1220
  // let zero = new PowiainaNum(dis.array[dis.arr01.length - 1][0]);
@@ -1245,7 +1274,7 @@ var PowiainaNum = /*#__PURE__*/function () {
1245
1274
  var ctt = PowiainaNum.arrowFuncMap.get("".concat(t.toString(), " ").concat(arrows.toString(), " ").concat(other.toString(), " ").concat(depth));
1246
1275
  if (ctt) return ctt.clone();
1247
1276
  var res = function () {
1248
- var r;
1277
+ var calcBase;
1249
1278
  if (t.isNaN() || other.isNaN() || payload.isNaN()) return PowiainaNum.NaN.clone();
1250
1279
  if (other.lt(PowiainaNum.ZERO)) return PowiainaNum.NaN.clone();
1251
1280
  if (t.eq(PowiainaNum.ZERO)) {
@@ -1259,9 +1288,9 @@ var PowiainaNum = /*#__PURE__*/function () {
1259
1288
  if (other.eq(PowiainaNum.ONE)) return t.clone();
1260
1289
  // arrow > 9e15, that using 10{x}, x=arrow;
1261
1290
  if (arrows.gt(PowiainaNum.MSI)) {
1262
- r = arrows.clone();
1263
- r.setOperator(r.getOperator(Infinity) + 1, Infinity);
1264
- return r;
1291
+ calcBase = arrows.clone();
1292
+ calcBase.setOperator(calcBase.getOperator(Infinity) + 1, Infinity);
1293
+ return calcBase;
1265
1294
  }
1266
1295
  var arrowsNum = arrows.toNumber();
1267
1296
  // arrow < 9e15
@@ -1270,15 +1299,15 @@ var PowiainaNum = /*#__PURE__*/function () {
1270
1299
  if (t.max(other).gt(PowiainaNum.arrowMSI(arrowsNum + 1))) return t.max(other);
1271
1300
  if (t.gt(PowiainaNum.arrowMSI(arrowsNum)) || other.gt(MSI)) {
1272
1301
  if (t.gt(PowiainaNum.arrowMSI(arrowsNum))) {
1273
- r = t.clone();
1274
- r.setOperator(r.getOperator(arrowsNum) - 1, arrowsNum);
1275
- r.normalize();
1302
+ calcBase = t.clone();
1303
+ calcBase.setOperator(calcBase.getOperator(arrowsNum) - 1, arrowsNum);
1304
+ calcBase.normalize();
1276
1305
  } else if (t.gt(PowiainaNum.arrowMSI(arrowsNum - 1))) {
1277
- r = new PowiainaNum(t.getOperator(arrowsNum - 1));
1306
+ calcBase = new PowiainaNum(t.getOperator(arrowsNum - 1));
1278
1307
  } else {
1279
- r = PowiainaNum.ZERO;
1308
+ calcBase = PowiainaNum.ZERO;
1280
1309
  }
1281
- var j = r.add(other);
1310
+ var j = calcBase.add(other);
1282
1311
  j.setOperator(j.getOperator(arrowsNum) + 1, arrowsNum);
1283
1312
  j.normalize();
1284
1313
  return j;
@@ -1294,18 +1323,19 @@ var PowiainaNum = /*#__PURE__*/function () {
1294
1323
  var y = other.toNumber();
1295
1324
  var f = Math.floor(y);
1296
1325
  var arrows_m1 = arrows.sub(PowiainaNum.ONE);
1297
- r = t.arrow(arrows_m1)(y - f, payload, depth + 1);
1326
+ //一般情况计算10{x}y, y-f是0. 因此calcBase会是1.
1327
+ calcBase = t.arrow(arrows_m1)(y - f, payload, depth + 1);
1298
1328
  var i = 0;
1299
- for (var m = PowiainaNum.arrowMSI(arrowsNum - 1); f !== 0 && r.lt(m) && i < 100; i++) {
1329
+ for (var m = PowiainaNum.arrowMSI(arrowsNum - 1); f !== 0 && calcBase.lt(m) && i < 100; i++) {
1300
1330
  if (f > 0) {
1301
- r = t.arrow(arrows_m1)(r, payload, depth + 1);
1331
+ calcBase = t.arrow(arrows_m1)(calcBase, payload, depth + 1);
1302
1332
  --f;
1303
1333
  }
1304
1334
  }
1305
1335
  if (i == 100) f = 0;
1306
- r.setOperator(r.getOperator(arrowsNum - 1) + f, arrowsNum - 1);
1307
- r.normalize();
1308
- return r;
1336
+ calcBase.setOperator(calcBase.getOperator(arrowsNum - 1) + f, arrowsNum - 1);
1337
+ calcBase.normalize();
1338
+ return calcBase;
1309
1339
  }();
1310
1340
  if (depth < PowiainaNum.maxOps + 10) {
1311
1341
  PowiainaNum.arrowFuncMap.set("".concat(t.toString(), " ").concat(arrows.toString(), " ").concat(other.toString(), " ").concat(depth), res.clone());
@@ -1395,6 +1425,96 @@ var PowiainaNum = /*#__PURE__*/function () {
1395
1425
  return PowiainaNum.NaN.clone();
1396
1426
  };
1397
1427
  }
1428
+ }, {
1429
+ key: "omega2log",
1430
+ value: function omega2log() {
1431
+ var bbase = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
1432
+ var EPSILON = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1e-6;
1433
+ var target = this;
1434
+ var dis = target.clone();
1435
+ if (dis.isInfiNaN()) return dis;
1436
+ if (dis.gte("10{1,3}e15.954589770191003")) return dis;
1437
+ new PowiainaNum(bbase).clone();
1438
+ if (dis.getOperator(1 / 0, 2) >= 1) {
1439
+ dis.setOperator(dis.getOperator(1 / 0) - 1, 1 / 0, 2, 1);
1440
+ return dis;
1441
+ }
1442
+ // if (dis.layer >= 1) {
1443
+ // dis.layer -= 1
1444
+ // return dis
1445
+ // } else
1446
+ // // @ts-expect-error
1447
+ // if (dis.arr01[dis.array.length - 1][0] >= 98) {
1448
+ // // @ts-expect-error
1449
+ // let zero = new PowiainaNum(dis.array[dis.arr01.length - 1][0]);
1450
+ // return zero;
1451
+ // }
1452
+ // else
1453
+ if (target.lt(new PowiainaNum(bbase).expansionArrow(3)(2))) {
1454
+ return new PowiainaNum(target).expansion_log2(3)(bbase);
1455
+ }
1456
+ // else {
1457
+ // let addTest = 8;
1458
+ // let target = 0;
1459
+ // while (addTest >= 10 ** -10) {
1460
+ // if (PowiainaNum.arrFrac(base, target + addTest).lte(dis)) {
1461
+ // target += addTest;
1462
+ // }
1463
+ // addTest /= 2;
1464
+ // }
1465
+ // return new PowiainaNum(target);
1466
+ // }
1467
+ if (bbase == 10) {
1468
+ var clonedOperators = [];
1469
+ for (var i = 0; i < target.array.length; i++) {
1470
+ clonedOperators[i] = {
1471
+ arrow: target.array[i].arrow,
1472
+ expans: target.array[i].expans,
1473
+ megota: target.array[i].megota,
1474
+ repeat: target.array[i].repeat,
1475
+ valuereplaced: target.array[i].valuereplaced
1476
+ };
1477
+ }
1478
+ var _result2 = PowiainaNum.omegacollect(clonedOperators);
1479
+ return new PowiainaNum(_result2[1].arrow - 1 + Math.log(_result2[0].repeat / 2) / Math.log(5));
1480
+ }
1481
+ var left = 2;
1482
+ var right = 9007199254740991;
1483
+ var result = NaN;
1484
+ while (left <= right) {
1485
+ var mid = Math.floor((left + right) / 2);
1486
+ var comparison = PowiainaNum.arrw2Frac(bbase, mid).cmp(target);
1487
+ if (comparison === 0) {
1488
+ return new PowiainaNum(mid);
1489
+ } else if (comparison < 0) {
1490
+ result = mid;
1491
+ left = mid + 1;
1492
+ } else {
1493
+ right = mid - 1;
1494
+ }
1495
+ if (Math.abs(left - right) <= EPSILON) {
1496
+ return new PowiainaNum(mid);
1497
+ }
1498
+ }
1499
+ return new PowiainaNum(result);
1500
+ // if (dis.arr01[dis.array.length - 1][0] >= 98) {
1501
+ // // @ts-expect-error
1502
+ // let zero = new PowiainaNum(dis.array[dis.arr01.length - 1][0]);
1503
+ // return zero;
1504
+ // } else if (target.lt(PowiainaNum.pentate(bbase, 2))) {
1505
+ // return new PowiainaNum(target).anyarrow_log(3)(bbase);
1506
+ // } else {
1507
+ // let addTest = 8;
1508
+ // let target = 0;
1509
+ // while (addTest >= 10 ** -10) {
1510
+ // if (PowiainaNum.arrFrac(base, target + addTest).lte(dis)) {
1511
+ // target += addTest;
1512
+ // }
1513
+ // addTest /= 2;
1514
+ // }
1515
+ // return new PowiainaNum(target);
1516
+ // }
1517
+ }
1398
1518
  /**
1399
1519
  * base{height}base
1400
1520
  */
@@ -1409,6 +1529,16 @@ var PowiainaNum = /*#__PURE__*/function () {
1409
1529
  function arrow_height_inverse(arrows) {
1410
1530
  return this.anyarrow_log(arrows);
1411
1531
  }
1532
+ /**
1533
+ * Arrow w2 height inverse, an alias of `expansion_log2`
1534
+ * @param arrows
1535
+ * @returns
1536
+ */
1537
+ }, {
1538
+ key: "arrow_w2_height_inverse",
1539
+ value: function arrow_w2_height_inverse(arrows) {
1540
+ return this.expansion_log2(arrows);
1541
+ }
1412
1542
  }, {
1413
1543
  key: "chain",
1414
1544
  value: function chain(other, arrows) {
@@ -1448,52 +1578,56 @@ var PowiainaNum = /*#__PURE__*/function () {
1448
1578
  function expansion(other2) {
1449
1579
  var other = new PowiainaNum(other2);
1450
1580
  var t = this.clone();
1451
- if (other.lt(PowiainaNum.ZERO) || !other.isInt()) return PowiainaNum.NaN.clone();
1581
+ if (other.lt(PowiainaNum.ZERO)) return PowiainaNum.NaN.clone();
1452
1582
  if (other.eq(PowiainaNum.ONE)) return this.clone();
1453
1583
  if (this.eq(PowiainaNum.ONE)) return PowiainaNum.ONE.clone();
1454
- if (!this.isInt()) {
1455
- if (PowiainaNum.throwErrorOnResultNaN) throw new Error("NaN");
1456
- return PowiainaNum.NaN.clone();
1457
- }
1458
1584
  if (this.eq(2)) return new PowiainaNum(4);
1459
1585
  if (other.eq(0)) return PowiainaNum.ONE.clone();
1460
- var r;
1586
+ if (other.gt(0) && other.lt(1) && !other.isInt()) {
1587
+ return t.pow(other);
1588
+ }
1589
+ if (other.gt(1) && other.lt(2) && !other.isInt()) {
1590
+ var _y = other.sub(1).pow_base(t);
1591
+ if (_y.lt(2)) return PowiainaNum.arrow(t, 3, _y);
1592
+ return PowiainaNum.arrFrac(t, _y);
1593
+ }
1594
+ var calcBase;
1461
1595
  // I don't know is this added partrs work correctly...
1462
1596
  if (t.gt("10{1,2}".concat(MSI)) || other.gt(MSI)) {
1463
1597
  if (t.gt("10{1,2}".concat(MSI))) {
1464
- r = t.clone();
1465
- r.setOperator(r.getOperator(1, 2) - 1, 1, 2);
1466
- r.normalize();
1598
+ calcBase = t.clone();
1599
+ calcBase.setOperator(calcBase.getOperator(1, 2) - 1, 1, 2);
1600
+ calcBase.normalize();
1467
1601
  } else if (t.gt("10{".concat(MSI, "}10"))) {
1468
- r = new PowiainaNum(t.getOperator(Infinity));
1602
+ calcBase = new PowiainaNum(t.getOperator(Infinity));
1469
1603
  } else {
1470
- r = PowiainaNum.ZERO;
1604
+ calcBase = PowiainaNum.ZERO;
1471
1605
  }
1472
- var j = r.add(other);
1606
+ var j = calcBase.add(other);
1473
1607
  j.setOperator(j.getOperator(1, 2) + 1, 1, 2);
1474
1608
  j.normalize();
1475
1609
  return j;
1476
1610
  }
1477
- var f = other.toNumber() - 1;
1478
- r = t.clone();
1479
- var i;
1480
- for (i = 0; f !== 0 && r.lt(MSI) && i < 100; ++i) {
1611
+ var y = other.toNumber() - 1;
1612
+ var f = Math.floor(y);
1613
+ calcBase = PowiainaNum.expansion(t, 1 + y - f);
1614
+ var i = 0;
1615
+ for (var m = new PowiainaNum("10{1,2}e15.954589770191003"); f !== 0 && calcBase.lt(m) && i < 100; i++) {
1481
1616
  if (f > 0) {
1482
- r = t.arrow(r)(t);
1617
+ calcBase = PowiainaNum.arrFrac(t, calcBase);
1483
1618
  --f;
1484
1619
  }
1485
1620
  }
1486
- if (i == 100) f = 0;
1487
- r.setOperator(r.getOperator(Infinity) + f, Infinity);
1488
- r.normalize();
1489
- return r;
1621
+ calcBase.setOperator(calcBase.getOperator(Infinity) + f, Infinity);
1622
+ calcBase.normalize();
1623
+ return calcBase;
1490
1624
  }
1491
1625
  }, {
1492
1626
  key: "expansionArrow",
1493
1627
  value: function expansionArrow(arrow2) {
1494
1628
  var arrow = new PowiainaNum(arrow2);
1495
1629
  var t = this.clone();
1496
- if (arrow.lt(0) || !arrow.isInt() || arrow.isNaN() || this.isNaN()) return function () {
1630
+ if (arrow.lt(0) || !arrow.isInt()) return function () {
1497
1631
  if (PowiainaNum.throwErrorOnResultNaN) throw new Error("NaN");
1498
1632
  return PowiainaNum.NaN.clone();
1499
1633
  };
@@ -1572,6 +1706,116 @@ var PowiainaNum = /*#__PURE__*/function () {
1572
1706
  return r;
1573
1707
  };
1574
1708
  }
1709
+ }, {
1710
+ key: "expansion_log_inner",
1711
+ value: function expansion_log_inner(base2) {
1712
+ var t = this.clone();
1713
+ var base = new PowiainaNum(base2);
1714
+ if (base.eq(2) && t.gt(4)) return PowiainaNum.NaN.clone();
1715
+ if (t.gte("10{2,2}".concat(MSI))) {
1716
+ return t;
1717
+ }
1718
+ if (t.gte("10{1,2}".concat(MSI))) {
1719
+ t.setOperator(t.getOperator(1, 2) - 1, 1, 2);
1720
+ return t;
1721
+ }
1722
+ var r = 0;
1723
+ var x = t.clone();
1724
+ var morexxxoperators = 0;
1725
+ if (x.getOperator(1 / 0) >= 10) {
1726
+ morexxxoperators = x.getOperator(1 / 0) - 10;
1727
+ x.setOperator(10, 1 / 0);
1728
+ }
1729
+ for (var i = 0; i < 100; ++i) {
1730
+ if (x.lt(PowiainaNum.ZERO)) {
1731
+ x = PowiainaNum.arrFrac(base, x);
1732
+ --r;
1733
+ } else if (x.lte(1)) {
1734
+ return new PowiainaNum(r + x.toNumber() - 1 + morexxxoperators);
1735
+ } else {
1736
+ // 第1-4次迭代,进入此处
1737
+ ++r;
1738
+ x = x.omegalog(base.toNumber());
1739
+ }
1740
+ }
1741
+ if (x.gt(10)) return new PowiainaNum(r + morexxxoperators);
1742
+ return x.add(morexxxoperators);
1743
+ }
1744
+ /**
1745
+ * return `base`{{`arrow2`}}`x` = `this` which `x` is.
1746
+ *
1747
+ * @param arrow2
1748
+ * @returns
1749
+ */
1750
+ }, {
1751
+ key: "expansion_log2",
1752
+ value: function expansion_log2(arrow2) {
1753
+ var x = this.clone();
1754
+ var arrow = new PowiainaNum(arrow2);
1755
+ var arrowsNum = arrow.toNumber();
1756
+ if (arrow.gt(MSI)) {
1757
+ throw new Error(powiainaNumError + "Not implemented");
1758
+ }
1759
+ if (!arrow.isInt() || arrow.lt(1)) return function () {
1760
+ if (PowiainaNum.throwErrorOnResultNaN) throw new Error("NaN");
1761
+ return PowiainaNum.NaN.clone();
1762
+ };
1763
+ if (arrow.eq(1)) return function (base) {
1764
+ return x.expansion_log_inner(base);
1765
+ };
1766
+ if (x.isInfiNaN()) return function () {
1767
+ return x;
1768
+ };
1769
+ return function (base) {
1770
+ var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
1771
+ var b = new PowiainaNum(base);
1772
+ if (b.isNaN()) return b;
1773
+ if (b.isInfi()) return PowiainaNum.ZERO.clone();
1774
+ if (x.isZero()) return PowiainaNum.ONE.clone();
1775
+ if (x.eq(PowiainaNum.ONE)) return PowiainaNum.ZERO.clone();
1776
+ if (x.eq(b)) return PowiainaNum.ONE.clone();
1777
+ if (x.max(b).gt(PowiainaNum.arrowexpansMSI(arrowsNum + 1))) {
1778
+ if (x.gt(b)) return x;
1779
+ return PowiainaNum.ZERO.clone();
1780
+ }
1781
+ if (x.max(b).gt(PowiainaNum.arrowexpansMSI(arrowsNum))) {
1782
+ if (x.gt(b)) {
1783
+ x.setOperator(x.getOperator(arrowsNum, 2) - 1, arrowsNum, 2);
1784
+ x.normalize();
1785
+ return x.sub(x.getOperator(arrowsNum - 1, 2));
1786
+ }
1787
+ }
1788
+ if (x.lt(PowiainaNum.ZERO.clone())) {
1789
+ if (PowiainaNum.throwErrorOnResultNaN) throw new Error("NaN");
1790
+ return PowiainaNum.NaN.clone();
1791
+ }
1792
+ // base^base^... = x? (? bases)
1793
+ var r = 0;
1794
+ // 计算x与base的差距
1795
+ var distanceLayerOf = x.getOperator(arrowsNum, 2) - b.getOperator(arrowsNum, 2);
1796
+ if (distanceLayerOf > 3) {
1797
+ var l = distanceLayerOf - 3;
1798
+ r += l;
1799
+ x.setOperator(x.getOperator(arrowsNum, 2) - l, arrowsNum, 2);
1800
+ }
1801
+ // 假设b=3, x=1e19
1802
+ for (var i = 0; i < 100; ++i) {
1803
+ if (x.lt(PowiainaNum.ZERO)) {
1804
+ x = x.expansionArrow(arrowsNum - 1)(base);
1805
+ --r;
1806
+ } else if (x.lte(1)) {
1807
+ return new PowiainaNum(r + x.toNumber() - 1);
1808
+ } else {
1809
+ // 第1-4次迭代,进入此处
1810
+ ++r;
1811
+ x = x.expansion_log2(arrowsNum - 1)(base, depth + 1);
1812
+ }
1813
+ }
1814
+ if (x.gt(10)) return new PowiainaNum(r);
1815
+ if (PowiainaNum.throwErrorOnResultNaN) throw new Error("NaN");
1816
+ return PowiainaNum.NaN.clone();
1817
+ };
1818
+ }
1575
1819
  }, {
1576
1820
  key: "multiExpansion",
1577
1821
  value: function multiExpansion(other) {
@@ -2571,18 +2815,44 @@ var PowiainaNum = /*#__PURE__*/function () {
2571
2815
  value: function oBase(operators) {
2572
2816
  return operators[0].repeat;
2573
2817
  }
2818
+ }, {
2819
+ key: "operatorLevel",
2820
+ value: function operatorLevel(operator) {
2821
+ if (operator == undefined) return [0, 0, 0];
2822
+ if (!Array.isArray(operator)) return [operator.megota, operator.expans, operator.arrow];else {
2823
+ return _toConsumableArray(operator);
2824
+ }
2825
+ }
2826
+ }, {
2827
+ key: "cmpOperatorLevel",
2828
+ value: function cmpOperatorLevel(operator, operator2) {
2829
+ return compareTuples(this.operatorLevel(operator), this.operatorLevel(operator2));
2830
+ }
2831
+ }, {
2832
+ key: "higherOmega",
2833
+ value: function higherOmega(operator) {
2834
+ this.operatorLevel(operator);
2835
+ if (!isFinite(operator.expans)) return this.operatorLevel(operator);else if (!isFinite(operator.arrow)) return this.operatorLevel(operator);else {
2836
+ return [operator.megota, operator.expans, 1 / 0];
2837
+ }
2838
+ }
2574
2839
  /**
2575
- * Only works for operators level < ω.
2840
+ * Only works for operators level < ω2.
2576
2841
  */
2577
2842
  }, {
2578
2843
  key: "omegacollect",
2579
2844
  value: function omegacollect(operators) {
2580
- debugger;
2845
+ var _b;
2581
2846
  // const result = {
2582
2847
  // bottom: NaN,
2583
2848
  // top: NaN,
2584
2849
  // };
2585
- var maxWhile = 1000;
2850
+ function upgrade2(base) {
2851
+ operators[1].arrow++;
2852
+ operators[0].repeat = operators[1].repeat + Math.log10(base);
2853
+ operators[1].repeat = 1;
2854
+ }
2855
+ var maxWhile = 1000000;
2586
2856
  while (maxWhile--) {
2587
2857
  var base = PowiainaNum.oBase(operators);
2588
2858
  if (base >= 10) {
@@ -2590,26 +2860,53 @@ var PowiainaNum = /*#__PURE__*/function () {
2590
2860
  operators[0].repeat = Math.log10(base);
2591
2861
  PowiainaNum.opSetOperator(operators, PowiainaNum.opGetOperator(operators, 1, 1, 1) + 1, 1, 1, 1);
2592
2862
  } else {
2593
- if (operators.length <= 2 && operators[1].repeat == 1) {
2863
+ if (operators.length <= 2 && ((_b = operators[1]) === null || _b === void 0 ? void 0 : _b.repeat) == 1) {
2594
2864
  return operators;
2595
2865
  }
2596
2866
  // Operator upgrade mode:
2867
+ var nextisOmega = this.cmpOperatorLevel(this.higherOmega(operators[1]), operators[2]) <= 0;
2868
+ // some operator will upgrade to 10{!}:
2869
+ // first, the 3th operator is >=ω.
2870
+ // second, the 2th operator's repeat is 1.
2871
+ // third: the 2th operator's arrow >=3 and it's not 10{!}(for converting)
2872
+ // fourth, base < 10
2873
+ if (nextisOmega && operators[1].repeat == 1 && isFinite(operators[1].arrow) && operators[1].arrow >= 3) {
2874
+ operators[0].repeat = operators[1].arrow - 1 + Math.log(operators[0].repeat / 2) / Math.log(5);
2875
+ operators[1] = newOperator(1, 1 / 0, operators[1].expans, operators[1].megota);
2876
+ mergeSameArrays({
2877
+ array: operators
2878
+ });
2879
+ continue;
2880
+ }
2597
2881
  // Check the -2th operator, is repeat >= 2?
2598
- if (operators[1].repeat >= 2) {
2599
- operators[1].arrow++;
2600
- operators[0].repeat = operators[1].repeat + Math.log10(base);
2601
- operators[1].repeat = 1;
2602
- } else if (base !== 1) {
2603
- operators[1].arrow++;
2604
- operators[0].repeat = operators[1].repeat + Math.log10(base);
2605
- operators[1].repeat = 1;
2606
- } else {
2607
- // -2th repeat = 1, and base = 1;
2608
- operators[1].arrow = operators[2].arrow;
2882
+ else if (isFinite(operators[1].arrow)) {
2883
+ // 如果下一个是omega,而且operators[1].arrow<3的话,强行提到arrow>=3
2884
+ if (operators[1].repeat >= 2) {
2885
+ upgrade2(base);
2886
+ } else if (nextisOmega && operators[1].arrow < 3) {
2887
+ upgrade2(base);
2888
+ } else if (base !== 1) {
2889
+ upgrade2(base);
2890
+ } else if (this.cmpOperatorLevel(this.higherOmega(operators[1]), operators[2]) == 1) {
2891
+ // -2th repeat = 1, and base = 1, 3rd operator is not higher.
2892
+ operators[1].arrow = operators[2].arrow;
2893
+ }
2894
+ mergeSameArrays({
2895
+ array: operators
2896
+ });
2897
+ continue;
2898
+ } else if (!isFinite(operators[1].arrow)) {
2899
+ // if an operator is 10{!}, upgrade to a higher level
2900
+ // 10{!}3 = 10{1,2}(1+Math.log10(3))
2901
+ var infRepeat = operators[1].repeat;
2902
+ var baseAfter = infRepeat + Math.log10(base);
2903
+ operators[1] = newOperator(1, 1, operators[1].expans + 1, operators[1].megota);
2904
+ operators[0].repeat = baseAfter;
2905
+ mergeSameArrays({
2906
+ array: operators
2907
+ });
2908
+ continue;
2609
2909
  }
2610
- mergeSameArrays({
2611
- array: operators
2612
- });
2613
2910
  }
2614
2911
  }
2615
2912
  return operators;
@@ -2627,11 +2924,27 @@ var PowiainaNum = /*#__PURE__*/function () {
2627
2924
  var h = new PowiainaNum(height).clone();
2628
2925
  return new PowiainaNum(b).arrow(h.floor().add(1))(b.div(2).pow(h.sub(h.floor())).mul(2));
2629
2926
  }
2927
+ /**
2928
+ * base{{height}}base
2929
+ */
2930
+ }, {
2931
+ key: "arrw2Frac",
2932
+ value: function arrw2Frac(base, height) {
2933
+ if (new PowiainaNum(height).lt(2)) return new PowiainaNum(base).expansionArrow(3)(height);
2934
+ var b = new PowiainaNum(base).clone();
2935
+ var h = new PowiainaNum(height).clone();
2936
+ return new PowiainaNum(b).expansionArrow(h.floor().add(1))(b.div(2).pow(h.sub(h.floor())).mul(2));
2937
+ }
2630
2938
  }, {
2631
2939
  key: "arrowMSI",
2632
2940
  value: function arrowMSI(arrowsNum) {
2633
2941
  return new PowiainaNum("10{".concat(arrowsNum, "}").concat(MSI));
2634
2942
  }
2943
+ }, {
2944
+ key: "arrowexpansMSI",
2945
+ value: function arrowexpansMSI(arrowsNum) {
2946
+ return new PowiainaNum("10{".concat(arrowsNum, ",2}").concat(MSI));
2947
+ }
2635
2948
  }, {
2636
2949
  key: "hyper",
2637
2950
  value: function hyper(arr) {
@@ -3681,3 +3994,4 @@ PowiainaNum.throwErrorOnResultNaN = false;
3681
3994
  exports.arraySortFunction = arraySortFunction;
3682
3995
  exports["default"] = PowiainaNum;
3683
3996
  exports.mergeSameArrays = mergeSameArrays;
3997
+ exports.newOperator = newOperator;