metanum 1.0.0 → 1.2.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 +157 -69
- package/metanum.js +5695 -3788
- package/package.json +1 -1
- package/test-interface.html +1 -1
- package/test_mixed.js +349 -16
package/package.json
CHANGED
package/test-interface.html
CHANGED
package/test_mixed.js
CHANGED
|
@@ -33,10 +33,11 @@ function checkRT(name, input) {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
console.log("=== New mixed token tests ===");
|
|
36
|
+
check("BbBbAaGGGFFE100 array", "BbBbAaGGGFFE100", [[100, 1, 2, 3], [1,0,1],[2,1,2]]);
|
|
36
37
|
check("QqQe308 array", "QqQe308", [[308], [1, 4, 17], [1, 16, 17]]);
|
|
37
38
|
check("AcAbAbAaAaAa114514 array", "AcAbAbAaAaAa114514", [[114514], [3, 0, 1], [2, 1, 1], [1, 2, 1]]);
|
|
38
39
|
check("AaAb100 array", "AaAb100", [[100], [1,0,1],[1,1,1]]);
|
|
39
|
-
check("AbAa100 array
|
|
40
|
+
check("AbAa100 array", "AbAa100", [[100], [1,0,1],[1,1,1]]);
|
|
40
41
|
|
|
41
42
|
console.log("\n=== Mixed token toString ===");
|
|
42
43
|
var m1 = MetaNum("QqQe308");
|
|
@@ -49,6 +50,11 @@ checkRT("QqQe308", "QqQe308");
|
|
|
49
50
|
checkRT("AcAbAbAaAaAa114514", "AcAbAbAaAaAa114514");
|
|
50
51
|
|
|
51
52
|
console.log("\n=== 2-letter regression ===");
|
|
53
|
+
checkRT("Aa10", "Aa10");
|
|
54
|
+
checkRT("Ab5", "Ab5");
|
|
55
|
+
checkRT("Ac100", "Ac100");
|
|
56
|
+
checkRT("AaAa10", "AaAa10");
|
|
57
|
+
checkRT("AbAb10", "AbAb10");
|
|
52
58
|
checkRT("Ba10", "Ba10");
|
|
53
59
|
checkRT("Ba1", "Ba1");
|
|
54
60
|
checkRT("BaBa10", "BaBa10");
|
|
@@ -59,19 +65,15 @@ checkRT("Ca10", "Ca10");
|
|
|
59
65
|
checkRT("Zz10", "Zz10");
|
|
60
66
|
checkRT("ZzZz10", "ZzZz10");
|
|
61
67
|
|
|
62
|
-
console.log("\n=== 3-letter
|
|
68
|
+
console.log("\n=== 3-letter regression ===");
|
|
63
69
|
checkRT("Aaa10", "Aaa10");
|
|
64
70
|
checkRT("Aaa1", "Aaa1");
|
|
65
71
|
checkRT("AaaAaa10", "AaaAaa10");
|
|
66
72
|
checkRT("Baa10", "Baa10");
|
|
67
73
|
checkRT("Zzz10", "Zzz10");
|
|
68
|
-
|
|
69
|
-
console.log("\n=== 3-letter standard regression ===");
|
|
70
74
|
checkRT("Aab10", "Aab10");
|
|
71
75
|
checkRT("Aac10", "Aac10");
|
|
72
76
|
checkRT("Abb10", "Abb10");
|
|
73
|
-
|
|
74
|
-
console.log("\n=== 3-letter diag regression ===");
|
|
75
77
|
checkRT("Aba10", "Aba10");
|
|
76
78
|
checkRT("Aba1", "Aba1");
|
|
77
79
|
checkRT("Aba2", "Aba2");
|
|
@@ -92,16 +94,347 @@ console.log("\n=== 5-letter regression ===");
|
|
|
92
94
|
checkRT("Aaaaa10", "Aaaaa10");
|
|
93
95
|
checkRT("Zzzzz10", "Zzzzz10");
|
|
94
96
|
|
|
95
|
-
console.log("\n===
|
|
96
|
-
checkRT("Aa10", "Aa10");
|
|
97
|
-
checkRT("
|
|
98
|
-
checkRT("
|
|
99
|
-
checkRT("
|
|
100
|
-
checkRT("
|
|
97
|
+
console.log("\n=== symbol+letters regression ===");
|
|
98
|
+
checkRT("!Aa10", "!Aa10"); //layer=1
|
|
99
|
+
checkRT("!Abcd10", "!Abcd10"); //layer=1
|
|
100
|
+
checkRT("@Ef10", "@Ef10"); //layer=2
|
|
101
|
+
checkRT("#Gh100", "#Gh100"); //layer=3
|
|
102
|
+
checkRT("1ε100", "1ε100"); //layer=100
|
|
103
|
+
checkRT("1ε"+Number.MAX_SAFE_INTEGER.toString(), "1ε"+Number.MAX_SAFE_INTEGER.toString()); //layer=MSI
|
|
101
104
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
|
|
106
|
+
// ─────────────────────────────────────
|
|
107
|
+
// 超运算 (Hyperoperations) 测试
|
|
108
|
+
// ─────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
function checkOp(label, result, expectedVal, tol) {
|
|
111
|
+
if (tol === undefined) tol = 0.01;
|
|
112
|
+
try {
|
|
113
|
+
var rn = result.toNumber ? result.toNumber() : result;
|
|
114
|
+
if (Number.isNaN(rn) && Number.isNaN(expectedVal)) {
|
|
115
|
+
console.log("PASS | " + label + " | NaN (expected)");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (Number.isFinite(rn) && Number.isFinite(expectedVal)) {
|
|
119
|
+
var ok = Math.abs(rn - expectedVal) <= tol;
|
|
120
|
+
console.log((ok ? "PASS" : "FAIL") + " | " + label + " | got=" + (result.toString ? result.toString().slice(0,40) : result) + " expected=" + expectedVal);
|
|
121
|
+
if (!ok) process.exitCode = 1;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
console.log("PASS | " + label + " | " + (result.toString ? result.toString().slice(0,60) : result));
|
|
125
|
+
} catch (e) {
|
|
126
|
+
console.log("ERROR | " + label + " => " + e.message);
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function checkBool(label, result, expected) {
|
|
132
|
+
try {
|
|
133
|
+
var pass = result === expected;
|
|
134
|
+
console.log((pass ? "PASS" : "FAIL") + " | " + label + " | got=" + result + " expected=" + expected);
|
|
135
|
+
if (!pass) process.exitCode = 1;
|
|
136
|
+
} catch (e) {
|
|
137
|
+
console.log("ERROR | " + label + " => " + e.message);
|
|
138
|
+
process.exitCode = 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
var m2 = MetaNum(2);
|
|
143
|
+
var m3 = MetaNum(3);
|
|
144
|
+
var m4 = MetaNum(4);
|
|
145
|
+
var m0 = MetaNum(0);
|
|
146
|
+
var m1 = MetaNum(1);
|
|
147
|
+
|
|
148
|
+
// ─── 1. aperiote (ω*2): x{y}x = arrow(x,y,x), arrow(y)(a,a)=a↑^y a ───
|
|
149
|
+
console.log("\n=== 1. aperiote (ω) ===");
|
|
150
|
+
// arrow(0): multiplication → 2*2=4, 3*3=9
|
|
151
|
+
// arrow(1): exponentiation → 2^2=4, 3^3=27
|
|
152
|
+
// arrow(2): tetration → 2↑↑2=4, 3↑↑3=3^27=7625597484987
|
|
153
|
+
checkOp("aper(2,0)", m2.aperiote(0), 4, 0);
|
|
154
|
+
checkOp("aper(2,1)", m2.aperiote(1), 4, 0);
|
|
155
|
+
checkOp("aper(2,2)", m2.aperiote(2), 4, 0);
|
|
156
|
+
checkOp("aper(3,0)", m3.aperiote(0), 9, 0);
|
|
157
|
+
checkOp("aper(3,1)", m3.aperiote(1), 27, 0);
|
|
158
|
+
checkBool("aper NaN", MetaNum.aperiote(m2, MetaNum.NaN).isNaN(), true);
|
|
159
|
+
checkBool("aper inv NaN", MetaNum.inv_aperiote(m2, MetaNum.NaN).isNaN(), true);
|
|
160
|
+
|
|
161
|
+
// ─── 2. expande (ω+1): x{{1}}y ───
|
|
162
|
+
console.log("\n=== 2. expande (ω+1) ===");
|
|
163
|
+
checkOp("expa(2,1)", m2.expande(1), 2, 0);
|
|
164
|
+
checkOp("expa(2,2)", m2.expande(2), 4, 0);
|
|
165
|
+
checkBool("expa y=0 NaN", m2.expande(0).isNaN(), true);
|
|
166
|
+
checkBool("expa NaN", MetaNum.expande(m2, MetaNum.NaN).isNaN(), true);
|
|
167
|
+
|
|
168
|
+
// ─── 3. multiexpande (ω+2): x{{2}}y ───
|
|
169
|
+
console.log("\n=== 3. multiexpande (ω+2) ===");
|
|
170
|
+
checkOp("muea(2,1)", m2.multiexpande(1), 2, 0);
|
|
171
|
+
checkOp("muea(2,2)", m2.multiexpande(2), 4, 0);
|
|
172
|
+
checkBool("muea y=0 NaN", m2.multiexpande(0).isNaN(), true);
|
|
173
|
+
checkBool("muea NaN", MetaNum.multiexpande(m2, MetaNum.NaN).isNaN(), true);
|
|
174
|
+
|
|
175
|
+
// ─── 4. powerexpande (ω+3): x{{3}}y ───
|
|
176
|
+
console.log("\n=== 4. powerexpande (ω+3) ===");
|
|
177
|
+
checkOp("poea(2,1)", m2.powerexpande(1), 2, 0);
|
|
178
|
+
checkOp("poea(2,2)", m2.powerexpande(2), 4, 0);
|
|
179
|
+
checkBool("poea y=0 NaN", m2.powerexpande(0).isNaN(), true);
|
|
180
|
+
checkBool("poea NaN", MetaNum.powerexpande(m2, MetaNum.NaN).isNaN(), true);
|
|
181
|
+
|
|
182
|
+
// ─── 5. aperioexpande (ω*2): x{{y}}x ───
|
|
183
|
+
console.log("\n=== 5. aperioexpande (ω*2) ===");
|
|
184
|
+
checkOp("apea(2,1)", m2.aperioexpande(1), 4, 0);
|
|
185
|
+
checkBool("apea NaN", MetaNum.aperioexpande(m2, MetaNum.NaN).isNaN(), true);
|
|
186
|
+
|
|
187
|
+
// ─── 6. explode (ω*2+1): x{{{1}}}y ───
|
|
188
|
+
console.log("\n=== 6. explode (ω*2+1) ===");
|
|
189
|
+
checkOp("expl(2,1)", m2.explode(1), 2, 0);
|
|
190
|
+
checkBool("expl y=0 NaN", m2.explode(0).isNaN(), true);
|
|
191
|
+
checkBool("expl NaN", MetaNum.explode(m2, MetaNum.NaN).isNaN(), true);
|
|
192
|
+
|
|
193
|
+
// ─── 7. multiexplode (ω*2+2): x{{{2}}}y ───
|
|
194
|
+
console.log("\n=== 7. multiexplode (ω*2+2) ===");
|
|
195
|
+
checkOp("muel(2,1)", m2.multiexplode(1), 2, 0);
|
|
196
|
+
checkBool("muel y=0 NaN", m2.multiexplode(0).isNaN(), true);
|
|
197
|
+
checkBool("muel NaN", MetaNum.multiexplode(m2, MetaNum.NaN).isNaN(), true);
|
|
198
|
+
|
|
199
|
+
// ─── 8. aperioexplode (ω*3): x{{{y}}}x ───
|
|
200
|
+
console.log("\n=== 8. aperioexplode (ω*3) ===");
|
|
201
|
+
checkOp("apel(2,1)", m2.aperioexplode(1), 4, 0);
|
|
202
|
+
checkBool("apel NaN", MetaNum.aperioexplode(m2, MetaNum.NaN).isNaN(), true);
|
|
203
|
+
|
|
204
|
+
// ─── 9. detonate (ω*3+1): x{{{{1}}}}y ───
|
|
205
|
+
console.log("\n=== 9. detonate (ω*3+1) ===");
|
|
206
|
+
checkOp("deto(2,1)", m2.detonate(1), 2, 0);
|
|
207
|
+
checkBool("deto y=0 NaN", m2.detonate(0).isNaN(), true);
|
|
208
|
+
checkBool("deto NaN", MetaNum.detonate(m2, MetaNum.NaN).isNaN(), true);
|
|
209
|
+
|
|
210
|
+
// ─── 10. aperiodetonate (ω*4): x{{{{y}}}}x ───
|
|
211
|
+
console.log("\n=== 10. aperiodetonate (ω*4) ===");
|
|
212
|
+
checkOp("apdt(2,1)", m2.aperiodetonate(1), 4, 0);
|
|
213
|
+
checkBool("apdt NaN", MetaNum.aperiodetonate(m2, MetaNum.NaN).isNaN(), true);
|
|
214
|
+
|
|
215
|
+
// ─── 11. aperionate (ω^2): 对角化 ω*y ───
|
|
216
|
+
console.log("\n=== 11. aperionate (ω^2) ===");
|
|
217
|
+
checkOp("apeo(2,1)", m2.aperionate(1), m2.aperiote(2).toNumber(), 0.01);
|
|
218
|
+
checkBool("apeo NaN", MetaNum.aperionate(m2, MetaNum.NaN).isNaN(), true);
|
|
219
|
+
|
|
220
|
+
// ─── 12. megote (ω^2+1): 迭代 ω^2 ───
|
|
221
|
+
console.log("\n=== 12. megote (ω^2+1) ===");
|
|
222
|
+
checkOp("mego(2,1)", m2.megote(1), 2, 0);
|
|
223
|
+
checkBool("mego y=0 NaN", m2.megote(0).isNaN(), true);
|
|
224
|
+
checkBool("mego NaN", MetaNum.megote(m2, MetaNum.NaN).isNaN(), true);
|
|
225
|
+
|
|
226
|
+
// ─── 13. multimegote (ω^2+2): 迭代 ω^2+1 ───
|
|
227
|
+
console.log("\n=== 13. multimegote (ω^2+2) ===");
|
|
228
|
+
checkOp("mume(2,1)", m2.multimegote(1), 2, 0);
|
|
229
|
+
checkBool("mume y=0 NaN", m2.multimegote(0).isNaN(), true);
|
|
230
|
+
checkBool("mume NaN", MetaNum.multimegote(m2, MetaNum.NaN).isNaN(), true);
|
|
231
|
+
|
|
232
|
+
// ─── 14. aperimegote (ω^2+ω): 对角化 ω^2+y ───
|
|
233
|
+
console.log("\n=== 14. aperimegote (ω^2+ω) ===");
|
|
234
|
+
checkOp("apmg(2,1)", m2.aperimegote(1), m2.megote(m2).toNumber(), 0.01);
|
|
235
|
+
checkBool("apmg NaN", MetaNum.aperimegote(m2, MetaNum.NaN).isNaN(), true);
|
|
236
|
+
|
|
237
|
+
// ─── 15. megoexpande (ω^2+ω+1): 迭代 ω^2+ω ───
|
|
238
|
+
console.log("\n=== 15. megoexpande (ω^2+ω+1) ===");
|
|
239
|
+
checkOp("mgea(2,1)", m2.megoexpande(1), 2, 0);
|
|
240
|
+
checkBool("mgea y=0 NaN", m2.megoexpande(0).isNaN(), true);
|
|
241
|
+
checkBool("mgea NaN", MetaNum.megoexpande(m2, MetaNum.NaN).isNaN(), true);
|
|
242
|
+
|
|
243
|
+
// ─── 16. aperimegoexpande (ω^2+ω*2): 对角化 ω^2+ω+y ───
|
|
244
|
+
console.log("\n=== 16. aperimegoexpande (ω^2+ω*2) ===");
|
|
245
|
+
checkOp("apme(2,1)", m2.aperimegoexpande(1), m2.megoexpande(m2).toNumber(), 0.01);
|
|
246
|
+
checkBool("apme NaN", MetaNum.aperimegoexpande(m2, MetaNum.NaN).isNaN(), true);
|
|
247
|
+
|
|
248
|
+
// ─── 17. megoaperionation (ω^2*2): 对角化 ω^2+ω*y ───
|
|
249
|
+
console.log("\n=== 17. megoaperionation (ω^2*2) ===");
|
|
250
|
+
checkBool("mgao NaN", MetaNum.megoaperionation(m2, MetaNum.NaN).isNaN(), true);
|
|
251
|
+
|
|
252
|
+
// ─── 18. gigote (ω^2*2+1): 迭代 ω^2*2 ───
|
|
253
|
+
console.log("\n=== 18. gigote (ω^2*2+1) ===");
|
|
254
|
+
checkOp("gigo(2,1)", m2.gigote(1), 2, 0);
|
|
255
|
+
checkBool("gigo y=0 NaN", m2.gigote(0).isNaN(), true);
|
|
256
|
+
checkBool("gigo NaN", MetaNum.gigote(m2, MetaNum.NaN).isNaN(), true);
|
|
257
|
+
|
|
258
|
+
// ─── 19. aperigigote (ω^2*2+ω): 对角化 ω^2*2+y ───
|
|
259
|
+
console.log("\n=== 19. aperigigote (ω^2*2+ω) ===");
|
|
260
|
+
checkOp("apgg(2,1)", m2.aperigigote(1), m2.gigote(m2).toNumber(), 0.01);
|
|
261
|
+
checkBool("apgg NaN", MetaNum.aperigigote(m2, MetaNum.NaN).isNaN(), true);
|
|
262
|
+
|
|
263
|
+
// ─── 20. gigoaperionate (ω^2*3): 对角化 ω^2*2+ω*y ───
|
|
264
|
+
console.log("\n=== 20. gigoaperionate (ω^2*3) ===");
|
|
265
|
+
checkOp("ggap(2,1)", m2.gigoaperionate(1), 2, 0);
|
|
266
|
+
checkBool("ggap y=0 NaN", m2.gigoaperionate(0).isNaN(), true);
|
|
267
|
+
checkBool("ggap NaN", MetaNum.gigoaperionate(m2, MetaNum.NaN).isNaN(), true);
|
|
268
|
+
|
|
269
|
+
// ─── 21. aperiatotion (ω^3): 对角化 ω^2*y ───
|
|
270
|
+
console.log("\n=== 21. aperiatotion (ω^3) ===");
|
|
271
|
+
checkOp("apat(2,1)", m2.aperiatotion(1), m2.aperionate(m2).toNumber(), 0.01);
|
|
272
|
+
checkBool("apat NaN", MetaNum.aperiatotion(m2, MetaNum.NaN).isNaN(), true);
|
|
273
|
+
|
|
274
|
+
// ─── 22. powiainate (ω^3+1): 迭代 ω^3 ───
|
|
275
|
+
console.log("\n=== 22. powiainate (ω^3+1) ===");
|
|
276
|
+
checkOp("pwan(2,1)", m2.powiainate(1), 2, 0);
|
|
277
|
+
checkBool("pwan y=0 NaN", m2.powiainate(0).isNaN(), true);
|
|
278
|
+
checkBool("pwan NaN", MetaNum.powiainate(m2, MetaNum.NaN).isNaN(), true);
|
|
279
|
+
|
|
280
|
+
// ─── 23. expandainate (ω^3+ω): ω级别迭代 powiainate ───
|
|
281
|
+
console.log("\n=== 23. expandainate (ω^3+ω) ===");
|
|
282
|
+
checkOp("epan(2,1)", m2.expandainate(1), m2.powiainate(m2).toNumber(), 0.01);
|
|
283
|
+
checkBool("epan NaN", MetaNum.expandainate(m2, MetaNum.NaN).isNaN(), true);
|
|
284
|
+
|
|
285
|
+
// ─── 24. megodainate (ω^3+ω^2): 迭代 ω^3+ω ───
|
|
286
|
+
console.log("\n=== 24. megodainate (ω^3+ω^2) ===");
|
|
287
|
+
checkOp("mgan(2,1)", m2.megodainate(1), 2, 0);
|
|
288
|
+
checkBool("mgan y=0 NaN", m2.megodainate(0).isNaN(), true);
|
|
289
|
+
checkBool("mgan NaN", MetaNum.megodainate(m2, MetaNum.NaN).isNaN(), true);
|
|
290
|
+
|
|
291
|
+
// ─── 25. powiairate (ω^3*2) ───
|
|
292
|
+
console.log("\n=== 25. powiairate (ω^3*2) ===");
|
|
293
|
+
checkOp("pwar(2,1)", m2.powiairate(1), 2, 0);
|
|
294
|
+
checkBool("pwar y=0 NaN", m2.powiairate(0).isNaN(), true);
|
|
295
|
+
checkBool("pwar NaN", MetaNum.powiairate(m2, MetaNum.NaN).isNaN(), true);
|
|
296
|
+
|
|
297
|
+
// ─── 26. aperioguate (ω^4): 对角化 ω^3*y ───
|
|
298
|
+
console.log("\n=== 26. aperioguate (ω^4) ===");
|
|
299
|
+
checkOp("apgu(2,1)", m2.aperioguate(1), m2.aperiatotion(m2).toNumber(), 0.01);
|
|
300
|
+
checkBool("apgu NaN", MetaNum.aperioguate(m2, MetaNum.NaN).isNaN(), true);
|
|
301
|
+
|
|
302
|
+
// ─── 27. iter (ω^ω): 对角化 ω^x ───
|
|
303
|
+
console.log("\n=== 27. iter (ω^ω) ===");
|
|
304
|
+
checkOp("ite(2,1)", m2.iter(1), 2, 0);
|
|
305
|
+
checkBool("ite y=0 NaN", m2.iter(0).isNaN(), true);
|
|
306
|
+
checkBool("ite NaN", MetaNum.iter(m2, MetaNum.NaN).isNaN(), true);
|
|
307
|
+
|
|
308
|
+
// ─── 28. itermult (ω^ω+1): 迭代 ω^ω ───
|
|
309
|
+
console.log("\n=== 28. itermult (ω^ω+1) ===");
|
|
310
|
+
checkOp("itmu(2,1)", m2.itermult(1), m2.iter(m2).toNumber(), 0.01);
|
|
311
|
+
checkBool("itmu y=0 NaN", m2.itermult(0).isNaN(), true);
|
|
312
|
+
checkBool("itmu NaN", MetaNum.itermult(m2, MetaNum.NaN).isNaN(), true);
|
|
313
|
+
|
|
314
|
+
// ─── 29. cuboiter (ω^ω*2) ───
|
|
315
|
+
console.log("\n=== 29. cuboiter (ω^ω*2) ===");
|
|
316
|
+
checkOp("cube(2,1)", m2.cuboiter(1), 2, 0);
|
|
317
|
+
checkBool("cube NaN", MetaNum.cuboiter(m2, MetaNum.NaN).isNaN(), true);
|
|
318
|
+
|
|
319
|
+
// ─── 30. expoiter (ω^(ω+1)) ───
|
|
320
|
+
console.log("\n=== 30. expoiter (ω^(ω+1)) ===");
|
|
321
|
+
checkOp("expo(2,1)", m2.expoiter(1), m2.iter(m2).toNumber(), 0.01);
|
|
322
|
+
checkBool("expo NaN", MetaNum.expoiter(m2, MetaNum.NaN).isNaN(), true);
|
|
323
|
+
|
|
324
|
+
// ─── 31. trioterate (ω^(ω*2)) ───
|
|
325
|
+
console.log("\n=== 31. trioterate (ω^(ω*2)) ===");
|
|
326
|
+
checkOp("tria(2,1)", m2.trioterate(1), m2.iter(m2).toNumber(), 0.01);
|
|
327
|
+
checkBool("tria NaN", MetaNum.trioterate(m2, MetaNum.NaN).isNaN(), true);
|
|
328
|
+
|
|
329
|
+
// ─── 32. trixxate (ω^(ω^2)) ───
|
|
330
|
+
console.log("\n=== 32. trixxate (ω^(ω^2)) ===");
|
|
331
|
+
checkOp("trix(2,1)", m2.trixxate(1), m2.trioterate(m2).toNumber(), 0.01);
|
|
332
|
+
checkBool("trix NaN", MetaNum.trixxate(m2, MetaNum.NaN).isNaN(), true);
|
|
333
|
+
|
|
334
|
+
// ─── 33. aperixxate (ω^(ω^ω)) ───
|
|
335
|
+
console.log("\n=== 33. aperixxate (ω^(ω^ω)) ===");
|
|
336
|
+
checkOp("apix(2,1)", m2.aperixxate(1), m2.trixxate(m2).toNumber(), 0.01);
|
|
337
|
+
checkBool("apix NaN", MetaNum.aperixxate(m2, MetaNum.NaN).isNaN(), true);
|
|
338
|
+
|
|
339
|
+
// ─── 34. epsilonate (ε₀) ───
|
|
340
|
+
console.log("\n=== 34. epsilonate (ε₀) ===");
|
|
341
|
+
checkOp("epsl(2,1)", m2.epsilonate(1), m2.aperixxate(m2).toNumber(), 0.01);
|
|
342
|
+
checkBool("epsl NaN", MetaNum.epsilonate(m2, MetaNum.NaN).isNaN(), true);
|
|
343
|
+
|
|
344
|
+
// ─────────────────────────────────────
|
|
345
|
+
// 逆运算 语义验证 (pentate_log/root + 通用)
|
|
346
|
+
// ─────────────────────────────────────
|
|
347
|
+
console.log("\n=== 逆运算 语义验证 ===");
|
|
348
|
+
|
|
349
|
+
// pentate_log: if pentate(a,b)=c then pentate_log(c,a)=b
|
|
350
|
+
checkOp("pent_log semantic 2^3", MetaNum.pentate(2,3).pentate_log(2), 3, 0.1);
|
|
351
|
+
checkOp("pent_log semantic 3^2", MetaNum.pentate(3,2).pentate_log(3), 2, 0.1);
|
|
352
|
+
|
|
353
|
+
// pentate_root: if pentate(a,b)=c then pentate_root(c,b)≈a
|
|
354
|
+
checkOp("pent_root semantic b=2", MetaNum.pentate_root(MetaNum.pentate(3,2), 2), 3, 0.1);
|
|
355
|
+
checkOp("pent_root semantic b=3", MetaNum.pentate_root(MetaNum.pentate(2,3), 3), 2, 0.1);
|
|
356
|
+
|
|
357
|
+
// Same-value tests: op(x,1) produces reasonable results
|
|
358
|
+
var ops = [
|
|
359
|
+
"aperiote","expande","multiexpande","powerexpande","aperioexpande",
|
|
360
|
+
"explode","multiexplode","aperioexplode","detonate","aperiodetonate",
|
|
361
|
+
"aperionate","megote","multimegote","aperimegote","megoexpande",
|
|
362
|
+
"aperimegoexpande","megoaperionation","gigote","aperigigote","gigoaperionate",
|
|
363
|
+
"aperiatotion","powiainate","expandainate","megodainate","powiairate","aperioguate","iter",
|
|
364
|
+
"itermult","cuboiter","expoiter","trioterate","trixxate","aperixxate","epsilonate"
|
|
365
|
+
];
|
|
366
|
+
|
|
367
|
+
console.log("\n=== 全运算 x=3, y=2 冒烟测试 ===");
|
|
368
|
+
for (var oi = 0; oi < ops.length; oi++) {
|
|
369
|
+
try {
|
|
370
|
+
var res = m3[ops[oi]](2);
|
|
371
|
+
console.log("PASS | " + ops[oi] + "(3,2) | " + res.toString().slice(0,60));
|
|
372
|
+
} catch (e) {
|
|
373
|
+
console.log("FAIL | " + ops[oi] + "(3,2) => " + e.message);
|
|
374
|
+
process.exitCode = 1;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
console.log("\n=== 全运算 x=3, y=1 边界测试 ===");
|
|
379
|
+
for (var oi = 0; oi < ops.length; oi++) {
|
|
380
|
+
try {
|
|
381
|
+
var res = m3[ops[oi]](1);
|
|
382
|
+
console.log("PASS | " + ops[oi] + "(3,1) | " + res.toString().slice(0,60));
|
|
383
|
+
} catch (e) {
|
|
384
|
+
console.log("FAIL | " + ops[oi] + "(3,1) => " + e.message);
|
|
385
|
+
process.exitCode = 1;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Static Q 方法测试
|
|
390
|
+
console.log("\n=== Static Q 方法 ===");
|
|
391
|
+
var qOps = {
|
|
392
|
+
"aperiote": ["aperiote","aper"], "expande": ["expande","expa"],
|
|
393
|
+
"multiexpande": ["multiexpande","muea"], "powerexpande": ["powerexpande","poea"],
|
|
394
|
+
"aperioexpande": ["aperioexpande","apea"], "explode": ["explode","expl"],
|
|
395
|
+
"multiexplode": ["multiexplode","muel"], "aperioexplode": ["aperioexplode","apel"],
|
|
396
|
+
"detonate": ["detonate","deto"], "aperiodetonate": ["aperiodetonate","apdt"],
|
|
397
|
+
"aperionate": ["aperionate","apeo"], "megote": ["megote","mego"],
|
|
398
|
+
"multimegote": ["multimegote","mume"], "aperimegote": ["aperimegote","apmg"],
|
|
399
|
+
"megoexpande": ["megoexpande","mgea"], "aperimegoexpande": ["aperimegoexpande","apme"],
|
|
400
|
+
"megoaperionation": ["megoaperionation","mgao"], "gigote": ["gigote","gigo"],
|
|
401
|
+
"aperigigote": ["aperigigote","apgg"], "gigoaperionate": ["gigoaperionate","ggap"],
|
|
402
|
+
"aperiatotion": ["aperiatotion","apat"], "powiainate": ["powiainate","pwan"],
|
|
403
|
+
"expandainate": ["expandainate","epan"], "megodainate": ["megodainate","mgan"],
|
|
404
|
+
"powiairate": ["powiairate","pwar"], "aperioguate": ["aperioguate","apgu"],
|
|
405
|
+
"iter": ["iter","ite"],
|
|
406
|
+
"itermult": ["itermult","itmu"], "cuboiter": ["cuboiter","cube"],
|
|
407
|
+
"expoiter": ["expoiter","expo"], "trioterate": ["trioterate","tria"],
|
|
408
|
+
"trixxate": ["trixxate","trix"], "aperixxate": ["aperixxate","apix"],
|
|
409
|
+
"epsilonate": ["epsilonate","epsl"]
|
|
410
|
+
};
|
|
411
|
+
for (var key in qOps) {
|
|
412
|
+
var f = MetaNum[key]; var s = MetaNum[qOps[key][1]];
|
|
413
|
+
try {
|
|
414
|
+
var rf = f(2, 2);
|
|
415
|
+
var rs = s(2, 2);
|
|
416
|
+
var ok = rf.eq(rs);
|
|
417
|
+
console.log((ok ? "PASS" : "FAIL") + " | Q." + key + "(2,2)==Q." + qOps[key][1] + "(2,2)");
|
|
418
|
+
if (!ok) { console.log(" full=" + rf.toString() + " short=" + rs.toString()); process.exitCode = 1; }
|
|
419
|
+
} catch (e) {
|
|
420
|
+
console.log("ERROR | Q." + key + " => " + e.message);
|
|
421
|
+
process.exitCode = 1;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// 逆运算 roundtrip: op(x,2) → inv → 应该 ≈ x
|
|
426
|
+
console.log("\n=== 逆运算 roundtrip ===");
|
|
427
|
+
for (var oi = 0; oi < ops.length; oi++) {
|
|
428
|
+
var opname = ops[oi];
|
|
429
|
+
try {
|
|
430
|
+
var fwd = m3[opname](2);
|
|
431
|
+
var invname = "inv_" + opname;
|
|
432
|
+
var back = fwd[invname](fwd);
|
|
433
|
+
console.log("PASS | " + invname + " | fwd=" + fwd.toString().slice(0,40) + " back=" + back.toString().slice(0,40));
|
|
434
|
+
} catch (e) {
|
|
435
|
+
console.log("FAIL | inv_" + opname + " => " + e.message);
|
|
436
|
+
process.exitCode = 1;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
106
439
|
|
|
107
440
|
console.log("\n=== Done ===");
|