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/README.md +9 -6
- package/format-metanum.js +972 -0
- package/metanum.js +1197 -1841
- package/package.json +1 -1
- package/test-interface.html +38 -0
- package/test_mixed.js +525 -206
package/metanum.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
//Author: dlsdl v1.
|
|
2
|
-
//Add
|
|
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
|
-
|
|
852
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1408
|
-
if (
|
|
1409
|
-
if (
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
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 (
|
|
1752
|
-
|
|
1753
|
-
for (var i =
|
|
1754
|
-
var row =
|
|
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
|
-
|
|
1757
|
-
|
|
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
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
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 (
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
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
|
-
//
|
|
1834
|
-
for (var i =
|
|
1835
|
-
var row =
|
|
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 (
|
|
1896
|
-
|
|
1897
|
-
for (var i =
|
|
1898
|
-
var row =
|
|
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
|
-
|
|
1907
|
-
|
|
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 (
|
|
1962
|
-
|
|
1963
|
-
for (var i =
|
|
1964
|
-
var row =
|
|
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
|
-
|
|
1973
|
-
|
|
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
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
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 (
|
|
1996
|
-
if (y.eq(
|
|
1997
|
-
if (y.
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
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
|
-
|
|
2049
|
-
|
|
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
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
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
|
|
2181
|
+
return Q._invHyperopFromOrdinal(x, z, [0,2]);
|
|
2079
2182
|
};
|
|
2080
|
-
|
|
2081
|
-
|
|
2183
|
+
|
|
2184
|
+
// explode = ω*2 + 1 → coeffs [1,2]
|
|
2082
2185
|
P.explode = P.expl = P.h21 = function (y) {
|
|
2083
|
-
|
|
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
|
|
2189
|
+
return Q._hyperopFromOrdinal(x, y, [1,2]);
|
|
2115
2190
|
};
|
|
2116
|
-
|
|
2117
2191
|
P.inv_explode = P.i_expl = P.i21 = function (z) {
|
|
2118
|
-
|
|
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
|
|
2195
|
+
return Q._invHyperopFromOrdinal(x, z, [1,2]);
|
|
2148
2196
|
};
|
|
2149
2197
|
|
|
2150
|
-
|
|
2198
|
+
// multiexplode = ω*2 + 2 → coeffs [2,2]
|
|
2151
2199
|
P.multiexplode = P.muel = P.h22 = function (y) {
|
|
2152
|
-
|
|
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
|
|
2203
|
+
return Q._hyperopFromOrdinal(x, y, [2,2]);
|
|
2184
2204
|
};
|
|
2185
|
-
|
|
2186
2205
|
P.inv_multiexplode = P.i_muel = P.i22 = function (z) {
|
|
2187
|
-
|
|
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
|
|
2209
|
+
return Q._invHyperopFromOrdinal(x, z, [2,2]);
|
|
2217
2210
|
};
|
|
2218
|
-
|
|
2219
|
-
|
|
2211
|
+
|
|
2212
|
+
// aperioexplode = ω*3 → coeffs [0,3]
|
|
2220
2213
|
P.aperioexplode = P.apel = P.h30 = function (y) {
|
|
2221
|
-
|
|
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
|
|
2217
|
+
return Q._hyperopFromOrdinal(x, y, [0,3]);
|
|
2252
2218
|
};
|
|
2253
|
-
|
|
2254
2219
|
P.inv_aperioexplode = P.i_apel = P.i30 = function (z) {
|
|
2255
|
-
|
|
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
|
|
2223
|
+
return Q._invHyperopFromOrdinal(x, z, [0,3]);
|
|
2285
2224
|
};
|
|
2286
|
-
|
|
2287
|
-
|
|
2225
|
+
|
|
2226
|
+
// detonate = ω*3 + 1 → coeffs [1,3]
|
|
2288
2227
|
P.detonate = P.deto = P.h31 = function (y) {
|
|
2289
|
-
|
|
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
|
|
2231
|
+
return Q._hyperopFromOrdinal(x, y, [1,3]);
|
|
2321
2232
|
};
|
|
2322
|
-
|
|
2323
2233
|
P.inv_detonate = P.i_deto = P.i31 = function (z) {
|
|
2324
|
-
|
|
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
|
|
2237
|
+
return Q._invHyperopFromOrdinal(x, z, [1,3]);
|
|
2354
2238
|
};
|
|
2355
|
-
|
|
2356
|
-
|
|
2239
|
+
|
|
2240
|
+
// aperiodetonate = ω*4 → coeffs [0,4]
|
|
2357
2241
|
P.aperiodetonate = P.apdt = P.h40 = function (y) {
|
|
2358
|
-
|
|
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
|
|
2245
|
+
return Q._hyperopFromOrdinal(x, y, [0,4]);
|
|
2388
2246
|
};
|
|
2389
|
-
|
|
2390
2247
|
P.inv_aperiodetonate = P.i_apdt = P.i40 = function (z) {
|
|
2391
|
-
|
|
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
|
|
2251
|
+
return Q._invHyperopFromOrdinal(x, z, [0,4]);
|
|
2421
2252
|
};
|
|
2422
2253
|
|
|
2423
|
-
|
|
2424
|
-
P.aperionate = P.apeo = P.h100 =function (y) {
|
|
2425
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2265
|
+
return Q._invHyperopFromOrdinal(x, z, [0,0,1]);
|
|
2490
2266
|
};
|
|
2491
2267
|
|
|
2492
|
-
|
|
2268
|
+
// megote = ω² + 1 → coeffs [1,0,1]
|
|
2493
2269
|
P.megote = P.mego = P.h101 = function (y) {
|
|
2494
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2279
|
+
return Q._invHyperopFromOrdinal(x, z, [1,0,1]);
|
|
2559
2280
|
};
|
|
2560
2281
|
|
|
2561
|
-
|
|
2282
|
+
// multimegote = ω² + 2 → coeffs [2,0,1]
|
|
2562
2283
|
P.multimegote = P.mume = P.h102 = function (y) {
|
|
2563
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2293
|
+
return Q._invHyperopFromOrdinal(x, z, [2,0,1]);
|
|
2628
2294
|
};
|
|
2629
2295
|
|
|
2630
|
-
//
|
|
2296
|
+
// aperimegote = ω² + ω → coeffs [0,1,1]
|
|
2631
2297
|
P.aperimegote = P.apmg = P.h110 = function (y) {
|
|
2632
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2307
|
+
return Q._invHyperopFromOrdinal(x, z, [0,1,1]);
|
|
2695
2308
|
};
|
|
2696
2309
|
|
|
2697
|
-
// megoexpande
|
|
2310
|
+
// megoexpande = ω² + ω + 1 → coeffs [1,1,1]
|
|
2698
2311
|
P.megoexpande = P.mgea = P.h111 = function (y) {
|
|
2699
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2321
|
+
return Q._invHyperopFromOrdinal(x, z, [1,1,1]);
|
|
2764
2322
|
};
|
|
2765
2323
|
|
|
2766
|
-
//aperimegoexpande
|
|
2324
|
+
// aperimegoexpande = ω² + ω*2 → coeffs [0,2,1]
|
|
2767
2325
|
P.aperimegoexpande = P.apme = P.h120 = function (y) {
|
|
2768
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2335
|
+
return Q._invHyperopFromOrdinal(x, z, [0,2,1]);
|
|
2831
2336
|
};
|
|
2832
2337
|
|
|
2833
|
-
|
|
2834
|
-
// megoaperionation
|
|
2835
|
-
P.
|
|
2836
|
-
|
|
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.
|
|
2867
|
-
return
|
|
2343
|
+
Q.megoaperionate = Q.mgao = Q.h200 = function (x, y) {
|
|
2344
|
+
return Q._hyperopFromOrdinal(x, y, [0,0,2]);
|
|
2868
2345
|
};
|
|
2869
|
-
|
|
2870
|
-
|
|
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.
|
|
2900
|
-
return
|
|
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
|
|
2353
|
+
// gigote = ω²*2 + 1 → coeffs [1,0,2]
|
|
2904
2354
|
P.gigote = P.gigo = P.h201 = function (y) {
|
|
2905
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2364
|
+
return Q._invHyperopFromOrdinal(x, z, [1,0,2]);
|
|
2970
2365
|
};
|
|
2971
2366
|
|
|
2972
|
-
//aperigigote
|
|
2367
|
+
// aperigigote = ω²*2 + ω → coeffs [0,1,2]
|
|
2973
2368
|
P.aperigigote = P.apgg = P.h210 = function (y) {
|
|
2974
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2378
|
+
return Q._invHyperopFromOrdinal(x, z, [0,1,2]);
|
|
3037
2379
|
};
|
|
3038
2380
|
|
|
3039
|
-
//gigoaperionate
|
|
2381
|
+
// gigoaperionate = ω²*3 → coeffs [0,0,3]
|
|
3040
2382
|
P.gigoaperionate = P.ggap = P.h300 = function (y) {
|
|
3041
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2392
|
+
return Q._invHyperopFromOrdinal(x, z, [0,0,3]);
|
|
3106
2393
|
};
|
|
3107
2394
|
|
|
3108
|
-
//
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
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.
|
|
3140
|
-
return
|
|
2400
|
+
Q.aperiatote = Q.apat = Q.h1000 = function (x, y) {
|
|
2401
|
+
return Q._hyperopFromOrdinal(x, y, [0,0,0,1]);
|
|
3141
2402
|
};
|
|
3142
|
-
|
|
3143
|
-
|
|
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.
|
|
3173
|
-
return
|
|
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
|
|
2410
|
+
// powiainate = ω³ + 1 → coeffs [1,0,0,1]
|
|
3177
2411
|
P.powiainate = P.pwan = P.h1001 = function (y) {
|
|
3178
|
-
|
|
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
|
|
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
|
-
|
|
3276
|
-
return
|
|
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
|
-
|
|
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
|
|
2435
|
+
return Q._invHyperopFromOrdinal(x, z, [0,1,0,1]);
|
|
3310
2436
|
};
|
|
3311
2437
|
|
|
3312
|
-
//megodainate
|
|
2438
|
+
// megodainate = ω³ + ω² → coeffs [0,0,1,1]
|
|
3313
2439
|
P.megodainate = P.mgan = P.h1100 = function (y) {
|
|
3314
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2449
|
+
return Q._invHyperopFromOrdinal(x, z, [0,0,1,1]);
|
|
3379
2450
|
};
|
|
3380
2451
|
|
|
3381
|
-
//powiairate
|
|
2452
|
+
// powiairate = ω³*2 → coeffs [0,0,0,2]
|
|
3382
2453
|
P.powiairate = P.pwar = P.h2000 = function (y) {
|
|
3383
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
2463
|
+
return Q._invHyperopFromOrdinal(x, z, [0,0,0,2]);
|
|
3448
2464
|
};
|
|
3449
2465
|
|
|
3450
|
-
//aperioguate
|
|
2466
|
+
// aperioguate = ω⁴ → coeffs [0,0,0,0,1]
|
|
3451
2467
|
P.aperioguate = P.apgu = P.h10000 = function (y) {
|
|
3452
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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).
|
|
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 (
|
|
3580
|
-
|
|
3581
|
-
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
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
|
|
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).
|
|
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 (
|
|
3636
|
-
var result =
|
|
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 (
|
|
3691
|
-
|
|
3692
|
-
|
|
3693
|
-
|
|
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 (
|
|
3744
|
-
|
|
3745
|
-
for (var i =
|
|
3746
|
-
var row =
|
|
3747
|
-
if (row.length >= 3 && row[2] === 1 && row[0]
|
|
3748
|
-
|
|
3749
|
-
|
|
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
|
|
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 (
|
|
3798
|
-
|
|
3799
|
-
for (var i =
|
|
3800
|
-
var row =
|
|
3801
|
-
if (row.length >=
|
|
3802
|
-
|
|
3803
|
-
|
|
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
|
|
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 (
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
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 (
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
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 =
|
|
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 =
|
|
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 (
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
|
|
3950
|
-
|
|
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
|
|
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{" +
|
|
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")
|
|
4502
|
-
|
|
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" ?
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5206
|
-
|
|
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
|
-
|
|
5313
|
-
|
|
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
|
|
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
|
|
5334
|
-
|
|
5335
|
-
|
|
5336
|
-
|
|
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',
|
|
5405
|
-
'maxCols',
|
|
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;
|