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/.gitattributes +1 -0
- package/LICENSE +21 -0
- package/README.md +583 -0
- package/metanum.js +3789 -0
- package/package.json +23 -0
- package/test-interface.html +45 -0
- package/test_mixed.js +107 -0
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);
|