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.
- package/README.md +151 -55
- package/metanum.js +718 -39
- package/package.json +1 -1
- package/test_mixed.js +43 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/metanum)
|
|
4
4
|
|
|
5
|
-
- MetaNum v1.
|
|
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
|
|
180
|
-
x.
|
|
179
|
+
// Level ω: diagonalize ω*y (→ a↑^a a)
|
|
180
|
+
x.aperiote(3); // aper(3) = h10
|
|
181
181
|
|
|
182
|
-
// Level
|
|
183
|
-
x.
|
|
182
|
+
// Level ω+1: iterate aperiote
|
|
183
|
+
x.expande(3); // expa(3) = h11
|
|
184
184
|
|
|
185
|
-
// Level
|
|
186
|
-
x.
|
|
185
|
+
// Level ω+2: iterate expande
|
|
186
|
+
x.multiexpande(3); // muea(3) = h12
|
|
187
187
|
|
|
188
|
-
// Level
|
|
189
|
-
x.
|
|
188
|
+
// Level ω+3: iterate multiexpande
|
|
189
|
+
x.powerexpande(3); // poea(3) = h13
|
|
190
190
|
|
|
191
|
-
// Level
|
|
192
|
-
x.
|
|
191
|
+
// Level ω*2: diagonalize ω+y
|
|
192
|
+
x.aperioexpande(3); // apea(3) = h20
|
|
193
193
|
|
|
194
|
-
// Level
|
|
195
|
-
x.
|
|
194
|
+
// Level ω*2+1: iterate aperioexpande
|
|
195
|
+
x.explode(3); // expl(3) = h21
|
|
196
196
|
|
|
197
|
-
// Level
|
|
198
|
-
x.
|
|
197
|
+
// Level ω*2+2: iterate explode
|
|
198
|
+
x.multiexplode(3); // muel(3) = h22
|
|
199
199
|
|
|
200
|
-
// Level
|
|
201
|
-
x.
|
|
200
|
+
// Level ω*3: diagonalize ω*2+y
|
|
201
|
+
x.aperioexplode(3); // apel(3) = h30
|
|
202
202
|
|
|
203
|
-
// Level
|
|
204
|
-
x.
|
|
203
|
+
// Level ω*3+1: iterate aperioexplode
|
|
204
|
+
x.detonate(3); // deto(3) = h31
|
|
205
205
|
|
|
206
|
-
// Level
|
|
207
|
-
x.
|
|
206
|
+
// Level ω*4: diagonalize ω*3+y
|
|
207
|
+
x.aperiodetonate(3); // apdt(3) = h40
|
|
208
208
|
|
|
209
|
-
// Level ω^
|
|
210
|
-
x.
|
|
209
|
+
// Level ω^2: diagonalize ω*y
|
|
210
|
+
x.aperionate(3); // apeo(3) = h100
|
|
211
211
|
|
|
212
|
-
// Level ω^
|
|
213
|
-
x.
|
|
212
|
+
// Level ω^2+1: iterate aperionate
|
|
213
|
+
x.megote(3); // mego(3) = h101
|
|
214
214
|
|
|
215
|
-
// Level ω^
|
|
216
|
-
x.
|
|
215
|
+
// Level ω^2+2: iterate megote
|
|
216
|
+
x.multimegote(3); // mume(3) = h102
|
|
217
217
|
|
|
218
|
-
// Level ω^
|
|
219
|
-
x.
|
|
218
|
+
// Level ω^2+ω: diagonalize ω^2+y
|
|
219
|
+
x.aperimegote(3); // apmg(3) = h110
|
|
220
220
|
|
|
221
|
-
// Level ω^
|
|
222
|
-
x.
|
|
221
|
+
// Level ω^2+ω+1: iterate aperimegote
|
|
222
|
+
x.megoexpande(3); // mgea(3) = h111
|
|
223
223
|
|
|
224
|
-
// Level ω^
|
|
225
|
-
x.
|
|
224
|
+
// Level ω^2+ω*2: diagonalize ω^2+ω+y
|
|
225
|
+
x.aperimegoexpande(3); // apme(3) = h120
|
|
226
226
|
|
|
227
|
-
// Level ω^
|
|
228
|
-
x.
|
|
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
|
|
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
|
|
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.
|
|
246
|
-
x.
|
|
247
|
-
x.
|
|
248
|
-
x.
|
|
249
|
-
x.
|
|
250
|
-
x.
|
|
251
|
-
x.
|
|
252
|
-
x.
|
|
253
|
-
x.
|
|
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
|
-
##
|
|
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.
|
|
2
|
-
//Add
|
|
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(
|
|
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
|
-
|
|
3598
|
-
1
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
-
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
|
|
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
|
-
|
|
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 (
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3881
|
-
|
|
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
|
-
|
|
3885
|
-
|
|
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
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
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 +=
|
|
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
|
|
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
|
-
|
|
4890
|
-
|
|
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 (
|
|
4909
|
-
|
|
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
|
|
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
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]];
|