metanum 1.2.0 → 1.3.0

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.
package/metanum.js CHANGED
@@ -1,5 +1,5 @@
1
- //Author: dlsdl v1.2
2
- //Add more hyper operations up to ε₀, add BEAF operation and fix bugs
1
+ //Author: dlsdl v1.3
2
+ //Add format-metanum.js, fix basic operations, hyper operations and BEAF bugs
3
3
  //Code snippets and templates from OmegaNum.js
4
4
 
5
5
  ;(function (globalScope) {
@@ -38,7 +38,7 @@
38
38
  R.PI = Math.PI;
39
39
  R.SQRT1_2 = Math.SQRT1_2;
40
40
  R.SQRT2 = Math.SQRT2;
41
- R.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
41
+ R.MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER;
42
42
  R.MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER;
43
43
  R.NaN = NaN;
44
44
  R.POSITIVE_INFINITY = Infinity;
@@ -299,6 +299,18 @@
299
299
  b = true;
300
300
  }
301
301
 
302
+ // Intermediate zero compression: [base, 0, ..., n] → [1, base, ..., n-1]
303
+ // This ensures F^n(base) = F^{n-1}(E^{base}(1)) for canonical representation
304
+ // e.g., [10, 0, 2] → [1, 10, 1], then expands to [10^10, 8, 1]
305
+ // [10, 9, 1] → [10^10, 8, 1] (via E-expansion), same result
306
+ if (!small && x.layer === 0 && r0.length > 2 && !r0[1]) {
307
+ for (var i = 2; !r0[i]; ++i) continue;
308
+ r0[i - 1] = r0[0];
309
+ r0[0] = 1;
310
+ r0[i]--;
311
+ b = true;
312
+ }
313
+
302
314
  for (var i = 1; i < r0.length; i++) {
303
315
  if (!small && r0[i] > MAX_SAFE_INTEGER) {
304
316
  r0[i + 1] = (r0[i + 1] || 0) + 1;
@@ -716,6 +728,11 @@
716
728
  return x.sign === 2 || x.sign === -2;
717
729
  }
718
730
 
731
+ function isNumeric(x) {
732
+ return x.layer === 0 && x.array.length === 1 &&
733
+ x.array[0].length === 1 && isFinite(x.array[0][0]);
734
+ }
735
+
719
736
  function computeLayer(arr) {
720
737
  // Layer represents ω^ nesting level above the ordinal represented by the array.
721
738
  // For all normal ordinal operations (up to ω^(maxcols-1) level), layer is 0.
@@ -848,8 +865,12 @@
848
865
  var n = other.gt(x);
849
866
  var t;
850
867
 
851
- if (q.gt(MetaNum.E_MAX_SAFE_INTEGER) || q.div(p).gt(MetaNum.MAX_SAFE_INTEGER)) {
852
- t = q;
868
+ // For very large q, subtraction of small values is negligible
869
+ if (q.gt(MetaNum.E_MAX_SAFE_INTEGER)) {
870
+ t = q.clone();
871
+ t = n ? t.neg() : t;
872
+ } else if (q.div(p).gt(MetaNum.MAX_SAFE_INTEGER)) {
873
+ t = q.clone();
853
874
  t = n ? t.neg() : t;
854
875
  } else if (!q.array[0][1]) {
855
876
  t = new MetaNum(x.toNumber() - other.toNumber());
@@ -973,6 +994,17 @@
973
994
  if (this.isNaN()) return MetaNum.NaN.clone();
974
995
  if (this.eq(MetaNum.ZERO)) return MetaNum.NaN.clone();
975
996
  if (this.isInfinite()) return MetaNum.ZERO.clone();
997
+ // Handle exponential format: rec(10^m) = 10^(-m)
998
+ if (this.layer === 0 && this.array.length === 1 && this.array[0].length > 1 && !isSmall(this)) {
999
+ var r0 = this.array[0].slice(0);
1000
+ r0[0] = -r0[0];
1001
+ var result = new MetaNum();
1002
+ result.array = [r0];
1003
+ result.sign = this.sign;
1004
+ result.layer = 0;
1005
+ result.normalize = P.normalize;
1006
+ return result.normalize();
1007
+ }
976
1008
  var x = this.clone();
977
1009
  // Toggle between large and small: 1↔2, -1↔-2
978
1010
  x.sign = x.sign === 1 ? 2 : x.sign === 2 ? 1 : x.sign === -1 ? -2 : -1;
@@ -1035,30 +1067,23 @@
1035
1067
  if (this.sign === -1 || this.sign === -2) return this.abs().exp().rec();
1036
1068
  if (isSimple(this) && !isSmall(this)) {
1037
1069
  var ev = Math.exp(this.array[0][0]);
1038
- if (Number.isFinite(ev) && Math.abs(ev) <= MAX_SAFE_INTEGER) return new MetaNum(ev);
1070
+ if (Number.isFinite(ev)) return new MetaNum(ev);
1039
1071
  }
1040
- return this;
1072
+ return MetaNum.pow(Math.E, this);
1041
1073
  };
1042
1074
  Q.exponential = Q.exp = function (x) {
1043
1075
  return new MetaNum(x).exp();
1044
1076
  };
1045
1077
 
1046
1078
  P.squareRoot = P.sqrt = function () {
1047
- if (this.isNaN() || this.sign === -1 || this.sign === -2) return MetaNum.NaN.clone();
1048
- if (this.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
1049
- if (isSimple(this) && !isSmall(this)) return new MetaNum(Math.sqrt(this.array[0][0]));
1050
- return this;
1079
+ return this.root(2);
1051
1080
  };
1052
1081
  Q.squareRoot = Q.sqrt = function (x) {
1053
1082
  return new MetaNum(x).sqrt();
1054
1083
  };
1055
1084
 
1056
1085
  P.cubeRoot = P.cbrt = function () {
1057
- if (this.isNaN()) return MetaNum.NaN.clone();
1058
- if (this.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
1059
- if (this.sign === -1 || this.sign === -2) return this.abs().cbrt().neg();
1060
- if (isSimple(this)) return new MetaNum(Math.cbrt(this.array[0][0]));
1061
- return this;
1086
+ return this.root(3);
1062
1087
  };
1063
1088
  Q.cubeRoot = Q.cbrt = function (x) {
1064
1089
  return new MetaNum(x).cbrt();
@@ -1074,7 +1099,55 @@
1074
1099
  if (other.mod(2).eq(MetaNum.ONE)) return x.abs().root(other).neg();
1075
1100
  return MetaNum.NaN.clone();
1076
1101
  }
1077
- if (isSimple(x) && isSimple(other)) return new MetaNum(Math.pow(x.array[0][0], 1 / other.array[0][0]));
1102
+ if (isNumeric(x) && isNumeric(other)) return new MetaNum(Math.pow(x.array[0][0], 1 / other.array[0][0]));
1103
+ // Handle E^m format (iterated exponentiation levels)
1104
+ if (x.layer === 0 && x.array.length === 1 && x.array[0].length > 1 && isNumeric(other)) {
1105
+ var r0 = x.array[0];
1106
+ var n = other.array[0][0];
1107
+ var m = r0[1]; // number of 10^ wrappings: 1=E, 2=EE, >=3=F or higher
1108
+ var newR0;
1109
+ if (m === 1) {
1110
+ // E^1: value = 10^r0[0]. root_n = 10^(r0[0]/n)
1111
+ newR0 = r0.slice(0);
1112
+ newR0[0] = r0[0] / n;
1113
+ } else if (m === 2) {
1114
+ // E^2 (EE): value = 10^(10^r0[0])
1115
+ // root_n = 10^((10^r0[0])/n)
1116
+ // If 10^r0[0] is computable as JS number, unwrap one level: E((10^r0[0])/n)
1117
+ var powVal = Math.pow(10, r0[0]);
1118
+ if (isFinite(powVal) && powVal > 0 && powVal / n > 0) {
1119
+ newR0 = [powVal / n, 1]; // drop to E-level
1120
+ } else {
1121
+ // Too large: use identity a/b = 10^(log10(a) - log10(b)) inside one 10^
1122
+ // root_n(10^(10^x)) = 10^(10^(x - log10(n)))
1123
+ newR0 = r0.slice(0);
1124
+ newR0[0] = r0[0] - Math.log10(n);
1125
+ }
1126
+ } else {
1127
+ // E^m with m >= 3 (F, G, ... level)
1128
+ // V = 10^U where U = E^(m-1)(r0[0]). V^(1/n) = 10^(U/n)
1129
+ // U = 10^V', so U/n = 10^V'/n = 10^(V' - log10(n)) when V' is still a pure tower
1130
+ // Since m >= 3, we can subtract log10(n) from r0[0] at level m-2, but we only have
1131
+ // a flat r0; the best uniform approximation is to subtract log10(n) from the base.
1132
+ newR0 = r0.slice(0);
1133
+ newR0[0] = r0[0] - Math.log10(n);
1134
+ if (newR0[0] <= 0) {
1135
+ // subtraction would collapse the bottom: try to unwrap one level instead
1136
+ // approximate: reduce the level by 1 and replace r0[0] by (10^r0[0] / n) if computable
1137
+ // if not computable, just keep the small value (log-scale effects dominate anyway)
1138
+ var powVal2 = Math.pow(10, r0[0]);
1139
+ if (isFinite(powVal2) && powVal2 / n > 0) {
1140
+ newR0 = [powVal2 / n, m - 1];
1141
+ }
1142
+ }
1143
+ }
1144
+ var result = new MetaNum();
1145
+ result.array = [newR0];
1146
+ result.sign = 1;
1147
+ result.layer = 0;
1148
+ result.normalize = P.normalize;
1149
+ return result.normalize();
1150
+ }
1078
1151
  return x;
1079
1152
  };
1080
1153
  Q.root = function (x, y) {
@@ -1095,7 +1168,7 @@
1095
1168
  return result.neg();
1096
1169
  }
1097
1170
  if (this.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
1098
- if (isSimple(this)) {
1171
+ if (isNumeric(this)) {
1099
1172
  var lv = Math.log10(this.array[0][0]);
1100
1173
  if (Number.isFinite(lv)) return new MetaNum(lv);
1101
1174
  }
@@ -1121,7 +1194,7 @@
1121
1194
  if (base.isNaN() || base.eq(MetaNum.ZERO) || base.eq(MetaNum.ONE)) return MetaNum.NaN.clone();
1122
1195
  if (x.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
1123
1196
  if (x.eq(MetaNum.ONE)) return MetaNum.ZERO.clone();
1124
- if (isSimple(x) && isSimple(base)) {
1197
+ if (isNumeric(x) && isNumeric(base)) {
1125
1198
  var lv = Math.log(x.array[0][0]) / Math.log(base.array[0][0]);
1126
1199
  if (Number.isFinite(lv)) return new MetaNum(lv);
1127
1200
  }
@@ -1135,7 +1208,7 @@
1135
1208
  if (this.isNaN() || this.sign === -1 || this.sign === -2) return MetaNum.NaN.clone();
1136
1209
  if (this.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
1137
1210
  if (this.isInfinite()) return this;
1138
- if (isSimple(this)) {
1211
+ if (isNumeric(this)) {
1139
1212
  var lv = Math.log(this.array[0][0]);
1140
1213
  if (Number.isFinite(lv)) return new MetaNum(lv);
1141
1214
  }
@@ -1152,6 +1225,22 @@
1152
1225
  var oNS = toNormalizedSign(other.sign);
1153
1226
  if (tNS * oNS === -1) return this.abs().mod(other.abs()).neg();
1154
1227
  if (this.sign === -1 || this.sign === -2) return this.abs().mod(other.abs());
1228
+ // Handle exponential format: mod(10^m, n) using modular exponentiation
1229
+ if (this.layer === 0 && this.array.length === 1 && this.array[0].length > 1 && isNumeric(other)) {
1230
+ var exp = this.array[0][0];
1231
+ var modVal = other.array[0][0];
1232
+ if (Number.isInteger(exp) && Number.isInteger(modVal) && modVal > 0) {
1233
+ var result = 1;
1234
+ var base = 10 % modVal;
1235
+ var e = exp;
1236
+ while (e > 0) {
1237
+ if (e % 2 === 1) result = (result * base) % modVal;
1238
+ e = Math.floor(e / 2);
1239
+ base = (base * base) % modVal;
1240
+ }
1241
+ return new MetaNum(result);
1242
+ }
1243
+ }
1155
1244
  return this.sub(this.div(other).floor().mul(other));
1156
1245
  };
1157
1246
  Q.modular = Q.mod = function (x, y) {
@@ -1209,13 +1298,40 @@
1209
1298
  if (principal === undefined) principal = true;
1210
1299
  if (this.isNaN()) return MetaNum.NaN.clone();
1211
1300
  if (this.isInfinite()) return this.clone();
1212
- if (isSimple(this)) {
1213
- try {
1214
- return new MetaNum(f_lambertw(this.array[0][0], tol, principal));
1215
- } catch (e) {
1216
- return MetaNum.NaN.clone();
1301
+ if (this.lt(-0.3678794411710499)) return MetaNum.NaN.clone();
1302
+
1303
+ // Handle large values with threshold checks (like OmegaNum)
1304
+ if (principal) {
1305
+ if (this.gt(MetaNum.TETRATED_MAX_SAFE_INTEGER)) return this.clone();
1306
+ if (this.gt(MetaNum.EE_MAX_SAFE_INTEGER)) {
1307
+ var result = this.clone();
1308
+ result.array[0][1]--;
1309
+ result.normalize();
1310
+ return result;
1311
+ }
1312
+ if (this.gt(MetaNum.E_MAX_SAFE_INTEGER)) return d_lambertw(this, tol, principal);
1313
+ if (isNumeric(this)) {
1314
+ try {
1315
+ return new MetaNum(f_lambertw(this.array[0][0], tol, principal));
1316
+ } catch (e) {
1317
+ return MetaNum.NaN.clone();
1318
+ }
1319
+ }
1320
+ } else {
1321
+ if (this.sign === 1 || this.sign === 2) return MetaNum.NaN.clone();
1322
+ if (this.abs().gt(MetaNum.EE_MAX_SAFE_INTEGER)) {
1323
+ return this.abs().recip().lambertw(tol, principal).neg();
1324
+ }
1325
+ if (this.abs().gt(MetaNum.E_MAX_SAFE_INTEGER)) return d_lambertw(this, tol, principal);
1326
+ if (isNumeric(this)) {
1327
+ try {
1328
+ return new MetaNum(f_lambertw(this.sign * this.array[0][0], tol, principal));
1329
+ } catch (e) {
1330
+ return MetaNum.NaN.clone();
1331
+ }
1217
1332
  }
1218
1333
  }
1334
+
1219
1335
  return d_lambertw(this, tol, principal);
1220
1336
  };
1221
1337
  Q.lambertw = function (x, tol, principal) {
@@ -1321,21 +1437,11 @@
1321
1437
  return new MetaNum(x).tetr(y, payload);
1322
1438
  };
1323
1439
 
1324
- P.iteratedexp = function (other) {
1325
- var x = this.clone();
1326
- other = new MetaNum(other);
1327
- if (other.sign === -1 || other.sign === -2) return MetaNum.ZERO.clone();
1328
- if (isSimple(x) && isSimple(other) && Number.isInteger(other.array[0][0]) && other.array[0][0] <= 4) {
1329
- var iv = x.array[0][0];
1330
- var ic = other.array[0][0];
1331
- var r = iv;
1332
- for (var i = 0; i < ic; i++) r = Math.pow(10, r);
1333
- if (Number.isFinite(r) && Math.abs(r) <= MAX_SAFE_INTEGER) return new MetaNum(r);
1334
- }
1335
- return x;
1440
+ P.iteratedexp = function (other, payload) {
1441
+ return this.tetr(other, payload);
1336
1442
  };
1337
- Q.iteratedexp = function (x, y) {
1338
- return new MetaNum(x).iteratedexp(y);
1443
+ Q.iteratedexp = function (x, y, payload) {
1444
+ return new MetaNum(x).iteratedexp(y, payload);
1339
1445
  };
1340
1446
 
1341
1447
  P.iteratedlog = function (other) {
@@ -1359,13 +1465,14 @@
1359
1465
 
1360
1466
  P.layeradd = function (other, base) {
1361
1467
  if (base == null) base = 10;
1468
+ if (other == null) other = MetaNum.ONE.clone();
1362
1469
  var x = this.clone();
1363
1470
  other = new MetaNum(other);
1364
1471
  base = new MetaNum(base);
1365
1472
  if (x.isNaN() || other.isNaN() || base.isNaN()) return MetaNum.NaN.clone();
1366
1473
  if (other.eq(MetaNum.ZERO)) return x.clone();
1367
1474
  if (other.sign === -1 || other.sign === -2) return MetaNum.ZERO.clone();
1368
- return x.tetr(other).tetr(base).logBase(base);
1475
+ return base.tetr(x.slog(base).add(other));
1369
1476
  };
1370
1477
  Q.layeradd = function (x, y, base) {
1371
1478
  return new MetaNum(x).layeradd(y, base);
@@ -1404,15 +1511,46 @@
1404
1511
  other = new MetaNum(other);
1405
1512
  if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
1406
1513
  if (x.sign === -1 || x.sign === -2 || other.sign === -1 || other.sign === -2) return MetaNum.NaN.clone();
1407
- if (other.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
1408
- if (other.eq(MetaNum.ONE)) return x.clone();
1409
- if (isSimple(x) && isSimple(other) && other.array[0][0] > 1) {
1410
- var v = x.array[0][0];
1411
- var n = other.array[0][0];
1412
- try {
1413
- var w = f_lambertw((n - 1) * Math.log(v / (n - 1)));
1414
- if (Number.isFinite(w)) return new MetaNum(Math.exp(w));
1415
- } catch (e) {}
1514
+ var degreeNum = other.toNumber();
1515
+ if (degreeNum === 1) return x.clone();
1516
+ if (x.eq(MetaNum.POSITIVE_INFINITY)) return MetaNum.POSITIVE_INFINITY.clone();
1517
+ if (!x.isFinite()) return MetaNum.NaN.clone();
1518
+ if (degreeNum > 0 && degreeNum < 1) return x.root(degreeNum);
1519
+ if (degreeNum <= 0) return MetaNum.NaN.clone();
1520
+ if (other.gt(MetaNum.MAX_SAFE_INTEGER)) {
1521
+ var xNum = x.toNumber();
1522
+ if (xNum < Math.E && xNum > 1 / Math.E) return x.pow(x.rec());
1523
+ if (x.gt(MetaNum.TETRATED_MAX_SAFE_INTEGER)) return MetaNum.tetr(10, x.slog(10).sub(other));
1524
+ return MetaNum.NaN.clone();
1525
+ }
1526
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1527
+ if (x.lt(MetaNum.ZERO)) return MetaNum.NaN.clone();
1528
+ if (x.gt(MetaNum.ONE)) {
1529
+ // Find upper bound
1530
+ var upperBound;
1531
+ if (degreeNum <= 1) {
1532
+ upperBound = x.root(degreeNum);
1533
+ } else if (x.gte(MetaNum.tetr(10, other))) {
1534
+ upperBound = x.iteratedlog(other, Math.floor(degreeNum) - 1);
1535
+ } else {
1536
+ upperBound = new MetaNum(10);
1537
+ }
1538
+ var lower = MetaNum.ZERO.clone();
1539
+ var layer = upperBound.array[0][2] || 0;
1540
+ var upper = upperBound.iteratedlog(10, layer);
1541
+ var guess = upper.div(2);
1542
+ for (var iter = 0; iter < 200; iter++) {
1543
+ var testVal = MetaNum.iteratedexp(10, layer, guess).tetr(other);
1544
+ if (testVal.gt(x)) {
1545
+ upper = guess;
1546
+ } else {
1547
+ lower = guess;
1548
+ }
1549
+ var newguess = lower.add(upper).div(2);
1550
+ if (newguess.eq(guess)) break;
1551
+ guess = newguess;
1552
+ }
1553
+ return MetaNum.iteratedexp(10, layer, guess);
1416
1554
  }
1417
1555
  return x;
1418
1556
  };
@@ -1427,6 +1565,7 @@
1427
1565
  if (x.isNaN() || base.isNaN()) return MetaNum.NaN.clone();
1428
1566
  if (x.sign === -1 || x.sign === -2 || base.sign === -1 || base.sign === -2) return MetaNum.NaN.clone();
1429
1567
  if (x.eq(MetaNum.ONE)) return MetaNum.ZERO.clone();
1568
+ if (x.eq(base)) return MetaNum.ONE.clone();
1430
1569
  if (x.lt(MetaNum.ONE)) return MetaNum.fromNumber(-1).add(x.slog(base));
1431
1570
  var m = x.max(base);
1432
1571
  if (m.gt(hyperLevel(3, MAX_SAFE_INTEGER))) {
@@ -1748,30 +1887,27 @@
1748
1887
  var x = this.clone();
1749
1888
  z = new MetaNum(z);
1750
1889
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1751
- if (z.array.length >= 2) {
1752
- var result = z.clone();
1753
- for (var i = result.array.length - 1; i >= 1; i--) {
1754
- var row = result.array[i];
1890
+ if (x.array.length >= 2) {
1891
+ // For ordinal y: find ordinal marker and return y
1892
+ for (var i = x.array.length - 1; i >= 1; i--) {
1893
+ var row = x.array[i];
1755
1894
  if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] > 0) {
1756
- row[0]--;
1757
- if (row[0] <= 0) result.array.splice(i, 1);
1895
+ // This is an ordinal marker, return the ordinal y
1896
+ var result = x.clone();
1897
+ result.array.splice(i, 1);
1758
1898
  result.normalize();
1759
1899
  if (result.array.length <= 1) result.layer = 0;
1760
1900
  return result;
1761
1901
  }
1762
1902
  }
1763
- for (var i = result.array.length - 1; i >= 1; i--) {
1764
- var row = result.array[i];
1765
- if (row.length === 2 && row[1] > 0) {
1766
- return new MetaNum(row[1] + 1);
1767
- }
1768
- }
1769
- return result;
1770
1903
  }
1771
- if (z.layer === 0 && z.array.length === 1) {
1772
- var r0 = z.array[0];
1773
- if (r0.length > 1 && r0[1] > 0) {
1774
- return new MetaNum(r0[1] + 1);
1904
+ // For finite y: count the number of values in r0
1905
+ if (x.layer === 0 && x.array.length === 1) {
1906
+ var r0 = x.array[0];
1907
+ if (r0.length > 1) {
1908
+ // r0 = [base, v1, v2, ..., v_{y-1}]
1909
+ // y = r0.length
1910
+ return new MetaNum(r0.length);
1775
1911
  }
1776
1912
  return new MetaNum(1);
1777
1913
  }
@@ -1786,6 +1922,7 @@
1786
1922
  var x = this.clone();
1787
1923
  y = new MetaNum(y);
1788
1924
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1925
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1789
1926
  if (y.eq(MetaNum.ONE)) return x.clone();
1790
1927
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1791
1928
  var base = x.aperiote(x); // expande(x, 2) = x{x}x
@@ -1818,37 +1955,26 @@
1818
1955
  var x = this.clone();
1819
1956
  z = new MetaNum(z);
1820
1957
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1821
- if (z.array.length >= 2) {
1822
- var result = z.clone();
1823
- // First: find ordinal marker [1, 1, 1]
1824
- for (var i = result.array.length - 1; i >= 1; i--) {
1825
- var row = result.array[i];
1958
+ if (x.array.length >= 2) {
1959
+ // For ordinal y: find [1, 1, 1] marker and return y (the ordinal itself)
1960
+ for (var i = x.array.length - 1; i >= 1; i--) {
1961
+ var row = x.array[i];
1826
1962
  if (row.length >= 3 && row[1] === 1 && row[2] === 1 && row[0] === 1) {
1963
+ // This is the ordinal marker, return the ordinal y
1964
+ var result = x.clone();
1827
1965
  result.array.splice(i, 1);
1828
1966
  result.normalize();
1829
1967
  if (result.array.length <= 1) result.layer = 0;
1830
1968
  return result;
1831
1969
  }
1832
1970
  }
1833
- // Second: find iteration count [count, 0, 1]
1834
- for (var i = result.array.length - 1; i >= 1; i--) {
1835
- var row = result.array[i];
1971
+ // For finite y: find [count, 0, 1] and return count + 2
1972
+ for (var i = x.array.length - 1; i >= 1; i--) {
1973
+ var row = x.array[i];
1836
1974
  if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] > 0) {
1837
- row[0]--;
1838
- if (row[0] <= 0) result.array.splice(i, 1);
1839
- result.normalize();
1840
- if (result.array.length <= 1) result.layer = 0;
1841
- return result;
1842
- }
1843
- }
1844
- // Fallback: finite-level result
1845
- for (var i = result.array.length - 1; i >= 1; i--) {
1846
- var row2 = result.array[i];
1847
- if (row2.length === 2 && row2[1] > 0) {
1848
- return new MetaNum(row2[1] + 1);
1975
+ return new MetaNum(row[0] + 2);
1849
1976
  }
1850
1977
  }
1851
- return result;
1852
1978
  }
1853
1979
  return z;
1854
1980
  };
@@ -1861,6 +1987,7 @@
1861
1987
  var x = this.clone();
1862
1988
  y = new MetaNum(y);
1863
1989
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1990
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1864
1991
  if (y.eq(MetaNum.ONE)) return x.clone();
1865
1992
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1866
1993
  var base = x.expande(x); // multiexpande(x, 2)
@@ -1892,28 +2019,26 @@
1892
2019
  var x = this.clone();
1893
2020
  z = new MetaNum(z);
1894
2021
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1895
- if (z.array.length >= 2) {
1896
- var result = z.clone();
1897
- for (var i = result.array.length - 1; i >= 1; i--) {
1898
- var row = result.array[i];
2022
+ if (x.array.length >= 2) {
2023
+ // For ordinal y: find [1, 2, 1] marker and return y (the ordinal itself)
2024
+ for (var i = x.array.length - 1; i >= 1; i--) {
2025
+ var row = x.array[i];
1899
2026
  if (row.length >= 3 && row[1] === 2 && row[2] === 1 && row[0] === 1) {
2027
+ // This is the ordinal marker, return the ordinal y
2028
+ var result = x.clone();
1900
2029
  result.array.splice(i, 1);
1901
2030
  result.normalize();
1902
2031
  if (result.array.length <= 1) result.layer = 0;
1903
2032
  return result;
1904
2033
  }
1905
2034
  }
1906
- for (var i = result.array.length - 1; i >= 1; i--) {
1907
- var row = result.array[i];
2035
+ // For finite y: find [count, 1, 1] and return count + 2
2036
+ for (var i = x.array.length - 1; i >= 1; i--) {
2037
+ var row = x.array[i];
1908
2038
  if (row.length >= 3 && row[1] === 1 && row[2] === 1 && row[0] > 0) {
1909
- row[0]--;
1910
- if (row[0] <= 0) result.array.splice(i, 1);
1911
- result.normalize();
1912
- if (result.array.length <= 1) result.layer = 0;
1913
- return result;
2039
+ return new MetaNum(row[0] + 2);
1914
2040
  }
1915
2041
  }
1916
- return result;
1917
2042
  }
1918
2043
  return z;
1919
2044
  };
@@ -1926,6 +2051,7 @@
1926
2051
  var x = this.clone();
1927
2052
  y = new MetaNum(y);
1928
2053
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2054
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1929
2055
  if (y.eq(MetaNum.ONE)) return x.clone();
1930
2056
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1931
2057
  var base = x.multiexpande(x); // powerexpande(x, 2)
@@ -1958,28 +2084,26 @@
1958
2084
  var x = this.clone();
1959
2085
  z = new MetaNum(z);
1960
2086
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1961
- if (z.array.length >= 2) {
1962
- var result = z.clone();
1963
- for (var i = result.array.length - 1; i >= 1; i--) {
1964
- var row = result.array[i];
2087
+ if (x.array.length >= 2) {
2088
+ // For ordinal y: find [1, 3, 1] marker and return y (the ordinal itself)
2089
+ for (var i = x.array.length - 1; i >= 1; i--) {
2090
+ var row = x.array[i];
1965
2091
  if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] === 1) {
2092
+ // This is the ordinal marker, return the ordinal y
2093
+ var result = x.clone();
1966
2094
  result.array.splice(i, 1);
1967
2095
  result.normalize();
1968
2096
  if (result.array.length <= 1) result.layer = 0;
1969
2097
  return result;
1970
2098
  }
1971
2099
  }
1972
- for (var i = result.array.length - 1; i >= 1; i--) {
1973
- var row = result.array[i];
2100
+ // For finite y: find [count, 2, 1] and return count + 2
2101
+ for (var i = x.array.length - 1; i >= 1; i--) {
2102
+ var row = x.array[i];
1974
2103
  if (row.length >= 3 && row[1] === 2 && row[2] === 1 && row[0] > 0) {
1975
- row[0]--;
1976
- if (row[0] <= 0) result.array.splice(i, 1);
1977
- result.normalize();
1978
- if (result.array.length <= 1) result.layer = 0;
1979
- return result;
2104
+ return new MetaNum(row[0] + 2);
1980
2105
  }
1981
2106
  }
1982
- return result;
1983
2107
  }
1984
2108
  return z;
1985
2109
  };
@@ -1987,1540 +2111,379 @@
1987
2111
  return new MetaNum(x).inv_powerexpande(z);
1988
2112
  };
1989
2113
 
1990
- //ω*2 x{{y}}x
1991
- P.aperioexpande = P.apea = P.h20 = function (y) {
1992
- var x = this.clone();
2114
+ // Helper: generic hyperoperation from ordinal level (Cantor normal form coefficients).
2115
+ // coeffs: [c0, c1, c2, ..., ck] where ordinal = ω^k*ck + ... + ω^2*c2 + ω*c1 + c0
2116
+ Q._hyperopFromOrdinal = function(x, y, coeffs) {
2117
+ x = new MetaNum(x);
1993
2118
  y = new MetaNum(y);
1994
2119
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1995
- if (y.eq(MetaNum.ONE)) return x.expande(x);
1996
- if (y.eq(2)) return x.multiexpande(x);
1997
- if (y.eq(3)) return x.powerexpande(x);
1998
- var base = x.powerexpande(x); // aperioexpande(x, 3)
1999
- if (y.layer === 0 && y.array.length <= 1) {
2000
- var yNum = y.toNumber();
2001
- if (yNum > Number.MAX_SAFE_INTEGER || !isFinite(yNum)) {
2002
- // Very large y: result at ω*2 level
2003
- // y is already in magnitude form (e.g., [[16,1]] for 1e16), just add ω*2 marker
2004
- var result = y.clone();
2005
- result.layer = 0;
2006
- result.array.push([1, 0, 2]);
2007
- result.normalize();
2008
- return result;
2009
- }
2010
- // Finite y: generate rows [1, i, 1] for i from 0 to yNum-1
2011
- var totalRows = yNum - 1;
2012
- var maxRows = MetaNum.maxRows - 1;
2013
- var result = base.clone();
2014
- if (yNum <= 2) return result;
2015
- result.layer = 0;
2016
- if (totalRows <= maxRows) {
2017
- // No truncation needed
2018
- result.array = [base.array[0].slice()];
2019
- for (var i = 0; i < totalRows; i++) {
2020
- result.array.push([1, i, 1]);
2021
- }
2022
- } else {
2023
- // Truncate: keep last maxRows rows
2024
- result.array = [[10]];
2025
- var keepStart = yNum - maxRows;
2026
- for (var i = keepStart; i < yNum; i++) {
2027
- result.array.push([1, i, 1]);
2028
- }
2029
- }
2030
- result.normalize();
2031
- return result;
2032
- }
2033
- // ordinal y: expand based on y's structure
2034
- var result = y.clone();
2035
- result.array[0] = base.array[0].slice();
2036
- result.layer = 0;
2037
- // For ordinal y, add the ω*2 marker
2038
- // h20 is the diagonalization: y levels of ω*2 operations
2039
- // The result keeps y's ordinal structure and adds [1, 0, 2] as the ω*2 marker
2040
- result.array.push([1, 0, 2]);
2041
- result.normalize();
2120
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
2121
+ if (y.eq(MetaNum.ONE)) return x.clone();
2122
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2123
+
2124
+ var xNum = x.toNumber();
2125
+ var yNum = y.toNumber();
2126
+ var maxRows = MetaNum.maxRows; // 100
2127
+
2128
+ var baseArrowLevel = Math.max(Math.floor(isFinite(xNum) ? xNum : 3), 3);
2129
+ var baseResult = x.arrow(baseArrowLevel)(x);
2130
+
2131
+ var rows = Q._generateOrdinalRows(coeffs,
2132
+ isFinite(xNum) ? Math.floor(xNum) : baseArrowLevel,
2133
+ isFinite(yNum) ? Math.floor(yNum) : baseArrowLevel,
2134
+ maxRows);
2135
+
2136
+ var result = baseResult.clone();
2137
+ result.array = [baseResult.array[0].slice()];
2138
+ for (var i = 0; i < rows.length; i++) result.array.push(rows[i]);
2139
+ if (result.array.length > 1) result.layer = 0;
2042
2140
  return result;
2043
2141
  };
2044
- Q.aperioexpande = Q.apea = Q.h20 = function (x, y) {
2045
- return new MetaNum(x).aperioexpande(y);
2046
- };
2047
2142
 
2048
- P.inv_aperioexpande = P.i_apea = P.i20 = function (z) {
2049
- var x = this.clone();
2143
+ // Helper: generic inverse hyperoperation from ordinal level.
2144
+ // Forward: op(base, arg) generates ordinal rows with count = arg - 2
2145
+ // Inverse: inv_op(result, base) should return arg
2146
+ Q._invHyperopFromOrdinal = function(x, z, coeffs) {
2147
+ x = new MetaNum(x);
2050
2148
  z = new MetaNum(z);
2051
2149
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2052
- if (z.array.length >= 2) {
2053
- var result = z.clone();
2054
- for (var i = result.array.length - 1; i >= 1; i--) {
2055
- var row = result.array[i];
2056
- if (row.length >= 3 && row[1] === 0 && row[2] === 2 && row[0] === 1) {
2057
- result.array.splice(i, 1);
2058
- result.normalize();
2059
- if (result.array.length <= 1) result.layer = 0;
2060
- return result;
2061
- }
2062
- }
2063
- for (var i = result.array.length - 1; i >= 1; i--) {
2064
- var row = result.array[i];
2065
- if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] > 0) {
2066
- row[0]--;
2067
- if (row[0] <= 0) result.array.splice(i, 1);
2068
- result.normalize();
2069
- if (result.array.length <= 1) result.layer = 0;
2070
- return result;
2071
- }
2072
- }
2073
- return result;
2074
- }
2075
- return z;
2150
+
2151
+ // If x has no ordinal rows, return z itself
2152
+ if (x.array.length <= 1) return z;
2153
+
2154
+ // Find the largest ordinal row (at the end of the array)
2155
+ var lastIdx = x.array.length - 1;
2156
+ var row = x.array[lastIdx];
2157
+ if (!row) return z;
2158
+
2159
+ // The forward operation generates rows with count = arg - 2
2160
+ // So the inverse is: arg = count + 2
2161
+ var count = row[0] || 0;
2162
+ return new MetaNum(count + 2);
2163
+ };
2164
+
2165
+ // ---------------------------------------------------------------------------
2166
+ // Hyperoperations from ω*2 up to ω^4, all generated from ordinal level (CNF).
2167
+ // coeffs = [c0, c1, c2, ..., ck] where ordinal = Σ ω^i * ci
2168
+ // ---------------------------------------------------------------------------
2169
+
2170
+ // aperioexpande = ω*2 → coeffs [0,2]
2171
+ P.aperioexpande = P.apea = P.h20 = function (y) {
2172
+ return Q._hyperopFromOrdinal(this, y, [0,2]);
2173
+ };
2174
+ Q.aperioexpande = Q.apea = Q.h20 = function (x, y) {
2175
+ return Q._hyperopFromOrdinal(x, y, [0,2]);
2176
+ };
2177
+ P.inv_aperioexpande = P.i_apea = P.i20 = function (z) {
2178
+ return Q._invHyperopFromOrdinal(this, z, [0,2]);
2076
2179
  };
2077
2180
  Q.inv_aperioexpande = Q.i_apea = Q.i20 = function (x, z) {
2078
- return new MetaNum(x).inv_aperioexpande(z);
2181
+ return Q._invHyperopFromOrdinal(x, z, [0,2]);
2079
2182
  };
2080
-
2081
- //ω*2+1 x{{{1}}}y
2183
+
2184
+ // explode = ω*2 + 1 → coeffs [1,2]
2082
2185
  P.explode = P.expl = P.h21 = function (y) {
2083
- var x = this.clone();
2084
- y = new MetaNum(y);
2085
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2086
- if (y.eq(MetaNum.ONE)) return x.clone();
2087
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2088
- var base = x.aperioexpande(x); // explode(x, 2)
2089
- if (y.layer === 0 && y.array.length <= 1) {
2090
- var result = base.clone();
2091
- if (y.eq(2)) return result;
2092
- var count = y.toNumber() - 2;
2093
- if (count > 0) {
2094
- result.layer = 0;
2095
- result.array = [base.array[0].slice()];
2096
- var cl = MetaNum.getCantorLevel(3);
2097
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2098
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2099
- for (var i = 0; i < ordRows.length; i++) {
2100
- result.array.push(ordRows[i]);
2101
- }
2102
- result.normalize();
2103
- }
2104
- return result;
2105
- }
2106
- var result = y.clone();
2107
- result.array[0] = base.array[0].slice();
2108
- result.layer = 0;
2109
- result.array.push([1, 1, 2]);
2110
- result.normalize();
2111
- return result;
2186
+ return Q._hyperopFromOrdinal(this, y, [1,2]);
2112
2187
  };
2113
2188
  Q.explode = Q.expl = Q.h21 = function (x, y) {
2114
- return new MetaNum(x).explode(y);
2189
+ return Q._hyperopFromOrdinal(x, y, [1,2]);
2115
2190
  };
2116
-
2117
2191
  P.inv_explode = P.i_expl = P.i21 = function (z) {
2118
- var x = this.clone();
2119
- z = new MetaNum(z);
2120
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2121
- if (z.array.length >= 2) {
2122
- var result = z.clone();
2123
- for (var i = result.array.length - 1; i >= 1; i--) {
2124
- var row = result.array[i];
2125
- if (row.length >= 3 && row[1] === 1 && row[2] === 2 && row[0] === 1) {
2126
- result.array.splice(i, 1);
2127
- result.normalize();
2128
- if (result.array.length <= 1) result.layer = 0;
2129
- return result;
2130
- }
2131
- }
2132
- for (var i = result.array.length - 1; i >= 1; i--) {
2133
- var row = result.array[i];
2134
- if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] > 0) {
2135
- row[0]--;
2136
- if (row[0] <= 0) result.array.splice(i, 1);
2137
- result.normalize();
2138
- if (result.array.length <= 1) result.layer = 0;
2139
- return result;
2140
- }
2141
- }
2142
- return result;
2143
- }
2144
- return z;
2192
+ return Q._invHyperopFromOrdinal(this, z, [1,2]);
2145
2193
  };
2146
2194
  Q.inv_explode = Q.i_expl = Q.i21 = function (x, z) {
2147
- return new MetaNum(x).inv_explode(z);
2195
+ return Q._invHyperopFromOrdinal(x, z, [1,2]);
2148
2196
  };
2149
2197
 
2150
- //ω*2+2 x{{{2}}}y
2198
+ // multiexplode = ω*2 + 2 → coeffs [2,2]
2151
2199
  P.multiexplode = P.muel = P.h22 = function (y) {
2152
- var x = this.clone();
2153
- y = new MetaNum(y);
2154
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2155
- if (y.eq(MetaNum.ONE)) return x.clone();
2156
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2157
- var base = x.explode(x); // multiexplode(x, 2)
2158
- if (y.layer === 0 && y.array.length <= 1) {
2159
- var result = base.clone();
2160
- if (y.eq(2)) return result;
2161
- var count = y.toNumber() - 2;
2162
- if (count > 0) {
2163
- result.layer = 0;
2164
- result.array = [base.array[0].slice()];
2165
- var cl = MetaNum.getCantorLevel(4);
2166
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2167
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2168
- for (var i = 0; i < ordRows.length; i++) {
2169
- result.array.push(ordRows[i]);
2170
- }
2171
- result.normalize();
2172
- }
2173
- return result;
2174
- }
2175
- var result = y.clone();
2176
- result.array[0] = base.array[0].slice();
2177
- result.layer = 0;
2178
- result.array.push([1, 2, 2]);
2179
- result.normalize();
2180
- return result;
2200
+ return Q._hyperopFromOrdinal(this, y, [2,2]);
2181
2201
  };
2182
2202
  Q.multiexplode = Q.muel = Q.h22 = function (x, y) {
2183
- return new MetaNum(x).multiexplode(y);
2203
+ return Q._hyperopFromOrdinal(x, y, [2,2]);
2184
2204
  };
2185
-
2186
2205
  P.inv_multiexplode = P.i_muel = P.i22 = function (z) {
2187
- var x = this.clone();
2188
- z = new MetaNum(z);
2189
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2190
- if (z.array.length >= 2) {
2191
- var result = z.clone();
2192
- for (var i = result.array.length - 1; i >= 1; i--) {
2193
- var row = result.array[i];
2194
- if (row.length >= 3 && row[1] === 2 && row[2] === 2 && row[0] === 1) {
2195
- result.array.splice(i, 1);
2196
- result.normalize();
2197
- if (result.array.length <= 1) result.layer = 0;
2198
- return result;
2199
- }
2200
- }
2201
- for (var i = result.array.length - 1; i >= 1; i--) {
2202
- var row = result.array[i];
2203
- if (row.length >= 3 && row[1] === 4 && row[2] === 1 && row[0] > 0) {
2204
- row[0]--;
2205
- if (row[0] <= 0) result.array.splice(i, 1);
2206
- result.normalize();
2207
- if (result.array.length <= 1) result.layer = 0;
2208
- return result;
2209
- }
2210
- }
2211
- return result;
2212
- }
2213
- return z;
2206
+ return Q._invHyperopFromOrdinal(this, z, [2,2]);
2214
2207
  };
2215
2208
  Q.inv_multiexplode = Q.i_muel = Q.i22 = function (x, z) {
2216
- return new MetaNum(x).inv_multiexplode(z);
2209
+ return Q._invHyperopFromOrdinal(x, z, [2,2]);
2217
2210
  };
2218
-
2219
- //ω*3 x{{{y}}}x
2211
+
2212
+ // aperioexplode = ω*3 → coeffs [0,3]
2220
2213
  P.aperioexplode = P.apel = P.h30 = function (y) {
2221
- var x = this.clone();
2222
- y = new MetaNum(y);
2223
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2224
- if (y.eq(MetaNum.ONE)) return x.explode(x);
2225
- if (y.eq(2)) return x.multiexplode(x);
2226
- var base = x.multiexplode(x); // aperioexplode(x, 2)
2227
- if (y.layer === 0 && y.array.length <= 1) {
2228
- var result = base.clone();
2229
- var count = y.toNumber() - 2;
2230
- if (count > 0) {
2231
- result.layer = 0;
2232
- result.array = [base.array[0].slice()];
2233
- var cl = MetaNum.getCantorLevel(5);
2234
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2235
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2236
- for (var i = 0; i < ordRows.length; i++) {
2237
- result.array.push(ordRows[i]);
2238
- }
2239
- result.normalize();
2240
- }
2241
- return result;
2242
- }
2243
- var result = y.clone();
2244
- result.array[0] = base.array[0].slice();
2245
- result.layer = 0;
2246
- result.array.push([1, 0, 3]);
2247
- result.normalize();
2248
- return result;
2214
+ return Q._hyperopFromOrdinal(this, y, [0,3]);
2249
2215
  };
2250
2216
  Q.aperioexplode = Q.apel = Q.h30 = function (x, y) {
2251
- return new MetaNum(x).aperioexplode(y);
2217
+ return Q._hyperopFromOrdinal(x, y, [0,3]);
2252
2218
  };
2253
-
2254
2219
  P.inv_aperioexplode = P.i_apel = P.i30 = function (z) {
2255
- var x = this.clone();
2256
- z = new MetaNum(z);
2257
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2258
- if (z.array.length >= 2) {
2259
- var result = z.clone();
2260
- for (var i = result.array.length - 1; i >= 1; i--) {
2261
- var row = result.array[i];
2262
- if (row.length >= 3 && row[1] === 0 && row[2] === 3 && row[0] === 1) {
2263
- result.array.splice(i, 1);
2264
- result.normalize();
2265
- if (result.array.length <= 1) result.layer = 0;
2266
- return result;
2267
- }
2268
- }
2269
- for (var i = result.array.length - 1; i >= 1; i--) {
2270
- var row = result.array[i];
2271
- if (row.length >= 3 && row[1] === 5 && row[2] === 1 && row[0] > 0) {
2272
- row[0]--;
2273
- if (row[0] <= 0) result.array.splice(i, 1);
2274
- result.normalize();
2275
- if (result.array.length <= 1) result.layer = 0;
2276
- return result;
2277
- }
2278
- }
2279
- return result;
2280
- }
2281
- return z;
2220
+ return Q._invHyperopFromOrdinal(this, z, [0,3]);
2282
2221
  };
2283
2222
  Q.inv_aperioexplode = Q.i_apel = Q.i30 = function (x, z) {
2284
- return new MetaNum(x).inv_aperioexplode(z);
2223
+ return Q._invHyperopFromOrdinal(x, z, [0,3]);
2285
2224
  };
2286
-
2287
- //ω*3+1 x{{{{1}}}}y
2225
+
2226
+ // detonate = ω*3 + 1 → coeffs [1,3]
2288
2227
  P.detonate = P.deto = P.h31 = function (y) {
2289
- var x = this.clone();
2290
- y = new MetaNum(y);
2291
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2292
- if (y.eq(MetaNum.ONE)) return x.clone();
2293
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2294
- var base = x.aperioexplode(x); // detonate(x, 2)
2295
- if (y.layer === 0 && y.array.length <= 1) {
2296
- var result = base.clone();
2297
- if (y.eq(2)) return result;
2298
- var count = y.toNumber() - 2;
2299
- if (count > 0) {
2300
- result.layer = 0;
2301
- result.array = [base.array[0].slice()];
2302
- var cl = MetaNum.getCantorLevel(5);
2303
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2304
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2305
- for (var i = 0; i < ordRows.length; i++) {
2306
- result.array.push(ordRows[i]);
2307
- }
2308
- result.normalize();
2309
- }
2310
- return result;
2311
- }
2312
- var result = y.clone();
2313
- result.array[0] = base.array[0].slice();
2314
- result.layer = 0;
2315
- result.array.push([1, 1, 3]);
2316
- result.normalize();
2317
- return result;
2228
+ return Q._hyperopFromOrdinal(this, y, [1,3]);
2318
2229
  };
2319
2230
  Q.detonate = Q.deto = Q.h31 = function (x, y) {
2320
- return new MetaNum(x).detonate(y);
2231
+ return Q._hyperopFromOrdinal(x, y, [1,3]);
2321
2232
  };
2322
-
2323
2233
  P.inv_detonate = P.i_deto = P.i31 = function (z) {
2324
- var x = this.clone();
2325
- z = new MetaNum(z);
2326
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2327
- if (z.array.length >= 2) {
2328
- var result = z.clone();
2329
- for (var i = result.array.length - 1; i >= 1; i--) {
2330
- var row = result.array[i];
2331
- if (row.length >= 3 && row[1] === 1 && row[2] === 3 && row[0] === 1) {
2332
- result.array.splice(i, 1);
2333
- result.normalize();
2334
- if (result.array.length <= 1) result.layer = 0;
2335
- return result;
2336
- }
2337
- }
2338
- for (var i = result.array.length - 1; i >= 1; i--) {
2339
- var row = result.array[i];
2340
- if (row.length >= 3 && row[1] === 5 && row[2] === 1 && row[0] > 0) {
2341
- row[0]--;
2342
- if (row[0] <= 0) result.array.splice(i, 1);
2343
- result.normalize();
2344
- if (result.array.length <= 1) result.layer = 0;
2345
- return result;
2346
- }
2347
- }
2348
- return result;
2349
- }
2350
- return z;
2234
+ return Q._invHyperopFromOrdinal(this, z, [1,3]);
2351
2235
  };
2352
2236
  Q.inv_detonate = Q.i_deto = Q.i31 = function (x, z) {
2353
- return new MetaNum(x).inv_detonate(z);
2237
+ return Q._invHyperopFromOrdinal(x, z, [1,3]);
2354
2238
  };
2355
-
2356
- //ω*4 x{{{{y}}}}x
2239
+
2240
+ // aperiodetonate = ω*4 → coeffs [0,4]
2357
2241
  P.aperiodetonate = P.apdt = P.h40 = function (y) {
2358
- var x = this.clone();
2359
- y = new MetaNum(y);
2360
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2361
- if (y.eq(MetaNum.ONE)) return x.detonate(x);
2362
- var base = x.detonate(x); // aperiodetonate(x, 1)
2363
- if (y.layer === 0 && y.array.length <= 1) {
2364
- var result = base.clone();
2365
- var count = y.toNumber() - 1;
2366
- if (count > 0) {
2367
- result.layer = 0;
2368
- result.array = [base.array[0].slice()];
2369
- var cl = MetaNum.getCantorLevel(6);
2370
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2371
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2372
- for (var i = 0; i < ordRows.length; i++) {
2373
- result.array.push(ordRows[i]);
2374
- }
2375
- result.normalize();
2376
- }
2377
- return result;
2378
- }
2379
- var result = y.clone();
2380
- result.array[0] = base.array[0].slice();
2381
- result.layer = 0;
2382
- result.array.push([1, 0, 4]);
2383
- result.normalize();
2384
- return result;
2242
+ return Q._hyperopFromOrdinal(this, y, [0,4]);
2385
2243
  };
2386
2244
  Q.aperiodetonate = Q.apdt = Q.h40 = function (x, y) {
2387
- return new MetaNum(x).aperiodetonate(y);
2245
+ return Q._hyperopFromOrdinal(x, y, [0,4]);
2388
2246
  };
2389
-
2390
2247
  P.inv_aperiodetonate = P.i_apdt = P.i40 = function (z) {
2391
- var x = this.clone();
2392
- z = new MetaNum(z);
2393
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2394
- if (z.array.length >= 2) {
2395
- var result = z.clone();
2396
- for (var i = result.array.length - 1; i >= 1; i--) {
2397
- var row = result.array[i];
2398
- if (row.length >= 3 && row[1] === 0 && row[2] === 4 && row[0] === 1) {
2399
- result.array.splice(i, 1);
2400
- result.normalize();
2401
- if (result.array.length <= 1) result.layer = 0;
2402
- return result;
2403
- }
2404
- }
2405
- for (var i = result.array.length - 1; i >= 1; i--) {
2406
- var row = result.array[i];
2407
- if (row.length >= 3 && row[1] === 6 && row[2] === 1 && row[0] > 0) {
2408
- row[0]--;
2409
- if (row[0] <= 0) result.array.splice(i, 1);
2410
- result.normalize();
2411
- if (result.array.length <= 1) result.layer = 0;
2412
- return result;
2413
- }
2414
- }
2415
- return result;
2416
- }
2417
- return z;
2248
+ return Q._invHyperopFromOrdinal(this, z, [0,4]);
2418
2249
  };
2419
2250
  Q.inv_aperiodetonate = Q.i_apdt = Q.i40 = function (x, z) {
2420
- return new MetaNum(x).inv_aperiodetonate(z);
2251
+ return Q._invHyperopFromOrdinal(x, z, [0,4]);
2421
2252
  };
2422
2253
 
2423
- //ω^2 (diagonalization at ω*y level)
2424
- P.aperionate = P.apeo = P.h100 =function (y) {
2425
- var x = this.clone();
2426
- y = new MetaNum(y);
2427
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2428
- if (y.eq(MetaNum.ONE)) return x.aperiote(x);
2429
- if (y.eq(2)) return x.aperioexpande(x);
2430
- if (y.eq(3)) return x.aperioexplode(x);
2431
- var base = x.aperioexplode(x);
2432
- if (y.layer === 0 && y.array.length <= 1) {
2433
- var result = base.clone();
2434
- var count = y.toNumber() - 3;
2435
- if (count > 0) {
2436
- result.layer = 0;
2437
- result.array = [base.array[0].slice()];
2438
- var cl = MetaNum.getCantorLevel(6);
2439
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2440
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2441
- for (var i = 0; i < ordRows.length; i++) {
2442
- result.array.push(ordRows[i]);
2443
- }
2444
- result.normalize();
2445
- }
2446
- return result;
2447
- }
2448
- var result = y.clone();
2449
- result.array[0] = base.array[0].slice();
2450
- result.layer = 0;
2451
- result.array.push([1, 0, 0, 1]);
2452
- result.normalize();
2453
- return result;
2254
+ // aperionate = ω² → coeffs [0,0,1]
2255
+ P.aperionate = P.apeo = P.h100 = function (y) {
2256
+ return Q._hyperopFromOrdinal(this, y, [0,0,1]);
2454
2257
  };
2455
2258
  Q.aperionate = Q.apeo = Q.h100 = function (x, y) {
2456
- return new MetaNum(x).aperionate(y);
2259
+ return Q._hyperopFromOrdinal(x, y, [0,0,1]);
2457
2260
  };
2458
-
2459
2261
  P.inv_aperionate = P.i_apeo = P.i100 = function (z) {
2460
- var x = this.clone();
2461
- z = new MetaNum(z);
2462
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2463
- if (z.array.length >= 2) {
2464
- var result = z.clone();
2465
- for (var i = result.array.length - 1; i >= 1; i--) {
2466
- var row = result.array[i];
2467
- if (row.length >= 4 && row[1] === 0 && row[2] === 0 && row[3] === 1 && row[0] === 1) {
2468
- result.array.splice(i, 1);
2469
- result.normalize();
2470
- if (result.array.length <= 1) result.layer = 0;
2471
- return result;
2472
- }
2473
- }
2474
- for (var i = result.array.length - 1; i >= 1; i--) {
2475
- var row = result.array[i];
2476
- if (row.length >= 3 && row[1] === 6 && row[2] === 1 && row[0] > 0) {
2477
- row[0]--;
2478
- if (row[0] <= 0) result.array.splice(i, 1);
2479
- result.normalize();
2480
- if (result.array.length <= 1) result.layer = 0;
2481
- return result;
2482
- }
2483
- }
2484
- return result;
2485
- }
2486
- return z;
2262
+ return Q._invHyperopFromOrdinal(this, z, [0,0,1]);
2487
2263
  };
2488
2264
  Q.inv_aperionate = Q.i_apeo = Q.i100 = function (x, z) {
2489
- return new MetaNum(x).inv_aperionate(z);
2265
+ return Q._invHyperopFromOrdinal(x, z, [0,0,1]);
2490
2266
  };
2491
2267
 
2492
- //ω^2+1 (iterated aperionate)
2268
+ // megote = ω² + 1 → coeffs [1,0,1]
2493
2269
  P.megote = P.mego = P.h101 = function (y) {
2494
- var x = this.clone();
2495
- y = new MetaNum(y);
2496
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2497
- if (y.eq(MetaNum.ONE)) return x.clone();
2498
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2499
- var base = x.aperionate(x); // megote(x, 2)
2500
- if (y.layer === 0 && y.array.length <= 1) {
2501
- var result = base.clone();
2502
- if (y.eq(2)) return result;
2503
- var count = y.toNumber() - 2;
2504
- if (count > 0) {
2505
- result.layer = 0;
2506
- result.array = [base.array[0].slice()];
2507
- var cl = MetaNum.getCantorLevel(7);
2508
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2509
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2510
- for (var i = 0; i < ordRows.length; i++) {
2511
- result.array.push(ordRows[i]);
2512
- }
2513
- result.normalize();
2514
- }
2515
- return result;
2516
- }
2517
- var result = y.clone();
2518
- result.array[0] = base.array[0].slice();
2519
- result.layer = 0;
2520
- result.array.push([1, 1, 0, 1]);
2521
- result.normalize();
2522
- return result;
2270
+ return Q._hyperopFromOrdinal(this, y, [1,0,1]);
2523
2271
  };
2524
2272
  Q.megote = Q.mego = Q.h101 = function (x, y) {
2525
- return new MetaNum(x).megote(y);
2273
+ return Q._hyperopFromOrdinal(x, y, [1,0,1]);
2526
2274
  };
2527
-
2528
2275
  P.inv_megote = P.i_mego = P.i101 = function (z) {
2529
- var x = this.clone();
2530
- z = new MetaNum(z);
2531
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2532
- if (z.array.length >= 2) {
2533
- var result = z.clone();
2534
- for (var i = result.array.length - 1; i >= 1; i--) {
2535
- var row = result.array[i];
2536
- if (row.length >= 4 && row[1] === 1 && row[2] === 0 && row[3] === 1 && row[0] === 1) {
2537
- result.array.splice(i, 1);
2538
- result.normalize();
2539
- if (result.array.length <= 1) result.layer = 0;
2540
- return result;
2541
- }
2542
- }
2543
- for (var i = result.array.length - 1; i >= 1; i--) {
2544
- var row = result.array[i];
2545
- if (row.length >= 3 && row[1] === 7 && row[2] === 1 && row[0] > 0) {
2546
- row[0]--;
2547
- if (row[0] <= 0) result.array.splice(i, 1);
2548
- result.normalize();
2549
- if (result.array.length <= 1) result.layer = 0;
2550
- return result;
2551
- }
2552
- }
2553
- return result;
2554
- }
2555
- return z;
2276
+ return Q._invHyperopFromOrdinal(this, z, [1,0,1]);
2556
2277
  };
2557
2278
  Q.inv_megote = Q.i_mego = Q.i101 = function (x, z) {
2558
- return new MetaNum(x).inv_megote(z);
2279
+ return Q._invHyperopFromOrdinal(x, z, [1,0,1]);
2559
2280
  };
2560
2281
 
2561
- //ω^2+2 (iterates megote)
2282
+ // multimegote = ω² + 2 → coeffs [2,0,1]
2562
2283
  P.multimegote = P.mume = P.h102 = function (y) {
2563
- var x = this.clone();
2564
- y = new MetaNum(y);
2565
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2566
- if (y.eq(MetaNum.ONE)) return x.clone();
2567
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2568
- var base = x.megote(x); // multimegote(x, 2)
2569
- if (y.layer === 0 && y.array.length <= 1) {
2570
- var result = base.clone();
2571
- if (y.eq(2)) return result;
2572
- var count = y.toNumber() - 2;
2573
- if (count > 0) {
2574
- result.layer = 0;
2575
- result.array = [base.array[0].slice()];
2576
- var cl = MetaNum.getCantorLevel(8);
2577
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2578
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2579
- for (var i = 0; i < ordRows.length; i++) {
2580
- result.array.push(ordRows[i]);
2581
- }
2582
- result.normalize();
2583
- }
2584
- return result;
2585
- }
2586
- var result = y.clone();
2587
- result.array[0] = base.array[0].slice();
2588
- result.layer = 0;
2589
- result.array.push([1, 2, 0, 1]);
2590
- result.normalize();
2591
- return result;
2284
+ return Q._hyperopFromOrdinal(this, y, [2,0,1]);
2592
2285
  };
2593
2286
  Q.multimegote = Q.mume = Q.h102 = function (x, y) {
2594
- return new MetaNum(x).multimegote(y);
2287
+ return Q._hyperopFromOrdinal(x, y, [2,0,1]);
2595
2288
  };
2596
-
2597
2289
  P.inv_multimegote = P.i_mume = P.i102 = function (z) {
2598
- var x = this.clone();
2599
- z = new MetaNum(z);
2600
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2601
- if (z.array.length >= 2) {
2602
- var result = z.clone();
2603
- for (var i = result.array.length - 1; i >= 1; i--) {
2604
- var row = result.array[i];
2605
- if (row.length >= 4 && row[1] === 2 && row[2] === 0 && row[3] === 1 && row[0] === 1) {
2606
- result.array.splice(i, 1);
2607
- result.normalize();
2608
- if (result.array.length <= 1) result.layer = 0;
2609
- return result;
2610
- }
2611
- }
2612
- for (var i = result.array.length - 1; i >= 1; i--) {
2613
- var row = result.array[i];
2614
- if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] > 0) {
2615
- row[0]--;
2616
- if (row[0] <= 0) result.array.splice(i, 1);
2617
- result.normalize();
2618
- if (result.array.length <= 1) result.layer = 0;
2619
- return result;
2620
- }
2621
- }
2622
- return result;
2623
- }
2624
- return z;
2290
+ return Q._invHyperopFromOrdinal(this, z, [2,0,1]);
2625
2291
  };
2626
2292
  Q.inv_multimegote = Q.i_mume = Q.i102 = function (x, z) {
2627
- return new MetaNum(x).inv_multimegote(z);
2293
+ return Q._invHyperopFromOrdinal(x, z, [2,0,1]);
2628
2294
  };
2629
2295
 
2630
- // ω^2+ω (diagonalization at ω^2+y level)
2296
+ // aperimegote = ω² + ω → coeffs [0,1,1]
2631
2297
  P.aperimegote = P.apmg = P.h110 = function (y) {
2632
- var x = this.clone();
2633
- y = new MetaNum(y);
2634
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2635
- if (y.eq(MetaNum.ONE)) return x.megote(x);
2636
- var base = x.megote(x); // aperimegote(x, 1)
2637
- if (y.layer === 0 && y.array.length <= 1) {
2638
- var result = base.clone();
2639
- var count = y.toNumber() - 1;
2640
- if (count > 0) {
2641
- result.layer = 0;
2642
- result.array = [base.array[0].slice()];
2643
- var cl = MetaNum.getCantorLevel(8);
2644
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2645
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2646
- for (var i = 0; i < ordRows.length; i++) {
2647
- result.array.push(ordRows[i]);
2648
- }
2649
- result.normalize();
2650
- }
2651
- return result;
2652
- }
2653
- var result = y.clone();
2654
- result.array[0] = base.array[0].slice();
2655
- result.layer = 0;
2656
- result.array.push([1, 0, 1, 1]);
2657
- result.normalize();
2658
- return result;
2298
+ return Q._hyperopFromOrdinal(this, y, [0,1,1]);
2659
2299
  };
2660
2300
  Q.aperimegote = Q.apmg = Q.h110 = function (x, y) {
2661
- return new MetaNum(x).aperimegote(y);
2301
+ return Q._hyperopFromOrdinal(x, y, [0,1,1]);
2662
2302
  };
2663
-
2664
2303
  P.inv_aperimegote = P.i_apmg = P.i110 = function (z) {
2665
- var x = this.clone();
2666
- z = new MetaNum(z);
2667
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2668
- if (z.array.length >= 2) {
2669
- var result = z.clone();
2670
- for (var i = result.array.length - 1; i >= 1; i--) {
2671
- var row = result.array[i];
2672
- if (row.length >= 4 && row[1] === 0 && row[2] === 1 && row[3] === 1 && row[0] === 1) {
2673
- result.array.splice(i, 1);
2674
- result.normalize();
2675
- if (result.array.length <= 1) result.layer = 0;
2676
- return result;
2677
- }
2678
- }
2679
- for (var i = result.array.length - 1; i >= 1; i--) {
2680
- var row = result.array[i];
2681
- if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] > 0) {
2682
- row[0]--;
2683
- if (row[0] <= 0) result.array.splice(i, 1);
2684
- result.normalize();
2685
- if (result.array.length <= 1) result.layer = 0;
2686
- return result;
2687
- }
2688
- }
2689
- return result;
2690
- }
2691
- return z;
2304
+ return Q._invHyperopFromOrdinal(this, z, [0,1,1]);
2692
2305
  };
2693
2306
  Q.inv_aperimegote = Q.i_apmg = Q.i110 = function (x, z) {
2694
- return new MetaNum(x).inv_aperimegote(z);
2307
+ return Q._invHyperopFromOrdinal(x, z, [0,1,1]);
2695
2308
  };
2696
2309
 
2697
- // megoexpande (ω^2+ω+1): iterates aperimegote
2310
+ // megoexpande = ω² + ω + 1 → coeffs [1,1,1]
2698
2311
  P.megoexpande = P.mgea = P.h111 = function (y) {
2699
- var x = this.clone();
2700
- y = new MetaNum(y);
2701
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2702
- if (y.eq(MetaNum.ONE)) return x.clone();
2703
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2704
- var base = x.aperimegote(x); // megoexpande(x, 2)
2705
- if (y.layer === 0 && y.array.length <= 1) {
2706
- var result = base.clone();
2707
- if (y.eq(2)) return result;
2708
- var count = y.toNumber() - 2;
2709
- if (count > 0) {
2710
- result.layer = 0;
2711
- result.array = [base.array[0].slice()];
2712
- var cl = MetaNum.getCantorLevel(8);
2713
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2714
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2715
- for (var i = 0; i < ordRows.length; i++) {
2716
- result.array.push(ordRows[i]);
2717
- }
2718
- result.normalize();
2719
- }
2720
- return result;
2721
- }
2722
- var result = y.clone();
2723
- result.array[0] = base.array[0].slice();
2724
- result.layer = 0;
2725
- result.array.push([1, 1, 1, 1]);
2726
- result.normalize();
2727
- return result;
2312
+ return Q._hyperopFromOrdinal(this, y, [1,1,1]);
2728
2313
  };
2729
2314
  Q.megoexpande = Q.mgea = Q.h111 = function (x, y) {
2730
- return new MetaNum(x).megoexpande(y);
2315
+ return Q._hyperopFromOrdinal(x, y, [1,1,1]);
2731
2316
  };
2732
-
2733
2317
  P.inv_megoexpande = P.i_mgea = P.i111 = function (z) {
2734
- var x = this.clone();
2735
- z = new MetaNum(z);
2736
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2737
- if (z.array.length >= 2) {
2738
- var result = z.clone();
2739
- for (var i = result.array.length - 1; i >= 1; i--) {
2740
- var row = result.array[i];
2741
- if (row.length >= 4 && row[1] === 1 && row[2] === 1 && row[3] === 1 && row[0] === 1) {
2742
- result.array.splice(i, 1);
2743
- result.normalize();
2744
- if (result.array.length <= 1) result.layer = 0;
2745
- return result;
2746
- }
2747
- }
2748
- for (var i = result.array.length - 1; i >= 1; i--) {
2749
- var row = result.array[i];
2750
- if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] > 0) {
2751
- row[0]--;
2752
- if (row[0] <= 0) result.array.splice(i, 1);
2753
- result.normalize();
2754
- if (result.array.length <= 1) result.layer = 0;
2755
- return result;
2756
- }
2757
- }
2758
- return result;
2759
- }
2760
- return z;
2318
+ return Q._invHyperopFromOrdinal(this, z, [1,1,1]);
2761
2319
  };
2762
2320
  Q.inv_megoexpande = Q.i_mgea = Q.i111 = function (x, z) {
2763
- return new MetaNum(x).inv_megoexpande(z);
2321
+ return Q._invHyperopFromOrdinal(x, z, [1,1,1]);
2764
2322
  };
2765
2323
 
2766
- //aperimegoexpande (ω^2+ω*2): diagonalize at ω^2+ω+y level
2324
+ // aperimegoexpande = ω² + ω*2 → coeffs [0,2,1]
2767
2325
  P.aperimegoexpande = P.apme = P.h120 = function (y) {
2768
- var x = this.clone();
2769
- y = new MetaNum(y);
2770
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2771
- if (y.eq(MetaNum.ONE)) return x.megoexpande(x);
2772
- var base = x.megoexpande(x); // aperimegoexpande(x, 1)
2773
- if (y.layer === 0 && y.array.length <= 1) {
2774
- var result = base.clone();
2775
- var count = y.toNumber() - 1;
2776
- if (count > 0) {
2777
- result.layer = 0;
2778
- result.array = [base.array[0].slice()];
2779
- var cl = MetaNum.getCantorLevel(9);
2780
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2781
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2782
- for (var i = 0; i < ordRows.length; i++) {
2783
- result.array.push(ordRows[i]);
2784
- }
2785
- result.normalize();
2786
- }
2787
- return result;
2788
- }
2789
- var result = y.clone();
2790
- result.array[0] = base.array[0].slice();
2791
- result.layer = 0;
2792
- result.array.push([1, 0, 2, 1]);
2793
- result.normalize();
2794
- return result;
2326
+ return Q._hyperopFromOrdinal(this, y, [0,2,1]);
2795
2327
  };
2796
2328
  Q.aperimegoexpande = Q.apme = Q.h120 = function (x, y) {
2797
- return new MetaNum(x).aperimegoexpande(y);
2329
+ return Q._hyperopFromOrdinal(x, y, [0,2,1]);
2798
2330
  };
2799
-
2800
2331
  P.inv_aperimegoexpande = P.i_apme = P.i120 = function (z) {
2801
- var x = this.clone();
2802
- z = new MetaNum(z);
2803
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2804
- if (z.array.length >= 2) {
2805
- var result = z.clone();
2806
- for (var i = result.array.length - 1; i >= 1; i--) {
2807
- var row = result.array[i];
2808
- if (row.length >= 4 && row[1] === 0 && row[2] === 2 && row[3] === 1 && row[0] === 1) {
2809
- result.array.splice(i, 1);
2810
- result.normalize();
2811
- if (result.array.length <= 1) result.layer = 0;
2812
- return result;
2813
- }
2814
- }
2815
- for (var i = result.array.length - 1; i >= 1; i--) {
2816
- var row = result.array[i];
2817
- if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
2818
- row[0]--;
2819
- if (row[0] <= 0) result.array.splice(i, 1);
2820
- result.normalize();
2821
- if (result.array.length <= 1) result.layer = 0;
2822
- return result;
2823
- }
2824
- }
2825
- return result;
2826
- }
2827
- return z;
2332
+ return Q._invHyperopFromOrdinal(this, z, [0,2,1]);
2828
2333
  };
2829
2334
  Q.inv_aperimegoexpande = Q.i_apme = Q.i120 = function (x, z) {
2830
- return new MetaNum(x).inv_aperimegoexpande(z);
2335
+ return Q._invHyperopFromOrdinal(x, z, [0,2,1]);
2831
2336
  };
2832
2337
 
2833
-
2834
- // megoaperionation (ω^2*2): diagonalization at ω^2+ω*y level
2835
- P.megoaperionation = P.mgao = P.h200 = function (y) {
2836
- var x = this.clone();
2837
- y = new MetaNum(y);
2838
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2839
- if (y.eq(MetaNum.ONE)) return x.megote(x);
2840
- if (y.eq(2)) return x.aperimegote(x);
2841
- if (y.eq(3)) return x.megoexpande(x);
2842
- var base = x.megoexpande(x); // megoaperionation(x, 3)
2843
- if (y.layer === 0 && y.array.length <= 1) {
2844
- var result = base.clone();
2845
- var count = y.toNumber() - 3;
2846
- if (count > 0) {
2847
- result.layer = 0;
2848
- result.array = [base.array[0].slice()];
2849
- var cl = MetaNum.getCantorLevel(9);
2850
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2851
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2852
- for (var i = 0; i < ordRows.length; i++) {
2853
- result.array.push(ordRows[i]);
2854
- }
2855
- result.normalize();
2856
- }
2857
- return result;
2858
- }
2859
- var result = y.clone();
2860
- result.array[0] = base.array[0].slice();
2861
- result.layer = 0;
2862
- result.array.push([1, 0, 0, 2]);
2863
- result.normalize();
2864
- return result;
2338
+ // megoaperionate = ω²*2 → coeffs [0,0,2]
2339
+ // (also alias megoaperionation for backwards compat; renamed per user request)
2340
+ P.megoaperionate = P.mgao = P.h200 = function (y) {
2341
+ return Q._hyperopFromOrdinal(this, y, [0,0,2]);
2865
2342
  };
2866
- Q.megoaperionation = Q.mgao = Q.h200 = function (x, y) {
2867
- return new MetaNum(x).megoaperionation(y);
2343
+ Q.megoaperionate = Q.mgao = Q.h200 = function (x, y) {
2344
+ return Q._hyperopFromOrdinal(x, y, [0,0,2]);
2868
2345
  };
2869
-
2870
- P.inv_megoaperionation = P.i_mgao = P.i200 = function (z) {
2871
- var x = this.clone();
2872
- z = new MetaNum(z);
2873
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2874
- if (z.array.length >= 2) {
2875
- var result = z.clone();
2876
- for (var i = result.array.length - 1; i >= 1; i--) {
2877
- var row = result.array[i];
2878
- if (row.length >= 4 && row[1] === 0 && row[2] === 0 && row[3] === 2 && row[0] === 1) {
2879
- result.array.splice(i, 1);
2880
- result.normalize();
2881
- if (result.array.length <= 1) result.layer = 0;
2882
- return result;
2883
- }
2884
- }
2885
- for (var i = result.array.length - 1; i >= 1; i--) {
2886
- var row = result.array[i];
2887
- if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
2888
- row[0]--;
2889
- if (row[0] <= 0) result.array.splice(i, 1);
2890
- result.normalize();
2891
- if (result.array.length <= 1) result.layer = 0;
2892
- return result;
2893
- }
2894
- }
2895
- return result;
2896
- }
2897
- return z;
2346
+ P.inv_megoaperionate = P.i_mgao = P.i200 = function (z) {
2347
+ return Q._invHyperopFromOrdinal(this, z, [0,0,2]);
2898
2348
  };
2899
- Q.inv_megoaperionation = Q.i_mgao = Q.i200 = function (x, z) {
2900
- return new MetaNum(x).inv_megoaperionation(z);
2349
+ Q.inv_megoaperionate = Q.i_mgao = Q.i200 = function (x, z) {
2350
+ return Q._invHyperopFromOrdinal(x, z, [0,0,2]);
2901
2351
  };
2902
2352
 
2903
- // gigote (ω^2*2+1): iterates megoaperionation
2353
+ // gigote = ω²*2 + 1 → coeffs [1,0,2]
2904
2354
  P.gigote = P.gigo = P.h201 = function (y) {
2905
- var x = this.clone();
2906
- y = new MetaNum(y);
2907
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2908
- if (y.eq(MetaNum.ONE)) return x.clone();
2909
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2910
- var base = x.megoaperionation(x); // gigote(x, 2)
2911
- if (y.layer === 0 && y.array.length <= 1) {
2912
- var result = base.clone();
2913
- if (y.eq(2)) return result;
2914
- var count = y.toNumber() - 2;
2915
- if (count > 0) {
2916
- result.layer = 0;
2917
- result.array = [base.array[0].slice()];
2918
- var cl = MetaNum.getCantorLevel(9);
2919
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2920
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2921
- for (var i = 0; i < ordRows.length; i++) {
2922
- result.array.push(ordRows[i]);
2923
- }
2924
- result.normalize();
2925
- }
2926
- return result;
2927
- }
2928
- var result = y.clone();
2929
- result.array[0] = base.array[0].slice();
2930
- result.layer = 0;
2931
- result.array.push([1, 1, 0, 2]);
2932
- result.normalize();
2933
- return result;
2355
+ return Q._hyperopFromOrdinal(this, y, [1,0,2]);
2934
2356
  };
2935
2357
  Q.gigote = Q.gigo = Q.h201 = function (x, y) {
2936
- return new MetaNum(x).gigote(y);
2358
+ return Q._hyperopFromOrdinal(x, y, [1,0,2]);
2937
2359
  };
2938
-
2939
2360
  P.inv_gigote = P.i_gigo = P.i201 = function (z) {
2940
- var x = this.clone();
2941
- z = new MetaNum(z);
2942
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2943
- if (z.array.length >= 2) {
2944
- var result = z.clone();
2945
- for (var i = result.array.length - 1; i >= 1; i--) {
2946
- var row = result.array[i];
2947
- if (row.length >= 4 && row[1] === 1 && row[2] === 0 && row[3] === 2 && row[0] === 1) {
2948
- result.array.splice(i, 1);
2949
- result.normalize();
2950
- if (result.array.length <= 1) result.layer = 0;
2951
- return result;
2952
- }
2953
- }
2954
- for (var i = result.array.length - 1; i >= 1; i--) {
2955
- var row = result.array[i];
2956
- if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
2957
- row[0]--;
2958
- if (row[0] <= 0) result.array.splice(i, 1);
2959
- result.normalize();
2960
- if (result.array.length <= 1) result.layer = 0;
2961
- return result;
2962
- }
2963
- }
2964
- return result;
2965
- }
2966
- return z;
2361
+ return Q._invHyperopFromOrdinal(this, z, [1,0,2]);
2967
2362
  };
2968
2363
  Q.inv_gigote = Q.i_gigo = Q.i201 = function (x, z) {
2969
- return new MetaNum(x).inv_gigote(z);
2364
+ return Q._invHyperopFromOrdinal(x, z, [1,0,2]);
2970
2365
  };
2971
2366
 
2972
- //aperigigote (ω^2*2+ω): diag at ω^2*2+y level
2367
+ // aperigigote = ω²*2 + ω → coeffs [0,1,2]
2973
2368
  P.aperigigote = P.apgg = P.h210 = function (y) {
2974
- var x = this.clone();
2975
- y = new MetaNum(y);
2976
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2977
- if (y.eq(MetaNum.ONE)) return x.gigote(x);
2978
- var base = x.gigote(x);
2979
- if (y.layer === 0 && y.array.length <= 1) {
2980
- var result = base.clone();
2981
- var count = y.toNumber() - 1;
2982
- if (count > 0) {
2983
- result.layer = 0;
2984
- result.array = [base.array[0].slice()];
2985
- var cl = MetaNum.getCantorLevel(9);
2986
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2987
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2988
- for (var i = 0; i < ordRows.length; i++) {
2989
- result.array.push(ordRows[i]);
2990
- }
2991
- result.normalize();
2992
- }
2993
- return result;
2994
- }
2995
- var result = y.clone();
2996
- result.array[0] = base.array[0].slice();
2997
- result.layer = 0;
2998
- result.array.push([1, 0, 1, 2]);
2999
- result.normalize();
3000
- return result;
2369
+ return Q._hyperopFromOrdinal(this, y, [0,1,2]);
3001
2370
  };
3002
2371
  Q.aperigigote = Q.apgg = Q.h210 = function (x, y) {
3003
- return new MetaNum(x).aperigigote(y);
2372
+ return Q._hyperopFromOrdinal(x, y, [0,1,2]);
3004
2373
  };
3005
-
3006
2374
  P.inv_aperigigote = P.i_apgg = P.i210 = function (z) {
3007
- var x = this.clone();
3008
- z = new MetaNum(z);
3009
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3010
- if (z.array.length >= 2) {
3011
- var result = z.clone();
3012
- for (var i = result.array.length - 1; i >= 1; i--) {
3013
- var row = result.array[i];
3014
- if (row.length >= 4 && row[1] === 0 && row[2] === 1 && row[3] === 2 && row[0] === 1) {
3015
- result.array.splice(i, 1);
3016
- result.normalize();
3017
- if (result.array.length <= 1) result.layer = 0;
3018
- return result;
3019
- }
3020
- }
3021
- for (var i = result.array.length - 1; i >= 1; i--) {
3022
- var row = result.array[i];
3023
- if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
3024
- row[0]--;
3025
- if (row[0] <= 0) result.array.splice(i, 1);
3026
- result.normalize();
3027
- if (result.array.length <= 1) result.layer = 0;
3028
- return result;
3029
- }
3030
- }
3031
- return result;
3032
- }
3033
- return z;
2375
+ return Q._invHyperopFromOrdinal(this, z, [0,1,2]);
3034
2376
  };
3035
2377
  Q.inv_aperigigote = Q.i_apgg = Q.i210 = function (x, z) {
3036
- return new MetaNum(x).inv_aperigigote(z);
2378
+ return Q._invHyperopFromOrdinal(x, z, [0,1,2]);
3037
2379
  };
3038
2380
 
3039
- //gigoaperionate (ω^2*3): diag at ω^2*2+ω*y level
2381
+ // gigoaperionate = ω²*3 → coeffs [0,0,3]
3040
2382
  P.gigoaperionate = P.ggap = P.h300 = function (y) {
3041
- var x = this.clone();
3042
- y = new MetaNum(y);
3043
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3044
- if (y.eq(MetaNum.ONE)) return x.clone();
3045
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3046
- var base = x.aperigigote(x);
3047
- if (y.layer === 0 && y.array.length <= 1) {
3048
- var result = base.clone();
3049
- if (y.eq(2)) return result;
3050
- var count = y.toNumber() - 2;
3051
- if (count > 0) {
3052
- result.layer = 0;
3053
- result.array = [base.array[0].slice()];
3054
- var cl = MetaNum.getCantorLevel(9);
3055
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3056
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3057
- for (var i = 0; i < ordRows.length; i++) {
3058
- result.array.push(ordRows[i]);
3059
- }
3060
- result.normalize();
3061
- }
3062
- return result;
3063
- }
3064
- var result = y.clone();
3065
- result.array[0] = base.array[0].slice();
3066
- result.layer = 0;
3067
- result.array.push([1, 0, 0, 3]);
3068
- result.normalize();
3069
- return result;
2383
+ return Q._hyperopFromOrdinal(this, y, [0,0,3]);
3070
2384
  };
3071
2385
  Q.gigoaperionate = Q.ggap = Q.h300 = function (x, y) {
3072
- return new MetaNum(x).gigoaperionate(y);
2386
+ return Q._hyperopFromOrdinal(x, y, [0,0,3]);
3073
2387
  };
3074
-
3075
2388
  P.inv_gigoaperionate = P.i_ggap = P.i300 = function (z) {
3076
- var x = this.clone();
3077
- z = new MetaNum(z);
3078
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3079
- if (z.array.length >= 2) {
3080
- var result = z.clone();
3081
- for (var i = result.array.length - 1; i >= 1; i--) {
3082
- var row = result.array[i];
3083
- if (row.length >= 4 && row[1] === 0 && row[2] === 0 && row[3] === 3 && row[0] === 1) {
3084
- result.array.splice(i, 1);
3085
- result.normalize();
3086
- if (result.array.length <= 1) result.layer = 0;
3087
- return result;
3088
- }
3089
- }
3090
- for (var i = result.array.length - 1; i >= 1; i--) {
3091
- var row = result.array[i];
3092
- if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
3093
- row[0]--;
3094
- if (row[0] <= 0) result.array.splice(i, 1);
3095
- result.normalize();
3096
- if (result.array.length <= 1) result.layer = 0;
3097
- return result;
3098
- }
3099
- }
3100
- return result;
3101
- }
3102
- return z;
2389
+ return Q._invHyperopFromOrdinal(this, z, [0,0,3]);
3103
2390
  };
3104
2391
  Q.inv_gigoaperionate = Q.i_ggap = Q.i300 = function (x, z) {
3105
- return new MetaNum(x).inv_gigoaperionate(z);
2392
+ return Q._invHyperopFromOrdinal(x, z, [0,0,3]);
3106
2393
  };
3107
2394
 
3108
- // aperiatotion (ω^3): diagonalization of ω^2*y
3109
- P.aperiatotion = P.apat = P.h1000 = function (y) {
3110
- var x = this.clone();
3111
- y = new MetaNum(y);
3112
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3113
- if (y.eq(MetaNum.ONE)) return x.aperionate(x);
3114
- if (y.eq(2)) return x.megoaperionation(x);
3115
- var base = x.megoaperionation(x); // aperiatotion(x, 2)
3116
- if (y.layer === 0 && y.array.length <= 1) {
3117
- var result = base.clone();
3118
- var count = y.toNumber() - 2;
3119
- if (count > 0) {
3120
- result.layer = 0;
3121
- result.array = [base.array[0].slice()];
3122
- var cl = MetaNum.getCantorLevel(10);
3123
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3124
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3125
- for (var i = 0; i < ordRows.length; i++) {
3126
- result.array.push(ordRows[i]);
3127
- }
3128
- result.normalize();
3129
- }
3130
- return result;
3131
- }
3132
- var result = y.clone();
3133
- result.array[0] = base.array[0].slice();
3134
- result.layer = 0;
3135
- result.array.push([1, 0, 0, 0, 1]);
3136
- result.normalize();
3137
- return result;
2395
+ // aperiatote = ω³ → coeffs [0,0,0,1]
2396
+ // (also alias aperiatotion for backwards compat; renamed per user request)
2397
+ P.aperiatote = P.apat = P.h1000 = function (y) {
2398
+ return Q._hyperopFromOrdinal(this, y, [0,0,0,1]);
3138
2399
  };
3139
- Q.aperiatotion = Q.apat = Q.h1000 = function (x, y) {
3140
- return new MetaNum(x).aperiatotion(y);
2400
+ Q.aperiatote = Q.apat = Q.h1000 = function (x, y) {
2401
+ return Q._hyperopFromOrdinal(x, y, [0,0,0,1]);
3141
2402
  };
3142
-
3143
- P.inv_aperiatotion = P.i_apat = P.i1000 = function (z) {
3144
- var x = this.clone();
3145
- z = new MetaNum(z);
3146
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3147
- if (z.array.length >= 2) {
3148
- var result = z.clone();
3149
- for (var i = result.array.length - 1; i >= 1; i--) {
3150
- var row = result.array[i];
3151
- if (row.length >= 5 && row[1] === 0 && row[2] === 0 && row[3] === 0 && row[4] === 1 && row[0] === 1) {
3152
- result.array.splice(i, 1);
3153
- result.normalize();
3154
- if (result.array.length <= 1) result.layer = 0;
3155
- return result;
3156
- }
3157
- }
3158
- for (var i = result.array.length - 1; i >= 1; i--) {
3159
- var row = result.array[i];
3160
- if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
3161
- row[0]--;
3162
- if (row[0] <= 0) result.array.splice(i, 1);
3163
- result.normalize();
3164
- if (result.array.length <= 1) result.layer = 0;
3165
- return result;
3166
- }
3167
- }
3168
- return result;
3169
- }
3170
- return z;
2403
+ P.inv_aperiatote = P.i_apat = P.i1000 = function (z) {
2404
+ return Q._invHyperopFromOrdinal(this, z, [0,0,0,1]);
3171
2405
  };
3172
- Q.inv_aperiatotion = Q.i_apat = Q.i1000 = function (x, z) {
3173
- return new MetaNum(x).inv_aperiatotion(z);
2406
+ Q.inv_aperiatote = Q.i_apat = Q.i1000 = function (x, z) {
2407
+ return Q._invHyperopFromOrdinal(x, z, [0,0,0,1]);
3174
2408
  };
3175
2409
 
3176
- // powiainate (ω^3+1): iterates aperiatotion
2410
+ // powiainate = ω³ + 1 → coeffs [1,0,0,1]
3177
2411
  P.powiainate = P.pwan = P.h1001 = function (y) {
3178
- var x = this.clone();
3179
- y = new MetaNum(y);
3180
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3181
- if (y.eq(MetaNum.ONE)) return x.clone();
3182
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3183
- var base = x.aperiatotion(x); // powiainate(x, 2)
3184
- if (y.layer === 0 && y.array.length <= 1) {
3185
- var result = base.clone();
3186
- if (y.eq(2)) return result;
3187
- var count = y.toNumber() - 2;
3188
- if (count > 0) {
3189
- result.layer = 0;
3190
- result.array = [base.array[0].slice()];
3191
- var cl = MetaNum.getCantorLevel(10);
3192
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3193
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3194
- for (var i = 0; i < ordRows.length; i++) {
3195
- result.array.push(ordRows[i]);
3196
- }
3197
- result.normalize();
3198
- }
3199
- return result;
3200
- }
3201
- var result = y.clone();
3202
- result.array[0] = base.array[0].slice();
3203
- result.layer = 0;
3204
- result.array.push([1, 1, 0, 0, 1]);
3205
- result.normalize();
3206
- return result;
2412
+ return Q._hyperopFromOrdinal(this, y, [1,0,0,1]);
3207
2413
  };
3208
- Q.powiainate = Q.pwan = Q.h1001 = function (x, y) {
3209
- return new MetaNum(x).powiainate(y);
3210
- };
3211
-
3212
- P.inv_powiainate = P.i_pwan = P.i1001 = function (z) {
3213
- var x = this.clone();
3214
- z = new MetaNum(z);
3215
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3216
- if (z.array.length >= 2) {
3217
- var result = z.clone();
3218
- for (var i = result.array.length - 1; i >= 1; i--) {
3219
- var row = result.array[i];
3220
- if (row.length >= 5 && row[1] === 1 && row[2] === 0 && row[3] === 0 && row[4] === 1 && row[0] === 1) {
3221
- result.array.splice(i, 1);
3222
- result.normalize();
3223
- if (result.array.length <= 1) result.layer = 0;
3224
- return result;
3225
- }
3226
- }
3227
- for (var i = result.array.length - 1; i >= 1; i--) {
3228
- var row = result.array[i];
3229
- if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
3230
- row[0]--;
3231
- if (row[0] <= 0) result.array.splice(i, 1);
3232
- result.normalize();
3233
- if (result.array.length <= 1) result.layer = 0;
3234
- return result;
3235
- }
3236
- }
3237
- return result;
3238
- }
3239
- return z;
3240
- };
3241
- Q.inv_powiainate = Q.i_pwan = Q.i1001 = function (x, z) {
3242
- return new MetaNum(x).inv_powiainate(z);
3243
- };
3244
-
3245
- //expandainate (ω^3+ω): diagonalization at ω^3+y level
3246
- P.expandainate = P.epan = P.h1010 = function (y) {
3247
- var x = this.clone();
3248
- y = new MetaNum(y);
3249
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3250
- if (y.eq(MetaNum.ONE)) return x.powiainate(x);
3251
- var base = x.powiainate(x);
3252
- if (y.layer === 0 && y.array.length <= 1) {
3253
- var result = base.clone();
3254
- var count = y.toNumber() - 1;
3255
- if (count > 0) {
3256
- result.layer = 0;
3257
- result.array = [base.array[0].slice()];
3258
- var cl = MetaNum.getCantorLevel(10);
3259
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3260
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3261
- for (var i = 0; i < ordRows.length; i++) {
3262
- result.array.push(ordRows[i]);
3263
- }
3264
- result.normalize();
3265
- }
3266
- return result;
3267
- }
3268
- var result = y.clone();
3269
- result.array[0] = base.array[0].slice();
3270
- result.layer = 0;
3271
- result.array.push([1, 0, 1, 0, 1]);
3272
- result.normalize();
3273
- return result;
2414
+ Q.powiainate = Q.pwan = Q.h1001 = function (x, y) {
2415
+ return Q._hyperopFromOrdinal(x, y, [1,0,0,1]);
3274
2416
  };
3275
- Q.expandainate = Q.epan = Q.h1010 = function (x, y) {
3276
- return new MetaNum(x).expandainate(y);
2417
+ P.inv_powiainate = P.i_pwan = P.i1001 = function (z) {
2418
+ return Q._invHyperopFromOrdinal(this, z, [1,0,0,1]);
2419
+ };
2420
+ Q.inv_powiainate = Q.i_pwan = Q.i1001 = function (x, z) {
2421
+ return Q._invHyperopFromOrdinal(x, z, [1,0,0,1]);
3277
2422
  };
3278
2423
 
2424
+ // expandainate = ω³ + ω → coeffs [0,1,0,1]
2425
+ P.expandainate = P.epan = P.h1010 = function (y) {
2426
+ return Q._hyperopFromOrdinal(this, y, [0,1,0,1]);
2427
+ };
2428
+ Q.expandainate = Q.epan = Q.h1010 = function (x, y) {
2429
+ return Q._hyperopFromOrdinal(x, y, [0,1,0,1]);
2430
+ };
3279
2431
  P.inv_expandainate = P.i_epan = P.i1010 = function (z) {
3280
- var x = this.clone();
3281
- z = new MetaNum(z);
3282
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3283
- if (z.array.length >= 2) {
3284
- var result = z.clone();
3285
- for (var i = result.array.length - 1; i >= 1; i--) {
3286
- var row = result.array[i];
3287
- if (row.length >= 5 && row[1] === 0 && row[2] === 1 && row[3] === 0 && row[4] === 1 && row[0] === 1) {
3288
- result.array.splice(i, 1);
3289
- result.normalize();
3290
- if (result.array.length <= 1) result.layer = 0;
3291
- return result;
3292
- }
3293
- }
3294
- for (var i = result.array.length - 1; i >= 1; i--) {
3295
- var row = result.array[i];
3296
- if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
3297
- row[0]--;
3298
- if (row[0] <= 0) result.array.splice(i, 1);
3299
- result.normalize();
3300
- if (result.array.length <= 1) result.layer = 0;
3301
- return result;
3302
- }
3303
- }
3304
- return result;
3305
- }
3306
- return z;
2432
+ return Q._invHyperopFromOrdinal(this, z, [0,1,0,1]);
3307
2433
  };
3308
2434
  Q.inv_expandainate = Q.i_epan = Q.i1010 = function (x, z) {
3309
- return new MetaNum(x).inv_expandainate(z);
2435
+ return Q._invHyperopFromOrdinal(x, z, [0,1,0,1]);
3310
2436
  };
3311
2437
 
3312
- //megodainate (ω^3+ω^2): diagonalization at ω^3+ω*y level
2438
+ // megodainate = ω³ + ω² → coeffs [0,0,1,1]
3313
2439
  P.megodainate = P.mgan = P.h1100 = function (y) {
3314
- var x = this.clone();
3315
- y = new MetaNum(y);
3316
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3317
- if (y.eq(MetaNum.ONE)) return x.clone();
3318
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3319
- var base = x.expandainate(x);
3320
- if (y.layer === 0 && y.array.length <= 1) {
3321
- var result = base.clone();
3322
- if (y.eq(2)) return result;
3323
- var count = y.toNumber() - 2;
3324
- if (count > 0) {
3325
- result.layer = 0;
3326
- result.array = [base.array[0].slice()];
3327
- var cl = MetaNum.getCantorLevel(10);
3328
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3329
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3330
- for (var i = 0; i < ordRows.length; i++) {
3331
- result.array.push(ordRows[i]);
3332
- }
3333
- result.normalize();
3334
- }
3335
- return result;
3336
- }
3337
- var result = y.clone();
3338
- result.array[0] = base.array[0].slice();
3339
- result.layer = 0;
3340
- result.array.push([1, 0, 0, 1, 1]);
3341
- result.normalize();
3342
- return result;
2440
+ return Q._hyperopFromOrdinal(this, y, [0,0,1,1]);
3343
2441
  };
3344
2442
  Q.megodainate = Q.mgan = Q.h1100 = function (x, y) {
3345
- return new MetaNum(x).megodainate(y);
2443
+ return Q._hyperopFromOrdinal(x, y, [0,0,1,1]);
3346
2444
  };
3347
-
3348
2445
  P.inv_megodainate = P.i_mgan = P.i1100 = function (z) {
3349
- var x = this.clone();
3350
- z = new MetaNum(z);
3351
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3352
- if (z.array.length >= 2) {
3353
- var result = z.clone();
3354
- for (var i = result.array.length - 1; i >= 1; i--) {
3355
- var row = result.array[i];
3356
- if (row.length >= 5 && row[1] === 0 && row[2] === 0 && row[3] === 1 && row[4] === 1 && row[0] === 1) {
3357
- result.array.splice(i, 1);
3358
- result.normalize();
3359
- if (result.array.length <= 1) result.layer = 0;
3360
- return result;
3361
- }
3362
- }
3363
- for (var i = result.array.length - 1; i >= 1; i--) {
3364
- var row = result.array[i];
3365
- if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
3366
- row[0]--;
3367
- if (row[0] <= 0) result.array.splice(i, 1);
3368
- result.normalize();
3369
- if (result.array.length <= 1) result.layer = 0;
3370
- return result;
3371
- }
3372
- }
3373
- return result;
3374
- }
3375
- return z;
2446
+ return Q._invHyperopFromOrdinal(this, z, [0,0,1,1]);
3376
2447
  };
3377
2448
  Q.inv_megodainate = Q.i_mgan = Q.i1100 = function (x, z) {
3378
- return new MetaNum(x).inv_megodainate(z);
2449
+ return Q._invHyperopFromOrdinal(x, z, [0,0,1,1]);
3379
2450
  };
3380
2451
 
3381
- //powiairate (ω^3*2): diagonalization at ω^3+ω^2*y level
2452
+ // powiairate = ω³*2 → coeffs [0,0,0,2]
3382
2453
  P.powiairate = P.pwar = P.h2000 = function (y) {
3383
- var x = this.clone();
3384
- y = new MetaNum(y);
3385
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3386
- if (y.eq(MetaNum.ONE)) return x.clone();
3387
- if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3388
- var base = x.megodainate(x);
3389
- if (y.layer === 0 && y.array.length <= 1) {
3390
- var result = base.clone();
3391
- if (y.eq(2)) return result;
3392
- var count = y.toNumber() - 2;
3393
- if (count > 0) {
3394
- result.layer = 0;
3395
- result.array = [base.array[0].slice()];
3396
- var cl = MetaNum.getCantorLevel(10);
3397
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3398
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3399
- for (var i = 0; i < ordRows.length; i++) {
3400
- result.array.push(ordRows[i]);
3401
- }
3402
- result.normalize();
3403
- }
3404
- return result;
3405
- }
3406
- var result = y.clone();
3407
- result.array[0] = base.array[0].slice();
3408
- result.layer = 0;
3409
- result.array.push([1, 0, 0, 0, 2]);
3410
- result.normalize();
3411
- return result;
2454
+ return Q._hyperopFromOrdinal(this, y, [0,0,0,2]);
3412
2455
  };
3413
2456
  Q.powiairate = Q.pwar = Q.h2000 = function (x, y) {
3414
- return new MetaNum(x).powiairate(y);
2457
+ return Q._hyperopFromOrdinal(x, y, [0,0,0,2]);
3415
2458
  };
3416
-
3417
2459
  P.inv_powiairate = P.i_pwar = P.i2000 = function (z) {
3418
- var x = this.clone();
3419
- z = new MetaNum(z);
3420
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3421
- if (z.array.length >= 2) {
3422
- var result = z.clone();
3423
- for (var i = result.array.length - 1; i >= 1; i--) {
3424
- var row = result.array[i];
3425
- if (row.length >= 5 && row[1] === 0 && row[2] === 0 && row[3] === 0 && row[4] === 2 && row[0] === 1) {
3426
- result.array.splice(i, 1);
3427
- result.normalize();
3428
- if (result.array.length <= 1) result.layer = 0;
3429
- return result;
3430
- }
3431
- }
3432
- for (var i = result.array.length - 1; i >= 1; i--) {
3433
- var row = result.array[i];
3434
- if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
3435
- row[0]--;
3436
- if (row[0] <= 0) result.array.splice(i, 1);
3437
- result.normalize();
3438
- if (result.array.length <= 1) result.layer = 0;
3439
- return result;
3440
- }
3441
- }
3442
- return result;
3443
- }
3444
- return z;
2460
+ return Q._invHyperopFromOrdinal(this, z, [0,0,0,2]);
3445
2461
  };
3446
2462
  Q.inv_powiairate = Q.i_pwar = Q.i2000 = function (x, z) {
3447
- return new MetaNum(x).inv_powiairate(z);
2463
+ return Q._invHyperopFromOrdinal(x, z, [0,0,0,2]);
3448
2464
  };
3449
2465
 
3450
- //aperioguate (ω^4): diagonalization at ω^3*y level
2466
+ // aperioguate = ω⁴ → coeffs [0,0,0,0,1]
3451
2467
  P.aperioguate = P.apgu = P.h10000 = function (y) {
3452
- var x = this.clone();
3453
- y = new MetaNum(y);
3454
- if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3455
- if (y.eq(MetaNum.ONE)) return x.aperiatotion(x);
3456
- if (y.eq(2)) return x.powiairate(x);
3457
- var base = x.powiairate(x);
3458
- if (y.layer === 0 && y.array.length <= 1) {
3459
- var result = base.clone();
3460
- var count = y.toNumber() - 2;
3461
- if (count > 0) {
3462
- result.layer = 0;
3463
- result.array = [base.array[0].slice()];
3464
- var cl = MetaNum.getCantorLevel(11);
3465
- var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
3466
- var ordRows = MetaNum.expandOrdinals(cl, maxVal);
3467
- for (var i = 0; i < ordRows.length; i++) {
3468
- result.array.push(ordRows[i]);
3469
- }
3470
- result.normalize();
3471
- }
3472
- return result;
3473
- }
3474
- var result = y.clone();
3475
- result.array[0] = base.array[0].slice();
3476
- result.layer = 0;
3477
- result.array.push([1, 0, 0, 0, 0, 1]);
3478
- result.normalize();
3479
- return result;
2468
+ return Q._hyperopFromOrdinal(this, y, [0,0,0,0,1]);
3480
2469
  };
3481
2470
  Q.aperioguate = Q.apgu = Q.h10000 = function (x, y) {
3482
- return new MetaNum(x).aperioguate(y);
2471
+ return Q._hyperopFromOrdinal(x, y, [0,0,0,0,1]);
3483
2472
  };
3484
-
3485
2473
  P.inv_aperioguate = P.i_apgu = P.i10000 = function (z) {
3486
- var x = this.clone();
3487
- z = new MetaNum(z);
3488
- if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3489
- if (z.array.length >= 2) {
3490
- var result = z.clone();
3491
- for (var i = result.array.length - 1; i >= 1; i--) {
3492
- var row = result.array[i];
3493
- if (row.length >= 6 && row[1] === 0 && row[2] === 0 && row[3] === 0 && row[4] === 0 && row[5] === 1 && row[0] === 1) {
3494
- result.array.splice(i, 1);
3495
- result.normalize();
3496
- if (result.array.length <= 1) result.layer = 0;
3497
- return result;
3498
- }
3499
- }
3500
- for (var i = result.array.length - 1; i >= 1; i--) {
3501
- var row = result.array[i];
3502
- if (row.length >= 3 && row[1] === 11 && row[2] === 1 && row[0] > 0) {
3503
- row[0]--;
3504
- if (row[0] <= 0) result.array.splice(i, 1);
3505
- result.normalize();
3506
- if (result.array.length <= 1) result.layer = 0;
3507
- return result;
3508
- }
3509
- }
3510
- return result;
3511
- }
3512
- return z;
2474
+ return Q._invHyperopFromOrdinal(this, z, [0,0,0,0,1]);
3513
2475
  };
3514
2476
  Q.inv_aperioguate = Q.i_apgu = Q.i10000 = function (x, z) {
3515
- return new MetaNum(x).inv_aperioguate(z);
2477
+ return Q._invHyperopFromOrdinal(x, z, [0,0,0,0,1]);
3516
2478
  };
3517
2479
 
3518
2480
  // iter (ω^ω): diagonalizes ω^x operations
3519
2481
  // k <= maxCols-2: layer 0, multi-index; k >= maxCols-1: layer 1
3520
- P.iter = P.hww = function (y) {
2482
+ P.iteration = P.iter = P.hww = function (y) {
3521
2483
  var x = this.clone();
3522
2484
  y = new MetaNum(y);
3523
2485
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2486
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3524
2487
  if (y.eq(MetaNum.ONE)) return x.clone();
3525
2488
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3526
2489
 
@@ -3568,33 +2531,54 @@
3568
2531
  result.normalize();
3569
2532
  return result;
3570
2533
  };
3571
- Q.iter = Q.hww = function (x, y) {
3572
- return new MetaNum(x).iter(y);
2534
+ Q.iteration = Q.iter = Q.hww = function (x, y) {
2535
+ return new MetaNum(x).iteration(y);
3573
2536
  };
3574
2537
 
3575
- P.inv_iter = P.iww = function (z) {
2538
+ P.inv_iteration = P.inv_iter = P.iww = function (z) {
3576
2539
  var x = this.clone();
3577
2540
  z = new MetaNum(z);
3578
2541
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3579
- if (z.array.length >= 2) {
3580
- var result = z.clone();
3581
- // Find the highest ordinal row and decrement/remove it
3582
- for (var i = result.array.length - 1; i >= 1; i--) {
3583
- var row = result.array[i];
3584
- if (row.length >= 3 && row[0] > 0) {
3585
- row[0]--;
3586
- if (row[0] <= 0) result.array.splice(i, 1);
2542
+ if (x.array.length >= 2) {
2543
+ // For ordinal y: find [1, 0, 1] marker and return y (the ordinal itself)
2544
+ for (var i = x.array.length - 1; i >= 1; i--) {
2545
+ var row = x.array[i];
2546
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2547
+ // This is the ordinal marker, return the ordinal y
2548
+ var result = x.clone();
2549
+ result.array.splice(i, 1);
3587
2550
  result.normalize();
3588
2551
  if (result.array.length <= 1) result.layer = 0;
3589
2552
  return result;
3590
2553
  }
3591
2554
  }
3592
- return result;
2555
+ // For finite y >= maxLevel: find [1, yn, 1] and return yn
2556
+ for (var i = x.array.length - 1; i >= 1; i--) {
2557
+ var row = x.array[i];
2558
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2559
+ return new MetaNum(row[1]);
2560
+ }
2561
+ }
2562
+ // For finite y < maxLevel: find [1, 0, 0, ..., 0, 1] and count zeros
2563
+ for (var i = x.array.length - 1; i >= 1; i--) {
2564
+ var row = x.array[i];
2565
+ if (row.length >= 3 && row[0] === 1 && row[row.length - 1] === 1) {
2566
+ // Count zeros between first and last element
2567
+ var zeros = 0;
2568
+ for (var j = 1; j < row.length - 1; j++) {
2569
+ if (row[j] === 0) zeros++;
2570
+ else break;
2571
+ }
2572
+ if (zeros > 0) {
2573
+ return new MetaNum(zeros);
2574
+ }
2575
+ }
2576
+ }
3593
2577
  }
3594
2578
  return z;
3595
2579
  };
3596
- Q.inv_iter = Q.iww = function (x, z) {
3597
- return new MetaNum(x).inv_iter(z);
2580
+ Q.inv_iteration = Q.inv_iter = Q.iww = function (x, z) {
2581
+ return new MetaNum(x).inv_iteration(z);
3598
2582
  };
3599
2583
 
3600
2584
  // itermult (ω^ω+1): iterates ω^ω level operations
@@ -3603,6 +2587,7 @@
3603
2587
  var x = this.clone();
3604
2588
  y = new MetaNum(y);
3605
2589
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2590
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3606
2591
  if (y.eq(MetaNum.ONE)) return x.iter(x);
3607
2592
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3608
2593
  if (y.layer === 0 && y.array.length <= 1) {
@@ -3632,8 +2617,8 @@
3632
2617
  var x = this.clone();
3633
2618
  z = new MetaNum(z);
3634
2619
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3635
- if (z.array.length >= 2) {
3636
- var result = z.clone();
2620
+ if (x.array.length >= 2) {
2621
+ var result = x.clone();
3637
2622
  for (var i = result.array.length - 1; i >= 1; i--) {
3638
2623
  var row = result.array[i];
3639
2624
  if (row.length >= 3 && row[0] > 0) {
@@ -3658,6 +2643,7 @@
3658
2643
  var x = this.clone();
3659
2644
  y = new MetaNum(y);
3660
2645
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2646
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3661
2647
  if (y.eq(MetaNum.ONE)) return x.clone();
3662
2648
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3663
2649
  var base = x.itermult(x);
@@ -3687,18 +2673,26 @@
3687
2673
  var x = this.clone();
3688
2674
  z = new MetaNum(z);
3689
2675
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3690
- if (z.array.length >= 2) {
3691
- var result = z.clone();
3692
- for (var i = result.array.length - 1; i >= 1; i--) {
3693
- var row = result.array[i];
2676
+ if (x.array.length >= 2) {
2677
+ // For finite y: find [1, yn, 1] with yn > 0 and return yn
2678
+ // (skip [1, 0, 1] which is the cuboiter marker)
2679
+ for (var i = x.array.length - 1; i >= 1; i--) {
2680
+ var row = x.array[i];
2681
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2682
+ return new MetaNum(row[1]);
2683
+ }
2684
+ }
2685
+ // For ordinal y: find [1, 0, 1] marker and return y
2686
+ for (var i = x.array.length - 1; i >= 1; i--) {
2687
+ var row = x.array[i];
3694
2688
  if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2689
+ var result = x.clone();
3695
2690
  result.array.splice(i, 1);
3696
2691
  result.normalize();
3697
2692
  if (result.array.length <= 1) result.layer = 0;
3698
2693
  return result;
3699
2694
  }
3700
2695
  }
3701
- return result;
3702
2696
  }
3703
2697
  return z;
3704
2698
  };
@@ -3712,6 +2706,7 @@
3712
2706
  var x = this.clone();
3713
2707
  y = new MetaNum(y);
3714
2708
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2709
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3715
2710
  if (y.eq(MetaNum.ONE)) return x.iter(x);
3716
2711
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3717
2712
  var base = x.iter(x);
@@ -3740,19 +2735,25 @@
3740
2735
  var x = this.clone();
3741
2736
  z = new MetaNum(z);
3742
2737
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3743
- if (z.array.length >= 2) {
3744
- var result = z.clone();
3745
- for (var i = result.array.length - 1; i >= 1; i--) {
3746
- var row = result.array[i];
3747
- if (row.length >= 3 && row[2] === 1 && row[0] > 0) {
3748
- row[0]--;
3749
- if (row[0] <= 0) result.array.splice(i, 1);
2738
+ if (x.array.length >= 2) {
2739
+ // For ordinal y: find [1, 0, 1] marker and return y
2740
+ for (var i = x.array.length - 1; i >= 1; i--) {
2741
+ var row = x.array[i];
2742
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2743
+ var result = x.clone();
2744
+ result.array.splice(i, 1);
3750
2745
  result.normalize();
3751
2746
  if (result.array.length <= 1) result.layer = 0;
3752
2747
  return result;
3753
2748
  }
3754
2749
  }
3755
- return result;
2750
+ // For finite y: find [yn, 0, 1] and return yn
2751
+ for (var i = x.array.length - 1; i >= 1; i--) {
2752
+ var row = x.array[i];
2753
+ if (row.length === 3 && row[1] === 0 && row[2] === 1 && row[0] > 0) {
2754
+ return new MetaNum(row[0]);
2755
+ }
2756
+ }
3756
2757
  }
3757
2758
  return z;
3758
2759
  };
@@ -3766,6 +2767,7 @@
3766
2767
  var x = this.clone();
3767
2768
  y = new MetaNum(y);
3768
2769
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2770
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3769
2771
  if (y.eq(MetaNum.ONE)) return x.iter(x);
3770
2772
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3771
2773
  if (y.layer === 0 && y.array.length <= 1) {
@@ -3794,19 +2796,25 @@
3794
2796
  var x = this.clone();
3795
2797
  z = new MetaNum(z);
3796
2798
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3797
- if (z.array.length >= 2) {
3798
- var result = z.clone();
3799
- for (var i = result.array.length - 1; i >= 1; i--) {
3800
- var row = result.array[i];
3801
- if (row.length >= 4 && row[3] === 1 && row[0] > 0) {
3802
- row[0]--;
3803
- if (row[0] <= 0) result.array.splice(i, 1);
2799
+ if (x.array.length >= 2) {
2800
+ // For ordinal y: find [1, 0, 1] marker and return y
2801
+ for (var i = x.array.length - 1; i >= 1; i--) {
2802
+ var row = x.array[i];
2803
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2804
+ var result = x.clone();
2805
+ result.array.splice(i, 1);
3804
2806
  result.normalize();
3805
2807
  if (result.array.length <= 1) result.layer = 0;
3806
2808
  return result;
3807
2809
  }
3808
2810
  }
3809
- return result;
2811
+ // For finite y: find [1, yn, 1] and return yn
2812
+ for (var i = x.array.length - 1; i >= 1; i--) {
2813
+ var row = x.array[i];
2814
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2815
+ return new MetaNum(row[1]);
2816
+ }
2817
+ }
3810
2818
  }
3811
2819
  return z;
3812
2820
  };
@@ -3820,6 +2828,7 @@
3820
2828
  var x = this.clone();
3821
2829
  y = new MetaNum(y);
3822
2830
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2831
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3823
2832
  if (y.eq(MetaNum.ONE)) return x.trioterate(x);
3824
2833
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3825
2834
  if (y.layer === 0 && y.array.length <= 1) {
@@ -3848,12 +2857,25 @@
3848
2857
  var x = this.clone();
3849
2858
  z = new MetaNum(z);
3850
2859
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3851
- if (z.layer >= 2) {
3852
- var result = z.clone();
3853
- result.layer--;
3854
- if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3855
- result.normalize();
3856
- return result;
2860
+ if (x.array.length >= 2) {
2861
+ // For ordinal y: find [1, 0, 1] marker and return y
2862
+ for (var i = x.array.length - 1; i >= 1; i--) {
2863
+ var row = x.array[i];
2864
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2865
+ var result = x.clone();
2866
+ result.array.splice(i, 1);
2867
+ result.normalize();
2868
+ if (result.array.length <= 1) result.layer = 0;
2869
+ return result;
2870
+ }
2871
+ }
2872
+ // For finite y: find [1, yn, 1] and return yn
2873
+ for (var i = x.array.length - 1; i >= 1; i--) {
2874
+ var row = x.array[i];
2875
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2876
+ return new MetaNum(row[1]);
2877
+ }
2878
+ }
3857
2879
  }
3858
2880
  return z;
3859
2881
  };
@@ -3867,6 +2889,7 @@
3867
2889
  var x = this.clone();
3868
2890
  y = new MetaNum(y);
3869
2891
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2892
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3870
2893
  if (y.eq(MetaNum.ONE)) return x.trixxate(x);
3871
2894
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3872
2895
  if (y.layer === 0 && y.array.length <= 1) {
@@ -3895,12 +2918,25 @@
3895
2918
  var x = this.clone();
3896
2919
  z = new MetaNum(z);
3897
2920
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3898
- if (z.layer >= 3) {
3899
- var result = z.clone();
3900
- result.layer--;
3901
- if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3902
- result.normalize();
3903
- return result;
2921
+ if (x.array.length >= 2) {
2922
+ // For ordinal y: find [1, 0, 1] marker and return y
2923
+ for (var i = x.array.length - 1; i >= 1; i--) {
2924
+ var row = x.array[i];
2925
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2926
+ var result = x.clone();
2927
+ result.array.splice(i, 1);
2928
+ result.normalize();
2929
+ if (result.array.length <= 1) result.layer = 0;
2930
+ return result;
2931
+ }
2932
+ }
2933
+ // For finite y: find [1, yn, 1] and return yn
2934
+ for (var i = x.array.length - 1; i >= 1; i--) {
2935
+ var row = x.array[i];
2936
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2937
+ return new MetaNum(row[1]);
2938
+ }
2939
+ }
3904
2940
  }
3905
2941
  return z;
3906
2942
  };
@@ -3914,6 +2950,7 @@
3914
2950
  var x = this.clone();
3915
2951
  y = new MetaNum(y);
3916
2952
  if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2953
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
3917
2954
  if (y.eq(MetaNum.ONE)) return x.aperixxate(x);
3918
2955
  if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3919
2956
  if (y.layer === 0 && y.array.length <= 1) {
@@ -3921,14 +2958,14 @@
3921
2958
  var base = x.aperixxate(x);
3922
2959
  if (y.eq(2)) return base;
3923
2960
  var result = base.clone();
3924
- result.layer = 4;
2961
+ result.layer = yn;
3925
2962
  result.array = [[1]];
3926
2963
  result.array.push([1, yn, 1]);
3927
2964
  result.normalize();
3928
2965
  return result;
3929
2966
  }
3930
2967
  var result = y.clone();
3931
- result.layer = 4;
2968
+ result.layer = y.layer;
3932
2969
  var base = x.aperixxate(x);
3933
2970
  result.array[0] = base.array[0].slice();
3934
2971
  result.normalize();
@@ -3942,12 +2979,25 @@
3942
2979
  var x = this.clone();
3943
2980
  z = new MetaNum(z);
3944
2981
  if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3945
- if (z.layer >= 4) {
3946
- var result = z.clone();
3947
- result.layer--;
3948
- if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3949
- result.normalize();
3950
- return result;
2982
+ if (x.array.length >= 2) {
2983
+ // For ordinal y: find [1, 0, 1] marker and return y
2984
+ for (var i = x.array.length - 1; i >= 1; i--) {
2985
+ var row = x.array[i];
2986
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
2987
+ var result = x.clone();
2988
+ result.array.splice(i, 1);
2989
+ result.normalize();
2990
+ if (result.array.length <= 1) result.layer = 0;
2991
+ return result;
2992
+ }
2993
+ }
2994
+ // For finite y: find [1, yn, 1] and return yn
2995
+ for (var i = x.array.length - 1; i >= 1; i--) {
2996
+ var row = x.array[i];
2997
+ if (row.length === 3 && row[0] === 1 && row[2] === 1 && row[1] > 0) {
2998
+ return new MetaNum(row[1]);
2999
+ }
3000
+ }
3951
3001
  }
3952
3002
  return z;
3953
3003
  };
@@ -4148,13 +3198,13 @@
4148
3198
  // Normal case: ordinal level from last row structure
4149
3199
  // The ε value is the ordinal exponent (number of ordinal params = lastRow.length - 2)
4150
3200
  var lastRow = this.array[this.array.length - 1];
4151
- epsVal = lastRow[0] || 1;
3201
+ epsVal = lastRow.length - 2;
4152
3202
  } else {
4153
3203
  epsVal = this.array[0][0] || 1;
4154
3204
  }
4155
3205
 
4156
3206
  if (epsIsSpecial) {
4157
- return "{" + epsVal + "}\u03B5{" + (this.layer - 1) + "}";
3207
+ return "{" + epsVal + "}\u03B5{" + this.layer + "}";
4158
3208
  }
4159
3209
  // Normal case: bare format mεn for simple values
4160
3210
  var epsStr;
@@ -4180,6 +3230,22 @@
4180
3230
  return "{" + this.array[0][1] + "}\u03B5{" + (this.layer - 1) + "}";
4181
3231
  }
4182
3232
 
3233
+ // Layers 1-10: check for mεn format (ω^ε representation)
3234
+ if (sym && this.array.length === 2 && this.array[0].length === 1 && this.array[0][0] === 10) {
3235
+ var lastRow = this.array[1];
3236
+ // Check if last row is [1, 0_repeated_m, 1] pattern
3237
+ if (lastRow[0] === 1 && lastRow[lastRow.length - 1] === 1) {
3238
+ var allZeros = true;
3239
+ for (var ei = 1; ei < lastRow.length - 1; ei++) {
3240
+ if (lastRow[ei] !== 0) { allZeros = false; break; }
3241
+ }
3242
+ if (allZeros) {
3243
+ var m = lastRow.length - 2; // number of zeros
3244
+ return m + "\u03B5" + this.layer;
3245
+ }
3246
+ }
3247
+ }
3248
+
4183
3249
  // Layers 1-10: try letter notation
4184
3250
  if (sym && this.array.length >= 2) {
4185
3251
  var ordTokens = [];
@@ -4498,8 +3564,10 @@
4498
3564
  } else {
4499
3565
  x.array = deepCloneArray(array);
4500
3566
  }
4501
- if (typeof sign === "number") x.sign = sign < 0 ? -1 : 1;
4502
- else x.sign = 1;
3567
+ if (typeof sign === "number") {
3568
+ if (sign === -2 || sign === 2) x.sign = sign;
3569
+ else x.sign = sign < 0 ? -1 : 1;
3570
+ } else x.sign = 1;
4503
3571
  if (typeof layer === "number" && isFinite(layer) && layer >= 0) x.layer = Math.floor(layer);
4504
3572
  else x.layer = computeLayer(x.array);
4505
3573
  return x.normalize();
@@ -4513,7 +3581,8 @@
4513
3581
  if (!(input.array instanceof Array)) throw Error(invalidArgument + "Expected that property 'array' exists");
4514
3582
  var x = new MetaNum();
4515
3583
  x.array = deepCloneArray(input.array);
4516
- x.sign = typeof input.sign === "number" ? (input.sign < 0 ? -1 : 1) : 1;
3584
+ x.sign = typeof input.sign === "number" ?
3585
+ (input.sign === 2 || input.sign === -2 ? input.sign : (input.sign < 0 ? -1 : 1)) : 1;
4517
3586
  x.layer = typeof input.layer === "number" && isFinite(input.layer) && input.layer >= 0 ? Math.floor(input.layer) : 0;
4518
3587
  return x.normalize();
4519
3588
  };
@@ -4696,7 +3765,7 @@
4696
3765
  s = s.substring(layerMatch[0].length).trim();
4697
3766
  }
4698
3767
 
4699
- // Parse {m}ε{n} format - new rule: layer = n-1, ordinal = [1, 0_repeated_m, 1], r0 defaults to 10
3768
+ // Parse {m}ε{n} format - new rule: layer = n, ordinal = [1, 0_repeated_m, 1], r0 defaults to 10
4700
3769
  // If m >= maxCols-1, row would exceed maxCols, so lift: array=[[10],[1,m]], layer=n
4701
3770
  var epsMatch = s.match(/^\{(\d+(?:\.\d+)?)\}\u03B5\{(\d+)\}\s*/);
4702
3771
  if (epsMatch) {
@@ -4714,7 +3783,7 @@
4714
3783
  x.array[0] = [10];
4715
3784
  x.array.push([1, epsM]);
4716
3785
  } else {
4717
- x.layer = epsN - 1;
3786
+ x.layer = epsN;
4718
3787
  x.array[0] = [10];
4719
3788
  // Build row [1, 0_repeated_epsM, 1]
4720
3789
  var epsRow = [1];
@@ -4739,7 +3808,7 @@
4739
3808
  return x.normalize();
4740
3809
  }
4741
3810
 
4742
- // Parse mεn format without braces - same rule: layer = n-1, ordinal = [1, 0_repeated_m, 1], r0 defaults to 10
3811
+ // Parse mεn format without braces - same rule: layer = n, ordinal = [1, 0_repeated_m, 1], r0 defaults to 10
4743
3812
  // If m >= maxCols-1, row would exceed maxCols, so lift: array=[[10],[1,m]], layer=n
4744
3813
  var epsBareMatch = s.match(/^(\d+(?:\.\d+)?)\u03B5(\d+)\s*/);
4745
3814
  if (epsBareMatch) {
@@ -4757,7 +3826,7 @@
4757
3826
  x.array[0] = [10];
4758
3827
  x.array.push([1, epsBareM]);
4759
3828
  } else {
4760
- x.layer = epsBareN - 1;
3829
+ x.layer = epsBareN;
4761
3830
  x.array[0] = [10];
4762
3831
  // Build row [1, 0_repeated_epsBareM, 1]
4763
3832
  var epsBareRow = [1];
@@ -4779,6 +3848,17 @@
4779
3848
  x.layer--;
4780
3849
  }
4781
3850
  }
3851
+ // Expand compact [1,m] form to full [1,0,...,0,1] form for display
3852
+ if (x.array.length >= 2) {
3853
+ var lastRow = x.array[x.array.length - 1];
3854
+ if (lastRow.length === 2 && lastRow[0] === 1) {
3855
+ var m = lastRow[1];
3856
+ var expandedRow = [1];
3857
+ for (var exi = 0; exi < m; exi++) expandedRow.push(0);
3858
+ expandedRow.push(1);
3859
+ x.array[x.array.length - 1] = expandedRow;
3860
+ }
3861
+ }
4782
3862
  return x.normalize();
4783
3863
  }
4784
3864
 
@@ -4879,15 +3959,7 @@
4879
3959
  } else if (gLastIsA3 && gFirstNonZero3 >= 0) {
4880
3960
  gIsDiag3 = true;
4881
3961
  for (var li3 = gK3 - 1; li3 >= 0; li3--) {
4882
- if (li3 === gK3 - 1) {
4883
- gRow3.push(symBase2);
4884
- } else if (li3 === gFirstNonZero3) {
4885
- gRow3.push(gIndices3[li3] + 1);
4886
- } else if (li3 < gFirstNonZero3) {
4887
- gRow3.push(gIndices3[li3]);
4888
- } else {
4889
- gRow3.push(0);
4890
- }
3962
+ gRow3.push(gIndices3[li3]);
4891
3963
  }
4892
3964
  gRow3.push(gUIdx3);
4893
3965
  } else {
@@ -5088,15 +4160,7 @@
5088
4160
  } else if (gLastIsA && gFirstNonZero >= 0) {
5089
4161
  gIsDiag = true;
5090
4162
  for (var li = gK - 1; li >= 0; li--) {
5091
- if (li === gK - 1) {
5092
- gRow.push(oaN);
5093
- } else if (li === gFirstNonZero) {
5094
- gRow.push(gIndices[li] + 1);
5095
- } else if (li < gFirstNonZero) {
5096
- gRow.push(gIndices[li]);
5097
- } else {
5098
- gRow.push(0);
5099
- }
4163
+ gRow.push(gIndices[li]);
5100
4164
  }
5101
4165
  gRow.push(gUIdx);
5102
4166
  } else {
@@ -5173,39 +4237,573 @@
5173
4237
  maxIdx = Math.max(maxIdx, idx);
5174
4238
  }
5175
4239
  }
5176
- x.array[0] = [val];
5177
- var eCount = counts[1] || 0;
5178
- var fCount = counts[2] || 0;
5179
- if (fCount > 0 && eCount === 0 && fCount === 1 && maxIdx === 2 && val >= 0 && val === Math.floor(val)) {
5180
- if (val === 0) {
5181
- x.array = [[1]];
5182
- } else if (val === 1) {
5183
- x.array = [[10]];
5184
- } else {
5185
- x.array[0] = [10000000000, val - 2];
5186
- }
5187
- } else if (maxIdx === 1) {
5188
- x.array[0][1] = eCount;
5189
- } else {
5190
- for (var idx = 1; idx <= maxIdx; idx++) {
5191
- x.array[0][idx] = counts[idx] || 0;
4240
+ x.array[0] = [val];
4241
+ var eCount = counts[1] || 0;
4242
+ var fCount = counts[2] || 0;
4243
+ if (fCount > 0 && eCount === 0 && fCount === 1 && maxIdx === 2 && val >= 0 && val === Math.floor(val)) {
4244
+ if (val === 0) {
4245
+ x.array = [[1]];
4246
+ } else if (val === 1) {
4247
+ x.array = [[10]];
4248
+ } else {
4249
+ x.array[0] = [10000000000, val - 2];
4250
+ }
4251
+ } else if (maxIdx === 1) {
4252
+ x.array[0][1] = eCount;
4253
+ } else {
4254
+ for (var idx = 1; idx <= maxIdx; idx++) {
4255
+ x.array[0][idx] = counts[idx] || 0;
4256
+ }
4257
+ }
4258
+ if (negateIt) x.sign = -1;
4259
+ return x.normalize();
4260
+ }
4261
+ }
4262
+
4263
+ var num = Number(rem);
4264
+ if (!isNaN(num) && isFinite(num)) {
4265
+ x.array[0][0] = num;
4266
+ }
4267
+ }
4268
+
4269
+ if (negateIt) x.sign = -1;
4270
+ return x.normalize();
4271
+ };
4272
+
4273
+
4274
+ // ==================== BEAF Ordinal Helpers ====================
4275
+ // Build ordinal coefficient array from BEAF args
4276
+ // coeffs[i] = args[i+2] - 1, where:
4277
+ // coeffs[0] = c-1 = a1-1 (ω^0 = constant term)
4278
+ // coeffs[1] = d-1 = a2-1 (ω^1 coefficient)
4279
+ // coeffs[2] = e-1 = a3-1 (ω^2 coefficient)
4280
+ // coeffs[3] = f-1 = a4-1 (ω^3 coefficient)
4281
+ // ...
4282
+ // Ordinal level = ...+ω^3*coeffs[3]+ω^2*coeffs[2]+ω*coeffs[1]+coeffs[0]
4283
+ Q._buildOrdinalCoeffs = function(args) {
4284
+ var coeffs = [];
4285
+ for (var i = 2; i < args.length; i++) {
4286
+ coeffs.push(args[i].toNumber() - 1);
4287
+ }
4288
+ return coeffs;
4289
+ };
4290
+
4291
+ // Apply fundamental sequence ONCE to a limit ordinal.
4292
+ //
4293
+ // coeffs: [c0, c1, c2, ...] where coeffs[i] is the coefficient of ω^i
4294
+ // cardinal: the argument to the fundamental sequence
4295
+ //
4296
+ // find the SMALLEST p >= 1 such that c_p > 0 and c_0 ... c_{p-1} are ALL 0.
4297
+ // That's the lowest non-zero ω-power. Then:
4298
+ // ω^p * q → ω^p * (q-1) + ω^{p-1} * cardinal
4299
+ Q._toSuccessorOrdinal = function(coeffs, cardinal) {
4300
+ var result = coeffs.slice();
4301
+ while (result.length > 0 && result[result.length - 1] === 0) result.pop();
4302
+ if (result.length === 0) return { coeffs: [0], isLimit: false };
4303
+
4304
+ // Successor ordinal: constant term c0 > 0
4305
+ if ((result[0] || 0) > 0) {
4306
+ return { coeffs: result, isLimit: false };
4307
+ }
4308
+
4309
+ // It's a limit ordinal (c0 = 0). Find p = the SMALLEST index >= 1 with c_p > 0.
4310
+ // (the rightmost / lowest ω-power with non-zero coefficient)
4311
+ var p = 1;
4312
+ while (p < result.length && (result[p] || 0) === 0) p++;
4313
+ if (p >= result.length) {
4314
+ return { coeffs: [0], isLimit: false };
4315
+ }
4316
+
4317
+ var q = result[p]; // coefficient of ω^p
4318
+ // Transform: ω^p*q → ω^p*(q-1) + ω^{p-1}*cardinal
4319
+ result[p] = q - 1;
4320
+ var effCardinal = (p === 1) ? (cardinal - 1) : cardinal;
4321
+ if (p - 1 === 0) {
4322
+ result[0] = (result[0] || 0) + effCardinal;
4323
+ } else {
4324
+ var idx = p - 1;
4325
+ while (result.length <= idx) result.push(0);
4326
+ result[idx] = (result[idx] || 0) + effCardinal;
4327
+ }
4328
+
4329
+ while (result.length > 0 && result[result.length - 1] === 0) result.pop();
4330
+ if (result.length === 0) result = [0];
4331
+
4332
+ var isLimit = true;
4333
+ if ((result[0] || 0) > 0) {
4334
+ isLimit = false;
4335
+ } else {
4336
+ var hasOmegaTerm = false;
4337
+ for (var i = 1; i < result.length; i++) {
4338
+ if ((result[i] || 0) > 0) {
4339
+ hasOmegaTerm = true;
4340
+ break;
4341
+ }
4342
+ }
4343
+ isLimit = hasOmegaTerm;
4344
+ }
4345
+
4346
+ return { coeffs: result, isLimit: isLimit };
4347
+ };
4348
+
4349
+ // Convert ordinal coefficients to a row representation
4350
+ // coeffs: [c0, c1, c2, ..., cp] where cp != 0
4351
+ // Row format: [count, c0, c1, ..., c_{p-1}, cp]
4352
+ // which represents count * (ω^p*cp + ω^{p-1}*c_{p-1} + ... + ω^1*c1 + c0)
4353
+ // count: the number of times this ordinal-level operation is repeated (i.e., b-2 in BEAF)
4354
+ Q._ordinalToRow = function(coeffs, count) {
4355
+ if (coeffs.length === 0) return null;
4356
+
4357
+ // Find the highest non-zero coefficient
4358
+ var maxIdx = coeffs.length - 1;
4359
+ while (maxIdx >= 0 && (coeffs[maxIdx] || 0) === 0) maxIdx--;
4360
+ if (maxIdx < 0) return null;
4361
+
4362
+ var row = [count];
4363
+ // Add coefficients from c0 (ω^0) up to c_{maxIdx-1}
4364
+ for (var i = 0; i < maxIdx; i++) {
4365
+ row.push(coeffs[i] || 0);
4366
+ }
4367
+ // Add the highest coefficient (diag)
4368
+ row.push(coeffs[maxIdx]);
4369
+ return row;
4370
+ };
4371
+
4372
+ // Decrement a successor ordinal by 1 (subtract 1 from constant term)
4373
+ Q._decrementOrdinal = function(coeffs) {
4374
+ var result = coeffs.slice();
4375
+ while (result.length > 0 && result[result.length - 1] === 0) result.pop();
4376
+ if (result.length === 0) return [0];
4377
+
4378
+ if ((result[0] || 0) > 0) {
4379
+ result[0]--;
4380
+ } else {
4381
+ // This should not be called on a limit ordinal, but handle it just in case
4382
+ // Find lowest non-zero coefficient and borrow
4383
+ var idx = 1;
4384
+ while (idx < result.length && (result[idx] || 0) === 0) idx++;
4385
+ if (idx < result.length) {
4386
+ result[idx]--;
4387
+ for (var i = 0; i < idx; i++) {
4388
+ result[i] = 0; // These would be filled in during subsequent expansion
4389
+ }
4390
+ }
4391
+ }
4392
+
4393
+ while (result.length > 0 && result[result.length - 1] === 0) result.pop();
4394
+ if (result.length === 0) return [0];
4395
+ return result;
4396
+ };
4397
+
4398
+ // Compare two ordinal coefficient arrays: returns -1 if a<b, 0 if equal, 1 if a>b
4399
+ Q._compareOrdinals = function(a, b) {
4400
+ var maxIdx = Math.max(a.length, b.length) - 1;
4401
+ for (var i = maxIdx; i >= 0; i--) {
4402
+ var av = (i < a.length) ? (a[i] || 0) : 0;
4403
+ var bv = (i < b.length) ? (b[i] || 0) : 0;
4404
+ if (av !== bv) return av - bv;
4405
+ }
4406
+ return 0;
4407
+ };
4408
+
4409
+ // Generate ordinal rows for BEAF/Hyperoperation A(m, n) using the exact algorithm
4410
+ //
4411
+ // 1. If A is a successor ordinal (c0 > 0), emit row with count = n-1 for level A-1,
4412
+ // then descend with tierCount = n-2.
4413
+ // 2. If A is a limit ordinal, apply fundamental sequence repeatedly until a successor
4414
+ // ordinal B is reached. Then proceed as (1) with B.
4415
+ // 3. For each subsequent tier (count = n-2, n-3, ...), repeat the full descent from
4416
+ // B again, but with count set to the current tier value.
4417
+ //
4418
+ // For example, BEAF(5,5,1,1,2):
4419
+ // 5(ω²)5
4420
+ // →5(ω*4+4) 4times 5 // Step 1, count=4, max ordinal=ω*4+4
4421
+ // →5(ω*4+4) 3times 5(ω*4+3) 3times …… 5(ω+1) 3times 5(ω) 3times 5(ω)5 // Step 2, count=3, descending levels
4422
+ // Finally: 5(ω)5 = base row
4423
+ //
4424
+ // So rows are:
4425
+ // [3, 4, 4],[3, 3, 4],...,[3, 0, 1],[3, 0, 1] (cascade, count=3)
4426
+ //
4427
+ // base: m from BEAF, cardinal: n from BEAF (b in the function)
4428
+ // Generate ordinal rows for a given ordinal level (coeffs) with base m and cardinal n.
4429
+ // Returns rows sorted from smallest to largest ordinal.
4430
+ // Each row has format: [count, c0, c1, ..., c_{p-1}, cp]
4431
+ // where count = n-2 for all rows (the top row is excluded).
4432
+ //
4433
+ // For ordinal A with base m and cardinal n:
4434
+ // - rows have count = n-2.
4435
+ // - Rows are sorted from smallest to largest ordinal.
4436
+ // - Includes all limit ordinals in the expansion.
4437
+ //
4438
+ // BEAF(5,5,1,1,2) has ordinal ω², base=5, cardinal=5.
4439
+ // topSuccessor = ω*4+4 (after FS from ω²)
4440
+ // count = 5-2 = 3
4441
+ // Rows: [3,0,1], [3,1,1], [3,2,1], [3,3,1], [3,4,1], (ω, ω+1, ω+2, ω+3, ω+4)
4442
+ // [3,0,2], [3,1,2], [3,2,2], [3,3,2], [3,4,2], (ω*2, ω*2+1, ..., ω*2+4)
4443
+ // [3,0,3], [3,1,3], [3,2,3], [3,3,3], [3,4,3], (ω*3, ω*3+1, ..., ω*3+4)
4444
+ // [3,0,4], [3,1,4], [3,2,4], [3,3,4], [3,4,4] (ω*4, ω*4+1, ..., ω*4+4)
4445
+
4446
+ Q._generateOrdinalRows = function(coeffs, base, cardinal, maxRows) {
4447
+ var rows = [];
4448
+ var m = base;
4449
+ var n = cardinal;
4450
+
4451
+ function compareOrd(a, b) {
4452
+ var maxLen = Math.max(a.length, b.length);
4453
+ for (var i = maxLen - 1; i >= 0; i--) {
4454
+ var va = (i < a.length) ? (a[i] || 0) : 0;
4455
+ var vb = (i < b.length) ? (b[i] || 0) : 0;
4456
+ if (va < vb) return -1;
4457
+ if (va > vb) return 1;
4458
+ }
4459
+ return 0;
4460
+ }
4461
+
4462
+ function addOrd(a, b) {
4463
+ if (!b || b.length === 0 || (b.length === 1 && b[0] === 0)) return a.slice();
4464
+ if (!a || a.length === 0 || (a.length === 1 && a[0] === 0)) return b.slice();
4465
+ var result = a.slice();
4466
+ var k = 0;
4467
+ while (k < result.length && (result[k] || 0) === 0) k++;
4468
+ if (k >= result.length) {
4469
+ return b.slice();
4470
+ } else if (k === 0) {
4471
+ result[0] = (result[0] || 0) + (b[0] || 0);
4472
+ for (var i = 1; i < b.length; i++) {
4473
+ result[i] = (result[i] || 0) + (b[i] || 0);
4474
+ }
4475
+ } else {
4476
+ result[k] = 0;
4477
+ result = result.slice(0, k);
4478
+ for (var i = 0; i < b.length; i++) {
4479
+ result.push(b[i] || 0);
4480
+ }
4481
+ }
4482
+ while (result.length > 0 && result[result.length - 1] === 0) result.pop();
4483
+ return result;
4484
+ }
4485
+
4486
+ function isZero(ord) {
4487
+ if (!ord || ord.length === 0) return true;
4488
+ for (var i = 0; i < ord.length; i++) {
4489
+ if ((ord[i] || 0) !== 0) return false;
4490
+ }
4491
+ return true;
4492
+ }
4493
+
4494
+ function buildRow(ord, count) {
4495
+ var maxIdx = ord.length - 1;
4496
+ while (maxIdx >= 0 && (ord[maxIdx] || 0) === 0) maxIdx--;
4497
+ if (maxIdx < 0) return null;
4498
+ var row = [count];
4499
+ for (var i = 0; i <= maxIdx - 1; i++) row.push(ord[i] || 0);
4500
+ row.push(ord[maxIdx]);
4501
+ return row;
4502
+ }
4503
+
4504
+ // Enumerate all ordinals below ω^k with coefficients < n
4505
+ function enumBelowOmegaK(k, n) {
4506
+ if (k === 0) {
4507
+ return [[0]];
4508
+ }
4509
+ if (k === 1) {
4510
+ var result = [];
4511
+ for (var i = 0; i < n; i++) {
4512
+ result.push([i]);
4513
+ }
4514
+ return result;
4515
+ }
4516
+ var result = [];
4517
+ for (var a = 0; a < n; a++) {
4518
+ var sub = enumBelowOmegaK(k - 1, n);
4519
+ for (var i = 0; i < sub.length; i++) {
4520
+ var combined = sub[i].slice();
4521
+ while (combined.length < k) combined.push(0);
4522
+ combined[k-1] = a;
4523
+ result.push(combined);
4524
+ }
4525
+ }
4526
+ return result;
4527
+ }
4528
+
4529
+ // Enumerate all ordinals below a given ordinal
4530
+ function enumBelow(alpha, n) {
4531
+ if (isZero(alpha)) return [];
4532
+
4533
+ if ((alpha[0] || 0) > 0) {
4534
+ var pred = alpha.slice();
4535
+ pred[0]--;
4536
+ while (pred.length > 0 && pred[pred.length - 1] === 0) pred.pop();
4537
+ if (pred.length === 0) pred = [0];
4538
+ var result = enumBelow(pred, n);
4539
+ result.push(pred.slice());
4540
+ return result;
4541
+ }
4542
+
4543
+ var k = alpha.length - 1;
4544
+ while (k >= 0 && (alpha[k] || 0) === 0) k--;
4545
+ if (k < 0) return [];
4546
+
4547
+ var ck = alpha[k] || 0;
4548
+ var rest = alpha.slice(0, k);
4549
+ while (rest.length > 0 && rest[rest.length - 1] === 0) rest.pop();
4550
+
4551
+ var result = [];
4552
+
4553
+ for (var j = 0; j < ck; j++) {
4554
+ var sub = enumBelowOmegaK(k, n);
4555
+ for (var i = 0; i < sub.length; i++) {
4556
+ var combined = sub[i].slice();
4557
+ while (combined.length <= k) combined.push(0);
4558
+ combined[k] = j;
4559
+ result.push(combined);
4560
+ }
4561
+ }
4562
+
4563
+ if (!isZero(rest)) {
4564
+ var restSub = enumBelow(rest, n);
4565
+ for (var i = 0; i < restSub.length; i++) {
4566
+ var combined = restSub[i].slice();
4567
+ while (combined.length <= k) combined.push(0);
4568
+ combined[k] = ck;
4569
+ result.push(combined);
4570
+ }
4571
+ }
4572
+
4573
+ return result;
4574
+ }
4575
+
4576
+ var count = n - 2;
4577
+ if (count < 1) return rows;
4578
+
4579
+ var allOrdinals = enumBelow(coeffs, n);
4580
+
4581
+ var seen = {};
4582
+ var uniqueOrdinals = [];
4583
+ for (var i = 0; i < allOrdinals.length; i++) {
4584
+ var ord = allOrdinals[i];
4585
+ if (isZero(ord)) continue;
4586
+
4587
+ // Normalize: remove trailing zeros
4588
+ var normalized = ord.slice();
4589
+ while (normalized.length > 0 && normalized[normalized.length - 1] === 0) {
4590
+ normalized.pop();
4591
+ }
4592
+
4593
+ // Skip ordinals below ω (finite ordinals: only constant term, length <= 1)
4594
+ if (normalized.length <= 1) continue;
4595
+
4596
+ var key = normalized.join(',');
4597
+ if (seen[key]) continue;
4598
+ seen[key] = true;
4599
+ uniqueOrdinals.push(normalized);
4600
+ }
4601
+
4602
+ uniqueOrdinals.sort(function(a, b) {
4603
+ return compareOrd(a, b);
4604
+ });
4605
+
4606
+ var allRows = [];
4607
+ for (var i = 0; i < uniqueOrdinals.length; i++) {
4608
+ var row = buildRow(uniqueOrdinals[i], count);
4609
+ if (row) allRows.push(row);
4610
+ }
4611
+
4612
+ var maxOrdinalRows = maxRows - 1;
4613
+ if (allRows.length > maxOrdinalRows) {
4614
+ allRows = allRows.slice(allRows.length - maxOrdinalRows);
4615
+ }
4616
+
4617
+ for (var i = 0; i < allRows.length; i++) {
4618
+ rows.push(allRows[i]);
4619
+ }
4620
+
4621
+ return rows;
4622
+ };
4623
+
4624
+ // Ordinal BEAF computation for 3+ arguments
4625
+ // BEAF(m, n, a1, a2, a3, a4, ...)
4626
+ // Ordinal level: ...+ω^3*(a4-1)+ω^2*(a3-1)+ω*(a2-1)+(a1-1)
4627
+ // coeffs passed in are: [a1-1, a2-1, a3-1, a4-1, ...]
4628
+ Q._beafOrdinal = function(a, b, coeffs) {
4629
+ var aNum = a.toNumber();
4630
+ var bNum = b.toNumber();
4631
+
4632
+ // For exactly 3 arguments: {m,n,c} (coeffs.length = 1):
4633
+ // c < 3 means finite hyperop (1=multiplication, 2=exponentiation)
4634
+ // c >= 3 means tetration+ which is already properly handled by arrow()
4635
+ if (coeffs.length === 1) {
4636
+ return a.arrow(coeffs[0] + 1)(b);
4637
+ }
4638
+
4639
+ // Base row = innermost lowest-level (ω) result, per user: 5(ω)5 = 5 arrow 5
4640
+ // Use arrow with level exactly aNum to guarantee base row = a arrow a of level a (tetrate).
4641
+ // For a>maxArrow, use maxArrow+1 which triggers ordinal path with array length > 1.
4642
+ // But we want base row to be a pure array[0] with enough entries (length >=4).
4643
+ // Arrow level aNum gives 5 arrow 5.
4644
+ var baseArrowLevel = Math.max(aNum, 3);
4645
+ var baseResult = a.arrow(baseArrowLevel)(b);
4646
+
4647
+ // Generate ordinal rows (sorted largest to smallest by generator)
4648
+ var maxRows = MetaNum.maxRows; // 100
4649
+ // _generateOrdinalRows(coeffs, base, cardinal, maxRows)
4650
+ // where base = aNum (m) for FS, cardinal = bNum (n) for FS.
4651
+ var rows = Q._generateOrdinalRows(coeffs, aNum, bNum, maxRows);
4652
+
4653
+ // Combine base result with ordinal rows. IMPORTANT: do NOT normalize because
4654
+ // normalize() re-sorts the array and destroys our largest-first ordering.
4655
+ // Instead, set array directly to [baseResult.array[0]].concat(rows).
4656
+ var result = baseResult.clone();
4657
+ result.array = [baseResult.array[0].slice()];
4658
+ for (var i = 0; i < rows.length; i++) {
4659
+ result.array.push(rows[i]);
4660
+ }
4661
+ if (result.array.length > 1) result.layer = 0;
4662
+ return result;
4663
+ };
4664
+
4665
+
4666
+ // ==================== BEAF Array Notation ====================
4667
+ // Bowers' Exploding Array Function: https://googology.fandom.com/wiki/Array_notation
4668
+ // Rules:
4669
+ // 1. {a} = a, {a,b} = a^b
4670
+ // 2. {a,b,c,...,n,1} = {a,b,c,...,n}
4671
+ // 3. {a,1,b,c,...,n} = a
4672
+ // 4. {a,b,1,...,1,c,d,...,n} = {a,a,a,...,{a,b-1,1,...,1,c,d,...,n},c-1,d,...,n}
4673
+ // 5. {a,b,c,d,...,n} = {a,{a,b-1,c,d,...,n},c-1,d,...,n}
4674
+
4675
+ // Internal recursive BEAF computation
4676
+ Q._beafRecursive = function(args, depth) {
4677
+ if (depth === undefined) depth = 0;
4678
+ if (depth > 500) return MetaNum.NaN.clone(); // safety limit
4679
+ var len = args.length;
4680
+ if (len === 0) return MetaNum.ONE.clone();
4681
+ if (len === 1) return args[0].clone();
4682
+ if (len === 2) return args[0].pow(args[1]);
4683
+
4684
+ // Remove trailing 1s (Rule 2)
4685
+ while (len > 2 && args[len - 1].eq(MetaNum.ONE)) { args.pop(); len--; }
4686
+
4687
+ // After removing trailing 1s, re-check length
4688
+ if (len <= 2) {
4689
+ return len === 1 ? args[0].clone() : args[0].pow(args[1]);
4690
+ }
4691
+
4692
+ // 3-entry optimization: {a, b, c} = a{c}b (use hyperoperators)
4693
+ if (len === 3) {
4694
+ var c = args[2];
4695
+ if (c.isint() && c.sign === 1) {
4696
+ var cNum = c.toNumber();
4697
+ if (isFinite(cNum) && cNum <= MetaNum.maxArrow) {
4698
+ return args[0].arrow(c)(args[1]);
4699
+ }
4700
+ }
4701
+ // Fall through to recursive computation for non-integer c
4702
+ }
4703
+
4704
+ // Rule 3: {a, 1, ...} = a
4705
+ if (args[1].eq(MetaNum.ONE)) return args[0].clone();
4706
+
4707
+ // 4+ arguments: use ordinal arithmetic instead of recursion
4708
+ if (len >= 4) {
4709
+ var coeffs = Q._buildOrdinalCoeffs(args);
4710
+ return Q._beafOrdinal(args[0], args[1], coeffs);
4711
+ }
4712
+
4713
+ // Rule 4: {a, b, 1, ..., 1, c, d, ...}
4714
+ if (args[2].eq(MetaNum.ONE)) {
4715
+ var pilotIdx = 2;
4716
+ while (pilotIdx < len && args[pilotIdx].eq(MetaNum.ONE)) pilotIdx++;
4717
+ if (pilotIdx >= len) {
4718
+ return args[0].pow(args[1]);
4719
+ }
4720
+ var c = args[pilotIdx];
4721
+ var newArgs = [args[0].clone()];
4722
+ for (var i = 1; i < pilotIdx - 1; i++) newArgs.push(args[0].clone());
4723
+ var orig = args.map(function(x) { return x.clone(); });
4724
+ orig[1] = args[1].sub(MetaNum.ONE);
4725
+ newArgs.push(Q._beafRecursive(orig, depth + 1));
4726
+ newArgs.push(c.sub(MetaNum.ONE));
4727
+ for (var i = pilotIdx + 1; i < len; i++) newArgs.push(args[i].clone());
4728
+ return Q._beafRecursive(newArgs, depth + 1);
4729
+ }
4730
+
4731
+ // Rule 5: {a, b, c, d, ...} = {a, BEAF(a, b-1, c, d, ...), c-1, d, ...}
4732
+ var orig = args.map(function(x) { return x.clone(); });
4733
+ orig[1] = args[1].sub(MetaNum.ONE);
4734
+ var newArgs = [args[0].clone(), Q._beafRecursive(orig, depth + 1), args[2].sub(MetaNum.ONE)];
4735
+ for (var i = 3; i < len; i++) newArgs.push(args[i].clone());
4736
+ return Q._beafRecursive(newArgs, depth + 1);
4737
+ };
4738
+
4739
+ // Public BEAF function: MetaNum.BEAF(a, b, c, ...)
4740
+ Q.BEAF = function() {
4741
+ var args = Array.prototype.slice.call(arguments);
4742
+ if (args.length > MetaNum.maxCols) {
4743
+ throw Error(metaNumError + 'BEAF: too many arguments (max ' + MetaNum.maxCols + ')');
4744
+ }
4745
+ var metaArgs = args.map(function(a) { return new MetaNum(a); });
4746
+ return Q._beafRecursive(metaArgs);
4747
+ };
4748
+
4749
+ // Parse BEAF string: {a,b,c,...}
4750
+ Q.fromBeaf = function(str) {
4751
+ if (typeof str !== 'string') return MetaNum.NaN.clone();
4752
+ var s = str.trim();
4753
+ if (s.charAt(0) !== '{' || s.charAt(s.length - 1) !== '}') {
4754
+ return MetaNum.NaN.clone();
4755
+ }
4756
+ var inner = s.slice(1, -1).trim();
4757
+ if (inner === '') return MetaNum.ONE.clone();
4758
+ var parts = inner.split(',');
4759
+ var args = [];
4760
+ for (var i = 0; i < parts.length; i++) {
4761
+ var val = Number(parts[i].trim());
4762
+ if (!isFinite(val) || val < 1) return MetaNum.NaN.clone();
4763
+ args.push(val);
4764
+ }
4765
+ return Q.BEAF.apply(null, args);
4766
+ };
4767
+
4768
+ // Convert to BEAF string: {a,b,c,...}
4769
+ P.toBeaf = function() {
4770
+ var x = this.clone().normalize();
4771
+ if (x.isNaN()) return 'NaN';
4772
+ if (x.layer === 0 && x.array.length === 1) {
4773
+ if (x.eq(MetaNum.ZERO)) return '{0}';
4774
+ return '{' + decimalPlaces(x.array[0][0], 6) + '}';
4775
+ }
4776
+ if (x.layer > 0 || x.array.length > 1) {
4777
+ if (x.array.length === 2 && x.array[1].length >= 3) {
4778
+ var row = x.array[1];
4779
+ var diag = row[row.length - 1];
4780
+ if (diag === 1 && row[0] === 1) {
4781
+ var vals = row.slice(1, row.length - 1);
4782
+ var allNonNegative = true;
4783
+ for (var i = 0; i < vals.length; i++) {
4784
+ if (vals[i] < 0) { allNonNegative = false; break; }
4785
+ }
4786
+ if (allNonNegative) {
4787
+ var a = decimalPlaces(x.array[0][0], 6);
4788
+ // Reconstruct BEAF: {a, ?, c, d+1, e+1, ...} from ordinal [1, c, d, e, ..., 1]
4789
+ var beafParts = [a, '?'];
4790
+ for (var i = 0; i < vals.length - 1; i++) {
4791
+ beafParts.push(String(vals[i] + 1));
5192
4792
  }
4793
+ beafParts.push(String(vals[vals.length - 1] + 1));
4794
+ return '{' + beafParts.join(', ') + '}';
5193
4795
  }
5194
- if (negateIt) x.sign = -1;
5195
- return x.normalize();
5196
4796
  }
5197
4797
  }
5198
-
5199
- var num = Number(rem);
5200
- if (!isNaN(num) && isFinite(num)) {
5201
- x.array[0][0] = num;
5202
- }
5203
4798
  }
5204
-
5205
- if (negateIt) x.sign = -1;
5206
- return x.normalize();
4799
+ return '{' + x.array.map(function(r) {
4800
+ return '[' + r.map(function(v) { return decimalPlaces(v, 6); }).join(', ') + ']';
4801
+ }).join(', ') + '}';
5207
4802
  };
5208
4803
 
4804
+
4805
+ // other methods
4806
+
5209
4807
  P.clone = function () {
5210
4808
  var x = new MetaNum();
5211
4809
  x.array = deepCloneArray(this.array);
@@ -5306,11 +4904,24 @@
5306
4904
 
5307
4905
  if (cantorLevel < 0) cantorLevel = 0;
5308
4906
 
4907
+ // nv (number of intermediate v's) must be bounded by cantorLevel:
4908
+ // cantorLevel 0 → nv up to 0, rows are finite level (length 2)
4909
+ // cantorLevel 1 → nv up to 1 (ω^1 rows, length 3)
4910
+ // cantorLevel 2 → nv up to 2 (ω^2 rows, length 4)
4911
+ // In general: nv_max = cantorLevel (or 1 at minimum)
4912
+ var nvMax = Math.max(cantorLevel, 0);
4913
+
5309
4914
  // Use maxVal as diag upper bound for proper cardinal expansion
5310
4915
  var diagMax = Math.max(maxVal, 1);
5311
4916
 
5312
- // Generate all combinations: numVals outer, diag inner (for increasing ordinal value)
5313
- for (var nv = 1; nv <= diagMax && rows.length < maxRows; nv++) {
4917
+ for (var nv = 0; nv <= nvMax && rows.length < maxRows; nv++) {
4918
+ if (nv === 0) {
4919
+ // Finite level: just [count, d] where d is the finite level
4920
+ for (var d0 = diagMax; d0 >= 1 && rows.length < maxRows; d0--) {
4921
+ rows.push([1, d0]);
4922
+ }
4923
+ continue;
4924
+ }
5314
4925
  for (var d = 1; d <= diagMax && rows.length < maxRows; d++) {
5315
4926
  var total = Math.pow(maxVal + 1, nv);
5316
4927
  for (var ci = 0; ci < total && rows.length < maxRows; ci++) {
@@ -5328,12 +4939,17 @@
5328
4939
  }
5329
4940
  }
5330
4941
 
5331
- // Add boundary/special row [1, 0, ..., 0, 1] with (maxVal+1) zeros + diag=1
4942
+ // Add boundary/special row only if it fits within nvMax:
4943
+ // Boundary row has nv = maxVal+1 zeros → length = maxVal+3 → ω^{maxVal+1} level.
4944
+ // To respect cantorLevel, we only add it if (maxVal+1) <= nvMax, otherwise cap at cantorLevel.
5332
4945
  if (rows.length < maxRows) {
5333
- var bRow = [1];
5334
- for (var k = 0; k < maxVal + 1; k++) bRow.push(0);
5335
- bRow.push(1);
5336
- rows.push(bRow);
4946
+ var boundaryNv = Math.min(maxVal + 1, nvMax);
4947
+ if (boundaryNv >= 0) {
4948
+ var bRow = [1];
4949
+ for (var k = 0; k < boundaryNv; k++) bRow.push(0);
4950
+ bRow.push(1);
4951
+ rows.push(bRow);
4952
+ }
5337
4953
  }
5338
4954
 
5339
4955
  return rows;
@@ -5379,7 +4995,7 @@
5379
4995
  if (R.hasOwnProperty(prop)) {
5380
4996
  var val = R[prop];
5381
4997
  if (typeof val === "string") {
5382
- obj[prop] = val;
4998
+ obj[prop] = new MetaNum(val);
5383
4999
  } else if (Object.defineProperty) {
5384
5000
  Object.defineProperty(obj, prop, {
5385
5001
  configurable: false,
@@ -5401,8 +5017,8 @@
5401
5017
  }
5402
5018
  var i, p, v,
5403
5019
  ps = [
5404
- 'maxRows', 1, 100,
5405
- 'maxCols', 1, 100,
5020
+ 'maxRows', 10, 1000,
5021
+ 'maxCols', 10, 1000,
5406
5022
  'maxArrow', 1, Number.MAX_SAFE_INTEGER,
5407
5023
  'serializeMode', 0, 1,
5408
5024
  'debug', 0, 2
@@ -5416,266 +5032,6 @@
5416
5032
  return this;
5417
5033
  }
5418
5034
 
5419
- // ==================== BEAF Ordinal Helpers ====================
5420
- // Build ordinal coefficient array from BEAF args
5421
- // coeffs[i] = args[i+2] - 1, where coeffs[0] = c-1 (ω^0), coeffs[1] = d-1 (ω^1), ...
5422
- Q._buildOrdinalCoeffs = function(args) {
5423
- var coeffs = [];
5424
- for (var i = 2; i < args.length; i++) {
5425
- coeffs.push(args[i].toNumber() - 1);
5426
- }
5427
- return coeffs;
5428
- };
5429
-
5430
- // Expand highest ω^k term when b=2: ω^k → ω^{k-1}*(a-1) + ... + ω*(a-1) + (a-1)
5431
- Q._expandForB2 = function(coeffs, a) {
5432
- var k = coeffs.length - 1;
5433
- while (k >= 0 && coeffs[k] === 0) k--;
5434
- if (k < 0) return { coeffs: [0] };
5435
- if (k === 0) return { coeffs: coeffs };
5436
- // ω^k → ω^{k-1}*(a-1) + ... + ω*(a-1) + (a-1), single expansion only
5437
- var newCoeffs = coeffs.slice(0, k);
5438
- while (newCoeffs.length < k) newCoeffs.push(0);
5439
- for (var i = 0; i < k; i++) {
5440
- newCoeffs[i] = (newCoeffs[i] || 0) + (a - 1);
5441
- }
5442
- return { coeffs: newCoeffs };
5443
- };
5444
-
5445
- // Generate ordinal rows in CNF from ω-level coefficients
5446
- // coeffs: [a₁, a₂, ..., aₖ] for ω^1, ω^2, ..., ω^k
5447
- // Each row is [count, v₀, v₁, ..., v_{k-1}, diag] representing count * (ω^k*diag + ω^{k-1}*v_{k-1} + ... + v₀)
5448
- Q._ordinalRowsForLevel = function(coeffs, count, maxRows) {
5449
- var rows = [];
5450
- var k = coeffs.length - 1;
5451
- var maxV0 = coeffs[0];
5452
-
5453
- // Generate ω^1 rows (level 0): [count, v₀, diag]
5454
- for (var diag = coeffs[0]; diag >= 1 && rows.length < maxRows; diag--) {
5455
- var maxV = (diag === coeffs[0]) ? maxV0 - 1 : maxV0;
5456
- for (var v = maxV; v >= 0 && rows.length < maxRows; v--) {
5457
- rows.push([count, v, diag]);
5458
- }
5459
- }
5460
-
5461
- if (k === 0) return rows;
5462
-
5463
- // Recursively generate higher-level rows
5464
- // depth: number of intermediate ω coefficients left to generate
5465
- // values: array of already-generated coefficients (v_level, v_{level-1}, ..., v₁)
5466
- // diag: the highest ω power coefficient
5467
- // level: the current max ω power level
5468
- function genHigher(depth, values, diag, level) {
5469
- if (rows.length >= maxRows) return;
5470
- if (depth === 0) {
5471
- // Generate v₀ (the constant term)
5472
- var allHigherMax = (diag === coeffs[level]);
5473
- for (var i = 0; i < values.length && allHigherMax; i++) {
5474
- if (values[i] < maxV0) allHigherMax = false;
5475
- }
5476
- var maxV = allHigherMax ? maxV0 - 1 : maxV0;
5477
- for (var v = maxV; v >= 0 && rows.length < maxRows; v--) {
5478
- var row = [count, v];
5479
- for (var i = values.length - 1; i >= 0; i--) row.push(values[i]);
5480
- row.push(diag);
5481
- rows.push(row);
5482
- }
5483
- } else {
5484
- for (var v = maxV0; v >= 0 && rows.length < maxRows; v--) {
5485
- var newValues = values.slice();
5486
- newValues.push(v);
5487
- genHigher(depth - 1, newValues, diag, level);
5488
- }
5489
- }
5490
- }
5491
-
5492
- // Generate rows for each higher ω power level
5493
- for (var level = k; level >= 1; level--) {
5494
- for (var diag = coeffs[level]; diag >= 1 && rows.length < maxRows; diag--) {
5495
- genHigher(level, [], diag, level);
5496
- }
5497
- }
5498
-
5499
- return rows;
5500
- };
5501
-
5502
- // Ordinal BEAF computation for 4+ arguments
5503
- Q._beafOrdinal = function(a, b, coeffs) {
5504
- var aNum = a.toNumber();
5505
- var bNum = b.toNumber();
5506
-
5507
- if (bNum === 2) {
5508
- var expanded = Q._expandForB2(coeffs, aNum);
5509
- coeffs = expanded.coeffs;
5510
- bNum = aNum;
5511
- b = new MetaNum(aNum);
5512
- }
5513
-
5514
- // When c=1 (coeffs[0] === 0) and b > 2, Rule 4 changes the formula:
5515
- // BEAF(a,b,1,d,...) = a(ω*(d-1)+...+(a-1)级运算)a
5516
- if (coeffs[0] === 0 && bNum > 2) {
5517
- coeffs[0] = aNum - 1;
5518
- bNum = aNum;
5519
- b = new MetaNum(aNum);
5520
- }
5521
-
5522
- var base = a.arrow(coeffs[0])(b);
5523
-
5524
- var count = bNum - 2;
5525
- if (count <= 0) return base;
5526
-
5527
- if (coeffs.length <= 1) return base;
5528
-
5529
- var upperCoeffs = coeffs.slice(1);
5530
- var maxRows = MetaNum.maxRows - 1;
5531
- var rows = Q._ordinalRowsForLevel(upperCoeffs, count, maxRows);
5532
-
5533
- var result = base.clone();
5534
- for (var i = 0; i < rows.length; i++) {
5535
- result.array.push(rows[i]);
5536
- }
5537
- result.normalize();
5538
- return result;
5539
- };
5540
-
5541
- // ==================== BEAF Array Notation ====================
5542
- // Bowers' Exploding Array Function: https://googology.fandom.com/wiki/Array_notation
5543
- // Rules:
5544
- // 1. {a} = a, {a,b} = a^b
5545
- // 2. {a,b,c,...,n,1} = {a,b,c,...,n}
5546
- // 3. {a,1,b,c,...,n} = a
5547
- // 4. {a,b,1,...,1,c,d,...,n} = {a,a,a,...,{a,b-1,1,...,1,c,d,...,n},c-1,d,...,n}
5548
- // 5. {a,b,c,d,...,n} = {a,{a,b-1,c,d,...,n},c-1,d,...,n}
5549
-
5550
- // Internal recursive BEAF computation
5551
- Q._beafRecursive = function(args, depth) {
5552
- if (depth === undefined) depth = 0;
5553
- if (depth > 500) return MetaNum.NaN.clone(); // safety limit
5554
- var len = args.length;
5555
- if (len === 0) return MetaNum.ONE.clone();
5556
- if (len === 1) return args[0].clone();
5557
- if (len === 2) return args[0].pow(args[1]);
5558
-
5559
- // Remove trailing 1s (Rule 2)
5560
- while (len > 2 && args[len - 1].eq(MetaNum.ONE)) { args.pop(); len--; }
5561
-
5562
- // After removing trailing 1s, re-check length
5563
- if (len <= 2) {
5564
- return len === 1 ? args[0].clone() : args[0].pow(args[1]);
5565
- }
5566
-
5567
- // 3-entry optimization: {a, b, c} = a{c}b (use hyperoperators)
5568
- if (len === 3) {
5569
- var c = args[2];
5570
- if (c.isint() && c.sign === 1) {
5571
- var cNum = c.toNumber();
5572
- if (isFinite(cNum) && cNum <= MetaNum.maxArrow) {
5573
- return args[0].arrow(c)(args[1]);
5574
- }
5575
- }
5576
- // Fall through to recursive computation for non-integer c
5577
- }
5578
-
5579
- // Rule 3: {a, 1, ...} = a
5580
- if (args[1].eq(MetaNum.ONE)) return args[0].clone();
5581
-
5582
- // 4+ arguments: use ordinal arithmetic instead of recursion
5583
- if (len >= 4) {
5584
- var coeffs = Q._buildOrdinalCoeffs(args);
5585
- return Q._beafOrdinal(args[0], args[1], coeffs);
5586
- }
5587
-
5588
- // Rule 4: {a, b, 1, ..., 1, c, d, ...}
5589
- if (args[2].eq(MetaNum.ONE)) {
5590
- var pilotIdx = 2;
5591
- while (pilotIdx < len && args[pilotIdx].eq(MetaNum.ONE)) pilotIdx++;
5592
- if (pilotIdx >= len) {
5593
- return args[0].pow(args[1]);
5594
- }
5595
- var c = args[pilotIdx];
5596
- var newArgs = [args[0].clone()];
5597
- for (var i = 1; i < pilotIdx - 1; i++) newArgs.push(args[0].clone());
5598
- var orig = args.map(function(x) { return x.clone(); });
5599
- orig[1] = args[1].sub(MetaNum.ONE);
5600
- newArgs.push(Q._beafRecursive(orig, depth + 1));
5601
- newArgs.push(c.sub(MetaNum.ONE));
5602
- for (var i = pilotIdx + 1; i < len; i++) newArgs.push(args[i].clone());
5603
- return Q._beafRecursive(newArgs, depth + 1);
5604
- }
5605
-
5606
- // Rule 5: {a, b, c, d, ...} = {a, BEAF(a, b-1, c, d, ...), c-1, d, ...}
5607
- var orig = args.map(function(x) { return x.clone(); });
5608
- orig[1] = args[1].sub(MetaNum.ONE);
5609
- var newArgs = [args[0].clone(), Q._beafRecursive(orig, depth + 1), args[2].sub(MetaNum.ONE)];
5610
- for (var i = 3; i < len; i++) newArgs.push(args[i].clone());
5611
- return Q._beafRecursive(newArgs, depth + 1);
5612
- };
5613
-
5614
- // Public BEAF function: MetaNum.BEAF(a, b, c, ...)
5615
- Q.BEAF = function() {
5616
- var args = Array.prototype.slice.call(arguments);
5617
- if (args.length > MetaNum.maxCols) {
5618
- throw Error(metaNumError + 'BEAF: too many arguments (max ' + MetaNum.maxCols + ')');
5619
- }
5620
- var metaArgs = args.map(function(a) { return new MetaNum(a); });
5621
- return Q._beafRecursive(metaArgs);
5622
- };
5623
-
5624
- // Parse BEAF string: {a,b,c,...}
5625
- Q.fromBeaf = function(str) {
5626
- if (typeof str !== 'string') return MetaNum.NaN.clone();
5627
- var s = str.trim();
5628
- if (s.charAt(0) !== '{' || s.charAt(s.length - 1) !== '}') {
5629
- return MetaNum.NaN.clone();
5630
- }
5631
- var inner = s.slice(1, -1).trim();
5632
- if (inner === '') return MetaNum.ONE.clone();
5633
- var parts = inner.split(',');
5634
- var args = [];
5635
- for (var i = 0; i < parts.length; i++) {
5636
- var val = Number(parts[i].trim());
5637
- if (!isFinite(val) || val < 1) return MetaNum.NaN.clone();
5638
- args.push(val);
5639
- }
5640
- return Q.BEAF.apply(null, args);
5641
- };
5642
-
5643
- // Convert to BEAF string: {a,b,c,...}
5644
- P.toBeaf = function() {
5645
- var x = this.clone().normalize();
5646
- if (x.isNaN()) return 'NaN';
5647
- if (x.layer === 0 && x.array.length === 1) {
5648
- if (x.eq(MetaNum.ZERO)) return '{0}';
5649
- return '{' + decimalPlaces(x.array[0][0], 6) + '}';
5650
- }
5651
- if (x.layer > 0 || x.array.length > 1) {
5652
- if (x.array.length === 2 && x.array[1].length >= 3) {
5653
- var row = x.array[1];
5654
- var diag = row[row.length - 1];
5655
- if (diag === 1 && row[0] === 1) {
5656
- var vals = row.slice(1, row.length - 1);
5657
- var allNonNegative = true;
5658
- for (var i = 0; i < vals.length; i++) {
5659
- if (vals[i] < 0) { allNonNegative = false; break; }
5660
- }
5661
- if (allNonNegative) {
5662
- var a = decimalPlaces(x.array[0][0], 6);
5663
- // Reconstruct BEAF: {a, ?, c, d+1, e+1, ...} from ordinal [1, c, d, e, ..., 1]
5664
- var beafParts = [a, '?'];
5665
- for (var i = 0; i < vals.length - 1; i++) {
5666
- beafParts.push(String(vals[i] + 1));
5667
- }
5668
- beafParts.push(String(vals[vals.length - 1] + 1));
5669
- return '{' + beafParts.join(', ') + '}';
5670
- }
5671
- }
5672
- }
5673
- }
5674
- return '{' + x.array.map(function(r) {
5675
- return '[' + r.map(function(v) { return decimalPlaces(v, 6); }).join(', ') + ']';
5676
- }).join(', ') + '}';
5677
- };
5678
-
5679
5035
  MetaNum = clone(MetaNum);
5680
5036
  MetaNum = defineConstants(MetaNum);
5681
5037
  MetaNum['default'] = MetaNum.MetaNum = MetaNum;