metanum 1.1.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.
Files changed (4) hide show
  1. package/README.md +151 -55
  2. package/metanum.js +718 -39
  3. package/package.json +1 -1
  4. package/test_mixed.js +43 -2
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![NPM](https://img.shields.io/npm/v/metanum.svg)](https://www.npmjs.com/package/metanum)
4
4
 
5
- - MetaNum v1.1 by dlsdl
5
+ - MetaNum v1.2 by dlsdl
6
6
 
7
7
  A huge number library holding up to X↑↑X&9e15.
8
8
 
@@ -171,61 +171,112 @@ new MetaNum(10).layeradd10(3); // 10^^3 (explicit base 10)
171
171
 
172
172
  ## Diagonalization / Expansion Hierarchy
173
173
 
174
- These functions represent iterated diagonalizations at increasing ordinal levels:
174
+ These functions represent iterated diagonalizations at increasing ordinal levels from ω to ε₀:
175
175
 
176
176
  ```javascript
177
177
  const x = new MetaNum(10);
178
178
 
179
- // Level ω+1: iterate aperiate
180
- x.expande(3); // expande(x, 3) = iterated aperiate
179
+ // Level ω: diagonalize ω*y (→ a↑^a a)
180
+ x.aperiote(3); // aper(3) = h10
181
181
 
182
- // Level ω*2+1: iterate expande
183
- x.multiexpande(3); // multiexpande(x, 3)
182
+ // Level ω+1: iterate aperiote
183
+ x.expande(3); // expa(3) = h11
184
184
 
185
- // Level ω*3+1: iterate multiexpande
186
- x.powerexpande(3);
185
+ // Level ω+2: iterate expande
186
+ x.multiexpande(3); // muea(3) = h12
187
187
 
188
- // Level ω^ω: diagonalize ω^x operations
189
- x.aperioexpansion(3); // apea(x, 3)
188
+ // Level ω+3: iterate multiexpande
189
+ x.powerexpande(3); // poea(3) = h13
190
190
 
191
- // Level ω^ω+1: iterate aperioexpansion
192
- x.explode(3); // expl(x, 3)
191
+ // Level ω*2: diagonalize ω+y
192
+ x.aperioexpande(3); // apea(3) = h20
193
193
 
194
- // Level ω^ω*2: diagonalize explode iterations
195
- x.multiexplode(3); // muel(x, 3)
194
+ // Level ω*2+1: iterate aperioexpande
195
+ x.explode(3); // expl(3) = h21
196
196
 
197
- // Level ω^(ω+1): diagonalize ω^ω*y
198
- x.aperioexplode(3); // apel(x, 3)
197
+ // Level ω*2+2: iterate explode
198
+ x.multiexplode(3); // muel(3) = h22
199
199
 
200
- // Level ω^(ω+1)+1: iterate aperioexplode
201
- x.detonate(3); // deto(x, 3)
200
+ // Level ω*3: diagonalize ω*2+y
201
+ x.aperioexplode(3); // apel(3) = h30
202
202
 
203
- // Level ω^(ω*2): diagonalize ω^(ω+1)*y
204
- x.aperionate(3); // apeo(x, 3)
203
+ // Level ω*3+1: iterate aperioexplode
204
+ x.detonate(3); // deto(3) = h31
205
205
 
206
- // Level ω^(ω*2)+1: iterate aperionate
207
- x.megote(3); // mego(x, 3)
206
+ // Level ω*4: diagonalize ω*3+y
207
+ x.aperiodetonate(3); // apdt(3) = h40
208
208
 
209
- // Level ω^(ω*2+ω): diagonalize ω^(ω*2)*y
210
- x.aperimegote(3); // apmg(x, 3)
209
+ // Level ω^2: diagonalize ω*y
210
+ x.aperionate(3); // apeo(3) = h100
211
211
 
212
- // Level ω^(ω*2+ω)+1: iterate aperimegote
213
- x.megoexpande(3); // mgea(x, 3)
212
+ // Level ω^2+1: iterate aperionate
213
+ x.megote(3); // mego(3) = h101
214
214
 
215
- // Level ω^(ω^2): diagonalize ω^(ω*2)
216
- x.megoaperionation(3); // mgao(x, 3)
215
+ // Level ω^2+2: iterate megote
216
+ x.multimegote(3); // mume(3) = h102
217
217
 
218
- // Level ω^(ω^2)+1: iterate megoaperionation
219
- x.gigote(3); // gigo(x, 3)
218
+ // Level ω^2+ω: diagonalize ω^2+y
219
+ x.aperimegote(3); // apmg(3) = h110
220
220
 
221
- // Level ω^(ω^3): diagonalize ω^(ω^2)*y
222
- x.aperiatotion(3); // apat(x, 3)
221
+ // Level ω^2+ω+1: iterate aperimegote
222
+ x.megoexpande(3); // mgea(3) = h111
223
223
 
224
- // Level ω^(ω^3)+1: iterate aperiatotion
225
- x.powiainate(3); // pwan(x, 3)
224
+ // Level ω^2+ω*2: diagonalize ω^2+ω+y
225
+ x.aperimegoexpande(3); // apme(3) = h120
226
226
 
227
- // Level ω^(ω^ω): universal diagonalizer (generalizes to arbitrary ordinals)
228
- x.iter(3); // iter(x, 3)
227
+ // Level ω^2*2: diagonalize ω^2+ω*y
228
+ x.megoaperionation(3); // mgao(3) = h200
229
+
230
+ // Level ω^2*2+1: iterate megoaperionation
231
+ x.gigote(3); // gigo(3) = h201
232
+
233
+ // Level ω^2*2+ω: diagonalize ω^2*2+y
234
+ x.aperigigote(3); // apgg(3) = h210
235
+
236
+ // Level ω^2*3: diagonalize ω^2*2+ω*y
237
+ x.gigoaperionate(3); // ggap(3) = h300
238
+
239
+ // Level ω^3: diagonalize ω^2*y
240
+ x.aperiatotion(3); // apat(3) = h1000
241
+
242
+ // Level ω^3+1: iterate aperiatotion
243
+ x.powiainate(3); // pwan(3) = h1001
244
+
245
+ // Level ω^3+ω: diagonalize ω^3+y
246
+ x.expandainate(3); // epan(3) = h1010
247
+
248
+ // Level ω^3+ω^2: diagonalize ω^3+ω*y
249
+ x.megodainate(3); // mgan(3) = h1100
250
+
251
+ // Level ω^3*2: diagonalize ω^3+ω^2*y
252
+ x.powiairate(3); // pwar(3) = h2000
253
+
254
+ // Level ω^4: diagonalize ω^3*y
255
+ x.aperioguate(3); // apgu(3) = h10000
256
+
257
+ // Level ω^ω: diagonalize ω^x (layer 1 transition)
258
+ x.iter(3); // ite(3) = hww
259
+
260
+ // Level ω^ω+1: iterate ω^ω level operations
261
+ x.itermult(3); // itmu(3) = hw01
262
+
263
+ // Level ω^ω*2: (ω^ω)*2 = ω^ω + ω^base
264
+ x.cuboiter(3); // cube(3) = hwx2
265
+
266
+ // Level ω^(ω+1): ω^(ω+1) = ω^ω*ω → ω^(ω*y)
267
+ x.expoiter(3); // expo(3) = hwa1
268
+
269
+ // Level ω^(ω*2): ω^(ω*2) = ω^(ω+base)
270
+ x.trioterate(3); // tria(3) = hwm2
271
+
272
+ // Level ω^(ω^2): diagonalize ω^(ω*y) (layer 2)
273
+ x.trixxate(3); // trix(3) = hwp2
274
+
275
+ // Level ω^(ω^ω): diagonalize ω^(ω^y) (layer 3)
276
+ x.aperixxate(3); // apix(3) = hwpw
277
+
278
+ // Level ε₀ = ω↑↑ω: diagonalize ω↑↑y (layer 4)
279
+ x.epsilonate(3); // epsl(3) = hepsl
229
280
  ```
230
281
 
231
282
  ## Inverse Operations
@@ -233,24 +284,68 @@ x.iter(3); // iter(x, 3)
233
284
  Each expansion operation has a corresponding inverse for decrementing ordinal structure:
234
285
 
235
286
  ```javascript
236
- x.i_aper(z) // inverse of aperiate
237
- x.i_expa(z) // inverse of expande
238
- x.i_muea(z) // inverse of multiexpande
239
- x.i_poea(z) // inverse of powerexpande
240
- x.i_apea(z) // inverse of aperioexpansion
241
- x.i_expl(z) // inverse of explode
242
- x.i_muel(z) // inverse of multiexplode
243
- x.i_apel(z) // inverse of aperioexplode
244
- x.i_deto(z) // inverse of detonate
245
- x.i_apeo(z) // inverse of aperionate
246
- x.i_mego(z) // inverse of megote
247
- x.i_apmg(z) // inverse of aperimegote
248
- x.i_mgea(z) // inverse of megoexpande
249
- x.i_mgao(z) // inverse of megoaperionation
250
- x.i_gigo(z) // inverse of gigote
251
- x.i_apat(z) // inverse of aperiatotion
252
- x.i_pwan(z) // inverse of powiainate
253
- x.i_ite(z) // inverse of iter
287
+ x.i_aper(z) // i10 = inverse of aperiote
288
+ x.i_expa(z) // i11 = inverse of expande
289
+ x.i_muea(z) // i12 = inverse of multiexpande
290
+ x.i_poea(z) // i13 = inverse of powerexpande
291
+ x.i_apea(z) // i20 = inverse of aperioexpande
292
+ x.i_expl(z) // i21 = inverse of explode
293
+ x.i_muel(z) // i22 = inverse of multiexplode
294
+ x.i_apel(z) // i30 = inverse of aperioexplode
295
+ x.i_deto(z) // i31 = inverse of detonate
296
+ x.i_apdt(z) // i40 = inverse of aperiodetonate
297
+ x.i_apeo(z) // i100 = inverse of aperionate
298
+ x.i_mego(z) // i101 = inverse of megote
299
+ x.i_mume(z) // i102 = inverse of multimegote
300
+ x.i_apmg(z) // i110 = inverse of aperimegote
301
+ x.i_mgea(z) // i111 = inverse of megoexpande
302
+ x.i_apme(z) // i120 = inverse of aperimegoexpande
303
+ x.i_mgao(z) // i200 = inverse of megoaperionation
304
+ x.i_gigo(z) // i201 = inverse of gigote
305
+ x.i_apgg(z) // i210 = inverse of aperigigote
306
+ x.i_ggap(z) // i300 = inverse of gigoaperionate
307
+ x.i_apat(z) // i1000 = inverse of aperiatotion
308
+ x.i_pwan(z) // i1001 = inverse of powiainate
309
+ x.i_epan(z) // i1010 = inverse of expandainate
310
+ x.i_mgan(z) // i1100 = inverse of megodainate
311
+ x.i_pwar(z) // i2000 = inverse of powiairate
312
+ x.i_apgu(z) // i10000 = inverse of aperioguate
313
+ x.i_ite(z) // iww = inverse of iter
314
+ x.i_itmu(z) // iw01 = inverse of itermult
315
+ x.i_cube(z) // iwx2 = inverse of cuboiter
316
+ x.i_expo(z) // iwa1 = inverse of expoiter
317
+ x.i_tria(z) // iwm2 = inverse of trioterate
318
+ x.i_trix(z) // iwp2 = inverse of trixxate
319
+ x.i_apix(z) // iwpw = inverse of aperixxate
320
+ x.i_epsl(z) // iepsl = inverse of epsilonate
321
+ ```
322
+
323
+ ## BEAF Operations
324
+
325
+ Bowers' Exploding Array Function (BEAF) is supported via ordinal arithmetic for 4+ arguments:
326
+
327
+ ```javascript
328
+ // 3-entry: {a,b,c} = a↑^c b (standard up-arrow notation)
329
+ MetaNum.BEAF(3, 3, 2); // 3↑↑3 = 7625597484987
330
+ MetaNum.BEAF(3, 3, 3); // 3↑↑↑3 = tritri
331
+
332
+ // 4-entry: {a,b,c,d} = a(ω*(d-1)+(c-1) level operation)b
333
+ MetaNum.BEAF(2, 2, 1, 2); // = 4
334
+ MetaNum.BEAF(3, 3, 3, 3); // 3(ω*2+2 level operation)3
335
+
336
+ // 5+ entry: ordinal arithmetic
337
+ // BEAF(a,b,c,d,...,n) = a(ω^(n-3)*(arg_n-1)+...+ω*(d-1)+(c-1) level operation)b
338
+ MetaNum.BEAF(10, 2, 1, 1, 2); // = BEAF(10,10,10,10) (ω^2 level operation)
339
+ MetaNum.BEAF(3, 3, 3, 3, 2); // 3(ω^2+ω*2+2 level operation)3
340
+
341
+ // Parse BEAF string notation
342
+ MetaNum.fromBeaf("{3,3,3}"); // 3↑↑↑3
343
+ MetaNum.fromBeaf("{3,3,3,3}"); // 3(ω*2+2)3
344
+ MetaNum.fromBeaf("{10,2,1,1,2}"); // 10(ω^2)2
345
+
346
+ // Convert to BEAF string
347
+ new MetaNum(7625597484987).toBeaf(); // "{7625597484987}"
348
+ MetaNum.BEAF(3,3,3).toBeaf(); // "{3638334640023.7783}"
254
349
  ```
255
350
 
256
351
  ## Layer & Serialization
@@ -564,8 +659,9 @@ Then we can define (the β-th symbol or symbol combination)Aa = f\_ω^ω^...^ω(
564
659
 
565
660
  #### Using dlsdl's letter notation, the biggest number we can define in Metanum is about ε1.797e308.
566
661
 
567
- ## Update log
662
+ ## Changelog
568
663
 
664
+ - 2026-7-9 v1.2 Add more hyper operations up to ε₀, add BEAF operation and fix bugs
569
665
  - 2026-6-3 v1.1 Add support for very small numbers ,add more hyper operations and fix bugs
570
666
  - 2026-5-23 v1.0 Rewritten and add even more hyper operations
571
667
  - 2026-2-24 v0.4 Add hyper operations and extend fromString
package/metanum.js CHANGED
@@ -1,5 +1,5 @@
1
- //Author: dlsdl v1.1
2
- //Add support for very small numbers ,add more hyper operations and fix bugs
1
+ //Author: dlsdl v1.2
2
+ //Add more hyper operations up to ε₀, add BEAF operation and fix bugs
3
3
  //Code snippets and templates from OmegaNum.js
4
4
 
5
5
  ;(function (globalScope) {
@@ -314,7 +314,7 @@
314
314
  }
315
315
 
316
316
  if (x.array.length > MetaNum.maxRows) {
317
- x.array = x.array.slice(0, MetaNum.maxRows);
317
+ x.array = x.array.slice(x.array.length - MetaNum.maxRows);
318
318
  b = true;
319
319
  }
320
320
 
@@ -1698,6 +1698,9 @@
1698
1698
  return j;
1699
1699
  }
1700
1700
  var y = other.toNumber();
1701
+ if (arrowsNum >= 23 && y !== Math.floor(y)) {
1702
+ y = 10;
1703
+ }
1701
1704
  var f = Math.floor(y);
1702
1705
  var arrows_m1 = arrows.sub(MetaNum.ONE);
1703
1706
  var r = t.arrow(arrows_m1)(y - f);
@@ -3594,15 +3597,363 @@
3594
3597
  return new MetaNum(x).inv_iter(z);
3595
3598
  };
3596
3599
 
3597
- /* hyper operations up to epsilon 0
3598
- 1. itermult (ω^ω+1) = hw01
3599
- 2. cuboiter (ω^ω*2) = hwx2
3600
- 3. expoiter (ω^(ω+1)) = hwa1
3601
- 4. trioterate (ω^(ω*2)) = hwm2
3602
- 5. trixxate (ω^(ω^2)) = hwp2
3603
- 6. aperixxate (ω^(ω^ω)) = hwpw
3604
- 7. epsilonate (ω↑↑ω) = epsl
3605
- */
3600
+ // itermult (ω^ω+1): iterates ω^ω level operations
3601
+ // layer=1, array=[[count], [1, yn, 1]] — count applications of ω^ω
3602
+ P.itermult = P.itmu = P.hw01 = function (y) {
3603
+ var x = this.clone();
3604
+ y = new MetaNum(y);
3605
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3606
+ if (y.eq(MetaNum.ONE)) return x.iter(x);
3607
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3608
+ if (y.layer === 0 && y.array.length <= 1) {
3609
+ var yn = y.toNumber();
3610
+ var base = x.iter(x);
3611
+ if (y.eq(2)) return base;
3612
+ var result = base.clone();
3613
+ result.layer = 1;
3614
+ result.array = [base.array[0].slice()];
3615
+ result.array[0] = [yn];
3616
+ result.array.push([1, yn, 1]);
3617
+ result.normalize();
3618
+ return result;
3619
+ }
3620
+ var result = y.clone();
3621
+ result.layer = Math.max(result.layer, 1);
3622
+ var base = x.iter(x);
3623
+ result.array[0] = base.array[0].slice();
3624
+ result.normalize();
3625
+ return result;
3626
+ };
3627
+ Q.itermult = Q.itmu = Q.hw01 = function (x, y) {
3628
+ return new MetaNum(x).itermult(y);
3629
+ };
3630
+
3631
+ P.inv_itermult = P.i_itmu = P.iw01 = function (z) {
3632
+ var x = this.clone();
3633
+ z = new MetaNum(z);
3634
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3635
+ if (z.array.length >= 2) {
3636
+ var result = z.clone();
3637
+ for (var i = result.array.length - 1; i >= 1; i--) {
3638
+ var row = result.array[i];
3639
+ if (row.length >= 3 && row[0] > 0) {
3640
+ row[0]--;
3641
+ if (row[0] <= 0) result.array.splice(i, 1);
3642
+ result.normalize();
3643
+ if (result.array.length <= 1) result.layer = 0;
3644
+ return result;
3645
+ }
3646
+ }
3647
+ return result;
3648
+ }
3649
+ return z;
3650
+ };
3651
+ Q.inv_itermult = Q.i_itmu = Q.iw01 = function (x, z) {
3652
+ return new MetaNum(x).inv_itermult(z);
3653
+ };
3654
+
3655
+ // cuboiter (ω^ω*2): (ω^ω)*2 = ω^ω + ω^base
3656
+ // layer=1, array=[[1], [1, yn, 1], [1, 0, 1]]
3657
+ P.cuboiter = P.cube = P.hwx2 = function (y) {
3658
+ var x = this.clone();
3659
+ y = new MetaNum(y);
3660
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3661
+ if (y.eq(MetaNum.ONE)) return x.clone();
3662
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3663
+ var base = x.itermult(x);
3664
+ if (y.layer === 0 && y.array.length <= 1) {
3665
+ var yn = y.toNumber();
3666
+ if (y.eq(2)) return base;
3667
+ var result = base.clone();
3668
+ result.layer = 1;
3669
+ result.array = [[1]];
3670
+ result.array.push([1, yn, 1]);
3671
+ result.array.push([1, 0, 1]);
3672
+ result.normalize();
3673
+ return result;
3674
+ }
3675
+ var result = y.clone();
3676
+ result.layer = 1;
3677
+ result.array[0] = base.array[0].slice();
3678
+ result.array.push([1, 0, 1]);
3679
+ result.normalize();
3680
+ return result;
3681
+ };
3682
+ Q.cuboiter = Q.cube = Q.hwx2 = function (x, y) {
3683
+ return new MetaNum(x).cuboiter(y);
3684
+ };
3685
+
3686
+ P.inv_cuboiter = P.i_cube = P.iwx2 = function (z) {
3687
+ var x = this.clone();
3688
+ z = new MetaNum(z);
3689
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3690
+ if (z.array.length >= 2) {
3691
+ var result = z.clone();
3692
+ for (var i = result.array.length - 1; i >= 1; i--) {
3693
+ var row = result.array[i];
3694
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] === 1) {
3695
+ result.array.splice(i, 1);
3696
+ result.normalize();
3697
+ if (result.array.length <= 1) result.layer = 0;
3698
+ return result;
3699
+ }
3700
+ }
3701
+ return result;
3702
+ }
3703
+ return z;
3704
+ };
3705
+ Q.inv_cuboiter = Q.i_cube = Q.iwx2 = function (x, z) {
3706
+ return new MetaNum(x).inv_cuboiter(z);
3707
+ };
3708
+
3709
+ // expoiter (ω^(ω+1)): ω^(ω+1) = ω^ω * ω → ω^(ω*y)[y]
3710
+ // layer=1, array=[[1], [yn, 0, 1]]
3711
+ P.expoiter = P.expo = P.hwa1 = function (y) {
3712
+ var x = this.clone();
3713
+ y = new MetaNum(y);
3714
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3715
+ if (y.eq(MetaNum.ONE)) return x.iter(x);
3716
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3717
+ var base = x.iter(x);
3718
+ if (y.layer === 0 && y.array.length <= 1) {
3719
+ var yn = y.toNumber();
3720
+ if (y.eq(2)) return x.cuboiter(x);
3721
+ var result = base.clone();
3722
+ result.layer = 1;
3723
+ result.array = [[1]];
3724
+ result.array.push([yn, 0, 1]);
3725
+ result.normalize();
3726
+ return result;
3727
+ }
3728
+ var result = y.clone();
3729
+ result.layer = 1;
3730
+ result.array[0] = base.array[0].slice();
3731
+ result.array.push([1, 0, 1]);
3732
+ result.normalize();
3733
+ return result;
3734
+ };
3735
+ Q.expoiter = Q.expo = Q.hwa1 = function (x, y) {
3736
+ return new MetaNum(x).expoiter(y);
3737
+ };
3738
+
3739
+ P.inv_expoiter = P.i_expo = P.iwa1 = function (z) {
3740
+ var x = this.clone();
3741
+ z = new MetaNum(z);
3742
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3743
+ if (z.array.length >= 2) {
3744
+ var result = z.clone();
3745
+ for (var i = result.array.length - 1; i >= 1; i--) {
3746
+ var row = result.array[i];
3747
+ if (row.length >= 3 && row[2] === 1 && row[0] > 0) {
3748
+ row[0]--;
3749
+ if (row[0] <= 0) result.array.splice(i, 1);
3750
+ result.normalize();
3751
+ if (result.array.length <= 1) result.layer = 0;
3752
+ return result;
3753
+ }
3754
+ }
3755
+ return result;
3756
+ }
3757
+ return z;
3758
+ };
3759
+ Q.inv_expoiter = Q.i_expo = Q.iwa1 = function (x, z) {
3760
+ return new MetaNum(x).inv_expoiter(z);
3761
+ };
3762
+
3763
+ // trioterate (ω^(ω*2)): ω^(ω*2) = ω^(ω+y)[y]
3764
+ // layer=1, array=[[1], [1, yn, 1]]
3765
+ P.trioterate = P.tria = P.hwm2 = function (y) {
3766
+ var x = this.clone();
3767
+ y = new MetaNum(y);
3768
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3769
+ if (y.eq(MetaNum.ONE)) return x.iter(x);
3770
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3771
+ if (y.layer === 0 && y.array.length <= 1) {
3772
+ var yn = y.toNumber();
3773
+ var base = x.expoiter(x);
3774
+ if (y.eq(2)) return base;
3775
+ var result = base.clone();
3776
+ result.layer = 1;
3777
+ result.array = [[1]];
3778
+ result.array.push([1, yn, 1]);
3779
+ result.normalize();
3780
+ return result;
3781
+ }
3782
+ var result = y.clone();
3783
+ result.layer = 1;
3784
+ var base = x.iter(x);
3785
+ result.array[0] = base.array[0].slice();
3786
+ result.normalize();
3787
+ return result;
3788
+ };
3789
+ Q.trioterate = Q.tria = Q.hwm2 = function (x, y) {
3790
+ return new MetaNum(x).trioterate(y);
3791
+ };
3792
+
3793
+ P.inv_trioterate = P.i_tria = P.iwm2 = function (z) {
3794
+ var x = this.clone();
3795
+ z = new MetaNum(z);
3796
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3797
+ if (z.array.length >= 2) {
3798
+ var result = z.clone();
3799
+ for (var i = result.array.length - 1; i >= 1; i--) {
3800
+ var row = result.array[i];
3801
+ if (row.length >= 4 && row[3] === 1 && row[0] > 0) {
3802
+ row[0]--;
3803
+ if (row[0] <= 0) result.array.splice(i, 1);
3804
+ result.normalize();
3805
+ if (result.array.length <= 1) result.layer = 0;
3806
+ return result;
3807
+ }
3808
+ }
3809
+ return result;
3810
+ }
3811
+ return z;
3812
+ };
3813
+ Q.inv_trioterate = Q.i_tria = Q.iwm2 = function (x, z) {
3814
+ return new MetaNum(x).inv_trioterate(z);
3815
+ };
3816
+
3817
+ // trixxate (ω^(ω^2)): diagonalizes ω^(ω*y) at layer 2
3818
+ // layer=2, array=[[1], [1, yn, 1]]
3819
+ P.trixxate = P.trix = P.hwp2 = function (y) {
3820
+ var x = this.clone();
3821
+ y = new MetaNum(y);
3822
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3823
+ if (y.eq(MetaNum.ONE)) return x.trioterate(x);
3824
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3825
+ if (y.layer === 0 && y.array.length <= 1) {
3826
+ var yn = y.toNumber();
3827
+ var base = x.trioterate(x);
3828
+ if (y.eq(2)) return base;
3829
+ var result = base.clone();
3830
+ result.layer = 2;
3831
+ result.array = [[1]];
3832
+ result.array.push([1, yn, 1]);
3833
+ result.normalize();
3834
+ return result;
3835
+ }
3836
+ var result = y.clone();
3837
+ result.layer = 2;
3838
+ var base = x.trioterate(x);
3839
+ result.array[0] = base.array[0].slice();
3840
+ result.normalize();
3841
+ return result;
3842
+ };
3843
+ Q.trixxate = Q.trix = Q.hwp2 = function (x, y) {
3844
+ return new MetaNum(x).trixxate(y);
3845
+ };
3846
+
3847
+ P.inv_trixxate = P.i_trix = P.iwp2 = function (z) {
3848
+ var x = this.clone();
3849
+ z = new MetaNum(z);
3850
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3851
+ if (z.layer >= 2) {
3852
+ var result = z.clone();
3853
+ result.layer--;
3854
+ if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3855
+ result.normalize();
3856
+ return result;
3857
+ }
3858
+ return z;
3859
+ };
3860
+ Q.inv_trixxate = Q.i_trix = Q.iwp2 = function (x, z) {
3861
+ return new MetaNum(x).inv_trixxate(z);
3862
+ };
3863
+
3864
+ // aperixxate (ω^(ω^ω)): diagonalizes ω^(ω^y) at layer 3
3865
+ // Repetition count negligible for layer >= 2 (defaults to 1)
3866
+ P.aperixxate = P.apix = P.hwpw = function (y) {
3867
+ var x = this.clone();
3868
+ y = new MetaNum(y);
3869
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3870
+ if (y.eq(MetaNum.ONE)) return x.trixxate(x);
3871
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3872
+ if (y.layer === 0 && y.array.length <= 1) {
3873
+ var yn = y.toNumber();
3874
+ var base = x.trixxate(x);
3875
+ if (y.eq(2)) return base;
3876
+ var result = base.clone();
3877
+ result.layer = 3;
3878
+ result.array = [[1]];
3879
+ result.array.push([1, yn, 1]);
3880
+ result.normalize();
3881
+ return result;
3882
+ }
3883
+ var result = y.clone();
3884
+ result.layer = 3;
3885
+ var base = x.trixxate(x);
3886
+ result.array[0] = base.array[0].slice();
3887
+ result.normalize();
3888
+ return result;
3889
+ };
3890
+ Q.aperixxate = Q.apix = Q.hwpw = function (x, y) {
3891
+ return new MetaNum(x).aperixxate(y);
3892
+ };
3893
+
3894
+ P.inv_aperixxate = P.i_apix = P.iwpw = function (z) {
3895
+ var x = this.clone();
3896
+ z = new MetaNum(z);
3897
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3898
+ if (z.layer >= 3) {
3899
+ var result = z.clone();
3900
+ result.layer--;
3901
+ if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3902
+ result.normalize();
3903
+ return result;
3904
+ }
3905
+ return z;
3906
+ };
3907
+ Q.inv_aperixxate = Q.i_apix = Q.iwpw = function (x, z) {
3908
+ return new MetaNum(x).inv_aperixxate(z);
3909
+ };
3910
+
3911
+ // epsilonate (ε₀ = ω↑↑ω): diagonalizes ω↑↑y
3912
+ // layer varies with y, array=[[1], [1, yn, 1]]
3913
+ P.epsilonate = P.epsl = P.hepsl = function (y) {
3914
+ var x = this.clone();
3915
+ y = new MetaNum(y);
3916
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
3917
+ if (y.eq(MetaNum.ONE)) return x.aperixxate(x);
3918
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
3919
+ if (y.layer === 0 && y.array.length <= 1) {
3920
+ var yn = y.toNumber();
3921
+ var base = x.aperixxate(x);
3922
+ if (y.eq(2)) return base;
3923
+ var result = base.clone();
3924
+ result.layer = 4;
3925
+ result.array = [[1]];
3926
+ result.array.push([1, yn, 1]);
3927
+ result.normalize();
3928
+ return result;
3929
+ }
3930
+ var result = y.clone();
3931
+ result.layer = 4;
3932
+ var base = x.aperixxate(x);
3933
+ result.array[0] = base.array[0].slice();
3934
+ result.normalize();
3935
+ return result;
3936
+ };
3937
+ Q.epsilonate = Q.epsl = Q.hepsl = function (x, y) {
3938
+ return new MetaNum(x).epsilonate(y);
3939
+ };
3940
+
3941
+ P.inv_epsilonate = P.i_epsl = P.iepsl = function (z) {
3942
+ var x = this.clone();
3943
+ z = new MetaNum(z);
3944
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
3945
+ if (z.layer >= 4) {
3946
+ var result = z.clone();
3947
+ result.layer--;
3948
+ if (result.layer <= 0 && result.array.length <= 1) result.layer = 0;
3949
+ result.normalize();
3950
+ return result;
3951
+ }
3952
+ return z;
3953
+ };
3954
+ Q.inv_epsilonate = Q.i_epsl = Q.iepsl = function (x, z) {
3955
+ return new MetaNum(x).inv_epsilonate(z);
3956
+ };
3606
3957
 
