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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metanum",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "A javascript library that handles numbers as large as f_ε₀(9e15)",
5
5
  "main": "metanum.js",
6
6
  "scripts": {
@@ -36,7 +36,7 @@
36
36
 
37
37
  </div>
38
38
  <script src="./metanum.js"></script>
39
- <script type="module">
39
+ <script>
40
40
  // test in console
41
41
  console.log('=== MetaNum Library by dlsdl ===');
42
42
 
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 (sorted)", "AbAa100", [[100], [1,0,1],[1,1,1]]);
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 fundamental regression ===");
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=== 1-letter ordinal regression ===");
96
- checkRT("Aa10", "Aa10");
97
- checkRT("Ab5", "Ab5");
98
- checkRT("Ac100", "Ac100");
99
- checkRT("AaAa10", "AaAa10");
100
- checkRT("AbAb10", "AbAb10");
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
- console.log("\n=== Edge cases ===");
103
- checkRT("Ba1000000", "Ba1000000");
104
- checkRT("Aaa100", "Aaa100");
105
- checkRT("Aba100", "Aba100");
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 ===");