metanum 1.0.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/metanum.js ADDED
@@ -0,0 +1,3789 @@
1
+ //Author: dlsdl v1.0
2
+ //rewritten and add even more hyper operations
3
+ //Code snippets and templates from OmegaNum.js
4
+
5
+ ;(function (globalScope) {
6
+ "use strict";
7
+
8
+ var MetaNum = {
9
+ maxRows: 100,
10
+ maxCols: 100,
11
+ maxArrow: Number.MAX_SAFE_INTEGER,
12
+ serializeMode: 0,
13
+ debug: 0
14
+ },
15
+
16
+ external = true,
17
+
18
+ metaNumError = "[MetaNumError] ",
19
+ invalidArgument = metaNumError + "Invalid argument: ",
20
+
21
+ MAX_SAFE_INTEGER = 9007199254740991,
22
+ MAX_E = Math.log10(MAX_SAFE_INTEGER),
23
+
24
+ P = {},
25
+ Q = {},
26
+ R = {};
27
+
28
+ R.ZERO = 0;
29
+ R.ONE = 1;
30
+ R.TWO = 2;
31
+ R.TEN = 10;
32
+ R.E = Math.E;
33
+ R.LN2 = Math.LN2;
34
+ R.LN10 = Math.LN10;
35
+ R.LOG2E = Math.LOG2E;
36
+ R.LOG10E = Math.LOG10E;
37
+ R.PI = Math.PI;
38
+ R.SQRT1_2 = Math.SQRT1_2;
39
+ R.SQRT2 = Math.SQRT2;
40
+ R.MAX_SAFE_INTEGER = MAX_SAFE_INTEGER;
41
+ R.MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER;
42
+ R.NaN = NaN;
43
+ R.POSITIVE_INFINITY = Infinity;
44
+ R.NEGATIVE_INFINITY = -Infinity;
45
+ R.E_MAX_SAFE_INTEGER = "E" + MAX_SAFE_INTEGER;
46
+ R.EE_MAX_SAFE_INTEGER = "EE" + MAX_SAFE_INTEGER;
47
+ R.TETRATED_MAX_SAFE_INTEGER = "F" + MAX_SAFE_INTEGER;
48
+ R.PENTATED_MAX_SAFE_INTEGER = "G" + MAX_SAFE_INTEGER;
49
+ R.TRITRI = "[[3638334640023.7783, 7625597484984]]";
50
+ R.GRAHAMS_NUMBER = "[[3638334640023.7783, 7625597484984, 0, 1],[63,0,1]]";//对3↑↑↑↑3(≈GE^7625597484984 3638334640023.7783)做63次ω级运算
51
+ R.QqQe308 = "QqQe308";
52
+
53
+ function cmpArr(a, b) {
54
+ var al = a.length;
55
+ while (al > 0 && a[al - 1] === 0) al--;
56
+ var bl = b.length;
57
+ while (bl > 0 && b[bl - 1] === 0) bl--;
58
+ if (al !== bl) return al > bl ? 1 : -1;
59
+ for (var i = al - 1; i >= 0; i--) {
60
+ if (a[i] > b[i]) return 1;
61
+ if (a[i] < b[i]) return -1;
62
+ }
63
+ return 0;
64
+ }
65
+
66
+ function isZeroArr(arr) {
67
+ if (!arr || arr.length === 0) return true;
68
+ for (var i = 0; i < arr.length; i++) {
69
+ if (arr[i] !== 0) return false;
70
+ }
71
+ return true;
72
+ }
73
+
74
+ function deepCloneArray(arr) {
75
+ var result = [];
76
+ for (var i = 0; i < arr.length; i++) {
77
+ result[i] = arr[i].slice(0);
78
+ }
79
+ return result;
80
+ }
81
+
82
+ var debugMessageSent = false;
83
+
84
+ var f_gamma = function (n) {
85
+ if (!isFinite(n)) return n;
86
+ if (n < -50) {
87
+ if (n == Math.trunc(n)) return Number.NEGATIVE_INFINITY;
88
+ return 0;
89
+ }
90
+ var scal1 = 1;
91
+ while (n < 10) {
92
+ scal1 = scal1 * n;
93
+ ++n;
94
+ }
95
+ n -= 1;
96
+ var l = 0.9189385332046727;
97
+ l += (n + 0.5) * Math.log(n);
98
+ l -= n;
99
+ var n2 = n * n;
100
+ var np = n;
101
+ l += 1 / (12 * np);
102
+ np *= n2;
103
+ l -= 1 / (360 * np);
104
+ np *= n2;
105
+ l += 1 / (1260 * np);
106
+ np *= n2;
107
+ l -= 1 / (1680 * np);
108
+ np *= n2;
109
+ l += 1 / (1188 * np);
110
+ np *= n2;
111
+ l -= 691 / (360360 * np);
112
+ np *= n2;
113
+ l += 7 / (1092 * np);
114
+ np *= n2;
115
+ l -= 3617 / (122400 * np);
116
+ return Math.exp(l) / scal1;
117
+ };
118
+
119
+ var OMEGA = 0.56714329040978387299997;
120
+
121
+ var f_lambertw = function (z, tol, principal) {
122
+ if (tol === undefined) tol = 1e-10;
123
+ if (principal === undefined) principal = true;
124
+ var w;
125
+ if (!Number.isFinite(z)) return z;
126
+ if (principal) {
127
+ if (z === 0) return z;
128
+ if (z === 1) return OMEGA;
129
+ if (z < 10) w = 0;
130
+ else w = Math.log(z) - Math.log(Math.log(z));
131
+ } else {
132
+ if (z === 0) return -Infinity;
133
+ if (z <= -0.1) w = -2;
134
+ else w = Math.log(-z) - Math.log(-Math.log(-z));
135
+ }
136
+ for (var i = 0; i < 100; ++i) {
137
+ var wn = (z * Math.exp(-w) + w * w) / (w + 1);
138
+ if (Math.abs(wn - w) < tol * Math.abs(wn)) return wn;
139
+ w = wn;
140
+ }
141
+ throw Error("Iteration failed to converge: " + z);
142
+ };
143
+
144
+ var d_lambertw = function (z, tol, principal) {
145
+ if (tol === undefined) tol = 1e-10;
146
+ if (principal === undefined) principal = true;
147
+ z = new MetaNum(z);
148
+ var w;
149
+ if (!z.isFinite()) return z;
150
+ if (principal) {
151
+ if (z.eq(MetaNum.ZERO)) return z;
152
+ if (z.eq(MetaNum.ONE)) return new MetaNum(OMEGA);
153
+ w = MetaNum.ln(z);
154
+ } else {
155
+ if (z.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
156
+ w = MetaNum.ln(z.neg());
157
+ }
158
+ for (var i = 0; i < 100; ++i) {
159
+ var ew = w.neg().exp();
160
+ var wewz = w.sub(z.mul(ew));
161
+ var dd = w.add(MetaNum.ONE).sub(w.add(2).mul(wewz).div(MetaNum.mul(2, w).add(2)));
162
+ if (dd.eq(MetaNum.ZERO)) return w;
163
+ var wn = w.sub(wewz.div(dd));
164
+ if (MetaNum.abs(wn.sub(w)).lt(MetaNum.abs(wn).mul(tol))) return wn;
165
+ w = wn;
166
+ }
167
+ throw Error("Iteration failed to converge: " + z);
168
+ };
169
+
170
+ var decimalPlaces = function (value, places) {
171
+ var len = places + 1;
172
+ var numDigits = Math.ceil(Math.log10(Math.abs(value)));
173
+ if (numDigits < 100) numDigits = 0;
174
+ var rounded = Math.round(value * Math.pow(10, len - numDigits)) * Math.pow(10, numDigits - len);
175
+ return parseFloat(rounded.toFixed(Math.max(len - numDigits, 0)));
176
+ };
177
+
178
+ var log10PosBigInt = function (input) {
179
+ var exp = BigInt(64);
180
+ while (input >= BigInt(1) << exp) exp *= BigInt(2);
181
+ var expdel = exp / BigInt(2);
182
+ while (expdel > BigInt(0)) {
183
+ if (input >= BigInt(1) << exp) exp += expdel;
184
+ else exp -= expdel;
185
+ expdel /= BigInt(2);
186
+ }
187
+ var cutbits = exp - BigInt(54);
188
+ var firstbits = input >> cutbits;
189
+ return Math.log10(Number(firstbits)) + Math.LOG10E / Math.LOG2E * Number(cutbits);
190
+ };
191
+
192
+ var LONG_STRING_MIN_LENGTH = 17;
193
+
194
+ var log10LongString = function (str) {
195
+ return Math.log10(Number(str.substring(0, LONG_STRING_MIN_LENGTH))) + (str.length - LONG_STRING_MIN_LENGTH);
196
+ };
197
+
198
+ P.normalize = function () {
199
+ var b;
200
+ var x = this;
201
+
202
+ if (!x.array || !Array.isArray(x.array) || x.array.length === 0) {
203
+ x.array = [[0]];
204
+ }
205
+ if (x.sign !== 1 && x.sign !== -1) {
206
+ x.sign = Number(x.sign) < 0 ? -1 : 1;
207
+ }
208
+ if (typeof x.layer !== 'number' || !isFinite(x.layer) || x.layer < 0) {
209
+ x.layer = 0;
210
+ }
211
+ x.layer = Math.floor(x.layer);
212
+
213
+ for (var i = 0; i < x.array.length; i++) {
214
+ if (!Array.isArray(x.array[i])) {
215
+ x.array[i] = [x.array[i]];
216
+ }
217
+ }
218
+
219
+ if (x.array[0] && x.array[0].length > 0) {
220
+ if (isNaN(x.array[0][0])) {
221
+ x.array = [[NaN]];
222
+ x.layer = 0;
223
+ return x;
224
+ }
225
+ if (!isFinite(x.array[0][0])) {
226
+ x.array = [[x.array[0][0] === Infinity ? Infinity : -Infinity]];
227
+ x.layer = 0;
228
+ return x;
229
+ }
230
+ }
231
+
232
+ var r0 = x.array[0];
233
+ for (var i = 0; i < r0.length; i++) {
234
+ if (r0[i] === null || r0[i] === undefined) {
235
+ r0[i] = 0;
236
+ continue;
237
+ }
238
+ if (i !== 0 && !Number.isInteger(r0[i])) r0[i] = Math.floor(r0[i]);
239
+ }
240
+
241
+ do {
242
+ b = false;
243
+
244
+ while (r0.length > 1 && r0[r0.length - 1] === 0) {
245
+ r0.pop();
246
+ b = true;
247
+ }
248
+
249
+ if (x.layer === 0 && r0[0] > MAX_SAFE_INTEGER) {
250
+ r0[1] = (r0[1] || 0) + 1;
251
+ r0[0] = Math.log10(r0[0]);
252
+ b = true;
253
+ }
254
+
255
+ while (x.layer === 0 && r0.length > 1 && r0[0] < MAX_E && r0[1]) {
256
+ r0[0] = Math.pow(10, r0[0]);
257
+ r0[1]--;
258
+ b = true;
259
+ }
260
+
261
+ for (var i = 1; i < r0.length; i++) {
262
+ if (r0[i] > MAX_SAFE_INTEGER) {
263
+ r0[i + 1] = (r0[i + 1] || 0) + 1;
264
+ r0[0] = r0[i] + 1;
265
+ for (var j = 1; j <= i; j++) r0[j] = 0;
266
+ b = true;
267
+ }
268
+ }
269
+
270
+ while (x.array.length > 1 && isZeroArr(x.array[x.array.length - 1])) {
271
+ x.array.pop();
272
+ b = true;
273
+ }
274
+
275
+ if (x.array.length > MetaNum.maxRows) {
276
+ x.array = x.array.slice(0, MetaNum.maxRows);
277
+ b = true;
278
+ }
279
+
280
+ for (var i = 0; i < x.array.length; i++) {
281
+ if (x.array[i].length > MetaNum.maxCols) {
282
+ x.array[i] = x.array[i].slice(0, MetaNum.maxCols);
283
+ b = true;
284
+ }
285
+ }
286
+
287
+ if (x.array.length === 0) {
288
+ x.array = [[0]];
289
+ b = true;
290
+ }
291
+
292
+ for (var i = 0; i < x.array.length; i++) {
293
+ for (var j = 0; j < x.array[i].length; j++) {
294
+ if (x.array[i][j] === null || x.array[i][j] === undefined) {
295
+ x.array[i][j] = 0;
296
+ b = true;
297
+ }
298
+ if ((i > 0 || j > 0) && (!isFinite(x.array[i][j]) || isNaN(x.array[i][j]))) {
299
+ x.array[i][j] = 0;
300
+ b = true;
301
+ }
302
+ }
303
+ }
304
+
305
+ for (var i = 1; i < x.array.length; i++) {
306
+ var row = x.array[i];
307
+ while (row.length > 0 && row[row.length - 1] === 0) {
308
+ row.pop();
309
+ b = true;
310
+ }
311
+ }
312
+
313
+ if (x.array.length > 2) {
314
+ var rows2plus = x.array.slice(1);
315
+ rows2plus.sort(function (a, b) { return cmpArr(a, b); });
316
+ var orderChanged = false;
317
+ for (var i = 0; i < rows2plus.length; i++) {
318
+ if (cmpArr(rows2plus[i], x.array[i + 1]) !== 0) {
319
+ orderChanged = true;
320
+ break;
321
+ }
322
+ }
323
+ if (orderChanged) {
324
+ for (var i = 0; i < rows2plus.length; i++) {
325
+ x.array[i + 1] = rows2plus[i].slice(0);
326
+ }
327
+ b = true;
328
+ }
329
+ }
330
+
331
+ for (var i = x.array.length - 1; i > 1; i--) {
332
+ var rowA = x.array[i];
333
+ var rowB = x.array[i - 1];
334
+ if (rowA.length === rowB.length && rowA.length >= 2) {
335
+ var same = true;
336
+ for (var k = 1; k < rowA.length; k++) {
337
+ if (rowA[k] !== rowB[k]) { same = false; break; }
338
+ }
339
+ if (same) {
340
+ rowB[0] += rowA[0];
341
+ x.array.splice(i, 1);
342
+ b = true;
343
+ }
344
+ }
345
+ }
346
+
347
+ } while (b);
348
+
349
+ if (!x.array.length || !x.array[0]) {
350
+ x.array = [[0]];
351
+ x.sign = 1;
352
+ }
353
+
354
+ if (x.array.length === 1 && x.array[0].length === 1 && x.array[0][0] === 0 && x.sign === -1) {
355
+ x.sign = 1;
356
+ }
357
+
358
+ return x;
359
+ };
360
+
361
+ var standardizeMessageSent = false;
362
+ P.standardize = function () {
363
+ if (!standardizeMessageSent) console.warn(metaNumError + "'standardize' method is being deprecated in favor of 'normalize' and will be removed in the future!"), standardizeMessageSent = true;
364
+ return this.normalize();
365
+ };
366
+
367
+ P.absoluteValue = P.abs = function () {
368
+ var x = this.clone();
369
+ x.sign = 1;
370
+ return x;
371
+ };
372
+ Q.absoluteValue = Q.abs = function (x) {
373
+ return new MetaNum(x).abs();
374
+ };
375
+
376
+ P.negate = P.neg = function () {
377
+ var x = this.clone();
378
+ x.sign = x.sign * -1;
379
+ return x.normalize();
380
+ };
381
+ Q.negate = Q.neg = function (x) {
382
+ return new MetaNum(x).neg();
383
+ };
384
+
385
+ P.compareTo = P.cmp = function (other) {
386
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
387
+
388
+ if (this.array[0] && isNaN(this.array[0][0])) return NaN;
389
+ if (other.array[0] && isNaN(other.array[0][0])) return NaN;
390
+
391
+ var tInf = this.array[0] && this.array[0][0] === Infinity;
392
+ var oInf = other.array[0] && other.array[0][0] === Infinity;
393
+
394
+ if (tInf && !oInf) return this.sign;
395
+ if (!tInf && oInf) return -other.sign;
396
+ if (tInf && oInf) {
397
+ if (this.sign !== other.sign) return this.sign;
398
+ return 0;
399
+ }
400
+
401
+ var tAllZero = (this.array.length === 1 && this.array[0].length === 1 && this.array[0][0] === 0);
402
+ var oAllZero = (other.array.length === 1 && other.array[0].length === 1 && other.array[0][0] === 0);
403
+ if (tAllZero && oAllZero) return 0;
404
+
405
+ if (this.sign !== other.sign) return this.sign;
406
+
407
+ var m = this.sign;
408
+
409
+ if (this.layer !== other.layer) {
410
+ return (this.layer > other.layer ? 1 : -1) * m;
411
+ }
412
+
413
+ var tRows = this.array.length;
414
+ var oRows = other.array.length;
415
+ while (tRows > 1 && isZeroArr(this.array[tRows - 1])) tRows--;
416
+ while (oRows > 1 && isZeroArr(other.array[oRows - 1])) oRows--;
417
+
418
+ if (tRows !== oRows) return (tRows > oRows ? 1 : -1) * m;
419
+
420
+ for (var i = tRows - 1; i >= 0; i--) {
421
+ var c = cmpArr(this.array[i], other.array[i]);
422
+ if (c !== 0) return c * m;
423
+ }
424
+
425
+ return 0;
426
+ };
427
+ Q.compare = Q.cmp = function (x, y) {
428
+ return new MetaNum(x).cmp(y);
429
+ };
430
+
431
+ P.greaterThan = P.gt = function (other) {
432
+ return this.cmp(other) > 0;
433
+ };
434
+ Q.greaterThan = Q.gt = function (x, y) {
435
+ return new MetaNum(x).gt(y);
436
+ };
437
+
438
+ P.greaterThanOrEqualTo = P.gte = function (other) {
439
+ return this.cmp(other) >= 0;
440
+ };
441
+ Q.greaterThanOrEqualTo = Q.gte = function (x, y) {
442
+ return new MetaNum(x).gte(y);
443
+ };
444
+
445
+ P.lessThan = P.lt = function (other) {
446
+ return this.cmp(other) < 0;
447
+ };
448
+ Q.lessThan = Q.lt = function (x, y) {
449
+ return new MetaNum(x).lt(y);
450
+ };
451
+
452
+ P.lessThanOrEqualTo = P.lte = function (other) {
453
+ return this.cmp(other) <= 0;
454
+ };
455
+ Q.lessThanOrEqualTo = Q.lte = function (x, y) {
456
+ return new MetaNum(x).lte(y);
457
+ };
458
+
459
+ P.equalsTo = P.equal = P.eq = function (other) {
460
+ return this.cmp(other) === 0;
461
+ };
462
+ Q.equalsTo = Q.equal = Q.eq = function (x, y) {
463
+ return new MetaNum(x).eq(y);
464
+ };
465
+
466
+ P.notEqualsTo = P.notEqual = P.neq = function (other) {
467
+ return this.cmp(other) !== 0;
468
+ };
469
+ Q.notEqualsTo = Q.notEqual = Q.neq = function (x, y) {
470
+ return new MetaNum(x).neq(y);
471
+ };
472
+
473
+ P.minimum = P.min = function (other) {
474
+ return this.lt(other) ? this.clone() : new MetaNum(other);
475
+ };
476
+ Q.minimum = Q.min = function (x, y) {
477
+ return new MetaNum(x).min(y);
478
+ };
479
+
480
+ P.maximum = P.max = function (other) {
481
+ return this.gt(other) ? this.clone() : new MetaNum(other);
482
+ };
483
+ Q.maximum = Q.max = function (x, y) {
484
+ return new MetaNum(x).max(y);
485
+ };
486
+
487
+ P.compareTo_tolerance = P.cmp_tolerance = function (other, tolerance) {
488
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
489
+ return this.eq_tolerance(other, tolerance) ? 0 : this.cmp(other);
490
+ };
491
+ Q.compare_tolerance = Q.cmp_tolerance = function (x, y, tolerance) {
492
+ return new MetaNum(x).cmp_tolerance(y, tolerance);
493
+ };
494
+
495
+ P.greaterThan_tolerance = P.gt_tolerance = function (other, tolerance) {
496
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
497
+ return !this.eq_tolerance(other, tolerance) && this.gt(other);
498
+ };
499
+ Q.greaterThan_tolerance = Q.gt_tolerance = function (x, y, tolerance) {
500
+ return new MetaNum(x).gt_tolerance(y, tolerance);
501
+ };
502
+
503
+ P.greaterThanOrEqualTo_tolerance = P.gte_tolerance = function (other, tolerance) {
504
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
505
+ return this.eq_tolerance(other, tolerance) || this.gt(other);
506
+ };
507
+ Q.greaterThanOrEqualTo_tolerance = Q.gte_tolerance = function (x, y, tolerance) {
508
+ return new MetaNum(x).gte_tolerance(y, tolerance);
509
+ };
510
+
511
+ P.lessThan_tolerance = P.lt_tolerance = function (other, tolerance) {
512
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
513
+ return !this.eq_tolerance(other, tolerance) && this.lt(other);
514
+ };
515
+ Q.lessThan_tolerance = Q.lt_tolerance = function (x, y, tolerance) {
516
+ return new MetaNum(x).lt_tolerance(y, tolerance);
517
+ };
518
+
519
+ P.lessThanOrEqualTo_tolerance = P.lte_tolerance = function (other, tolerance) {
520
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
521
+ return this.eq_tolerance(other, tolerance) || this.lt(other);
522
+ };
523
+ Q.lessThanOrEqualTo_tolerance = Q.lte_tolerance = function (x, y, tolerance) {
524
+ return new MetaNum(x).lte_tolerance(y, tolerance);
525
+ };
526
+
527
+ P.equalsTo_tolerance = P.equal_tolerance = P.eq_tolerance = function (other, tolerance) {
528
+ if (!(other instanceof MetaNum)) other = new MetaNum(other);
529
+ if (tolerance == null) tolerance = 1e-7;
530
+ if (this.isNaN() || other.isNaN() || this.isFinite() != other.isFinite()) return false;
531
+ if (this.sign != other.sign) return false;
532
+ if (this.layer !== other.layer) return false;
533
+ var a, b, tR = this.array.length, oR = other.array.length;
534
+ if (tR <= 1 && oR <= 1) {
535
+ a = this.array[0] ? this.array[0][0] || 0 : 0;
536
+ b = other.array[0] ? other.array[0][0] || 0 : 0;
537
+ return Math.abs(a - b) <= tolerance * Math.max(Math.abs(a), Math.abs(b));
538
+ }
539
+ if (Math.abs(tR - oR) > 1) return false;
540
+ for (var i = Math.max(tR, oR) - 1; i >= 0; i--) {
541
+ var tRow = this.array[i] || [0];
542
+ var oRow = other.array[i] || [0];
543
+ if (cmpArr(tRow, oRow) !== 0) return false;
544
+ }
545
+ return true;
546
+ };
547
+ Q.equalsTo_tolerance = Q.equal_tolerance = Q.eq_tolerance = function (x, y, tolerance) {
548
+ return new MetaNum(x).eq_tolerance(y, tolerance);
549
+ };
550
+
551
+ P.notEqualsTo_tolerance = P.notEqual_tolerance = P.neq_tolerance = function (other, tolerance) {
552
+ return !this.eq_tolerance(other, tolerance);
553
+ };
554
+ Q.notEqualsTo_tolerance = Q.notEqual_tolerance = Q.neq_tolerance = function (x, y, tolerance) {
555
+ return new MetaNum(x).neq_tolerance(y, tolerance);
556
+ };
557
+
558
+ P.isPositive = P.ispos = function () {
559
+ return this.gt(MetaNum.ZERO);
560
+ };
561
+ Q.isPositive = Q.ispos = function (x) {
562
+ return new MetaNum(x).ispos();
563
+ };
564
+
565
+ P.isNegative = P.isneg = function () {
566
+ return this.lt(MetaNum.ZERO);
567
+ };
568
+ Q.isNegative = Q.isneg = function (x) {
569
+ return new MetaNum(x).isneg();
570
+ };
571
+
572
+ P.isNaN = function () {
573
+ return this.array[0] && isNaN(this.array[0][0]);
574
+ };
575
+ Q.isNaN = function (x) {
576
+ return new MetaNum(x).isNaN();
577
+ };
578
+
579
+ P.isFinite = function () {
580
+ if (!this.array[0]) return true;
581
+ return isFinite(this.array[0][0]);
582
+ };
583
+ Q.isFinite = function (x) {
584
+ return new MetaNum(x).isFinite();
585
+ };
586
+
587
+ P.isInfinite = function () {
588
+ return this.array[0] && this.array[0][0] === Infinity;
589
+ };
590
+ Q.isInfinite = function (x) {
591
+ return new MetaNum(x).isInfinite();
592
+ };
593
+
594
+ P.layerUp = function () {
595
+ var x = this.clone();
596
+ if (x.isNaN()) return x;
597
+
598
+ var actualRows = x.array.length;
599
+ while (actualRows > 1 && isZeroArr(x.array[actualRows - 1])) actualRows--;
600
+
601
+ if (actualRows <= 1) return x;
602
+
603
+ var maxRow = x.array[actualRows - 1];
604
+ x.array[0] = maxRow.slice(0);
605
+ x.array = [x.array[0]];
606
+ x.layer++;
607
+ return x.normalize();
608
+ };
609
+ Q.layerUp = function (x) {
610
+ return new MetaNum(x).layerUp();
611
+ };
612
+
613
+ P.layerDown = function () {
614
+ var x = this.clone();
615
+ if (x.isNaN() || x.layer <= 0) return x;
616
+
617
+ var hasRowsAfter = false;
618
+ for (var i = 1; i < x.array.length; i++) {
619
+ if (!isZeroArr(x.array[i])) {
620
+ hasRowsAfter = true;
621
+ break;
622
+ }
623
+ }
624
+
625
+ if (hasRowsAfter) return x;
626
+
627
+ if (x.array.length < 2) x.array.push([0]);
628
+ x.array[1] = x.array[0].slice(0);
629
+ x.array[0] = [0];
630
+ x.layer--;
631
+ return x.normalize();
632
+ };
633
+ Q.layerDown = function (x) {
634
+ return new MetaNum(x).layerDown();
635
+ };
636
+
637
+ function isSimple(x) {
638
+ return x.layer === 0 && x.array.length === 1 &&
639
+ x.array[0].length === 1 && isFinite(x.array[0][0]) &&
640
+ Math.abs(x.array[0][0]) <= MAX_SAFE_INTEGER;
641
+ }
642
+
643
+ function hyperLevel(n, val) {
644
+ var arr = new Array(n + 1);
645
+ for (var i = 0; i <= n; i++) arr[i] = 0;
646
+ arr[0] = val;
647
+ arr[n] = 1;
648
+ return new MetaNum([arr]);
649
+ }
650
+
651
+ function hyperLevelSafe(n, val) {
652
+ var arr = new Array(n + 1);
653
+ for (var i = 0; i <= n; i++) arr[i] = 0;
654
+ arr[0] = val;
655
+ arr[n] = 1;
656
+ var oldMaxCols = MetaNum.maxCols;
657
+ MetaNum.maxCols = Math.max(oldMaxCols, n + 1);
658
+ var r = new MetaNum([arr]);
659
+ MetaNum.maxCols = oldMaxCols;
660
+ return r;
661
+ }
662
+
663
+ function addOrdinalRow(metaNum, count, rawLevel) {
664
+ // Add an ordinal row [count, raw_level] to the MetaNum
665
+ // If there's already an ordinal row with the same level, merge counts
666
+ var x = metaNum.clone();
667
+ if (typeof rawLevel !== 'number' || !isFinite(rawLevel) || rawLevel < 0) {
668
+ return x;
669
+ }
670
+ if (count <= 0) return x;
671
+ x.layer = Math.max(x.layer, 1);
672
+ // Try to merge with existing row at the same level
673
+ for (var i = 1; i < x.array.length; i++) {
674
+ var row = x.array[i];
675
+ if (row.length === 2 && row[1] === rawLevel) {
676
+ row[0] += count;
677
+ return x;
678
+ }
679
+ }
680
+ if (x.array.length < MetaNum.maxRows) {
681
+ x.array.push([count, rawLevel]);
682
+ }
683
+ return x;
684
+ }
685
+
686
+ P.plus = P.add = function (other) {
687
+ var x = this.clone();
688
+ other = new MetaNum(other);
689
+
690
+ if (x.sign === -1) return x.neg().add(other.neg()).neg();
691
+ if (other.sign === -1) return x.sub(other.neg());
692
+ if (x.eq(MetaNum.ZERO)) return other;
693
+ if (other.eq(MetaNum.ZERO)) return x;
694
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
695
+ if (x.isInfinite() && other.isInfinite() && x.eq(other.neg())) return MetaNum.NaN.clone();
696
+ if (x.isInfinite()) return x;
697
+ if (other.isInfinite()) return other;
698
+
699
+ var p = x.min(other);
700
+ var q = x.max(other);
701
+ var t;
702
+
703
+ if (q.gt(MetaNum.E_MAX_SAFE_INTEGER) || q.div(p).gt(MetaNum.MAX_SAFE_INTEGER)) {
704
+ t = q;
705
+ } else if (!q.array[0][1]) {
706
+ t = new MetaNum(x.toNumber() + other.toNumber());
707
+ } else if (q.array[0][1] === 1) {
708
+ var a = p.array[0][1] ? p.array[0][0] : Math.log10(p.array[0][0]);
709
+ t = new MetaNum([a + Math.log10(Math.pow(10, q.array[0][0] - a) + 1), 1]);
710
+ }
711
+
712
+ return t;
713
+ };
714
+ Q.plus = Q.add = function (x, y) {
715
+ return new MetaNum(x).add(y);
716
+ };
717
+
718
+ P.minus = P.sub = function (other) {
719
+ var x = this.clone();
720
+ other = new MetaNum(other);
721
+
722
+ if (x.sign === -1) return x.neg().sub(other.neg()).neg();
723
+ if (other.sign === -1) return x.add(other.neg());
724
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
725
+ if (x.isInfinite() && other.isInfinite()) return MetaNum.NaN.clone();
726
+ if (x.isInfinite()) return x;
727
+ if (other.isInfinite()) return other.neg();
728
+ if (x.eq(other)) return MetaNum.ZERO.clone();
729
+ if (other.eq(MetaNum.ZERO)) return x;
730
+
731
+ var p = x.min(other);
732
+ var q = x.max(other);
733
+ var n = other.gt(x);
734
+ var t;
735
+
736
+ if (q.gt(MetaNum.E_MAX_SAFE_INTEGER) || q.div(p).gt(MetaNum.MAX_SAFE_INTEGER)) {
737
+ t = q;
738
+ t = n ? t.neg() : t;
739
+ } else if (!q.array[0][1]) {
740
+ t = new MetaNum(x.toNumber() - other.toNumber());
741
+ } else if (q.array[0][1] === 1) {
742
+ var a = p.array[0][1] ? p.array[0][0] : Math.log10(p.array[0][0]);
743
+ t = new MetaNum([a + Math.log10(Math.pow(10, q.array[0][0] - a) - 1), 1]);
744
+ t = n ? t.neg() : t;
745
+ }
746
+
747
+ return t;
748
+ };
749
+ Q.minus = Q.sub = function (x, y) {
750
+ return new MetaNum(x).sub(y);
751
+ };
752
+
753
+ P.times = P.mul = function (other) {
754
+ var x = this.clone();
755
+ other = new MetaNum(other);
756
+
757
+ if (x.sign * other.sign === -1) return x.abs().mul(other.abs()).neg();
758
+ if (x.sign === -1) return x.abs().mul(other.abs());
759
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
760
+ if (x.eq(MetaNum.ZERO) && other.isInfinite()) return MetaNum.NaN.clone();
761
+ if (x.isInfinite() && other.eq(MetaNum.ZERO)) return MetaNum.NaN.clone();
762
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
763
+ if (other.eq(MetaNum.ONE)) return x.clone();
764
+ if (x.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
765
+ if (x.eq(MetaNum.ONE)) return other.clone();
766
+ if (x.isInfinite()) return x;
767
+ if (other.isInfinite()) return other;
768
+
769
+ if (x.max(other).gt(MetaNum.EE_MAX_SAFE_INTEGER)) return x.max(other);
770
+
771
+ var n = x.toNumber() * other.toNumber();
772
+ if (n <= MAX_SAFE_INTEGER) return new MetaNum(n);
773
+ return MetaNum.pow(10, x.log10().add(other.log10()));
774
+ };
775
+ Q.times = Q.mul = function (x, y) {
776
+ return new MetaNum(x).mul(y);
777
+ };
778
+
779
+ P.divide = P.div = function (other) {
780
+ var x = this.clone();
781
+ other = new MetaNum(other);
782
+
783
+ if (x.sign * other.sign === -1) return x.abs().div(other.abs()).neg();
784
+ if (x.sign === -1) return x.abs().div(other.abs());
785
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
786
+ if (x.isInfinite() && other.isInfinite()) return MetaNum.NaN.clone();
787
+ if (x.eq(MetaNum.ZERO) && other.eq(MetaNum.ZERO)) return MetaNum.NaN.clone();
788
+ if (other.eq(MetaNum.ZERO)) return MetaNum.POSITIVE_INFINITY.clone();
789
+ if (other.eq(MetaNum.ONE)) return x.clone();
790
+ if (x.eq(other)) return MetaNum.ONE.clone();
791
+ if (x.isInfinite()) return x;
792
+ if (other.isInfinite()) return MetaNum.ZERO.clone();
793
+
794
+ if (x.max(other).gt(MetaNum.EE_MAX_SAFE_INTEGER)) return x.gt(other) ? x.clone() : MetaNum.ZERO.clone();
795
+
796
+ var n = x.toNumber() / other.toNumber();
797
+ if (n <= MAX_SAFE_INTEGER) return new MetaNum(n);
798
+ var pw = MetaNum.pow(10, x.log10().sub(other.log10()));
799
+ var fp = pw.floor();
800
+ if (pw.sub(fp).lt(new MetaNum(1e-9))) return fp;
801
+ return pw;
802
+ };
803
+ Q.divide = Q.div = function (x, y) {
804
+ return new MetaNum(x).div(y);
805
+ };
806
+
807
+ P.reciprocate = P.rec = function () {
808
+ if (this.isNaN()) return MetaNum.NaN.clone();
809
+ if (this.eq(MetaNum.ZERO)) return MetaNum.NaN.clone();
810
+ if (this.isInfinite()) return MetaNum.ZERO.clone();
811
+ if (this.layer > 0 || this.array.length > 1 || this.array[0].length > 1) return MetaNum.ZERO.clone();
812
+ return new MetaNum(1 / this.array[0][0]);
813
+ };
814
+ Q.reciprocate = Q.rec = function (x) {
815
+ return new MetaNum(x).rec();
816
+ };
817
+
818
+ P.toPower = P.pow = function (other) {
819
+ var x = this.clone();
820
+ other = new MetaNum(other);
821
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
822
+ if (x.sign === -1) return this.abs().pow(other).mul(MetaNum.fromNumber(-1).pow(other));
823
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ONE.clone();
824
+ if (x.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
825
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
826
+ if (other.eq(MetaNum.ONE)) return x.clone();
827
+ if (x.isInfinite() || other.isInfinite()) return x;
828
+ if (isSimple(x) && isSimple(other)) {
829
+ var powVal = Math.pow(x.array[0][0], other.array[0][0]);
830
+ if (Number.isFinite(powVal) && Math.abs(powVal) <= MAX_SAFE_INTEGER) return new MetaNum(powVal);
831
+ }
832
+ if (x.eq(MetaNum.TEN)) {
833
+ if (other.layer > 0 || other.array.length > 1) return other;
834
+ var newRow0 = other.array[0].slice(0);
835
+ newRow0[1] = (newRow0[1] || 0) + 1;
836
+ return new MetaNum(newRow0);
837
+ }
838
+ return MetaNum.pow(10, x.log10().mul(other));
839
+ };
840
+ Q.toPower = Q.pow = function (x, y) {
841
+ return new MetaNum(x).pow(y);
842
+ };
843
+
844
+ P.exponential = P.exp = function () {
845
+ if (this.isNaN()) return MetaNum.NaN.clone();
846
+ if (this.sign === -1) return this.abs().exp().rec();
847
+ if (isSimple(this)) {
848
+ var ev = Math.exp(this.array[0][0]);
849
+ if (Number.isFinite(ev) && Math.abs(ev) <= MAX_SAFE_INTEGER) return new MetaNum(ev);
850
+ }
851
+ return this;
852
+ };
853
+ Q.exponential = Q.exp = function (x) {
854
+ return new MetaNum(x).exp();
855
+ };
856
+
857
+ P.squareRoot = P.sqrt = function () {
858
+ if (this.isNaN() || this.sign === -1) return MetaNum.NaN.clone();
859
+ if (this.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
860
+ if (isSimple(this)) return new MetaNum(Math.sqrt(this.array[0][0]));
861
+ return this;
862
+ };
863
+ Q.squareRoot = Q.sqrt = function (x) {
864
+ return new MetaNum(x).sqrt();
865
+ };
866
+
867
+ P.cubeRoot = P.cbrt = function () {
868
+ if (this.isNaN()) return MetaNum.NaN.clone();
869
+ if (this.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
870
+ if (this.sign === -1) return this.abs().cbrt().neg();
871
+ if (isSimple(this)) return new MetaNum(Math.cbrt(this.array[0][0]));
872
+ return this;
873
+ };
874
+ Q.cubeRoot = Q.cbrt = function (x) {
875
+ return new MetaNum(x).cbrt();
876
+ };
877
+
878
+ P.root = function (other) {
879
+ var x = this.clone();
880
+ other = new MetaNum(other);
881
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
882
+ if (x.isInfinite()) return x;
883
+ if (other.eq(MetaNum.ZERO)) return MetaNum.POSITIVE_INFINITY.clone();
884
+ if (x.sign === -1 && other.mod(2).eq(MetaNum.ONE)) return x.abs().root(other).neg();
885
+ if (isSimple(x) && isSimple(other)) return new MetaNum(Math.pow(x.array[0][0], 1 / other.array[0][0]));
886
+ return x;
887
+ };
888
+ Q.root = function (x, y) {
889
+ return new MetaNum(x).root(y);
890
+ };
891
+
892
+ P.generalLogarithm = P.log10 = function () {
893
+ if (this.isNaN() || this.sign === -1) return MetaNum.NaN.clone();
894
+ if (this.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
895
+ if (this.isInfinite()) return this;
896
+ if (isSimple(this)) {
897
+ var lv = Math.log10(this.array[0][0]);
898
+ if (Number.isFinite(lv)) return new MetaNum(lv);
899
+ }
900
+ if (this.layer === 0 && this.array.length === 1 && this.array[0].length > 1) {
901
+ var r0 = this.array[0];
902
+ if (r0[1] > 0) {
903
+ var newR0 = r0.slice(0);
904
+ newR0[1]--;
905
+ return new MetaNum(newR0);
906
+ }
907
+ return this;
908
+ }
909
+ return this;
910
+ };
911
+ Q.generalLogarithm = Q.log10 = function (x) {
912
+ return new MetaNum(x).log10();
913
+ };
914
+
915
+ P.logarithm = P.logBase = P.log = function (base) {
916
+ var x = this.clone();
917
+ if (x.isNaN() || x.sign === -1) return MetaNum.NaN.clone();
918
+ base = new MetaNum(base);
919
+ if (base.isNaN() || base.eq(MetaNum.ZERO) || base.eq(MetaNum.ONE)) return MetaNum.NaN.clone();
920
+ if (x.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
921
+ if (x.eq(MetaNum.ONE)) return MetaNum.ZERO.clone();
922
+ if (isSimple(x) && isSimple(base)) {
923
+ var lv = Math.log(x.array[0][0]) / Math.log(base.array[0][0]);
924
+ if (Number.isFinite(lv)) return new MetaNum(lv);
925
+ }
926
+ return x.log10().div(base.log10());
927
+ };
928
+ Q.logarithm = Q.logBase = Q.log = function (x, base) {
929
+ return new MetaNum(x).logBase(base);
930
+ };
931
+
932
+ P.naturalLogarithm = P.ln = function () {
933
+ if (this.isNaN() || this.sign === -1) return MetaNum.NaN.clone();
934
+ if (this.eq(MetaNum.ZERO)) return MetaNum.NEGATIVE_INFINITY.clone();
935
+ if (this.isInfinite()) return this;
936
+ if (isSimple(this)) {
937
+ var lv = Math.log(this.array[0][0]);
938
+ if (Number.isFinite(lv)) return new MetaNum(lv);
939
+ }
940
+ return this.log10().div(new MetaNum(Math.LOG10E));
941
+ };
942
+ Q.naturalLogarithm = Q.ln = function (x) {
943
+ return new MetaNum(x).ln();
944
+ };
945
+
946
+ P.modular = P.mod = function (other) {
947
+ other = new MetaNum(other);
948
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
949
+ if (this.sign * other.sign === -1) return this.abs().mod(other.abs()).neg();
950
+ if (this.sign === -1) return this.abs().mod(other.abs());
951
+ return this.sub(this.div(other).floor().mul(other));
952
+ };
953
+ Q.modular = Q.mod = function (x, y) {
954
+ return new MetaNum(x).mod(y);
955
+ };
956
+
957
+ P.gamma = function () {
958
+ if (this.sign === -1) return MetaNum.NaN.clone();
959
+ if (this.isNaN() || this.isInfinite()) return this.clone();
960
+ if (isSimple(this)) {
961
+ if (Number.isInteger(this.array[0][0]) && this.array[0][0] >= 0 && this.array[0][0] <= 100) {
962
+ var f = 1;
963
+ for (var i = 2; i < this.array[0][0]; i++) f *= i;
964
+ return new MetaNum(f);
965
+ }
966
+ var g = f_gamma(this.array[0][0]);
967
+ if (Number.isFinite(g) && Math.abs(g) <= MAX_SAFE_INTEGER) return new MetaNum(g);
968
+ }
969
+ return this;
970
+ };
971
+ Q.gamma = function (x) {
972
+ return new MetaNum(x).gamma();
973
+ };
974
+
975
+ P.factorial = P.fact = function () {
976
+ if (this.isNaN() || this.isInfinite()) return this;
977
+ if (this.sign === -1) return this.abs().fact().neg();
978
+ if (isSimple(this)) {
979
+ if (Number.isInteger(this.array[0][0]) && this.array[0][0] >= 0 && this.array[0][0] <= 20) {
980
+ var f = 1;
981
+ for (var i = 2; i <= this.array[0][0]; i++) f *= i;
982
+ return new MetaNum(f);
983
+ }
984
+ var fa = f_gamma(this.array[0][0] + 1);
985
+ if (Number.isFinite(fa) && Math.abs(fa) <= MAX_SAFE_INTEGER) return new MetaNum(fa);
986
+ }
987
+ return this;
988
+ };
989
+ Q.factorial = Q.fact = function (x) {
990
+ return new MetaNum(x).fact();
991
+ };
992
+
993
+ P.lambertw = function (tol, principal) {
994
+ if (tol === undefined) tol = 1e-10;
995
+ if (principal === undefined) principal = true;
996
+ if (this.isNaN()) return MetaNum.NaN.clone();
997
+ if (this.isInfinite()) return this.clone();
998
+ if (isSimple(this)) {
999
+ try {
1000
+ return new MetaNum(f_lambertw(this.array[0][0], tol, principal));
1001
+ } catch (e) {
1002
+ return MetaNum.NaN.clone();
1003
+ }
1004
+ }
1005
+ return d_lambertw(this, tol, principal);
1006
+ };
1007
+ Q.lambertw = function (x, tol, principal) {
1008
+ return new MetaNum(x).lambertw(tol, principal);
1009
+ };
1010
+
1011
+ P.floor = function () {
1012
+ if (this.isNaN() || this.isInfinite()) return this.clone();
1013
+ if (this.layer > 0 || this.array.length > 1 || this.array[0].length > 1) return this.clone();
1014
+ return new MetaNum(Math.floor(this.array[0][0]));
1015
+ };
1016
+ Q.floor = function (x) {
1017
+ return new MetaNum(x).floor();
1018
+ };
1019
+
1020
+ P.ceiling = P.ceil = function () {
1021
+ if (this.isNaN() || this.isInfinite()) return this.clone();
1022
+ if (this.layer > 0 || this.array.length > 1 || this.array[0].length > 1) return this.clone();
1023
+ return new MetaNum(Math.ceil(this.array[0][0]));
1024
+ };
1025
+ Q.ceiling = Q.ceil = function (x) {
1026
+ return new MetaNum(x).ceil();
1027
+ };
1028
+
1029
+ P.round = function () {
1030
+ if (this.isNaN() || this.isInfinite()) return this.clone();
1031
+ if (this.layer > 0 || this.array.length > 1 || this.array[0].length > 1) return this.clone();
1032
+ return new MetaNum(Math.round(this.array[0][0]));
1033
+ };
1034
+ Q.round = function (x) {
1035
+ return new MetaNum(x).round();
1036
+ };
1037
+
1038
+ P.isInteger = P.isint = function () {
1039
+ if (this.isNaN() || this.isInfinite()) return false;
1040
+ if (this.sign === -1) return this.abs().isint();
1041
+ if (this.layer > 0 || this.array.length > 1 || this.array[0].length > 1) return true;
1042
+ return Number.isInteger(this.array[0][0]);
1043
+ };
1044
+ Q.isInteger = Q.isint = function (x) {
1045
+ return new MetaNum(x).isint();
1046
+ };
1047
+
1048
+ P.tetrate = P.tetr = function (other, payload) {
1049
+ if (payload === undefined) payload = MetaNum.ONE;
1050
+ var x = this.clone();
1051
+ other = new MetaNum(other);
1052
+ payload = new MetaNum(payload);
1053
+ if (payload.neq(MetaNum.ONE)) other = other.add(payload.slog(x));
1054
+ if (x.isNaN() || other.isNaN() || payload.isNaN()) return MetaNum.NaN.clone();
1055
+ if (other.sign === -1) return MetaNum.NaN.clone();
1056
+ if (other.eq(MetaNum.NEGATIVE_INFINITY)) return MetaNum.ZERO.clone();
1057
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ONE.clone();
1058
+ if (other.eq(MetaNum.ONE)) return x.clone();
1059
+ if (other.eq(2)) return x.pow(x);
1060
+ if (x.eq(MetaNum.ZERO)) {
1061
+ if (other.eq(MetaNum.ZERO)) return MetaNum.NaN.clone();
1062
+ if (other.mod(2).eq(MetaNum.ZERO)) return MetaNum.ONE.clone();
1063
+ return MetaNum.ZERO.clone();
1064
+ }
1065
+ if (x.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1066
+ if (x.eq(2)) {
1067
+ if (other.eq(3)) return new MetaNum(16);
1068
+ if (other.eq(4)) return new MetaNum(65536);
1069
+ }
1070
+ if (x.isInfinite() || other.isInfinite()) return x.max(other);
1071
+ var m = x.max(other);
1072
+ if (m.gt(hyperLevel(3, MAX_SAFE_INTEGER))) return m;
1073
+ if (m.gt(MetaNum.TETRATED_MAX_SAFE_INTEGER) || other.gt(MetaNum.MAX_SAFE_INTEGER)) {
1074
+ var j = x.slog(10).add(other);
1075
+ j.array[0][2] = (j.array[0][2] || 0) + 1;
1076
+ j.normalize();
1077
+ return j;
1078
+ }
1079
+ var y = other.toNumber();
1080
+ var f = Math.floor(y);
1081
+ var r = x.pow(y - f);
1082
+ for (var i = 0; f !== 0 && r.lt(MetaNum.E_MAX_SAFE_INTEGER) && i < 100; i++) {
1083
+ if (f > 0) {
1084
+ r = x.pow(r);
1085
+ f--;
1086
+ }
1087
+ }
1088
+ if (i === 100) f = 0;
1089
+ r.array[0][1] = (r.array[0][1] + f) || f;
1090
+ r.normalize();
1091
+ return r;
1092
+ };
1093
+ Q.tetrate = Q.tetr = function (x, y, payload) {
1094
+ return new MetaNum(x).tetr(y, payload);
1095
+ };
1096
+
1097
+ P.iteratedexp = function (other) {
1098
+ var x = this.clone();
1099
+ other = new MetaNum(other);
1100
+ if (other.sign === -1) return MetaNum.ZERO.clone();
1101
+ if (isSimple(x) && isSimple(other) && Number.isInteger(other.array[0][0]) && other.array[0][0] <= 4) {
1102
+ var iv = x.array[0][0];
1103
+ var ic = other.array[0][0];
1104
+ var r = iv;
1105
+ for (var i = 0; i < ic; i++) r = Math.pow(10, r);
1106
+ if (Number.isFinite(r) && Math.abs(r) <= MAX_SAFE_INTEGER) return new MetaNum(r);
1107
+ }
1108
+ return x;
1109
+ };
1110
+ Q.iteratedexp = function (x, y) {
1111
+ return new MetaNum(x).iteratedexp(y);
1112
+ };
1113
+
1114
+ P.iteratedlog = function (other) {
1115
+ var x = this.clone();
1116
+ other = new MetaNum(other);
1117
+ if (other.sign === -1) return MetaNum.POSITIVE_INFINITY.clone();
1118
+ if (other.eq(MetaNum.ZERO)) return x.clone();
1119
+ if (isSimple(x) && isSimple(other) && Number.isInteger(other.array[0][0]) && other.array[0][0] <= 4) {
1120
+ var iv = x.array[0][0];
1121
+ var ic = other.array[0][0];
1122
+ if (ic <= 0) return x.clone();
1123
+ var r = iv;
1124
+ for (var i = 0; i < ic; i++) r = Math.log10(r);
1125
+ return new MetaNum(r);
1126
+ }
1127
+ return x;
1128
+ };
1129
+ Q.iteratedlog = function (x, y) {
1130
+ return new MetaNum(x).iteratedlog(y);
1131
+ };
1132
+
1133
+ P.layeradd = function (other, base) {
1134
+ if (base == null) base = 10;
1135
+ var x = this.clone();
1136
+ other = new MetaNum(other);
1137
+ base = new MetaNum(base);
1138
+ if (x.isNaN() || other.isNaN() || base.isNaN()) return MetaNum.NaN.clone();
1139
+ if (other.eq(MetaNum.ZERO)) return x.clone();
1140
+ if (other.sign === -1) return MetaNum.ZERO.clone();
1141
+ return x.tetr(other).tetr(base).logBase(base);
1142
+ };
1143
+ Q.layeradd = function (x, y, base) {
1144
+ return new MetaNum(x).layeradd(y, base);
1145
+ };
1146
+
1147
+ P.layeradd10 = function (other) {
1148
+ return this.layeradd(other, 10);
1149
+ };
1150
+ Q.layeradd10 = function (x, y) {
1151
+ return new MetaNum(x).layeradd10(y);
1152
+ };
1153
+
1154
+ P.ssqrt = P.ssrt = function () {
1155
+ if (this.sign === -1) return MetaNum.NaN.clone();
1156
+ if (this.isNaN()) return MetaNum.NaN.clone();
1157
+ if (this.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
1158
+ if (this.eq(MetaNum.ONE)) return MetaNum.ONE.clone();
1159
+ if (isSimple(this)) {
1160
+ var v = this.array[0][0];
1161
+ if (v > 0 && v < 1) return new MetaNum(v);
1162
+ try {
1163
+ var w = f_lambertw(Math.log(v));
1164
+ if (Number.isFinite(w)) return new MetaNum(Math.exp(w));
1165
+ } catch (e) {}
1166
+ }
1167
+ return this.log10();
1168
+ };
1169
+ Q.ssqrt = Q.ssrt = function (x) {
1170
+ return new MetaNum(x).ssqrt();
1171
+ };
1172
+
1173
+ P.linear_sroot = function (other) {
1174
+ var x = this.clone();
1175
+ other = new MetaNum(other);
1176
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
1177
+ if (x.sign === -1 || other.sign === -1) return MetaNum.NaN.clone();
1178
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ZERO.clone();
1179
+ if (other.eq(MetaNum.ONE)) return x.clone();
1180
+ if (isSimple(x) && isSimple(other) && other.array[0][0] > 1) {
1181
+ var v = x.array[0][0];
1182
+ var n = other.array[0][0];
1183
+ try {
1184
+ var w = f_lambertw((n - 1) * Math.log(v / (n - 1)));
1185
+ if (Number.isFinite(w)) return new MetaNum(Math.exp(w));
1186
+ } catch (e) {}
1187
+ }
1188
+ return x;
1189
+ };
1190
+ Q.linear_sroot = function (x, y) {
1191
+ return new MetaNum(x).linear_sroot(y);
1192
+ };
1193
+
1194
+ P.slog = function (base) {
1195
+ if (base === undefined) base = 10;
1196
+ var x = this.clone();
1197
+ base = new MetaNum(base);
1198
+ if (x.isNaN() || base.isNaN()) return MetaNum.NaN.clone();
1199
+ if (x.sign === -1 || base.sign === -1) return MetaNum.NaN.clone();
1200
+ if (x.eq(MetaNum.ONE)) return MetaNum.ZERO.clone();
1201
+ if (x.lt(MetaNum.ONE)) return MetaNum.fromNumber(-1).add(x.slog(base));
1202
+ var m = x.max(base);
1203
+ if (m.gt(hyperLevel(3, MAX_SAFE_INTEGER))) {
1204
+ if (x.gt(base)) return x.clone();
1205
+ return MetaNum.ZERO.clone();
1206
+ }
1207
+ if (m.gt(MetaNum.TETRATED_MAX_SAFE_INTEGER)) {
1208
+ if (x.gt(base)) {
1209
+ x.array[0][2]--;
1210
+ x.normalize();
1211
+ return x.sub(x.array[0][1] || 0);
1212
+ }
1213
+ return MetaNum.ZERO.clone();
1214
+ }
1215
+ if (isSimple(x) && isSimple(base) && base.array[0][0] > 1) {
1216
+ var v = x.array[0][0];
1217
+ var b = base.array[0][0];
1218
+ if (v <= Math.pow(b, b)) {
1219
+ if (v <= 1) return MetaNum.ZERO.clone();
1220
+ var sl = 0;
1221
+ while (Math.pow(b, b) >= v && sl < 10) {
1222
+ v = Math.log(v) / Math.log(b);
1223
+ sl++;
1224
+ if (v <= 0) break;
1225
+ }
1226
+ if (sl > 0) return new MetaNum(sl + v - 1);
1227
+ }
1228
+ }
1229
+ var r = 0;
1230
+ var t = (x.array[0][1] || 0) - (base.array[0][1] || 0);
1231
+ if (t > 3) {
1232
+ var l = t - 3;
1233
+ r += l;
1234
+ x.array[0][1] = x.array[0][1] - l;
1235
+ }
1236
+ for (var i = 0; i < 100; i++) {
1237
+ if (x.lt(0)) {
1238
+ x = MetaNum.pow(base, x);
1239
+ r--;
1240
+ } else if (x.lte(1)) {
1241
+ return new MetaNum(r + x.array[0][0] - 1);
1242
+ } else {
1243
+ r++;
1244
+ x = x.logBase(base);
1245
+ }
1246
+ }
1247
+ if (x.gt(10)) return new MetaNum(r);
1248
+ return new MetaNum(r + x.array[0][0] - 1);
1249
+ };
1250
+ Q.slog = function (x, base) {
1251
+ return new MetaNum(x).slog(base);
1252
+ };
1253
+
1254
+ P.pentate = P.pent = function (other) {
1255
+ return this.arrow(3)(other);
1256
+ };
1257
+ Q.pentate = Q.pent = function (x, y) {
1258
+ return MetaNum.arrow(x, 3, y);
1259
+ };
1260
+
1261
+ P.arrow = function (arrows) {
1262
+ var t = this.clone();
1263
+ arrows = new MetaNum(arrows);
1264
+ if (!arrows.isint() || arrows.sign === -1) return function () { return MetaNum.NaN.clone(); };
1265
+ if (arrows.eq(MetaNum.ZERO)) return function (other) { return t.mul(other); };
1266
+ if (arrows.eq(MetaNum.ONE)) return function (other) { return t.pow(other); };
1267
+ if (arrows.eq(2)) return function (other) { return t.tetr(other); };
1268
+ return function (other) {
1269
+ other = new MetaNum(other);
1270
+ if (other.sign === -1) return MetaNum.NaN.clone();
1271
+ if (other.eq(MetaNum.ZERO)) return MetaNum.ONE.clone();
1272
+ if (other.eq(MetaNum.ONE)) return t.clone();
1273
+ if (other.eq(2)) return t.arrow(arrows.sub(MetaNum.ONE))(t);
1274
+ var arrowsNum = arrows.toNumber();
1275
+ if (!isFinite(arrowsNum)) {
1276
+ // arrows is a huge MetaNum (ω-level): result inherits the largest structure
1277
+ var j = t.max(other).max(arrows).clone();
1278
+ j.layer = 1;
1279
+ j.array.push([1, 0, 1]);
1280
+ j.normalize();
1281
+ return j;
1282
+ }
1283
+ if (arrows.gte(MetaNum.maxArrow)) {
1284
+ // arrows is very large but still a JS number; use approximate overflow
1285
+ var j = t.max(other).clone();
1286
+ j.layer = 1;
1287
+ j.array.push([1, 0, 1]);
1288
+ j.normalize();
1289
+ return j;
1290
+ }
1291
+ if (t.max(other).gt(hyperLevelSafe(arrowsNum + 1, MAX_SAFE_INTEGER))) return t.max(other);
1292
+ if (arrowsNum >= MetaNum.maxCols && t.array.length === 1 && other.array.length === 1) {
1293
+ var a = t.array[0][0];
1294
+ var b = other.array[0][0];
1295
+ if (b >= 2) {
1296
+ var count = b - 2;
1297
+ var baseResult = t.arrow(MetaNum.maxCols - 1)(other);
1298
+ if (arrowsNum === MetaNum.maxCols) {
1299
+ baseResult.array[0][MetaNum.maxCols - 1] = (baseResult.array[0][MetaNum.maxCols - 1] || 0) + count;
1300
+ baseResult.normalize();
1301
+ return baseResult;
1302
+ }
1303
+ if (arrowsNum === MetaNum.maxCols + 1) {
1304
+ baseResult.array[0][MetaNum.maxCols - 1] = (baseResult.array[0][MetaNum.maxCols - 1] || 0) + count;
1305
+ baseResult.normalize();
1306
+ baseResult = addOrdinalRow(baseResult, count, MetaNum.maxCols);
1307
+ baseResult.normalize();
1308
+ return baseResult;
1309
+ }
1310
+ var endLevel = arrowsNum - 1;
1311
+ var startLevel = MetaNum.maxCols;
1312
+ var totalOrdinal = endLevel - startLevel + 1;
1313
+ if (totalOrdinal + 1 <= MetaNum.maxRows) {
1314
+ r = t.arrow(MetaNum.maxCols - 1)(other);
1315
+ for (var lev = startLevel; lev <= endLevel; lev++) {
1316
+ r = addOrdinalRow(r, count, lev);
1317
+ }
1318
+ } else {
1319
+ r = new MetaNum(a);
1320
+ var keepStart = endLevel - MetaNum.maxRows + 2;
1321
+ for (var lev = keepStart; lev <= endLevel; lev++) {
1322
+ r = addOrdinalRow(r, count, lev);
1323
+ }
1324
+ }
1325
+ r.normalize();
1326
+ return r;
1327
+ }
1328
+ }
1329
+ if (t.gt(hyperLevelSafe(arrowsNum, MAX_SAFE_INTEGER)) || other.gt(MetaNum.MAX_SAFE_INTEGER)) {
1330
+ var r;
1331
+ if (t.gt(hyperLevelSafe(arrowsNum, MAX_SAFE_INTEGER))) {
1332
+ r = t.clone();
1333
+ if (arrowsNum < MetaNum.maxCols) {
1334
+ r.array[0][arrowsNum]--;
1335
+ } else {
1336
+ var lastRow = r.array[r.array.length - 1];
1337
+ if (lastRow && lastRow.length >= 2 && typeof lastRow[lastRow.length - 1] === 'number') {
1338
+ lastRow[0] = (lastRow[0] || 0) - 1;
1339
+ if (lastRow[0] <= 0) r.array.pop();
1340
+ }
1341
+ }
1342
+ r.normalize();
1343
+ } else if (t.gt(hyperLevelSafe(arrowsNum - 1, MAX_SAFE_INTEGER))) {
1344
+ if (arrowsNum - 1 < MetaNum.maxCols) {
1345
+ r = new MetaNum(t.array[0][arrowsNum - 1]);
1346
+ } else {
1347
+ r = MetaNum.ZERO.clone();
1348
+ }
1349
+ } else {
1350
+ r = MetaNum.ZERO.clone();
1351
+ }
1352
+ var j = r.add(other);
1353
+ if (arrowsNum < MetaNum.maxCols) {
1354
+ j.array[0][arrowsNum] = (j.array[0][arrowsNum] || 0) + 1;
1355
+ } else {
1356
+ j = addOrdinalRow(j, 1, arrowsNum);
1357
+ }
1358
+ j.normalize();
1359
+ return j;
1360
+ }
1361
+ var y = other.toNumber();
1362
+ var f = Math.floor(y);
1363
+ var arrows_m1 = arrows.sub(MetaNum.ONE);
1364
+ var r = t.arrow(arrows_m1)(y - f);
1365
+ var initFloor = Math.floor(other.toNumber());
1366
+ for (var i = 0; f !== 0 && r.lt(hyperLevelSafe(arrowsNum - 1, MAX_SAFE_INTEGER)) && i < 100; i++) {
1367
+ if (f > 0) {
1368
+ r = t.arrow(arrows_m1)(r);
1369
+ f--;
1370
+ }
1371
+ }
1372
+ if (i === 100) f = 0;
1373
+ if (arrowsNum - 1 < MetaNum.maxCols) {
1374
+ if (f > 0) {
1375
+ r.array[0][arrowsNum - 1] = (r.array[0][arrowsNum - 1] || 0) + f;
1376
+ }
1377
+ } else {
1378
+ var count = f > 0 ? f : (i > 0 && initFloor > 0 ? initFloor - 1 : 0);
1379
+ if (count > 0) {
1380
+ r = addOrdinalRow(r, count, arrowsNum - 1);
1381
+ }
1382
+ }
1383
+ r.normalize();
1384
+ return r;
1385
+ };
1386
+ };
1387
+ P.chain = function (other, arrows) {
1388
+ return this.arrow(arrows)(other);
1389
+ };
1390
+ Q.arrow = function (x, arrows, y) {
1391
+ return new MetaNum(x).arrow(arrows)(y);
1392
+ };
1393
+ Q.chain = function (x, y, arrows) {
1394
+ return new MetaNum(x).arrow(arrows)(y);
1395
+ };
1396
+ P.aperiote = P.aper = function (y) {
1397
+ return this.arrow(y)(this);
1398
+ };
1399
+ Q.aperiote = Q.aper = function (x, y) {
1400
+ return new MetaNum(x).arrow(y)(x);
1401
+ };
1402
+
1403
+ P.inv_aperiote = P.i_aper = function (z) {
1404
+ var x = this.clone();
1405
+ z = new MetaNum(z);
1406
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1407
+ if (z.array.length >= 2) {
1408
+ var result = z.clone();
1409
+ for (var i = result.array.length - 1; i >= 1; i--) {
1410
+ var row = result.array[i];
1411
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] > 0) {
1412
+ row[0]--;
1413
+ if (row[0] <= 0) result.array.splice(i, 1);
1414
+ result.normalize();
1415
+ if (result.array.length <= 1) result.layer = 0;
1416
+ return result;
1417
+ }
1418
+ }
1419
+ for (var i = result.array.length - 1; i >= 1; i--) {
1420
+ var row = result.array[i];
1421
+ if (row.length === 2 && row[1] > 0) {
1422
+ return new MetaNum(row[1] + 1);
1423
+ }
1424
+ }
1425
+ return result;
1426
+ }
1427
+ if (z.layer === 0 && z.array.length === 1) {
1428
+ var r0 = z.array[0];
1429
+ if (r0.length > 1 && r0[1] > 0) {
1430
+ return new MetaNum(r0[1] + 1);
1431
+ }
1432
+ return new MetaNum(1);
1433
+ }
1434
+ return z;
1435
+ };
1436
+ Q.inv_aperiote = Q.i_aper = function (x, z) {
1437
+ return new MetaNum(x).inv_aperiote(z);
1438
+ };
1439
+
1440
+ P.expande = P.expa = function (y) {
1441
+ var x = this.clone();
1442
+ y = new MetaNum(y);
1443
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1444
+ if (y.eq(MetaNum.ONE)) return x.clone();
1445
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1446
+ var base = x.aperiote(x); // expande(x, 2)
1447
+ if (y.layer === 0) {
1448
+ // finite y: r0 from base, Cantor expansion
1449
+ var result = base.clone();
1450
+ if (y.eq(2)) return result;
1451
+ var count = y.toNumber() - 2;
1452
+ if (count > 0) {
1453
+ result.layer = 0;
1454
+ result.array = [base.array[0].slice()];
1455
+ var cl = MetaNum.getCantorLevel(0);
1456
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1457
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1458
+ for (var i = 0; i < ordRows.length; i++) {
1459
+ result.array.push(ordRows[i]);
1460
+ }
1461
+ result.normalize();
1462
+ }
1463
+ return result;
1464
+ }
1465
+ // ordinal y: clone y, set r0, add [1, 1, 1]
1466
+ var result = y.clone();
1467
+ result.array[0] = base.array[0].slice();
1468
+ result.layer = 0;
1469
+ result.array.push([1, 1, 1]);
1470
+ result.normalize();
1471
+ return result;
1472
+ };
1473
+ Q.expande = Q.expa = function (x, y) {
1474
+ return new MetaNum(x).expande(y);
1475
+ };
1476
+
1477
+ P.inv_expande = P.i_expa = function (z) {
1478
+ var x = this.clone();
1479
+ z = new MetaNum(z);
1480
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1481
+ if (z.array.length >= 2) {
1482
+ var result = z.clone();
1483
+ // First: find ordinal marker [1, 1, 1]
1484
+ for (var i = result.array.length - 1; i >= 1; i--) {
1485
+ var row = result.array[i];
1486
+ if (row.length >= 3 && row[1] === 1 && row[2] === 1 && row[0] === 1) {
1487
+ result.array.splice(i, 1);
1488
+ result.normalize();
1489
+ if (result.array.length <= 1) result.layer = 0;
1490
+ return result;
1491
+ }
1492
+ }
1493
+ // Second: find iteration count [count, 0, 1]
1494
+ for (var i = result.array.length - 1; i >= 1; i--) {
1495
+ var row = result.array[i];
1496
+ if (row.length >= 3 && row[1] === 0 && row[2] === 1 && row[0] > 0) {
1497
+ row[0]--;
1498
+ if (row[0] <= 0) result.array.splice(i, 1);
1499
+ result.normalize();
1500
+ if (result.array.length <= 1) result.layer = 0;
1501
+ return result;
1502
+ }
1503
+ }
1504
+ // Fallback: finite-level result
1505
+ for (var i = result.array.length - 1; i >= 1; i--) {
1506
+ var row2 = result.array[i];
1507
+ if (row2.length === 2 && row2[1] > 0) {
1508
+ return new MetaNum(row2[1] + 1);
1509
+ }
1510
+ }
1511
+ return result;
1512
+ }
1513
+ return z;
1514
+ };
1515
+ Q.inv_expande = Q.i_expa = function (x, z) {
1516
+ return new MetaNum(x).inv_expande(z);
1517
+ };
1518
+
1519
+ P.multiexpande = P.muea = function (y) {
1520
+ var x = this.clone();
1521
+ y = new MetaNum(y);
1522
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1523
+ if (y.eq(MetaNum.ONE)) return x.clone();
1524
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1525
+ var base = x.expande(x); // multiexpande(x, 2)
1526
+ if (y.layer === 0) {
1527
+ var result = base.clone();
1528
+ if (y.eq(2)) return result;
1529
+ var count = y.toNumber() - 2;
1530
+ if (count > 0) {
1531
+ result.layer = 0;
1532
+ result.array = [base.array[0].slice()];
1533
+ var cl = MetaNum.getCantorLevel(1);
1534
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1535
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1536
+ for (var i = 0; i < ordRows.length; i++) {
1537
+ result.array.push(ordRows[i]);
1538
+ }
1539
+ result.normalize();
1540
+ }
1541
+ return result;
1542
+ }
1543
+ var result = y.clone();
1544
+ result.array[0] = base.array[0].slice();
1545
+ result.layer = 0;
1546
+ result.array.push([1, 2, 1]);
1547
+ result.normalize();
1548
+ return result;
1549
+ };
1550
+ Q.multiexpande = Q.muea = function (x, y) {
1551
+ return new MetaNum(x).multiexpande(y);
1552
+ };
1553
+
1554
+ P.inv_multiexpande = P.i_muea = function (z) {
1555
+ var x = this.clone();
1556
+ z = new MetaNum(z);
1557
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1558
+ if (z.array.length >= 2) {
1559
+ var result = z.clone();
1560
+ for (var i = result.array.length - 1; i >= 1; i--) {
1561
+ var row = result.array[i];
1562
+ if (row.length >= 3 && row[1] === 2 && row[2] === 1 && row[0] === 1) {
1563
+ result.array.splice(i, 1);
1564
+ result.normalize();
1565
+ if (result.array.length <= 1) result.layer = 0;
1566
+ return result;
1567
+ }
1568
+ }
1569
+ for (var i = result.array.length - 1; i >= 1; i--) {
1570
+ var row = result.array[i];
1571
+ if (row.length >= 3 && row[1] === 1 && row[2] === 1 && row[0] > 0) {
1572
+ row[0]--;
1573
+ if (row[0] <= 0) result.array.splice(i, 1);
1574
+ result.normalize();
1575
+ if (result.array.length <= 1) result.layer = 0;
1576
+ return result;
1577
+ }
1578
+ }
1579
+ return result;
1580
+ }
1581
+ return z;
1582
+ };
1583
+ Q.inv_multiexpande = Q.i_muea = function (x, z) {
1584
+ return new MetaNum(x).inv_multiexpande(z);
1585
+ };
1586
+
1587
+ P.powerexpande = P.poea = function (y) {
1588
+ var x = this.clone();
1589
+ y = new MetaNum(y);
1590
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1591
+ if (y.eq(MetaNum.ONE)) return x.clone();
1592
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1593
+ var base = x.multiexpande(x); // powerexpande(x, 2)
1594
+ if (y.layer === 0) {
1595
+ var result = base.clone();
1596
+ if (y.eq(2)) return result;
1597
+ var count = y.toNumber() - 2;
1598
+ if (count > 0) {
1599
+ result.layer = 0;
1600
+ result.array = [base.array[0].slice()];
1601
+ var cl = MetaNum.getCantorLevel(2);
1602
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1603
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1604
+ for (var i = 0; i < ordRows.length; i++) {
1605
+ result.array.push(ordRows[i]);
1606
+ }
1607
+ result.normalize();
1608
+ }
1609
+ return result;
1610
+ }
1611
+ var result = y.clone();
1612
+ result.array[0] = base.array[0].slice();
1613
+ result.layer = 0;
1614
+ result.array.push([1, 3, 1]);
1615
+ result.normalize();
1616
+ return result;
1617
+ };
1618
+ Q.powerexpande = Q.poea = function (x, y) {
1619
+ return new MetaNum(x).powerexpande(y);
1620
+ };
1621
+
1622
+ P.inv_powerexpande = P.i_poea = function (z) {
1623
+ var x = this.clone();
1624
+ z = new MetaNum(z);
1625
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1626
+ if (z.array.length >= 2) {
1627
+ var result = z.clone();
1628
+ for (var i = result.array.length - 1; i >= 1; i--) {
1629
+ var row = result.array[i];
1630
+ if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] === 1) {
1631
+ result.array.splice(i, 1);
1632
+ result.normalize();
1633
+ if (result.array.length <= 1) result.layer = 0;
1634
+ return result;
1635
+ }
1636
+ }
1637
+ for (var i = result.array.length - 1; i >= 1; i--) {
1638
+ var row = result.array[i];
1639
+ if (row.length >= 3 && row[1] === 2 && row[2] === 1 && row[0] > 0) {
1640
+ row[0]--;
1641
+ if (row[0] <= 0) result.array.splice(i, 1);
1642
+ result.normalize();
1643
+ if (result.array.length <= 1) result.layer = 0;
1644
+ return result;
1645
+ }
1646
+ }
1647
+ return result;
1648
+ }
1649
+ return z;
1650
+ };
1651
+ Q.inv_powerexpande = Q.i_poea = function (x, z) {
1652
+ return new MetaNum(x).inv_powerexpande(z);
1653
+ };
1654
+
1655
+ P.aperioexpansion = P.apea = function (y) {
1656
+ var x = this.clone();
1657
+ y = new MetaNum(y);
1658
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1659
+ if (y.eq(MetaNum.ONE)) return x.expande(x);
1660
+ if (y.eq(2)) return x.multiexpande(x);
1661
+ if (y.eq(3)) return x.powerexpande(x);
1662
+ var base = x.powerexpande(x); // aperioexpansion(x, 3)
1663
+ if (y.layer === 0) {
1664
+ var result = base.clone();
1665
+ var count = y.toNumber() - 3;
1666
+ if (count > 0) {
1667
+ result.layer = 0;
1668
+ result.array = [base.array[0].slice()];
1669
+ var cl = MetaNum.getCantorLevel(3);
1670
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1671
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1672
+ for (var i = 0; i < ordRows.length; i++) {
1673
+ result.array.push(ordRows[i]);
1674
+ }
1675
+ result.normalize();
1676
+ }
1677
+ return result;
1678
+ }
1679
+ var result = y.clone();
1680
+ result.array[0] = base.array[0].slice();
1681
+ result.layer = 0;
1682
+ result.array.push([1, 4, 1]);
1683
+ result.normalize();
1684
+ return result;
1685
+ };
1686
+ Q.aperioexpansion = Q.apea = function (x, y) {
1687
+ return new MetaNum(x).aperioexpansion(y);
1688
+ };
1689
+
1690
+ P.inv_aperioexpansion = P.i_apea = function (z) {
1691
+ var x = this.clone();
1692
+ z = new MetaNum(z);
1693
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1694
+ if (z.array.length >= 2) {
1695
+ var result = z.clone();
1696
+ for (var i = result.array.length - 1; i >= 1; i--) {
1697
+ var row = result.array[i];
1698
+ if (row.length >= 3 && row[1] === 4 && row[2] === 1 && row[0] === 1) {
1699
+ result.array.splice(i, 1);
1700
+ result.normalize();
1701
+ if (result.array.length <= 1) result.layer = 0;
1702
+ return result;
1703
+ }
1704
+ }
1705
+ for (var i = result.array.length - 1; i >= 1; i--) {
1706
+ var row = result.array[i];
1707
+ if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] > 0) {
1708
+ row[0]--;
1709
+ if (row[0] <= 0) result.array.splice(i, 1);
1710
+ result.normalize();
1711
+ if (result.array.length <= 1) result.layer = 0;
1712
+ return result;
1713
+ }
1714
+ }
1715
+ return result;
1716
+ }
1717
+ return z;
1718
+ };
1719
+ Q.inv_aperioexpande = Q.i_apea = function (x, z) {
1720
+ return new MetaNum(x).inv_aperioexpansion(z);
1721
+ };
1722
+
1723
+ P.explode = P.expl = function (y) {
1724
+ var x = this.clone();
1725
+ y = new MetaNum(y);
1726
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1727
+ if (y.eq(MetaNum.ONE)) return x.clone();
1728
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1729
+ var base = x.aperioexpansion(x); // explode(x, 2)
1730
+ if (y.layer === 0) {
1731
+ var result = base.clone();
1732
+ if (y.eq(2)) return result;
1733
+ var count = y.toNumber() - 2;
1734
+ if (count > 0) {
1735
+ result.layer = 0;
1736
+ result.array = [base.array[0].slice()];
1737
+ var cl = MetaNum.getCantorLevel(3);
1738
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1739
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1740
+ for (var i = 0; i < ordRows.length; i++) {
1741
+ result.array.push(ordRows[i]);
1742
+ }
1743
+ result.normalize();
1744
+ }
1745
+ return result;
1746
+ }
1747
+ var result = y.clone();
1748
+ result.array[0] = base.array[0].slice();
1749
+ result.layer = 0;
1750
+ result.array.push([1, 4, 1]);
1751
+ result.normalize();
1752
+ return result;
1753
+ };
1754
+ Q.explode = Q.expl = function (x, y) {
1755
+ return new MetaNum(x).explode(y);
1756
+ };
1757
+
1758
+ P.inv_explode = P.i_expl = function (z) {
1759
+ var x = this.clone();
1760
+ z = new MetaNum(z);
1761
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1762
+ if (z.array.length >= 2) {
1763
+ var result = z.clone();
1764
+ for (var i = result.array.length - 1; i >= 1; i--) {
1765
+ var row = result.array[i];
1766
+ if (row.length >= 3 && row[1] === 4 && row[2] === 1 && row[0] === 1) {
1767
+ result.array.splice(i, 1);
1768
+ result.normalize();
1769
+ if (result.array.length <= 1) result.layer = 0;
1770
+ return result;
1771
+ }
1772
+ }
1773
+ for (var i = result.array.length - 1; i >= 1; i--) {
1774
+ var row = result.array[i];
1775
+ if (row.length >= 3 && row[1] === 3 && row[2] === 1 && row[0] > 0) {
1776
+ row[0]--;
1777
+ if (row[0] <= 0) result.array.splice(i, 1);
1778
+ result.normalize();
1779
+ if (result.array.length <= 1) result.layer = 0;
1780
+ return result;
1781
+ }
1782
+ }
1783
+ return result;
1784
+ }
1785
+ return z;
1786
+ };
1787
+ Q.inv_explode = Q.i_expl = function (x, z) {
1788
+ return new MetaNum(x).inv_explode(z);
1789
+ };
1790
+
1791
+ P.multiexplode = P.muel = function (y) {
1792
+ var x = this.clone();
1793
+ y = new MetaNum(y);
1794
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1795
+ if (y.eq(MetaNum.ONE)) return x.clone();
1796
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1797
+ var base = x.explode(x); // multiexplode(x, 2)
1798
+ if (y.layer === 0) {
1799
+ var result = base.clone();
1800
+ if (y.eq(2)) return result;
1801
+ var count = y.toNumber() - 2;
1802
+ if (count > 0) {
1803
+ result.layer = 0;
1804
+ result.array = [base.array[0].slice()];
1805
+ var cl = MetaNum.getCantorLevel(4);
1806
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1807
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1808
+ for (var i = 0; i < ordRows.length; i++) {
1809
+ result.array.push(ordRows[i]);
1810
+ }
1811
+ result.normalize();
1812
+ }
1813
+ return result;
1814
+ }
1815
+ var result = y.clone();
1816
+ result.array[0] = base.array[0].slice();
1817
+ result.layer = 0;
1818
+ result.array.push([1, 5, 1]);
1819
+ result.normalize();
1820
+ return result;
1821
+ };
1822
+ Q.multiexplode = Q.muel = function (x, y) {
1823
+ return new MetaNum(x).multiexplode(y);
1824
+ };
1825
+
1826
+ P.inv_multiexplode = P.i_muel = function (z) {
1827
+ var x = this.clone();
1828
+ z = new MetaNum(z);
1829
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1830
+ if (z.array.length >= 2) {
1831
+ var result = z.clone();
1832
+ for (var i = result.array.length - 1; i >= 1; i--) {
1833
+ var row = result.array[i];
1834
+ if (row.length >= 3 && row[1] === 5 && row[2] === 1 && row[0] === 1) {
1835
+ result.array.splice(i, 1);
1836
+ result.normalize();
1837
+ if (result.array.length <= 1) result.layer = 0;
1838
+ return result;
1839
+ }
1840
+ }
1841
+ for (var i = result.array.length - 1; i >= 1; i--) {
1842
+ var row = result.array[i];
1843
+ if (row.length >= 3 && row[1] === 4 && row[2] === 1 && row[0] > 0) {
1844
+ row[0]--;
1845
+ if (row[0] <= 0) result.array.splice(i, 1);
1846
+ result.normalize();
1847
+ if (result.array.length <= 1) result.layer = 0;
1848
+ return result;
1849
+ }
1850
+ }
1851
+ return result;
1852
+ }
1853
+ return z;
1854
+ };
1855
+ Q.inv_multiexplode = Q.i_muel = function (x, z) {
1856
+ return new MetaNum(x).inv_multiexplode(z);
1857
+ };
1858
+
1859
+ P.aperioexplode = P.apel = function (y) {
1860
+ var x = this.clone();
1861
+ y = new MetaNum(y);
1862
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1863
+ if (y.eq(MetaNum.ONE)) return x.explode(x);
1864
+ if (y.eq(2)) return x.multiexplode(x);
1865
+ var base = x.multiexplode(x); // aperioexplode(x, 2)
1866
+ if (y.layer === 0) {
1867
+ var result = base.clone();
1868
+ var count = y.toNumber() - 2;
1869
+ if (count > 0) {
1870
+ result.layer = 0;
1871
+ result.array = [base.array[0].slice()];
1872
+ var cl = MetaNum.getCantorLevel(5);
1873
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1874
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1875
+ for (var i = 0; i < ordRows.length; i++) {
1876
+ result.array.push(ordRows[i]);
1877
+ }
1878
+ result.normalize();
1879
+ }
1880
+ return result;
1881
+ }
1882
+ var result = y.clone();
1883
+ result.array[0] = base.array[0].slice();
1884
+ result.layer = 0;
1885
+ result.array.push([1, 6, 1]);
1886
+ result.normalize();
1887
+ return result;
1888
+ };
1889
+ Q.aperioexplode = Q.apel = function (x, y) {
1890
+ return new MetaNum(x).aperioexplode(y);
1891
+ };
1892
+
1893
+ P.inv_aperioexplode = P.i_apel = function (z) {
1894
+ var x = this.clone();
1895
+ z = new MetaNum(z);
1896
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1897
+ if (z.array.length >= 2) {
1898
+ var result = z.clone();
1899
+ for (var i = result.array.length - 1; i >= 1; i--) {
1900
+ var row = result.array[i];
1901
+ if (row.length >= 3 && row[1] === 6 && row[2] === 1 && row[0] === 1) {
1902
+ result.array.splice(i, 1);
1903
+ result.normalize();
1904
+ if (result.array.length <= 1) result.layer = 0;
1905
+ return result;
1906
+ }
1907
+ }
1908
+ for (var i = result.array.length - 1; i >= 1; i--) {
1909
+ var row = result.array[i];
1910
+ if (row.length >= 3 && row[1] === 5 && row[2] === 1 && row[0] > 0) {
1911
+ row[0]--;
1912
+ if (row[0] <= 0) result.array.splice(i, 1);
1913
+ result.normalize();
1914
+ if (result.array.length <= 1) result.layer = 0;
1915
+ return result;
1916
+ }
1917
+ }
1918
+ return result;
1919
+ }
1920
+ return z;
1921
+ };
1922
+ Q.inv_aperioexplode = Q.i_apel = function (x, z) {
1923
+ return new MetaNum(x).inv_aperioexplode(z);
1924
+ };
1925
+
1926
+ P.detonate = P.deto = function (y) {
1927
+ var x = this.clone();
1928
+ y = new MetaNum(y);
1929
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1930
+ if (y.eq(MetaNum.ONE)) return x.clone();
1931
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
1932
+ var base = x.aperioexplode(x); // detonate(x, 2)
1933
+ if (y.layer === 0) {
1934
+ var result = base.clone();
1935
+ if (y.eq(2)) return result;
1936
+ var count = y.toNumber() - 2;
1937
+ if (count > 0) {
1938
+ result.layer = 0;
1939
+ result.array = [base.array[0].slice()];
1940
+ var cl = MetaNum.getCantorLevel(5);
1941
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
1942
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
1943
+ for (var i = 0; i < ordRows.length; i++) {
1944
+ result.array.push(ordRows[i]);
1945
+ }
1946
+ result.normalize();
1947
+ }
1948
+ return result;
1949
+ }
1950
+ var result = y.clone();
1951
+ result.array[0] = base.array[0].slice();
1952
+ result.layer = 0;
1953
+ result.array.push([1, 6, 1]);
1954
+ result.normalize();
1955
+ return result;
1956
+ };
1957
+ Q.detonate = Q.deto = function (x, y) {
1958
+ return new MetaNum(x).detonate(y);
1959
+ };
1960
+
1961
+ P.inv_detonate = P.i_deto = function (z) {
1962
+ var x = this.clone();
1963
+ z = new MetaNum(z);
1964
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
1965
+ if (z.array.length >= 2) {
1966
+ var result = z.clone();
1967
+ for (var i = result.array.length - 1; i >= 1; i--) {
1968
+ var row = result.array[i];
1969
+ if (row.length >= 3 && row[1] === 6 && row[2] === 1 && row[0] === 1) {
1970
+ result.array.splice(i, 1);
1971
+ result.normalize();
1972
+ if (result.array.length <= 1) result.layer = 0;
1973
+ return result;
1974
+ }
1975
+ }
1976
+ for (var i = result.array.length - 1; i >= 1; i--) {
1977
+ var row = result.array[i];
1978
+ if (row.length >= 3 && row[1] === 5 && row[2] === 1 && row[0] > 0) {
1979
+ row[0]--;
1980
+ if (row[0] <= 0) result.array.splice(i, 1);
1981
+ result.normalize();
1982
+ if (result.array.length <= 1) result.layer = 0;
1983
+ return result;
1984
+ }
1985
+ }
1986
+ return result;
1987
+ }
1988
+ return z;
1989
+ };
1990
+ Q.inv_detonate = Q.i_deto = function (x, z) {
1991
+ return new MetaNum(x).inv_detonate(z);
1992
+ };
1993
+
1994
+ P.aperionate = P.apeo = function (y) {
1995
+ var x = this.clone();
1996
+ y = new MetaNum(y);
1997
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
1998
+ if (y.eq(MetaNum.ONE)) return x.aperiote(x);
1999
+ if (y.eq(2)) return x.aperioexpansion(x);
2000
+ if (y.eq(3)) return x.aperioexplode(x);
2001
+ var base = x.aperioexplode(x); // aperionate(x, 3)
2002
+ if (y.layer === 0) {
2003
+ var result = base.clone();
2004
+ var count = y.toNumber() - 3;
2005
+ if (count > 0) {
2006
+ result.layer = 0;
2007
+ result.array = [base.array[0].slice()];
2008
+ var cl = MetaNum.getCantorLevel(6);
2009
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2010
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2011
+ for (var i = 0; i < ordRows.length; i++) {
2012
+ result.array.push(ordRows[i]);
2013
+ }
2014
+ result.normalize();
2015
+ }
2016
+ return result;
2017
+ }
2018
+ var result = y.clone();
2019
+ result.array[0] = base.array[0].slice();
2020
+ result.layer = 0;
2021
+ result.array.push([1, 7, 1]);
2022
+ result.normalize();
2023
+ return result;
2024
+ };
2025
+ Q.aperionate = Q.apeo = function (x, y) {
2026
+ return new MetaNum(x).aperionate(y);
2027
+ };
2028
+
2029
+ P.inv_aperionate = P.i_apeo = function (z) {
2030
+ var x = this.clone();
2031
+ z = new MetaNum(z);
2032
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2033
+ if (z.array.length >= 2) {
2034
+ var result = z.clone();
2035
+ for (var i = result.array.length - 1; i >= 1; i--) {
2036
+ var row = result.array[i];
2037
+ if (row.length >= 3 && row[1] === 7 && row[2] === 1 && row[0] === 1) {
2038
+ result.array.splice(i, 1);
2039
+ result.normalize();
2040
+ if (result.array.length <= 1) result.layer = 0;
2041
+ return result;
2042
+ }
2043
+ }
2044
+ for (var i = result.array.length - 1; i >= 1; i--) {
2045
+ var row = result.array[i];
2046
+ if (row.length >= 3 && row[1] === 6 && row[2] === 1 && row[0] > 0) {
2047
+ row[0]--;
2048
+ if (row[0] <= 0) result.array.splice(i, 1);
2049
+ result.normalize();
2050
+ if (result.array.length <= 1) result.layer = 0;
2051
+ return result;
2052
+ }
2053
+ }
2054
+ return result;
2055
+ }
2056
+ return z;
2057
+ };
2058
+ Q.inv_aperionate = Q.i_apeo = function (x, z) {
2059
+ return new MetaNum(x).inv_aperionate(z);
2060
+ };
2061
+
2062
+ // megote (ω^2+1): iterates aperionate
2063
+ P.megote = P.mego = function (y) {
2064
+ var x = this.clone();
2065
+ y = new MetaNum(y);
2066
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2067
+ if (y.eq(MetaNum.ONE)) return x.clone();
2068
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2069
+ var base = x.aperionate(x); // megote(x, 2)
2070
+ if (y.layer === 0) {
2071
+ var result = base.clone();
2072
+ if (y.eq(2)) return result;
2073
+ var count = y.toNumber() - 2;
2074
+ if (count > 0) {
2075
+ result.layer = 0;
2076
+ result.array = [base.array[0].slice()];
2077
+ var cl = MetaNum.getCantorLevel(7);
2078
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2079
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2080
+ for (var i = 0; i < ordRows.length; i++) {
2081
+ result.array.push(ordRows[i]);
2082
+ }
2083
+ result.normalize();
2084
+ }
2085
+ return result;
2086
+ }
2087
+ var result = y.clone();
2088
+ result.array[0] = base.array[0].slice();
2089
+ result.layer = 0;
2090
+ result.array.push([1, 8, 1]);
2091
+ result.normalize();
2092
+ return result;
2093
+ };
2094
+ Q.megote = Q.mego = function (x, y) {
2095
+ return new MetaNum(x).megote(y);
2096
+ };
2097
+
2098
+ P.inv_megote = P.i_mego = function (z) {
2099
+ var x = this.clone();
2100
+ z = new MetaNum(z);
2101
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2102
+ if (z.array.length >= 2) {
2103
+ var result = z.clone();
2104
+ for (var i = result.array.length - 1; i >= 1; i--) {
2105
+ var row = result.array[i];
2106
+ if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] === 1) {
2107
+ result.array.splice(i, 1);
2108
+ result.normalize();
2109
+ if (result.array.length <= 1) result.layer = 0;
2110
+ return result;
2111
+ }
2112
+ }
2113
+ for (var i = result.array.length - 1; i >= 1; i--) {
2114
+ var row = result.array[i];
2115
+ if (row.length >= 3 && row[1] === 7 && row[2] === 1 && row[0] > 0) {
2116
+ row[0]--;
2117
+ if (row[0] <= 0) result.array.splice(i, 1);
2118
+ result.normalize();
2119
+ if (result.array.length <= 1) result.layer = 0;
2120
+ return result;
2121
+ }
2122
+ }
2123
+ return result;
2124
+ }
2125
+ return z;
2126
+ };
2127
+ Q.inv_megote = Q.i_mego = function (x, z) {
2128
+ return new MetaNum(x).inv_megote(z);
2129
+ };
2130
+
2131
+ // aperimegote (ω^2+ω): diagonalization at ω^2 level
2132
+ P.aperimegote = P.apmg = function (y) {
2133
+ var x = this.clone();
2134
+ y = new MetaNum(y);
2135
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2136
+ if (y.eq(MetaNum.ONE)) return x.megote(x);
2137
+ var base = x.megote(x); // aperimegote(x, 1)
2138
+ if (y.layer === 0) {
2139
+ var result = base.clone();
2140
+ var count = y.toNumber() - 1;
2141
+ if (count > 0) {
2142
+ result.layer = 0;
2143
+ result.array = [base.array[0].slice()];
2144
+ var cl = MetaNum.getCantorLevel(8);
2145
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2146
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2147
+ for (var i = 0; i < ordRows.length; i++) {
2148
+ result.array.push(ordRows[i]);
2149
+ }
2150
+ result.normalize();
2151
+ }
2152
+ return result;
2153
+ }
2154
+ var result = y.clone();
2155
+ result.array[0] = base.array[0].slice();
2156
+ result.layer = 0;
2157
+ result.array.push([1, 9, 1]);
2158
+ result.normalize();
2159
+ return result;
2160
+ };
2161
+ Q.aperimegote = Q.apmg = function (x, y) {
2162
+ return new MetaNum(x).aperimegote(y);
2163
+ };
2164
+
2165
+ P.inv_aperimegote = P.i_apmg = function (z) {
2166
+ var x = this.clone();
2167
+ z = new MetaNum(z);
2168
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2169
+ if (z.array.length >= 2) {
2170
+ var result = z.clone();
2171
+ for (var i = result.array.length - 1; i >= 1; i--) {
2172
+ var row = result.array[i];
2173
+ if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] === 1) {
2174
+ result.array.splice(i, 1);
2175
+ result.normalize();
2176
+ if (result.array.length <= 1) result.layer = 0;
2177
+ return result;
2178
+ }
2179
+ }
2180
+ for (var i = result.array.length - 1; i >= 1; i--) {
2181
+ var row = result.array[i];
2182
+ if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] > 0) {
2183
+ row[0]--;
2184
+ if (row[0] <= 0) result.array.splice(i, 1);
2185
+ result.normalize();
2186
+ if (result.array.length <= 1) result.layer = 0;
2187
+ return result;
2188
+ }
2189
+ }
2190
+ return result;
2191
+ }
2192
+ return z;
2193
+ };
2194
+ Q.inv_aperimegote = Q.i_apmg = function (x, z) {
2195
+ return new MetaNum(x).inv_aperimegote(z);
2196
+ };
2197
+
2198
+ // megoexpande (ω^2+ω+1): iterates aperimegote
2199
+ P.megoexpande = P.mgea = function (y) {
2200
+ var x = this.clone();
2201
+ y = new MetaNum(y);
2202
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2203
+ if (y.eq(MetaNum.ONE)) return x.clone();
2204
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2205
+ var base = x.aperimegote(x); // megoexpande(x, 2)
2206
+ if (y.layer === 0) {
2207
+ var result = base.clone();
2208
+ if (y.eq(2)) return result;
2209
+ var count = y.toNumber() - 2;
2210
+ if (count > 0) {
2211
+ result.layer = 0;
2212
+ result.array = [base.array[0].slice()];
2213
+ var cl = MetaNum.getCantorLevel(8);
2214
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2215
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2216
+ for (var i = 0; i < ordRows.length; i++) {
2217
+ result.array.push(ordRows[i]);
2218
+ }
2219
+ result.normalize();
2220
+ }
2221
+ return result;
2222
+ }
2223
+ var result = y.clone();
2224
+ result.array[0] = base.array[0].slice();
2225
+ result.layer = 0;
2226
+ result.array.push([1, 9, 1]);
2227
+ result.normalize();
2228
+ return result;
2229
+ };
2230
+ Q.megoexpande = Q.mgea = function (x, y) {
2231
+ return new MetaNum(x).megoexpande(y);
2232
+ };
2233
+
2234
+ P.inv_megoexpande = P.i_mgea = function (z) {
2235
+ var x = this.clone();
2236
+ z = new MetaNum(z);
2237
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2238
+ if (z.array.length >= 2) {
2239
+ var result = z.clone();
2240
+ for (var i = result.array.length - 1; i >= 1; i--) {
2241
+ var row = result.array[i];
2242
+ if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] === 1) {
2243
+ result.array.splice(i, 1);
2244
+ result.normalize();
2245
+ if (result.array.length <= 1) result.layer = 0;
2246
+ return result;
2247
+ }
2248
+ }
2249
+ for (var i = result.array.length - 1; i >= 1; i--) {
2250
+ var row = result.array[i];
2251
+ if (row.length >= 3 && row[1] === 8 && row[2] === 1 && row[0] > 0) {
2252
+ row[0]--;
2253
+ if (row[0] <= 0) result.array.splice(i, 1);
2254
+ result.normalize();
2255
+ if (result.array.length <= 1) result.layer = 0;
2256
+ return result;
2257
+ }
2258
+ }
2259
+ return result;
2260
+ }
2261
+ return z;
2262
+ };
2263
+ Q.inv_megoexpande = Q.i_mgea = function (x, z) {
2264
+ return new MetaNum(x).inv_megoexpande(z);
2265
+ };
2266
+
2267
+ // megoaperionation (ω^2*2): diagonalization at ω^2+ω level
2268
+ P.megoaperionation = P.mgao = function (y) {
2269
+ var x = this.clone();
2270
+ y = new MetaNum(y);
2271
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2272
+ if (y.eq(MetaNum.ONE)) return x.megote(x);
2273
+ if (y.eq(2)) return x.aperimegote(x);
2274
+ if (y.eq(3)) return x.megoexpande(x);
2275
+ var base = x.megoexpande(x); // megoaperionation(x, 3)
2276
+ if (y.layer === 0) {
2277
+ var result = base.clone();
2278
+ var count = y.toNumber() - 3;
2279
+ if (count > 0) {
2280
+ result.layer = 0;
2281
+ result.array = [base.array[0].slice()];
2282
+ var cl = MetaNum.getCantorLevel(9);
2283
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2284
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2285
+ for (var i = 0; i < ordRows.length; i++) {
2286
+ result.array.push(ordRows[i]);
2287
+ }
2288
+ result.normalize();
2289
+ }
2290
+ return result;
2291
+ }
2292
+ var result = y.clone();
2293
+ result.array[0] = base.array[0].slice();
2294
+ result.layer = 0;
2295
+ result.array.push([1, 10, 1]);
2296
+ result.normalize();
2297
+ return result;
2298
+ };
2299
+ Q.megoaperionation = Q.mgao = function (x, y) {
2300
+ return new MetaNum(x).megoaperionation(y);
2301
+ };
2302
+
2303
+ P.inv_megoaperionation = P.i_mgao = function (z) {
2304
+ var x = this.clone();
2305
+ z = new MetaNum(z);
2306
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2307
+ if (z.array.length >= 2) {
2308
+ var result = z.clone();
2309
+ for (var i = result.array.length - 1; i >= 1; i--) {
2310
+ var row = result.array[i];
2311
+ if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] === 1) {
2312
+ result.array.splice(i, 1);
2313
+ result.normalize();
2314
+ if (result.array.length <= 1) result.layer = 0;
2315
+ return result;
2316
+ }
2317
+ }
2318
+ for (var i = result.array.length - 1; i >= 1; i--) {
2319
+ var row = result.array[i];
2320
+ if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
2321
+ row[0]--;
2322
+ if (row[0] <= 0) result.array.splice(i, 1);
2323
+ result.normalize();
2324
+ if (result.array.length <= 1) result.layer = 0;
2325
+ return result;
2326
+ }
2327
+ }
2328
+ return result;
2329
+ }
2330
+ return z;
2331
+ };
2332
+ Q.inv_megoaperionation = Q.i_mgao = function (x, z) {
2333
+ return new MetaNum(x).inv_megoaperionation(z);
2334
+ };
2335
+
2336
+ // gigote (ω^2*2+1): iterates megoaperionation
2337
+ P.gigote = P.gigo = function (y) {
2338
+ var x = this.clone();
2339
+ y = new MetaNum(y);
2340
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2341
+ if (y.eq(MetaNum.ONE)) return x.clone();
2342
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2343
+ var base = x.megoaperionation(x); // gigote(x, 2)
2344
+ if (y.layer === 0) {
2345
+ var result = base.clone();
2346
+ if (y.eq(2)) return result;
2347
+ var count = y.toNumber() - 2;
2348
+ if (count > 0) {
2349
+ result.layer = 0;
2350
+ result.array = [base.array[0].slice()];
2351
+ var cl = MetaNum.getCantorLevel(9);
2352
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2353
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2354
+ for (var i = 0; i < ordRows.length; i++) {
2355
+ result.array.push(ordRows[i]);
2356
+ }
2357
+ result.normalize();
2358
+ }
2359
+ return result;
2360
+ }
2361
+ var result = y.clone();
2362
+ result.array[0] = base.array[0].slice();
2363
+ result.layer = 0;
2364
+ result.array.push([1, 10, 1]);
2365
+ result.normalize();
2366
+ return result;
2367
+ };
2368
+ Q.gigote = Q.gigo = function (x, y) {
2369
+ return new MetaNum(x).gigote(y);
2370
+ };
2371
+
2372
+ P.inv_gigote = P.i_gigo = function (z) {
2373
+ var x = this.clone();
2374
+ z = new MetaNum(z);
2375
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2376
+ if (z.array.length >= 2) {
2377
+ var result = z.clone();
2378
+ for (var i = result.array.length - 1; i >= 1; i--) {
2379
+ var row = result.array[i];
2380
+ if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] === 1) {
2381
+ result.array.splice(i, 1);
2382
+ result.normalize();
2383
+ if (result.array.length <= 1) result.layer = 0;
2384
+ return result;
2385
+ }
2386
+ }
2387
+ for (var i = result.array.length - 1; i >= 1; i--) {
2388
+ var row = result.array[i];
2389
+ if (row.length >= 3 && row[1] === 9 && row[2] === 1 && row[0] > 0) {
2390
+ row[0]--;
2391
+ if (row[0] <= 0) result.array.splice(i, 1);
2392
+ result.normalize();
2393
+ if (result.array.length <= 1) result.layer = 0;
2394
+ return result;
2395
+ }
2396
+ }
2397
+ return result;
2398
+ }
2399
+ return z;
2400
+ };
2401
+ Q.inv_gigote = Q.i_gigo = function (x, z) {
2402
+ return new MetaNum(x).inv_gigote(z);
2403
+ };
2404
+
2405
+ // aperiatotion (ω^3): diagonalization of ω^2*y
2406
+ P.aperiatotion = P.apat = function (y) {
2407
+ var x = this.clone();
2408
+ y = new MetaNum(y);
2409
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2410
+ if (y.eq(MetaNum.ONE)) return x.aperionate(x);
2411
+ if (y.eq(2)) return x.megoaperionation(x);
2412
+ var base = x.megoaperionation(x); // aperiatotion(x, 2)
2413
+ if (y.layer === 0) {
2414
+ var result = base.clone();
2415
+ var count = y.toNumber() - 2;
2416
+ if (count > 0) {
2417
+ result.layer = 0;
2418
+ result.array = [base.array[0].slice()];
2419
+ var cl = MetaNum.getCantorLevel(10);
2420
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2421
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2422
+ for (var i = 0; i < ordRows.length; i++) {
2423
+ result.array.push(ordRows[i]);
2424
+ }
2425
+ result.normalize();
2426
+ }
2427
+ return result;
2428
+ }
2429
+ var result = y.clone();
2430
+ result.array[0] = base.array[0].slice();
2431
+ result.layer = 0;
2432
+ result.array.push([1, 11, 1]);
2433
+ result.normalize();
2434
+ return result;
2435
+ };
2436
+ Q.aperiatotion = Q.apat = function (x, y) {
2437
+ return new MetaNum(x).aperiatotion(y);
2438
+ };
2439
+
2440
+ P.inv_aperiatotion = P.i_apat = function (z) {
2441
+ var x = this.clone();
2442
+ z = new MetaNum(z);
2443
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2444
+ if (z.array.length >= 2) {
2445
+ var result = z.clone();
2446
+ for (var i = result.array.length - 1; i >= 1; i--) {
2447
+ var row = result.array[i];
2448
+ if (row.length >= 3 && row[1] === 11 && row[2] === 1 && row[0] === 1) {
2449
+ result.array.splice(i, 1);
2450
+ result.normalize();
2451
+ if (result.array.length <= 1) result.layer = 0;
2452
+ return result;
2453
+ }
2454
+ }
2455
+ for (var i = result.array.length - 1; i >= 1; i--) {
2456
+ var row = result.array[i];
2457
+ if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
2458
+ row[0]--;
2459
+ if (row[0] <= 0) result.array.splice(i, 1);
2460
+ result.normalize();
2461
+ if (result.array.length <= 1) result.layer = 0;
2462
+ return result;
2463
+ }
2464
+ }
2465
+ return result;
2466
+ }
2467
+ return z;
2468
+ };
2469
+ Q.inv_aperiatotion = Q.i_apat = function (x, z) {
2470
+ return new MetaNum(x).inv_aperiatotion(z);
2471
+ };
2472
+
2473
+ // powiainate (ω^3+1): iterates aperiatotion
2474
+ P.powiainate = P.pwan = function (y) {
2475
+ var x = this.clone();
2476
+ y = new MetaNum(y);
2477
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2478
+ if (y.eq(MetaNum.ONE)) return x.clone();
2479
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2480
+ var base = x.aperiatotion(x); // powiainate(x, 2)
2481
+ if (y.layer === 0) {
2482
+ var result = base.clone();
2483
+ if (y.eq(2)) return result;
2484
+ var count = y.toNumber() - 2;
2485
+ if (count > 0) {
2486
+ result.layer = 0;
2487
+ result.array = [base.array[0].slice()];
2488
+ var cl = MetaNum.getCantorLevel(10);
2489
+ var maxVal = (cl >= 2) ? (y.toNumber() - 1) : count;
2490
+ var ordRows = MetaNum.expandOrdinals(cl, maxVal);
2491
+ for (var i = 0; i < ordRows.length; i++) {
2492
+ result.array.push(ordRows[i]);
2493
+ }
2494
+ result.normalize();
2495
+ }
2496
+ return result;
2497
+ }
2498
+ var result = y.clone();
2499
+ result.array[0] = base.array[0].slice();
2500
+ result.layer = 0;
2501
+ result.array.push([1, 11, 1]);
2502
+ result.normalize();
2503
+ return result;
2504
+ };
2505
+ Q.powiainate = Q.pwan = function (x, y) {
2506
+ return new MetaNum(x).powiainate(y);
2507
+ };
2508
+
2509
+ P.inv_powiainate = P.i_pwan = function (z) {
2510
+ var x = this.clone();
2511
+ z = new MetaNum(z);
2512
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2513
+ if (z.array.length >= 2) {
2514
+ var result = z.clone();
2515
+ for (var i = result.array.length - 1; i >= 1; i--) {
2516
+ var row = result.array[i];
2517
+ if (row.length >= 3 && row[1] === 11 && row[2] === 1 && row[0] === 1) {
2518
+ result.array.splice(i, 1);
2519
+ result.normalize();
2520
+ if (result.array.length <= 1) result.layer = 0;
2521
+ return result;
2522
+ }
2523
+ }
2524
+ for (var i = result.array.length - 1; i >= 1; i--) {
2525
+ var row = result.array[i];
2526
+ if (row.length >= 3 && row[1] === 10 && row[2] === 1 && row[0] > 0) {
2527
+ row[0]--;
2528
+ if (row[0] <= 0) result.array.splice(i, 1);
2529
+ result.normalize();
2530
+ if (result.array.length <= 1) result.layer = 0;
2531
+ return result;
2532
+ }
2533
+ }
2534
+ return result;
2535
+ }
2536
+ return z;
2537
+ };
2538
+ Q.inv_powiainate = Q.i_pwan = function (x, z) {
2539
+ return new MetaNum(x).inv_powiainate(z);
2540
+ };
2541
+
2542
+ // iter (ω^ω): diagonalizes ω^x operations
2543
+ // k <= maxCols-2: layer 0, multi-index; k >= maxCols-1: layer 1
2544
+ P.iter = P.ite = function (y) {
2545
+ var x = this.clone();
2546
+ y = new MetaNum(y);
2547
+ if (x.isNaN() || y.isNaN()) return MetaNum.NaN.clone();
2548
+ if (y.eq(MetaNum.ONE)) return x.clone();
2549
+ if (y.lte(MetaNum.ZERO)) return MetaNum.NaN.clone();
2550
+
2551
+ if (y.layer === 0 && y.array.length <= 1) {
2552
+ var yn = y.toNumber();
2553
+ var maxLevel = MetaNum.maxCols - 1;
2554
+ if (yn < maxLevel) {
2555
+ // y fits within ordinal levels: create ω^y at layer 0
2556
+ // Multi-index format: [1, 0, 0, ..., 0, 1] with yn zeros
2557
+ var result = x.clone();
2558
+ var row = [1];
2559
+ for (var i = 0; i < yn; i++) row.push(0);
2560
+ row.push(1);
2561
+ result.layer = 0;
2562
+ result.array.push(row);
2563
+ result.normalize();
2564
+ return result;
2565
+ } else {
2566
+ // y >= maxLevel: promote to layer 1, compact format
2567
+ var result = x.clone();
2568
+ result.layer = 1;
2569
+ result.array.push([1, yn, 1]);
2570
+ result.normalize();
2571
+ return result;
2572
+ }
2573
+ }
2574
+
2575
+ // y is ordinal: iter on ordinal
2576
+ // Promote: absorb y's ordinal rows into r0, add iter marker
2577
+ // Layer promotion consumes one level: skip the first value
2578
+ var result = y.clone();
2579
+ var newR0 = x.array[0].slice();
2580
+ // Absorb y's ordinal rows into r0 (skip count and first value)
2581
+ for (var ir = 1; ir < y.array.length; ir++) {
2582
+ var yrow = y.array[ir];
2583
+ // Start from index 2 to skip count and first ordinal value
2584
+ for (var jc = 2; jc < yrow.length; jc++) {
2585
+ newR0.push(yrow[jc]);
2586
+ }
2587
+ }
2588
+ result.array[0] = newR0;
2589
+ result.array = [newR0];
2590
+ // Add iter's own ordinal marker
2591
+ result.array.push([1, 0, 1]);
2592
+ result.layer = y.layer + 1;
2593
+ result.normalize();
2594
+ return result;
2595
+ };
2596
+ Q.iter = Q.ite = function (x, y) {
2597
+ return new MetaNum(x).iter(y);
2598
+ };
2599
+
2600
+ P.inv_iter = P.i_ite = function (z) {
2601
+ var x = this.clone();
2602
+ z = new MetaNum(z);
2603
+ if (x.isNaN() || z.isNaN()) return MetaNum.NaN.clone();
2604
+ if (z.array.length >= 2) {
2605
+ var result = z.clone();
2606
+ // Find the highest ordinal row and decrement/remove it
2607
+ for (var i = result.array.length - 1; i >= 1; i--) {
2608
+ var row = result.array[i];
2609
+ if (row.length >= 3 && row[0] > 0) {
2610
+ row[0]--;
2611
+ if (row[0] <= 0) result.array.splice(i, 1);
2612
+ result.normalize();
2613
+ if (result.array.length <= 1) result.layer = 0;
2614
+ return result;
2615
+ }
2616
+ }
2617
+ return result;
2618
+ }
2619
+ return z;
2620
+ };
2621
+ Q.inv_iter = Q.i_ite = function (x, z) {
2622
+ return new MetaNum(x).inv_iter(z);
2623
+ };
2624
+
2625
+
2626
+
2627
+ P.choose = function (other) {
2628
+ var x = this.clone();
2629
+ other = new MetaNum(other);
2630
+ if (x.isNaN() || other.isNaN()) return MetaNum.NaN.clone();
2631
+ if (x.sign === -1 || other.sign === -1) return MetaNum.ZERO.clone();
2632
+ if (other.eq(MetaNum.ZERO) || x.eq(other)) return MetaNum.ONE.clone();
2633
+ if (x.lt(other)) return MetaNum.ZERO.clone();
2634
+ if (isSimple(x) && isSimple(other) && Number.isInteger(x.array[0][0]) && Number.isInteger(other.array[0][0]) &&
2635
+ x.array[0][0] >= 0 && other.array[0][0] >= 0 && x.array[0][0] <= 1000 && other.array[0][0] <= 1000) {
2636
+ var n = x.array[0][0];
2637
+ var k = other.array[0][0];
2638
+ if (k > n - k) k = n - k;
2639
+ var result = 1;
2640
+ for (var i = 0; i < k; i++) result = result * (n - i) / (i + 1);
2641
+ return new MetaNum(result);
2642
+ }
2643
+ return x.fact().div(other.fact().mul(x.sub(other).fact()));
2644
+ };
2645
+ Q.choose = function (x, y) {
2646
+ return new MetaNum(x).choose(y);
2647
+ };
2648
+
2649
+ P.toNumber = function () {
2650
+ if (this.sign === -1) return -this.abs().toNumber();
2651
+ if (this.isNaN()) return NaN;
2652
+ if (this.isInfinite()) return Infinity;
2653
+ if (this.layer > 0) return Infinity;
2654
+ if (this.array.length > 1) return Infinity;
2655
+ var r0 = this.array[0];
2656
+ if (r0.length === 1) return r0[0];
2657
+ return Infinity;
2658
+ };
2659
+ Q.toNumber = function (x) {
2660
+ return new MetaNum(x).toNumber();
2661
+ };
2662
+
2663
+ P.valueOf = function () {
2664
+ return this.toString();
2665
+ };
2666
+
2667
+ P.toString = function () {
2668
+ function formatCount(pattern, count) {
2669
+ return count >= 4 ? pattern + "^" + count : pattern.repeat(count);
2670
+ }
2671
+ function formatFiniteOps(r0) {
2672
+ var parts = [];
2673
+ for (var i = r0.length - 1; i >= 1; i--) {
2674
+ if (r0[i] > 0) {
2675
+ var letter = String.fromCharCode(68 + i);
2676
+ var token = formatCount(letter, r0[i]);
2677
+ parts.push(token);
2678
+ }
2679
+ }
2680
+ if (parts.length === 0) return "";
2681
+ var hasPower = false;
2682
+ for (var j = 0; j < parts.length; j++) {
2683
+ if (parts[j].indexOf("^") !== -1) { hasPower = true; break; }
2684
+ }
2685
+ var sep = hasPower ? " " : "";
2686
+ return parts.join(sep) + (hasPower ? " " : "");
2687
+ }
2688
+ if (this.isNaN()) return "NaN";
2689
+ if (this.isInfinite()) return this.sign === -1 ? "-Infinity" : "Infinity";
2690
+
2691
+ if (this.eq(MetaNum.ZERO)) return "0";
2692
+
2693
+ if (this.sign === -1) return "-" + this.abs().toString();
2694
+
2695
+ if (this.layer > 0) {
2696
+ var LAYER_SYMBOLS = {1: '!', 2: '@', 3: '#', 4: '$', 5: '%', 6: '&', 7: '~', 8: '<', 9: '>', 10: '?'};
2697
+ var sym = this.layer <= 10 ? LAYER_SYMBOLS[this.layer] : null;
2698
+
2699
+ // Layer >= 11: use {m}ε{n} format
2700
+ if (this.layer >= 11) {
2701
+ var s2 = "";
2702
+ if (this.array.length >= 2) {
2703
+ var lastRow = this.array[this.array.length - 1];
2704
+ var lastCount = lastRow[0];
2705
+ s2 = "{" + lastCount + "}\u03B5{" + this.layer + "}";
2706
+ } else {
2707
+ s2 = "\u03B5{" + this.layer + "}";
2708
+ }
2709
+ s2 += " [" + this.array[0].join(",") + "]";
2710
+ for (var i = 1; i < this.array.length - 1; i++) {
2711
+ s2 += " [" + this.array[i].join(",") + "]";
2712
+ }
2713
+ return s2;
2714
+ }
2715
+
2716
+ // Layers 1-10: try letter notation
2717
+ if (sym && this.array.length >= 2) {
2718
+ var ordTokens = [];
2719
+ var validLetter = true;
2720
+
2721
+ for (var i = this.array.length - 1; i >= 1; i--) {
2722
+ var row = this.array[i];
2723
+ if (row.length < 3) { validLetter = false; break; }
2724
+ var diag = row[row.length - 1];
2725
+ var countVals = row[0];
2726
+ var vals = row.slice(1, row.length - 1);
2727
+ var n = vals.length;
2728
+
2729
+ if (diag < 1 || diag > 26) { validLetter = false; break; }
2730
+
2731
+ var U = String.fromCharCode(64 + diag);
2732
+ var allZero = true;
2733
+ var anyLarge = false;
2734
+ var largeVal = -1;
2735
+ for (var j = 0; j < n; j++) {
2736
+ if (vals[j] > 25) { anyLarge = true; largeVal = vals[j]; }
2737
+ if (vals[j] !== 0) allZero = false;
2738
+ }
2739
+
2740
+ var token;
2741
+ if (allZero) {
2742
+ token = n > 26 ? U + "a" + n : U + "a".repeat(n);
2743
+ } else if (anyLarge && n === 1) {
2744
+ // Compact format: single large value
2745
+ token = U + "a" + largeVal;
2746
+ } else {
2747
+ var lower = "";
2748
+ var ok = true;
2749
+ for (var j = n - 1; j >= 0; j--) {
2750
+ if (vals[j] > 25) { ok = false; break; }
2751
+ lower += String.fromCharCode(97 + vals[j]);
2752
+ }
2753
+ if (!ok) { validLetter = false; break; }
2754
+ token = U + lower;
2755
+ }
2756
+ if (countVals > 1) {
2757
+ token = countVals >= 4 ? token + "^" + countVals : token.repeat(countVals);
2758
+ }
2759
+ ordTokens.push(token);
2760
+ }
2761
+
2762
+ if (validLetter && ordTokens.length > 0) {
2763
+ var finOps = formatFiniteOps(this.array[0]);
2764
+ return sym + ordTokens.join("") + (finOps ? finOps : "");
2765
+ }
2766
+ }
2767
+
2768
+ // Ultimate fallback: array notation with layer symbol
2769
+ var s = (this.layer <= 10 ? LAYER_SYMBOLS[this.layer] || ("!".repeat(this.layer)) : "e" + this.layer) + " ";
2770
+ for (var i = 0; i < this.array.length; i++) {
2771
+ if (i > 0) s += " ";
2772
+ s += "[" + this.array[i].join(",") + "]";
2773
+ }
2774
+ return s;
2775
+ }
2776
+
2777
+ if (this.array.length <= 1) {
2778
+ var r0 = this.array[0];
2779
+
2780
+ if (r0.length === 1) return String(r0[0]);
2781
+
2782
+ if (r0.length >= 24) {
2783
+ var highestIdx = -1;
2784
+ for (var j = r0.length - 1; j >= 1; j--) {
2785
+ if (r0[j] && r0[j] !== 0) {
2786
+ highestIdx = j;
2787
+ break;
2788
+ }
2789
+ }
2790
+ if (highestIdx !== -1) {
2791
+ return r0[highestIdx] + "Aa" + highestIdx;
2792
+ }
2793
+ }
2794
+
2795
+ var result = "";
2796
+ for (var j = r0.length - 1; j >= 1; j--) {
2797
+ if (!r0[j] || r0[j] === 0) continue;
2798
+ var letter = String.fromCharCode(68 + j);
2799
+ if (r0[j] > 3) {
2800
+ result += letter + "^" + r0[j] + " ";
2801
+ } else {
2802
+ result += letter.repeat(r0[j]);
2803
+ }
2804
+ }
2805
+ result += decimalPlaces(r0[0], 6);
2806
+ return result;
2807
+ }
2808
+
2809
+ // Layer 0 with ordinal rows: try letter notation
2810
+ if (this.array.length > 1) {
2811
+ var ordTokens = [];
2812
+ var validLetter = true;
2813
+ var useExclaim = false;
2814
+
2815
+ for (var i = this.array.length - 1; i >= 1; i--) {
2816
+ var row = this.array[i];
2817
+ if (row.length < 3) { validLetter = false; break; }
2818
+ var diag = row[row.length - 1];
2819
+ var countVals = row[0];
2820
+ var vals = row.slice(1, row.length - 1);
2821
+ var n = vals.length;
2822
+
2823
+ if (diag < 1 || diag > 26) { validLetter = false; break; }
2824
+
2825
+ var U = String.fromCharCode(64 + diag);
2826
+ var allZero = true;
2827
+ var anyLarge = false;
2828
+ for (var j = 0; j < n; j++) {
2829
+ if (vals[j] > 25) { anyLarge = true; }
2830
+ if (vals[j] !== 0) allZero = false;
2831
+ }
2832
+ if (anyLarge) { validLetter = false; break; }
2833
+ if (!validLetter) break;
2834
+
2835
+ var token;
2836
+ if (allZero) {
2837
+ if (n > 26) {
2838
+ useExclaim = true;
2839
+ token = U + "a" + n;
2840
+ } else {
2841
+ token = U + "a".repeat(n);
2842
+ }
2843
+ } else {
2844
+ var lower = "";
2845
+ for (var j = n - 1; j >= 0; j--) {
2846
+ lower += String.fromCharCode(97 + vals[j]);
2847
+ }
2848
+ token = U + lower;
2849
+ }
2850
+ if (countVals > 1) {
2851
+ token = countVals >= 4 ? token + "^" + countVals : token.repeat(countVals);
2852
+ }
2853
+ ordTokens.push(token);
2854
+ }
2855
+
2856
+ if (validLetter) {
2857
+ var finOps = formatFiniteOps(this.array[0]);
2858
+ var prefix = useExclaim ? "!" : "";
2859
+ var baseNum = useExclaim ? "" : decimalPlaces(this.array[0][0], 6);
2860
+ return prefix + ordTokens.join("") + (finOps ? finOps : "") + baseNum;
2861
+ }
2862
+ }
2863
+
2864
+ if (this.array.length === 2 &&
2865
+ this.array[0].length === 1 && this.array[0][0] === 10 &&
2866
+ this.array[1].length === 2) {
2867
+ return this.array[1][0] + "Aa" + this.array[1][1];
2868
+ }
2869
+
2870
+ var multiResult = "";
2871
+ for (var i = 0; i < this.array.length; i++) {
2872
+ if (i > 0) multiResult += " ";
2873
+ multiResult += "[" + this.array[i].join(",") + "]";
2874
+ }
2875
+ return multiResult;
2876
+ };
2877
+
2878
+ P.toJSON = function () {
2879
+ if (MetaNum.serializeMode === 0) {
2880
+ return {
2881
+ sign: this.sign,
2882
+ array: deepCloneArray(this.array),
2883
+ layer: this.layer
2884
+ };
2885
+ } else {
2886
+ return this.toString();
2887
+ }
2888
+ };
2889
+
2890
+ P.toStringWithDecimalPlaces = function (places) {
2891
+ if (this.sign === -1) return "-" + this.abs().toStringWithDecimalPlaces(places);
2892
+ if (this.isNaN()) return "NaN";
2893
+ if (this.isInfinite()) return "Infinity";
2894
+ if (isSimple(this)) {
2895
+ var v = decimalPlaces(this.array[0][0], places);
2896
+ if (Number.isFinite(v)) return v.toString();
2897
+ }
2898
+ return this.toString();
2899
+ };
2900
+
2901
+ P.toExponential = function (places) {
2902
+ if (this.sign === -1) return "-" + this.abs().toExponential(places);
2903
+ if (this.isNaN()) return "NaN";
2904
+ if (this.isInfinite()) return "Infinity";
2905
+ if (isSimple(this)) return this.toNumber().toExponential(places);
2906
+ return this.toString();
2907
+ };
2908
+
2909
+ P.toFixed = function (places) {
2910
+ if (this.sign === -1) return "-" + this.abs().toFixed(places);
2911
+ if (this.isNaN()) return "NaN";
2912
+ if (this.isInfinite()) return "Infinity";
2913
+ if (isSimple(this)) return this.toNumber().toFixed(places);
2914
+ return this.toString();
2915
+ };
2916
+
2917
+ P.toPrecision = function (places) {
2918
+ if (this.sign === -1) return "-" + this.abs().toPrecision(places);
2919
+ if (this.isNaN()) return "NaN";
2920
+ if (this.isInfinite()) return "Infinity";
2921
+ if (isSimple(this)) return this.toNumber().toPrecision(places);
2922
+ return this.toString();
2923
+ };
2924
+
2925
+ P.toHyperE = function () {
2926
+ if (this.sign === -1) return "-" + this.abs().toHyperE();
2927
+ if (this.isNaN()) return "NaN";
2928
+ if (this.isInfinite()) return "Infinity";
2929
+ if (isSimple(this)) {
2930
+ var v = this.array[0][0];
2931
+ if (v < 10) return String(v);
2932
+ return "E" + Math.log10(v).toFixed(6);
2933
+ }
2934
+ if (this.layer > 0) return "E" + this.layer + "#" + this.toString();
2935
+ if (this.array.length === 1 && this.array[0].length >= 2) {
2936
+ var s = "E";
2937
+ for (var i = 1; i < this.array[0].length; i++) s += "#";
2938
+ s += String(this.array[0][0]);
2939
+ return s;
2940
+ }
2941
+ return this.toString();
2942
+ };
2943
+
2944
+ Q.fromNumber = function (input) {
2945
+ if (typeof input !== "number") throw Error(invalidArgument + "Expected Number");
2946
+ var x = new MetaNum();
2947
+ x.array = [[Math.abs(input)]];
2948
+ x.sign = input < 0 ? -1 : 1;
2949
+ x.layer = 0;
2950
+ return x.normalize();
2951
+ };
2952
+
2953
+ Q.fromArray = function (array, sign, layer) {
2954
+ if (!Array.isArray(array)) throw Error(invalidArgument + "Expected Array");
2955
+ var x = new MetaNum();
2956
+ if (array.length > 0 && !Array.isArray(array[0])) {
2957
+ x.array = [array.slice(0)];
2958
+ } else {
2959
+ x.array = deepCloneArray(array);
2960
+ }
2961
+ if (typeof sign === "number") x.sign = sign < 0 ? -1 : 1;
2962
+ else x.sign = 1;
2963
+ if (typeof layer === "number" && isFinite(layer) && layer >= 0) x.layer = Math.floor(layer);
2964
+ else if (x.array.length > 1) x.layer = 1;
2965
+ else x.layer = 0;
2966
+ return x.normalize();
2967
+ };
2968
+
2969
+ Q.fromObject = function (input) {
2970
+ if (typeof input !== "object") throw Error(invalidArgument + "Expected Object");
2971
+ if (input === null) return MetaNum.ZERO.clone();
2972
+ if (Array.isArray(input)) return MetaNum.fromArray(input);
2973
+ if (input instanceof MetaNum) return new MetaNum(input);
2974
+ if (!(input.array instanceof Array)) throw Error(invalidArgument + "Expected that property 'array' exists");
2975
+ var x = new MetaNum();
2976
+ x.array = deepCloneArray(input.array);
2977
+ x.sign = typeof input.sign === "number" ? (input.sign < 0 ? -1 : 1) : 1;
2978
+ x.layer = typeof input.layer === "number" && isFinite(input.layer) && input.layer >= 0 ? Math.floor(input.layer) : 0;
2979
+ return x.normalize();
2980
+ };
2981
+
2982
+ Q.fromJSON = function (input) {
2983
+ if (typeof input === "object") return MetaNum.fromObject(input);
2984
+ if (typeof input !== "string") throw Error(invalidArgument + "Expected String");
2985
+ var parsedObject;
2986
+ try {
2987
+ parsedObject = JSON.parse(input);
2988
+ } catch (e) {
2989
+ throw Error(invalidArgument + "Invalid JSON string");
2990
+ }
2991
+ return MetaNum.fromObject(parsedObject);
2992
+ };
2993
+
2994
+ Q.hyper = function (n, a, b) {
2995
+ if (n === undefined) n = 2;
2996
+ n = new MetaNum(n);
2997
+ a = new MetaNum(a);
2998
+ b = new MetaNum(b);
2999
+ if (n.isNaN() || a.isNaN() || b.isNaN()) return MetaNum.NaN.clone();
3000
+ if (n.eq(MetaNum.ZERO)) return b.add(MetaNum.ONE);
3001
+ if (n.eq(MetaNum.ONE)) return a.add(b);
3002
+ if (n.eq(2)) return a.mul(b);
3003
+ if (n.eq(3)) return a.pow(b);
3004
+ if (n.eq(4)) return a.tetr(b);
3005
+ if (n.eq(5)) return a.pent(b);
3006
+ return a.arrow(b, n.sub(1));
3007
+ };
3008
+
3009
+ Q.affordGeometricSeries = function (resourcesAvailable, priceStart, priceRatio, currentOwned) {
3010
+ resourcesAvailable = new MetaNum(resourcesAvailable);
3011
+ priceStart = new MetaNum(priceStart);
3012
+ priceRatio = new MetaNum(priceRatio);
3013
+ currentOwned = new MetaNum(currentOwned);
3014
+ return priceStart.eq(new MetaNum(1))
3015
+ ? resourcesAvailable.add(new MetaNum(1)).floor()
3016
+ : MetaNum.ONE;
3017
+ };
3018
+
3019
+ Q.affordArithmeticSeries = function (resourcesAvailable, priceStart, priceAdd, currentOwned) {
3020
+ resourcesAvailable = new MetaNum(resourcesAvailable);
3021
+ priceStart = new MetaNum(priceStart);
3022
+ priceAdd = new MetaNum(priceAdd);
3023
+ currentOwned = new MetaNum(currentOwned);
3024
+ if (priceAdd.eq(MetaNum.ZERO)) return resourcesAvailable.div(priceStart).floor();
3025
+ var a = priceAdd;
3026
+ var b = priceStart.mul(2).sub(priceAdd);
3027
+ var c = priceStart.sub(priceAdd).sub(resourcesAvailable.mul(2)).add(a);
3028
+ return b.neg().add(b.pow(2).sub(a.mul(c).mul(4)).sqrt()).div(a.mul(2)).floor();
3029
+ };
3030
+
3031
+ Q.sumGeometricSeries = function (numItems, start, ratio, numItemsStart) {
3032
+ if (numItemsStart === undefined) numItemsStart = 0;
3033
+ numItems = new MetaNum(numItems);
3034
+ start = new MetaNum(start);
3035
+ ratio = new MetaNum(ratio);
3036
+ numItemsStart = new MetaNum(numItemsStart);
3037
+ if (numItems.lt(numItemsStart)) return MetaNum.ZERO.clone();
3038
+ return start.mul(MetaNum.ONE.sub(ratio.pow(numItems.sub(numItemsStart).add(MetaNum.ONE))))
3039
+ .div(MetaNum.ONE.sub(ratio));
3040
+ };
3041
+
3042
+ Q.sumArithmeticSeries = function (numItems, start, add, numItemsStart) {
3043
+ if (numItemsStart === undefined) numItemsStart = 0;
3044
+ numItems = new MetaNum(numItems);
3045
+ start = new MetaNum(start);
3046
+ add = new MetaNum(add);
3047
+ numItemsStart = new MetaNum(numItemsStart);
3048
+ if (numItems.lt(numItemsStart)) return MetaNum.ZERO.clone();
3049
+ var n = numItems.sub(numItemsStart).add(MetaNum.ONE);
3050
+ var last = start.add(add.mul(n.sub(MetaNum.ONE)));
3051
+ return n.mul(start.add(last)).div(new MetaNum(2));
3052
+ };
3053
+
3054
+ Q.choose = function (x, y) {
3055
+ return new MetaNum(x).choose(y);
3056
+ };
3057
+
3058
+ Q.fromBigInt = function (input) {
3059
+ if (typeof BigInt === "undefined") throw Error(metaNumError + "BigInt is not supported in current environment");
3060
+ if (typeof input === "bigint") {
3061
+ if (input >= BigInt(0) && input <= BigInt(MAX_SAFE_INTEGER)) {
3062
+ return new MetaNum(Number(input));
3063
+ }
3064
+ var inputStr = input.toString();
3065
+ var inputLen = inputStr.length;
3066
+ if (inputLen <= LONG_STRING_MIN_LENGTH) {
3067
+ return new MetaNum(Number(inputStr));
3068
+ }
3069
+ var x = new MetaNum();
3070
+ x.array = [[inputLen - 1 + log10LongString(inputStr)]];
3071
+ x.sign = 1;
3072
+ x.layer = 0;
3073
+ return x.normalize();
3074
+ } else {
3075
+ throw Error(invalidArgument + "Expected BigInt");
3076
+ }
3077
+ };
3078
+
3079
+ Q.fromHyperE = function (input) {
3080
+ if (typeof input !== "string") throw Error(invalidArgument + "Expected String");
3081
+ var s = input.trim();
3082
+ var negateIt = false;
3083
+ if (s[0] === "-") {
3084
+ negateIt = true;
3085
+ s = s.substring(1).trim();
3086
+ }
3087
+ if (s === "NaN" || s === "Infinity") {
3088
+ var x = new MetaNum();
3089
+ x.array = [[s === "NaN" ? NaN : Infinity]];
3090
+ x.sign = negateIt ? -1 : 1;
3091
+ return x;
3092
+ }
3093
+ var count = 0;
3094
+ while (s[0] === "E") {
3095
+ count++;
3096
+ s = s.substring(1).trim();
3097
+ if (s[0] === "#") {
3098
+ s = s.substring(1);
3099
+ }
3100
+ }
3101
+ if (count === 0) {
3102
+ return MetaNum.fromString((negateIt ? "-" : "") + s);
3103
+ }
3104
+ var x = new MetaNum();
3105
+ if (count === 1) {
3106
+ x.array = [[Math.pow(10, Number(s))]];
3107
+ } else {
3108
+ x.array = [[Number(s)]];
3109
+ for (var i = 1; i < count; i++) x.array[0].push(i === count - 1 ? 1 : 0);
3110
+ }
3111
+ x.sign = negateIt ? -1 : 1;
3112
+ x.layer = 0;
3113
+ return x.normalize();
3114
+ };
3115
+
3116
+ Q.fromString = function (input) {
3117
+ if (typeof input !== "string") throw Error(invalidArgument + "Expected String");
3118
+
3119
+ try {
3120
+ var parsed = JSON.parse(input);
3121
+ if (parsed && typeof parsed === "object" && parsed.array) {
3122
+ return MetaNum.fromJSON(parsed);
3123
+ }
3124
+ } catch (e) {}
3125
+
3126
+ var x = new MetaNum();
3127
+ x.array = [[0]];
3128
+ x.sign = 1;
3129
+ x.layer = 0;
3130
+
3131
+ var s = input.trim();
3132
+ if (s === "" || s === "0") {
3133
+ return x;
3134
+ }
3135
+
3136
+ var negateIt = false;
3137
+ if (s[0] === "-" || s[0] === "+") {
3138
+ var signMatch = s.match(/^[-\+]+/);
3139
+ var signs = signMatch[0];
3140
+ negateIt = (signs.match(/-/g) || []).length % 2 === 1;
3141
+ s = s.substring(signMatch[0].length).trim();
3142
+ }
3143
+
3144
+ if (s === "NaN") {
3145
+ x.array = [[NaN]];
3146
+ return x;
3147
+ }
3148
+ if (s === "Infinity") {
3149
+ x.array = [[Infinity]];
3150
+ x.sign = negateIt ? -1 : 1;
3151
+ return x;
3152
+ }
3153
+
3154
+ var layerMatch = s.match(/^\u03C9\^(\d+)\s*/);
3155
+ if (layerMatch) {
3156
+ x.layer = parseInt(layerMatch[1], 10);
3157
+ s = s.substring(layerMatch[0].length).trim();
3158
+ }
3159
+
3160
+ // Parse {m}ε{n} format (layer >= 11)
3161
+ var epsMatch = s.match(/^\{(\d+(?:\.\d+)?)\}\u03B5\{(\d+)\}\s*/);
3162
+ if (epsMatch) {
3163
+ x.layer = parseInt(epsMatch[2], 10);
3164
+ var epsCount = Number(epsMatch[1]);
3165
+ s = s.substring(epsMatch[0].length).trim();
3166
+ if (x.layer >= 11) {
3167
+ x.array[0] = [epsCount];
3168
+ if (epsCount >= 1 && isFinite(epsCount)) {
3169
+ x.array.push([epsCount, 0, 1]);
3170
+ }
3171
+ }
3172
+ if (negateIt) x.sign = -1;
3173
+ return x.normalize();
3174
+ }
3175
+
3176
+ // Parse ε{n} format (layer with no count)
3177
+ var epsSimpleMatch = s.match(/^\u03B5\{(\d+)\}\s*/);
3178
+ if (epsSimpleMatch) {
3179
+ x.layer = parseInt(epsSimpleMatch[1], 10);
3180
+ s = s.substring(epsSimpleMatch[0].length).trim();
3181
+ if (negateIt) x.sign = -1;
3182
+ return x.normalize();
3183
+ }
3184
+
3185
+ // Parse layer symbol + letter pattern + {n} format
3186
+ // (simple case: just {n} after symbol, no letters)
3187
+ var symSimpleMatch = s.match(/^([!@#\$%&~<>?])\{(\d+(?:\.\d+)?)\}\s*$/);
3188
+ if (symSimpleMatch) {
3189
+ var SYMBOL_LAYERS = {'!': 1, '@': 2, '#': 3, '$': 4, '%': 5, '&': 6, '~': 7, '<': 8, '>': 9, '?': 10};
3190
+ x.layer = SYMBOL_LAYERS[symSimpleMatch[1]] || 1;
3191
+ var symSimpleVal = Number(symSimpleMatch[2]);
3192
+ if (!isNaN(symSimpleVal) && isFinite(symSimpleVal)) {
3193
+ x.array[0] = [symSimpleVal];
3194
+ }
3195
+ if (negateIt) x.sign = -1;
3196
+ return x.normalize();
3197
+ }
3198
+
3199
+ // Parse symbol + full letter pattern {n} (multi-letter like !AaBa{n}, handles ^N notation)
3200
+ var symParseMatch = s.match(/^([!@#\$%&~<>?])(.*?)\{(\d+(?:\.\d+)?)\}\s*$/);
3201
+ if (symParseMatch) {
3202
+ var SYMBOL_LAYERS3 = {'!': 1, '@': 2, '#': 3, '$': 4, '%': 5, '&': 6, '~': 7, '<': 8, '>': 9, '?': 10};
3203
+ x.layer = SYMBOL_LAYERS3[symParseMatch[1]] || 1;
3204
+ var symLetters2 = symParseMatch[2].trim();
3205
+ var symBase2 = Number(symParseMatch[3]);
3206
+
3207
+ // Parse tokens: ordinal tokens have lowercase (Aa, Abc), finite ops are single uppercase
3208
+ var symTokens2 = [];
3209
+ var symFinOps = []; // finite ops for r0
3210
+ var symTokRegex = /([A-Z][a-z]*)(?:\^(\d+))?/g;
3211
+ var symTokM;
3212
+ while ((symTokM = symTokRegex.exec(symLetters2)) !== null) {
3213
+ var tokName = symTokM[1];
3214
+ var tokCount = symTokM[2] ? parseInt(symTokM[2], 10) : 1;
3215
+ // Single uppercase letter (no lowercase) = finite op
3216
+ if (tokName.length === 1 && tokName[0] >= 'D') {
3217
+ // Finite operations start from E (level 1 = E, level 2 = F, ...)
3218
+ var finLevel = tokName.charCodeAt(0) - 68; // 68 = 'D', E->1, F->2, ...
3219
+ if (finLevel > 0) {
3220
+ symFinOps.push({level: finLevel, count: tokCount});
3221
+ }
3222
+ } else {
3223
+ symTokens2.push({name: tokName, count: tokCount});
3224
+ }
3225
+ }
3226
+
3227
+ if (symTokens2.length === 0) {
3228
+ x.array[0] = [symBase2];
3229
+ if (negateIt) x.sign = -1;
3230
+ return x;
3231
+ }
3232
+
3233
+ // Group consecutive identical tokens
3234
+ var symGroups2 = [];
3235
+ for (var ti = 0; ti < symTokens2.length; ti++) {
3236
+ if (symGroups2.length > 0 && symGroups2[symGroups2.length - 1].name === symTokens2[ti].name) {
3237
+ symGroups2[symGroups2.length - 1].count += symTokens2[ti].count;
3238
+ } else {
3239
+ symGroups2.push({name: symTokens2[ti].name, count: symTokens2[ti].count});
3240
+ }
3241
+ }
3242
+
3243
+ var symRows2 = [];
3244
+ for (var gi3 = 0; gi3 < symGroups2.length; gi3++) {
3245
+ var g3 = symGroups2[gi3];
3246
+ var gName3 = g3.name;
3247
+ var gU3 = gName3[0];
3248
+ var gUIdx3 = gU3.charCodeAt(0) - 64;
3249
+ var gLower3 = gName3.slice(1);
3250
+ var gIndices3 = [];
3251
+ for (var li3 = 0; li3 < gLower3.length; li3++) {
3252
+ gIndices3.push(gLower3.charCodeAt(li3) - 97);
3253
+ }
3254
+ var gK3 = gIndices3.length;
3255
+ var gAllZero3 = true;
3256
+ var gFirstNonZero3 = -1;
3257
+ for (var li3 = 0; li3 < gK3; li3++) {
3258
+ if (gIndices3[li3] !== 0) {
3259
+ gAllZero3 = false;
3260
+ if (gFirstNonZero3 === -1) gFirstNonZero3 = li3;
3261
+ }
3262
+ }
3263
+ var gLastIsA3 = gIndices3[gK3 - 1] === 0;
3264
+ var gRow3 = [g3.count];
3265
+ var gIsDiag3 = false;
3266
+
3267
+ if (gAllZero3) {
3268
+ for (var li3 = 0; li3 < gK3; li3++) gRow3.push(0);
3269
+ gRow3.push(gUIdx3);
3270
+ } else if (gLastIsA3 && gFirstNonZero3 >= 0) {
3271
+ gIsDiag3 = true;
3272
+ for (var li3 = gK3 - 1; li3 >= 0; li3--) {
3273
+ if (li3 === gK3 - 1) {
3274
+ gRow3.push(symBase2);
3275
+ } else if (li3 === gFirstNonZero3) {
3276
+ gRow3.push(gIndices3[li3] + 1);
3277
+ } else if (li3 < gFirstNonZero3) {
3278
+ gRow3.push(gIndices3[li3]);
3279
+ } else {
3280
+ gRow3.push(0);
3281
+ }
3282
+ }
3283
+ gRow3.push(gUIdx3);
3284
+ } else {
3285
+ for (var li3 = gK3 - 1; li3 >= 0; li3--) {
3286
+ gRow3.push(gIndices3[li3]);
3287
+ }
3288
+ gRow3.push(gUIdx3);
3289
+ }
3290
+ symRows2.push({
3291
+ row: gRow3,
3292
+ isDiag: gIsDiag3,
3293
+ lowerIndices: gIndices3,
3294
+ level: gUIdx3
3295
+ });
3296
+ }
3297
+
3298
+ symRows2.sort(function(a, b) {
3299
+ if (a.level !== b.level) return a.level - b.level;
3300
+ var maxLen = Math.max(a.lowerIndices.length, b.lowerIndices.length);
3301
+ for (var ii = 0; ii < maxLen; ii++) {
3302
+ var va = ii < a.lowerIndices.length ? a.lowerIndices[ii] : 0;
3303
+ var vb = ii < b.lowerIndices.length ? b.lowerIndices[ii] : 0;
3304
+ if (va !== vb) return va - vb;
3305
+ }
3306
+ return 0;
3307
+ });
3308
+
3309
+ x.array = [[symBase2]];
3310
+ // Apply finite ops to r0
3311
+ for (var fi = 0; fi < symFinOps.length; fi++) {
3312
+ var fo = symFinOps[fi];
3313
+ x.array[0][fo.level] = (x.array[0][fo.level] || 0) + fo.count;
3314
+ }
3315
+ // Handle special finite ops: F and E
3316
+ // F (level 2): F^count means tetration exponent count-2
3317
+ // E (level 1): E^count means exponent count
3318
+ // Higher levels (G, H, ...) are higher hyperoperation levels
3319
+ x._oaRowData = [];
3320
+ for (var gi3 = 0; gi3 < symRows2.length; gi3++) {
3321
+ x.array.push(symRows2[gi3].row);
3322
+ x._oaRowData.push({isDiag: symRows2[gi3].isDiag});
3323
+ }
3324
+ if (negateIt) x.sign = -1;
3325
+ return x.normalize();
3326
+ }
3327
+
3328
+ var bracketPattern = /\[([^\]]*)\]/g;
3329
+ var match;
3330
+ var rowIndex = 0;
3331
+
3332
+ while ((match = bracketPattern.exec(s)) !== null) {
3333
+ var nums = match[1].split(",");
3334
+ var row = [];
3335
+ for (var i = 0; i < nums.length; i++) {
3336
+ var raw = nums[i].trim();
3337
+ if (raw[0] === '[') raw = raw.substring(1);
3338
+ if (raw[raw.length - 1] === ']') raw = raw.substring(0, raw.length - 1);
3339
+ var n = Number(raw);
3340
+ if (!isNaN(n) && isFinite(n)) {
3341
+ row.push(n);
3342
+ } else {
3343
+ row.push(0);
3344
+ }
3345
+ }
3346
+ if (rowIndex === 0) {
3347
+ x.array[0] = row;
3348
+ } else {
3349
+ x.array.push(row);
3350
+ }
3351
+ rowIndex++;
3352
+ if (rowIndex >= MetaNum.maxRows) break;
3353
+ }
3354
+
3355
+ if (rowIndex > 1) {
3356
+ x.layer = 1;
3357
+ }
3358
+
3359
+ if (rowIndex === 0) {
3360
+ var rem = s;
3361
+
3362
+ var tetrMatch = rem.match(/^(\d+(?:\.\d+)?)\s*\^\^\s*(\d+(?:\.\d+)?)\s*$/);
3363
+ if (tetrMatch) {
3364
+ var tetrBase = Number(tetrMatch[1]);
3365
+ var tetrHeight = Number(tetrMatch[2]);
3366
+ if (!isNaN(tetrBase) && !isNaN(tetrHeight) && isFinite(tetrHeight) && tetrHeight >= 0 && tetrHeight === Math.floor(tetrHeight)) {
3367
+ if (tetrHeight === 0) {
3368
+ x.array = [[1]];
3369
+ } else if (tetrHeight === 1) {
3370
+ x.array = [[tetrBase]];
3371
+ } else {
3372
+ var tetrResult = MetaNum.pow(tetrBase, new MetaNum(tetrBase));
3373
+ for (var ti = 3; ti <= tetrHeight; ti++) {
3374
+ tetrResult = MetaNum.pow(tetrBase, tetrResult);
3375
+ }
3376
+ x.array = deepCloneArray(tetrResult.array);
3377
+ x.sign = tetrResult.sign;
3378
+ x.layer = tetrResult.layer;
3379
+ }
3380
+ if (negateIt) x.sign = -1;
3381
+ return x.normalize();
3382
+ }
3383
+ }
3384
+
3385
+ var coeffEMatch = rem.match(/^(\d+(?:\.\d+)?)\s*[Ee]\s*(\d+(?:\.\d+)?)\s*$/);
3386
+ if (coeffEMatch) {
3387
+ var coeff = Number(coeffEMatch[1]);
3388
+ var exp = Number(coeffEMatch[2]);
3389
+ if (!isNaN(coeff) && !isNaN(exp) && isFinite(exp) && coeff > 0) {
3390
+ x.array[0] = [exp + Math.log10(coeff), 1];
3391
+ x.sign = negateIt ? -1 : 1;
3392
+ x.layer = 0;
3393
+ return x.normalize();
3394
+ }
3395
+ }
3396
+
3397
+ var aaMatch = rem.match(/^(\d+)Aa(\d+)/i);
3398
+ if (aaMatch) {
3399
+ var aaCount = aaMatch[1] ? Number(aaMatch[1]) : 1;
3400
+ var aaN = Number(aaMatch[2]);
3401
+ if (!isNaN(aaN) && isFinite(aaN) && aaN >= 1 && aaN === Math.floor(aaN)) {
3402
+ if (aaN < MetaNum.maxCols) {
3403
+ x.array[0] = [10];
3404
+ x.array[0][aaN] = aaCount;
3405
+ } else {
3406
+ x.array = [[10], [aaCount, aaN]];
3407
+ }
3408
+ if (negateIt) x.sign = -1;
3409
+ return x.normalize();
3410
+ }
3411
+ }
3412
+
3413
+ var oaMatch = rem.match(/^((?:[A-Z][a-z]+)+)(\d+)/);
3414
+ if (oaMatch) {
3415
+ var oaFullPrefix = oaMatch[1];
3416
+ var oaN = Number(oaMatch[2]);
3417
+ if (!isNaN(oaN) && isFinite(oaN) && oaN >= 1 && oaN === Math.floor(oaN)) {
3418
+ var oaTokens = [];
3419
+ var oaTokenRegex = /[A-Z][a-z]+/g;
3420
+ var oaTm;
3421
+ while ((oaTm = oaTokenRegex.exec(oaFullPrefix)) !== null) {
3422
+ oaTokens.push(oaTm[0]);
3423
+ }
3424
+
3425
+ var oaGroups = [];
3426
+ for (var ti = 0; ti < oaTokens.length; ti++) {
3427
+ if (oaGroups.length > 0 && oaGroups[oaGroups.length - 1].token === oaTokens[ti]) {
3428
+ oaGroups[oaGroups.length - 1].count++;
3429
+ } else {
3430
+ oaGroups.push({token: oaTokens[ti], count: 1});
3431
+ }
3432
+ }
3433
+
3434
+ var oaRows = [];
3435
+ for (var gi = 0; gi < oaGroups.length; gi++) {
3436
+ var g = oaGroups[gi];
3437
+ var gU = g.token[0];
3438
+ var gUIdx = gU.charCodeAt(0) - 64;
3439
+ var gLower = g.token.slice(1);
3440
+ var gIndices = [];
3441
+ for (var li = 0; li < gLower.length; li++) {
3442
+ gIndices.push(gLower.charCodeAt(li) - 97);
3443
+ }
3444
+ var gK = gIndices.length;
3445
+ var gAllZero = true;
3446
+ var gFirstNonZero = -1;
3447
+ for (var li = 0; li < gK; li++) {
3448
+ if (gIndices[li] !== 0) {
3449
+ gAllZero = false;
3450
+ if (gFirstNonZero === -1) gFirstNonZero = li;
3451
+ }
3452
+ }
3453
+ var gLastIsA = gIndices[gK - 1] === 0;
3454
+ var gRow = [g.count];
3455
+ var gIsDiag = false;
3456
+
3457
+ if (gAllZero) {
3458
+ for (var li = 0; li < gK; li++) gRow.push(0);
3459
+ gRow.push(gUIdx);
3460
+ } else if (gLastIsA && gFirstNonZero >= 0) {
3461
+ gIsDiag = true;
3462
+ for (var li = gK - 1; li >= 0; li--) {
3463
+ if (li === gK - 1) {
3464
+ gRow.push(oaN);
3465
+ } else if (li === gFirstNonZero) {
3466
+ gRow.push(gIndices[li] + 1);
3467
+ } else if (li < gFirstNonZero) {
3468
+ gRow.push(gIndices[li]);
3469
+ } else {
3470
+ gRow.push(0);
3471
+ }
3472
+ }
3473
+ gRow.push(gUIdx);
3474
+ } else {
3475
+ for (var li = gK - 1; li >= 0; li--) {
3476
+ gRow.push(gIndices[li]);
3477
+ }
3478
+ gRow.push(gUIdx);
3479
+ }
3480
+ oaRows.push({
3481
+ row: gRow,
3482
+ isDiag: gIsDiag,
3483
+ lowerIndices: gIndices,
3484
+ level: gUIdx
3485
+ });
3486
+ }
3487
+
3488
+ oaRows.sort(function(a, b) {
3489
+ if (a.level !== b.level) return a.level - b.level;
3490
+ var maxLen = Math.max(a.lowerIndices.length, b.lowerIndices.length);
3491
+ for (var i = 0; i < maxLen; i++) {
3492
+ var va = i < a.lowerIndices.length ? a.lowerIndices[i] : 0;
3493
+ var vb = i < b.lowerIndices.length ? b.lowerIndices[i] : 0;
3494
+ if (va !== vb) return va - vb;
3495
+ }
3496
+ return 0;
3497
+ });
3498
+
3499
+ x.array = [[oaN]];
3500
+ x._oaRowData = [];
3501
+ for (var gi = 0; gi < oaRows.length; gi++) {
3502
+ x.array.push(oaRows[gi].row);
3503
+ x._oaRowData.push({isDiag: oaRows[gi].isDiag});
3504
+ }
3505
+ x.layer = 1;
3506
+ if (negateIt) x.sign = -1;
3507
+ return x.normalize();
3508
+ }
3509
+ }
3510
+
3511
+ if (/^[A-Z]+/i.test(rem)) {
3512
+ var prefixMatch = rem.match(/^([A-Z]+)/i);
3513
+ var prefix = prefixMatch[0].toUpperCase();
3514
+ rem = rem.substring(prefixMatch[0].length).trim();
3515
+ var val = Number(rem);
3516
+ if (!isNaN(val) && isFinite(val)) {
3517
+ var counts = {};
3518
+ var maxIdx = 0;
3519
+ for (var i = 0; i < prefix.length; i++) {
3520
+ var letterPos = prefix.charCodeAt(i) - 64;
3521
+ if (letterPos >= 5) {
3522
+ var idx = letterPos - 4;
3523
+ counts[idx] = (counts[idx] || 0) + 1;
3524
+ maxIdx = Math.max(maxIdx, idx);
3525
+ }
3526
+ }
3527
+ x.array[0] = [val];
3528
+ var eCount = counts[1] || 0;
3529
+ var fCount = counts[2] || 0;
3530
+ if (fCount > 0 && eCount === 0 && fCount === 1 && maxIdx === 2 && val >= 0 && val === Math.floor(val)) {
3531
+ if (val === 0) {
3532
+ x.array = [[1]];
3533
+ } else if (val === 1) {
3534
+ x.array = [[10]];
3535
+ } else {
3536
+ x.array[0] = [10000000000, val - 2];
3537
+ }
3538
+ } else if (maxIdx === 1) {
3539
+ x.array[0][1] = eCount;
3540
+ } else {
3541
+ for (var idx = 1; idx <= maxIdx; idx++) {
3542
+ x.array[0][idx] = counts[idx] || 0;
3543
+ }
3544
+ }
3545
+ if (negateIt) x.sign = -1;
3546
+ return x.normalize();
3547
+ }
3548
+ }
3549
+
3550
+ var num = Number(rem);
3551
+ if (!isNaN(num) && isFinite(num)) {
3552
+ x.array[0][0] = num;
3553
+ }
3554
+ }
3555
+
3556
+ if (negateIt) x.sign = -1;
3557
+ return x.normalize();
3558
+ };
3559
+
3560
+ P.clone = function () {
3561
+ var x = new MetaNum();
3562
+ x.array = deepCloneArray(this.array);
3563
+ x.sign = this.sign;
3564
+ x.layer = this.layer;
3565
+ return x;
3566
+ };
3567
+
3568
+ function objectCreate() {
3569
+ var x = {};
3570
+ x.array = [[0]];
3571
+ x.sign = 1;
3572
+ x.layer = 0;
3573
+ return x;
3574
+ }
3575
+
3576
+ function clone(obj) {
3577
+ var i, p, ps;
3578
+ function MetaNum(input, input2, input3) {
3579
+ var x = this;
3580
+ if (!(x instanceof MetaNum)) return new MetaNum(input, input2, input3);
3581
+ x.constructor = MetaNum;
3582
+
3583
+ if (input === undefined || input === null) {
3584
+ x.array = [[0]];
3585
+ x.sign = 1;
3586
+ x.layer = 0;
3587
+ return x;
3588
+ }
3589
+
3590
+ var parsedObject = null;
3591
+ if (typeof input === "string" && (input[0] === "[" || input[0] === "{")) {
3592
+ try {
3593
+ parsedObject = JSON.parse(input);
3594
+ } catch (e) {}
3595
+ }
3596
+
3597
+ var temp;
3598
+ if (typeof input === "number" && input2 === undefined) {
3599
+ temp = objectCreate();
3600
+ temp.array = [[Math.abs(input)]];
3601
+ temp.sign = input < 0 ? -1 : 1;
3602
+ temp.layer = 0;
3603
+ temp.normalize = P.normalize;
3604
+ temp = temp.normalize();
3605
+ } else if (parsedObject) {
3606
+ temp = Q.fromObject(parsedObject);
3607
+ } else if (typeof input === "string") {
3608
+ temp = Q.fromString(input);
3609
+ } else if (Array.isArray(input)) {
3610
+ temp = Q.fromArray(input, input2, input3);
3611
+ } else if (input instanceof MetaNum) {
3612
+ temp = input;
3613
+ } else if (typeof input === "object" && input !== null) {
3614
+ temp = Q.fromObject(input);
3615
+ } else {
3616
+ temp = objectCreate();
3617
+ var num = Number(input);
3618
+ if (!isNaN(num) && isFinite(num)) {
3619
+ temp.array = [[Math.abs(num)]];
3620
+ temp.sign = num < 0 ? -1 : 1;
3621
+ temp.layer = 0;
3622
+ temp.normalize = P.normalize;
3623
+ temp = temp.normalize();
3624
+ } else if (isNaN(num)) {
3625
+ temp.array = [[NaN]];
3626
+ } else {
3627
+ temp.array = [[Infinity]];
3628
+ temp.sign = num < 0 ? -1 : 1;
3629
+ }
3630
+ }
3631
+
3632
+ x.array = deepCloneArray(temp.array);
3633
+ x.sign = temp.sign;
3634
+ x.layer = temp.layer;
3635
+ if (temp._oaIsDiag !== undefined) x._oaIsDiag = temp._oaIsDiag;
3636
+ if (temp._oaRowData !== undefined) x._oaRowData = temp._oaRowData.map(function(d) { return {isDiag: d.isDiag}; });
3637
+
3638
+ return x;
3639
+ }
3640
+
3641
+ MetaNum.prototype = P;
3642
+
3643
+ MetaNum.JSON = 0;
3644
+ MetaNum.STRING = 1;
3645
+
3646
+ MetaNum.NONE = 0;
3647
+ MetaNum.NORMAL = 1;
3648
+ MetaNum.ALL = 2;
3649
+
3650
+ // expandOrdinals: Generate all Cantor normal form terms below a given ordinal level
3651
+ // cantorLevel: determines max nesting depth (diag range and numVals range)
3652
+ // maxVal: determines value range (0..maxVal) for each position
3653
+ // Returns array of ordinal rows [[1, v0, diag], [1, v0, v1, diag], ...]
3654
+ MetaNum.expandOrdinals = function (cantorLevel, maxVal) {
3655
+ var rows = [];
3656
+ var maxRows = MetaNum.maxCols - 1; // 99
3657
+
3658
+ if (cantorLevel < 0) cantorLevel = 0;
3659
+
3660
+ // Generate all combinations: numVals outer, diag inner (for increasing ordinal value)
3661
+ // Order: nv=1(d=1..cantorLevel), nv=2(d=1..cantorLevel), ..., plus special row
3662
+ for (var nv = 1; nv <= cantorLevel && rows.length < maxRows; nv++) {
3663
+ for (var d = 1; d <= cantorLevel && rows.length < maxRows; d++) {
3664
+ var total = Math.pow(maxVal + 1, nv);
3665
+ for (var ci = 0; ci < total && rows.length < maxRows; ci++) {
3666
+ var vals = [];
3667
+ var tmp = ci;
3668
+ for (var k = 0; k < nv; k++) {
3669
+ vals.push(tmp % (maxVal + 1));
3670
+ tmp = Math.floor(tmp / (maxVal + 1));
3671
+ }
3672
+ var row = [1];
3673
+ for (var k = 0; k < nv; k++) row.push(vals[k]);
3674
+ row.push(d);
3675
+ rows.push(row);
3676
+ }
3677
+ }
3678
+ }
3679
+
3680
+ // Add boundary/special row [1, 0, ..., 0, 1] with (cantorLevel+1) zeros + diag=1
3681
+ // For cantorLevel=0: generates the sole row [[1,0,1]] (1 zero)
3682
+ // For cantorLevel>=2: adds the terminal row [1, 0, ..., 0, 1] with cantorLevel+1 zeros
3683
+ // For cantorLevel=1: skip (not needed)
3684
+ if ((cantorLevel === 0 || cantorLevel >= 2) && rows.length < maxRows) {
3685
+ var bRow = [1];
3686
+ var zeroCount = (cantorLevel === 0) ? 1 : (cantorLevel + 1);
3687
+ for (var k = 0; k < zeroCount; k++) bRow.push(0);
3688
+ bRow.push(1);
3689
+ rows.push(bRow);
3690
+ }
3691
+
3692
+ return rows;
3693
+ };
3694
+
3695
+ // getCantorLevel: map operation level to expandOrdinals cantorLevel
3696
+ // v0 values: 0=ω+1, 1=ω*2+1, 2=ω*3+1, 3-5=ω^ω range,
3697
+ // 6=ω^2+1, 7=ω^2+ω, 8=ω^2+ω+1, 9=ω^2*2,
3698
+ // 10=ω^3, 11=ω^3+1, ...
3699
+ MetaNum.getCantorLevel = function (levelN) {
3700
+ // For now, simple mapping based on known cases
3701
+ if (levelN <= 0) return 0; // ω+1: expande
3702
+ if (levelN <= 2) return 1; // ω*2+1 through ω*3+1
3703
+ if (levelN <= 5) return 1; // ω^ω diagonalization range
3704
+ if (levelN <= 9) return 1; // ω^2 range
3705
+ if (levelN <= 11) return 2; // ω^3 range
3706
+ // Default: use levelN / some factor
3707
+ return Math.min(Math.floor(levelN / 5) + 1, MetaNum.maxCols);
3708
+ };
3709
+
3710
+ MetaNum.clone = clone;
3711
+ MetaNum.config = MetaNum.set = config;
3712
+
3713
+ for (var prop in Q) {
3714
+ if (Q.hasOwnProperty(prop)) {
3715
+ MetaNum[prop] = Q[prop];
3716
+ }
3717
+ }
3718
+
3719
+ if (obj === void 0) obj = {};
3720
+ if (obj) {
3721
+ ps = ['maxRows', 'maxCols', 'maxArrow', 'serializeMode', 'debug'];
3722
+ for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];
3723
+ }
3724
+
3725
+ MetaNum.config(obj);
3726
+
3727
+ return MetaNum;
3728
+ }
3729
+
3730
+ function defineConstants(obj) {
3731
+ for (var prop in R) {
3732
+ if (R.hasOwnProperty(prop)) {
3733
+ var val = R[prop];
3734
+ if (typeof val === "string") {
3735
+ obj[prop] = val;
3736
+ } else if (Object.defineProperty) {
3737
+ Object.defineProperty(obj, prop, {
3738
+ configurable: false,
3739
+ enumerable: true,
3740
+ writable: false,
3741
+ value: new MetaNum(val)
3742
+ });
3743
+ } else {
3744
+ obj[prop] = new MetaNum(val);
3745
+ }
3746
+ }
3747
+ }
3748
+ return obj;
3749
+ }
3750
+
3751
+ function config(obj) {
3752
+ if (!obj || typeof obj !== 'object') {
3753
+ throw Error(metaNumError + 'Object expected');
3754
+ }
3755
+ var i, p, v,
3756
+ ps = [
3757
+ 'maxRows', 1, 1000,
3758
+ 'maxCols', 1, 1000,
3759
+ 'maxArrow', 1, Number.MAX_SAFE_INTEGER,
3760
+ 'serializeMode', 0, 1,
3761
+ 'debug', 0, 2
3762
+ ];
3763
+ for (i = 0; i < ps.length; i += 3) {
3764
+ if ((v = obj[p = ps[i]]) !== void 0) {
3765
+ if (Math.floor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;
3766
+ else throw Error(invalidArgument + p + ': ' + v);
3767
+ }
3768
+ }
3769
+ return this;
3770
+ }
3771
+
3772
+ MetaNum = clone(MetaNum);
3773
+ MetaNum = defineConstants(MetaNum);
3774
+ MetaNum['default'] = MetaNum.MetaNum = MetaNum;
3775
+
3776
+ if (typeof define == 'function' && define.amd) {
3777
+ define(function () {
3778
+ return MetaNum;
3779
+ });
3780
+ } else if (typeof module != 'undefined' && module.exports) {
3781
+ module.exports = MetaNum;
3782
+ } else {
3783
+ if (!globalScope) {
3784
+ globalScope = typeof self != 'undefined' && self && self.self == self
3785
+ ? self : Function('return this')();
3786
+ }
3787
+ globalScope.MetaNum = MetaNum;
3788
+ }
3789
+ })(this);