3607
3958
 
3608
3959
  P.choose = function (other) {
@@ -3662,8 +4013,40 @@
3662
4013
  return count >= 4 ? pattern + "^" + count : pattern.repeat(count);
3663
4014
  }
3664
4015
  function formatFiniteOps(r0) {
3665
- var parts = [];
4016
+ // Find the highest level
4017
+ var highest = -1;
3666
4018
  for (var i = r0.length - 1; i >= 1; i--) {
4019
+ if (r0[i] > 0) { highest = i; break; }
4020
+ }
4021
+ if (highest === -1) return "";
4022
+
4023
+ // If highest level is 23+, use normalized Aa notation
4024
+ if (highest >= 23) {
4025
+ var coeff = r0[highest];
4026
+ var pow9 = 9;
4027
+ for (var i = highest - 1; i >= 1; i--) {
4028
+ coeff += (r0[i] || 0) / pow9;
4029
+ pow9 *= 9;
4030
+ }
4031
+ // Carry: if coeff >= 9, move to next level
4032
+ var level = highest;
4033
+ while (coeff >= 9) {
4034
+ coeff /= 9;
4035
+ level++;
4036
+ }
4037
+ // Format coefficient
4038
+ var coeffStr;
4039
+ if (Math.abs(coeff - Math.round(coeff)) < 1e-12 && Math.round(coeff) <= Number.MAX_SAFE_INTEGER) {
4040
+ coeffStr = String(Math.round(coeff));
4041
+ } else {
4042
+ coeffStr = decimalPlaces(coeff, 8);
4043
+ }
4044
+ return coeffStr + "Aa" + level;
4045
+ }
4046
+
4047
+ // Letter notation for levels <= 22
4048
+ var parts = [];
4049
+ for (var i = highest; i >= 1; i--) {
3667
4050
  if (r0[i] > 0) {
3668
4051
  var letter = String.fromCharCode(68 + i);
3669
4052
  var token = formatCount(letter, r0[i]);
@@ -3845,11 +4228,14 @@
3845
4228
 
3846
4229
  if (validLetter && ordTokens.length > 0) {
3847
4230
  var finOps = formatFiniteOps(this.array[0]);
4231
+ var hasAa = finOps && finOps.indexOf("Aa") !== -1;
3848
4232
  var baseStr = "";
3849
- if (this.array[0].length === 1) {
3850
- baseStr = String(this.array[0][0]);
3851
- } else if (finOps !== "" && this.array[0].length >= 1 && this.array[0][0] > 0) {
3852
- baseStr = String(this.array[0][0]);
4233
+ if (!hasAa) {
4234
+ if (this.array[0].length === 1) {
4235
+ baseStr = String(this.array[0][0]);
4236
+ } else if (finOps !== "" && this.array[0].length >= 1 && this.array[0][0] > 0) {
4237
+ baseStr = String(this.array[0][0]);
4238
+ }
3853
4239
  }
3854
4240
  // Always include layer symbol for layers 1-10
3855
4241
  if (this.layer >= 1 && finOps === "" && baseStr !== "") {
@@ -3874,26 +4260,59 @@
3874
4260
  if (r0.length === 1) return String(r0[0]);
3875
4261
 
3876
4262
  if (r0.length >= 24) {
3877
- var highestIdx = -1;
4263
+ // Find highest level with non-zero value
4264
+ var highest = -1;
3878
4265
  for (var j = r0.length - 1; j >= 1; j--) {
3879
- if (r0[j] && r0[j] !== 0) {
3880
- highestIdx = j;
3881
- break;
4266
+ if (r0[j] && r0[j] !== 0) { highest = j; break; }
4267
+ }
4268
+ if (highest >= 23) {
4269
+ // Normalized Aa notation: absorb all lower levels into coefficient
4270
+ var coeff = r0[highest];
4271
+ var pow9 = 9;
4272
+ for (var j = highest - 1; j >= 1; j--) {
4273
+ coeff += (r0[j] || 0) / pow9;
4274
+ pow9 *= 9;
3882
4275
  }
4276
+ var level = highest;
4277
+ while (coeff >= 9) {
4278
+ coeff /= 9;
4279
+ level++;
4280
+ }
4281
+ var coeffStr;
4282
+ if (Math.abs(coeff - Math.round(coeff)) < 1e-12 && Math.round(coeff) <= Number.MAX_SAFE_INTEGER) {
4283
+ coeffStr = String(Math.round(coeff));
4284
+ } else {
4285
+ coeffStr = decimalPlaces(coeff, 8);
4286
+ }
4287
+ return coeffStr + "Aa" + level;
3883
4288
  }
3884
- if (highestIdx !== -1) {
3885
- return r0[highestIdx] + "Aa" + highestIdx;
4289
+ // Fallback: letter notation for all levels
4290
+ var result = "";
4291
+ for (var j = r0.length - 1; j >= 1; j--) {
4292
+ if (!r0[j] || r0[j] === 0) continue;
4293
+ var letter = String.fromCharCode(68 + j);
4294
+ if (r0[j] > 3) {
4295
+ result += letter + "^" + r0[j] + " ";
4296
+ } else {
4297
+ result += letter.repeat(r0[j]);
4298
+ }
3886
4299
  }
4300
+ result += decimalPlaces(r0[0], 6);
4301
+ return result;
3887
4302
  }
3888
4303
 
3889
4304
  var result = "";
3890
4305
  for (var j = r0.length - 1; j >= 1; j--) {
3891
4306
  if (!r0[j] || r0[j] === 0) continue;
3892
- var letter = String.fromCharCode(68 + j);
3893
- if (r0[j] > 3) {
3894
- result += letter + "^" + r0[j] + " ";
4307
+ if (j <= 22) {
4308
+ var letter = String.fromCharCode(68 + j);
4309
+ if (r0[j] > 3) {
4310
+ result += letter + "^" + r0[j] + " ";
4311
+ } else {
4312
+ result += letter.repeat(r0[j]);
4313
+ }
3895
4314
  } else {
3896
- result += letter.repeat(r0[j]);
4315
+ result += r0[j] + "Aa" + j + " ";
3897
4316
  }
3898
4317
  }
3899
4318
  result += decimalPlaces(r0[0], 6);
@@ -3923,7 +4342,8 @@
3923
4342
  tokens.push(tok);
3924
4343
  }
3925
4344
  var finOps = formatFiniteOps(this.array[0]);
3926
- var baseNum = decimalPlaces(this.array[0][0], 6);
4345
+ var hasAa = finOps && finOps.indexOf("Aa") !== -1;
4346
+ var baseNum = hasAa ? "" : decimalPlaces(this.array[0][0], 6);
3927
4347
  return tokens.join("") + (finOps ? finOps : "") + baseNum;
3928
4348
  }
3929
4349
 
@@ -3974,8 +4394,9 @@
3974
4394
 
3975
4395
  if (validLetter) {
3976
4396
  var finOps = formatFiniteOps(this.array[0]);
4397
+ var hasAa = finOps && finOps.indexOf("Aa") !== -1;
3977
4398
  var prefix = useExclaim ? "!" : "";
3978
- var baseNum = useExclaim ? "" : decimalPlaces(this.array[0][0], 6);
4399
+ var baseNum = (useExclaim || hasAa) ? "" : decimalPlaces(this.array[0][0], 6);
3979
4400
  return prefix + ordTokens.join("") + (finOps ? finOps : "") + baseNum;
3980
4401
  }
3981
4402
  }
@@ -4885,10 +5306,12 @@
4885
5306
 
4886
5307
  if (cantorLevel < 0) cantorLevel = 0;
4887
5308
 
5309
+ // Use maxVal as diag upper bound for proper cardinal expansion
5310
+ var diagMax = Math.max(maxVal, 1);
5311
+
4888
5312
  // Generate all combinations: numVals outer, diag inner (for increasing ordinal value)
4889
- // Order: nv=1(d=1..cantorLevel), nv=2(d=1..cantorLevel), ..., plus special row
4890
- for (var nv = 1; nv <= cantorLevel && rows.length < maxRows; nv++) {
4891
- for (var d = 1; d <= cantorLevel && rows.length < maxRows; d++) {
5313
+ for (var nv = 1; nv <= diagMax && rows.length < maxRows; nv++) {
5314
+ for (var d = 1; d <= diagMax && rows.length < maxRows; d++) {
4892
5315
  var total = Math.pow(maxVal + 1, nv);
4893
5316
  for (var ci = 0; ci < total && rows.length < maxRows; ci++) {
4894
5317
  var vals = [];
@@ -4905,14 +5328,10 @@
4905
5328
  }
4906
5329
  }
4907
5330
 
4908
- // Add boundary/special row [1, 0, ..., 0, 1] with (cantorLevel+1) zeros + diag=1
4909
- // For cantorLevel=0: generates the sole row [[1,0,1]] (1 zero)
4910
- // For cantorLevel>=2: adds the terminal row [1, 0, ..., 0, 1] with cantorLevel+1 zeros
4911
- // For cantorLevel=1: skip (not needed)
4912
- if ((cantorLevel === 0 || cantorLevel >= 2) && rows.length < maxRows) {
5331
+ // Add boundary/special row [1, 0, ..., 0, 1] with (maxVal+1) zeros + diag=1
5332
+ if (rows.length < maxRows) {
4913
5333
  var bRow = [1];
4914
- var zeroCount = (cantorLevel === 0) ? 1 : (cantorLevel + 1);
4915
- for (var k = 0; k < zeroCount; k++) bRow.push(0);
5334
+ for (var k = 0; k < maxVal + 1; k++) bRow.push(0);
4916
5335
  bRow.push(1);
4917
5336
  rows.push(bRow);
4918
5337
  }
@@ -4997,6 +5416,266 @@
4997
5416
  return this;
4998
5417
  }
4999
5418
 
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
+
5000
5679
  MetaNum = clone(MetaNum);
5001
5680
  MetaNum = defineConstants(MetaNum);
5002
5681
  MetaNum['default'] = MetaNum.MetaNum = MetaNum;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metanum",
3
- "version": "1.1.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": {
package/test_mixed.js CHANGED
@@ -305,6 +305,42 @@ checkOp("ite(2,1)", m2.iter(1), 2, 0);
305
305
  checkBool("ite y=0 NaN", m2.iter(0).isNaN(), true);
306
306
  checkBool("ite NaN", MetaNum.iter(m2, MetaNum.NaN).isNaN(), true);
307
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
+
308
344
  // ─────────────────────────────────────
309
345
  // 逆运算 语义验证 (pentate_log/root + 通用)
310
346
  // ─────────────────────────────────────
@@ -324,7 +360,8 @@ var ops = [
324
360
  "explode","multiexplode","aperioexplode","detonate","aperiodetonate",
325
361
  "aperionate","megote","multimegote","aperimegote","megoexpande",
326
362
  "aperimegoexpande","megoaperionation","gigote","aperigigote","gigoaperionate",
327
- "aperiatotion","powiainate","expandainate","megodainate","powiairate","aperioguate","iter"
363
+ "aperiatotion","powiainate","expandainate","megodainate","powiairate","aperioguate","iter",
364
+ "itermult","cuboiter","expoiter","trioterate","trixxate","aperixxate","epsilonate"
328
365
  ];
329
366
 
330
367
  console.log("\n=== 全运算 x=3, y=2 冒烟测试 ===");
@@ -365,7 +402,11 @@ var qOps = {
365
402
  "aperiatotion": ["aperiatotion","apat"], "powiainate": ["powiainate","pwan"],
366
403
  "expandainate": ["expandainate","epan"], "megodainate": ["megodainate","mgan"],
367
404
  "powiairate": ["powiairate","pwar"], "aperioguate": ["aperioguate","apgu"],
368
- "iter": ["iter","ite"]
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"]
369
410
  };
370
411
  for (var key in qOps) {
371
412
  var f = MetaNum[key]; var s = MetaNum[qOps[key][1]];