Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port to BigInt? #6

Open
fasiha opened this issue May 24, 2019 · 3 comments
Open

Port to BigInt? #6

fasiha opened this issue May 24, 2019 · 3 comments

Comments

@fasiha
Copy link
Owner

fasiha commented May 24, 2019

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

Available in Chrome/Node now. In Firefox beta. WIP in Safari per https://wingolog.org/archives/2019/05/23/bigint-shipping-in-firefox

@fasiha
Copy link
Owner Author

fasiha commented May 24, 2019

Basic sketch, proof of concept, showing both ascending and descending operation:

"use strict";

function bigIntToDigits(x, base) {
  let ret = [];
  while (x > 0) {
    ret.push(x % base);
    x /= base;
  }
  ret.reverse();
  return ret;
}

function bigIntSubdivide(l, r, n, base) {
  while ((r - l) / n === 0n) {
    r *= base;
    l *= base;
  }
  let delta = (r - l) / n;
  let ret = [];
  let nNumber = Number(n);
  {
    let prev = l;
    for (let i = 0; i < nNumber; i++) {
      let next = prev + delta;
      ret.push(next);
      prev = next;
    }
  }
  return ret;
}

function digits2bigint(arr, base) {
  arr = arr.map(BigInt);
  let ret = 0n;
  let pow = 1n;
  for (let i = arr.length - 1; i >= 0; --i) {
    ret += arr[i] * pow;
    pow *= base;
  }
  return ret;
}

function makeUniqueNumArr(vov, left) {
  vov.forEach((arr, i) => {
    const prev = vov[i - 1] || left;
    const hit = arr.findIndex((n, i) => n !== prev[i]);
    if (hit >= 0) { vov[i] = vov[i].slice(0, hit + 1); }
  });
  return vov;
}

function main(left, right, numStringsNumber, num2sym, shorten = true) {
  let sym2num = new Map(num2sym.map((sym, i) => [sym, i]));
  let base = BigInt(num2sym.length);

  const str2digits = s => s.split('').map(c => sym2num.get(c));
  let flipped = left > right;
  if (flipped) { [left, right] = [right, left]; }

  let maxLen = Math.max(left.length, right.length);
  let bigintarr = bigIntSubdivide(
      digits2bigint(str2digits(num2sym[1] + left + num2sym[0].repeat(maxLen - left.length)), base),
      digits2bigint(str2digits(num2sym[1] + right + num2sym[0].repeat(maxLen - right.length)), base),
      BigInt(numStringsNumber),
      base,
  );

  if (!shorten) {
    if (flipped) { bigintarr.reverse(); }
    return bigintarr.map(n => bigIntToDigits(n, base).slice(1).map(n => num2sym[n]).join(''));
  }
  let ret = makeUniqueNumArr(bigintarr.map(n => bigIntToDigits(n, base).slice(1).map(n => num2sym[n])), left.split(''))
                .map(v => v.join(''));
  if (flipped) { ret.reverse(); }
  return ret;
}

function checkAsc(v) {
  if (!v.every((s, i) => (!i) || v[i - 1] < s)) { throw new Error('invalid'); }
}
function checkDesc(v) {
  if (!v.every((s, i) => (!i) || v[i - 1] > s)) { throw new Error('invalid'); }
}
if (require.main === module) {
  let num2sym = '0123456789abcdef'.split('');
  let left = '03a';
  let right = '2';
  let numStrings = 1000;

  let mudder = require('./index');
  let hex = new mudder.SymbolTable(num2sym);

  for (let i = 0; i < 2; i++) {
    if (i > 0) { [left, right] = [right, left]; }

    let sameLength = main(left, right, numStrings, num2sym, false);
    let shortAsPossible = main(left, right, numStrings, num2sym, true);
    let gold = hex.mudder(left, right, Number(numStrings));

    console.log('\n\nBigIntSameLen\tBigIntShort\tMudder');
    console.log(gold.map((gold, i) => [sameLength[i], shortAsPossible[i], gold].join('\t')).join('\n'));

    let check = (left < right) ? checkAsc : checkDesc;
    check(sameLength);
    check(shortAsPossible);
    check(gold);
  }
}

Outputs:

BigIntSameLen	BigIntShort	Mudder
03a7	03a7	03a7
03ae	03ae	03ae
03b5	03b	03b
03bc	03bc	03bd
03c3	03c	03c
03ca	03ca	03cb
03d1	03d	03d
03d8	03d8	03da
03df	03df	03e
03e6	03e	03e8
03ed	03ed	03ef
03f4	03f	03f
03fb	03fb	03fe
0402	04	04
0409	040	040c
0410	041	041
0417	0417	041b
041e	041e	042
0425	042	0429
042c	042c	043
0433	043	0438
043a	043a	043f
0441	044	044
0448	0448	044e
044f	044f	045
0456	045	045c
045d	045d	046
0464	046	046b
046b	046b	047
0472	047	0479
0479	0479	048
0480	048	0488
0487	0487	048f
048e	048e	049
0495	049	049d
049c	049c	04a
04a3	04a	04ac
04aa	04aa	04b
04b1	04b	04bb
04b8	04b8	04c
04bf	04bf	04c9
04c6	04c	04d
04cd	04cd	04d8
04d4	04d	04df
04db	04db	04e
04e2	04e	04ed
04e9	04e9	04f
04f0	04f	04fc
04f7	04f7	05
04fe	04fe	050a
0505	05	051
050c	050	0519
0513	051	052
051a	051a	0527
0521	052	052f
0528	0528	053
052f	052f	053d
0536	053	054
053d	053d	054c
0544	054	055
054b	054b	055a
0552	055	056
0559	0559	0569
0560	056	057
0567	0567	0577
056e	056e	057e
0575	057	058
057c	057c	058d
0583	058	059
058a	058a	059b
0591	059	05a
0598	0598	05aa
059f	059f	05b
05a6	05a	05b9
05ad	05ad	05c
05b4	05b	05c7
05bb	05bb	05ce
05c2	05c	05d
05c9	05c9	05dd
05d0	05d	05e
05d7	05d7	05eb
05de	05de	05f
05e5	05e	05fa
05ec	05ec	06
05f3	05f	0608
05fa	05fa	061
0601	06	0617
0608	060	061e
060f	060f	062
0616	061	062d
061d	061d	063
0624	062	063b
062b	062b	064
0632	063	064a
0639	0639	065
0640	064	0658
0647	0647	065f
064e	064e	066
0655	065	066e
065c	065c	067
0663	066	067c
066a	066a	068
0671	067	068b
0678	0678	069
067f	067f	0699
0686	068	06a
068d	068d	06a8
0694	069	06af
069b	069b	06b
06a2	06a	06be
06a9	06a9	06c
06b0	06b	06cc
06b7	06b7	06d
06be	06be	06db
06c5	06c	06e
06cc	06cc	06e9
06d3	06d	06f
06da	06da	06f8
06e1	06e	06ff
06e8	06e8	07
06ef	06ef	070e
06f6	06f	071
06fd	06fd	071c
0704	07	072
070b	070	072b
0712	071	073
0719	0719	0739
0720	072	074
0727	0727	0748
072e	072e	074f
0735	073	075
073c	073c	075d
0743	074	076
074a	074a	076c
0751	075	077
0758	0758	077a
075f	075f	078
0766	076	0789
076d	076d	079
0774	077	0797
077b	077b	079f
0782	078	07a
0789	0789	07ad
0790	079	07b
0797	0797	07bc
079e	079e	07c
07a5	07a	07ca
07ac	07ac	07d
07b3	07b	07d9
07ba	07ba	07e
07c1	07c	07e7
07c8	07c8	07ef
07cf	07cf	07f
07d6	07d	07fd
07dd	07dd	08
07e4	07e	080c
07eb	07eb	081
07f2	07f	081a
07f9	07f9	082
0800	08	0829
0807	080	083
080e	080e	0837
0815	081	083e
081c	081c	084
0823	082	084d
082a	082a	085
0831	083	085b
0838	0838	086
083f	083f	086a
0846	084	087
084d	084d	0878
0854	085	088
085b	085b	0887
0862	086	088e
0869	0869	089
0870	087	089d
0877	0877	08a
087e	087e	08ab
0885	088	08b
088c	088c	08ba
0893	089	08c
089a	089a	08c8
08a1	08a	08cf
08a8	08a8	08d
08af	08af	08de
08b6	08b	08e
08bd	08bd	08ed
08c4	08c	08f
08cb	08cb	08fb
08d2	08d	09
08d9	08d9	090a
08e0	08e	091
08e7	08e7	0918
08ee	08ee	091f
08f5	08f	092
08fc	08fc	092e
0903	09	093
090a	090	093c
0911	091	094
0918	0918	094b
091f	091f	095
0926	092	0959
092d	092d	096
0934	093	0968
093b	093b	096f
0942	094	097
0949	0949	097e
0950	095	098
0957	0957	098c
095e	095e	099
0965	096	099b
096c	096c	09a
0973	097	09a9
097a	097a	09b
0981	098	09b8
0988	0988	09bf
098f	098f	09c
0996	099	09cd
099d	099d	09d
09a4	09a	09dc
09ab	09ab	09e
09b2	09b	09ea
09b9	09b9	09f
09c0	09c	09f9
09c7	09c7	0a
09ce	09ce	0a08
09d5	09d	0a0f
09dc	09dc	0a1
09e3	09e	0a1d
09ea	09ea	0a2
09f1	09f	0a2c
09f8	09f8	0a3
09ff	09ff	0a3a
0a06	0a	0a4
0a0d	0a0	0a49
0a14	0a1	0a5
0a1b	0a1b	0a57
0a22	0a2	0a5f
0a29	0a29	0a6
0a30	0a3	0a6d
0a37	0a37	0a7
0a3e	0a3e	0a7c
0a45	0a4	0a8
0a4c	0a4c	0a8a
0a53	0a5	0a9
0a5a	0a5a	0a99
0a61	0a6	0aa
0a68	0a68	0aa7
0a6f	0a6f	0aae
0a76	0a7	0ab
0a7d	0a7d	0abd
0a84	0a8	0ac
0a8b	0a8b	0acb
0a92	0a9	0ad
0a99	0a99	0ada
0aa0	0aa	0ae
0aa7	0aa7	0ae8
0aae	0aae	0af
0ab5	0ab	0af7
0abc	0abc	0afe
0ac3	0ac	0b
0aca	0aca	0b0d
0ad1	0ad	0b1
0ad8	0ad8	0b1b
0adf	0adf	0b2
0ae6	0ae	0b2a
0aed	0aed	0b3
0af4	0af	0b38
0afb	0afb	0b4
0b02	0b	0b47
0b09	0b0	0b4e
0b10	0b1	0b5
0b17	0b17	0b5d
0b1e	0b1e	0b6
0b25	0b2	0b6b
0b2c	0b2c	0b7
0b33	0b3	0b7a
0b3a	0b3a	0b8
0b41	0b4	0b88
0b48	0b48	0b8f
0b4f	0b4f	0b9
0b56	0b5	0b9e
0b5d	0b5d	0ba
0b64	0b6	0bac
0b6b	0b6b	0bb
0b72	0b7	0bbb
0b79	0b79	0bc
0b80	0b8	0bc9
0b87	0b87	0bd
0b8e	0b8e	0bd8
0b95	0b9	0bdf
0b9c	0b9c	0be
0ba3	0ba	0bee
0baa	0baa	0bf
0bb1	0bb	0bfc
0bb8	0bb8	0c
0bbf	0bbf	0c0b
0bc6	0bc	0c1
0bcd	0bcd	0c19
0bd4	0bd	0c2
0bdb	0bdb	0c28
0be2	0be	0c2f
0be9	0be9	0c3
0bf0	0bf	0c3e
0bf7	0bf7	0c4
0bfe	0bfe	0c4c
0c05	0c	0c5
0c0c	0c0	0c5b
0c13	0c1	0c6
0c1a	0c1a	0c69
0c21	0c2	0c7
0c28	0c28	0c78
0c2f	0c2f	0c7f
0c36	0c3	0c8
0c3d	0c3d	0c8d
0c44	0c4	0c9
0c4b	0c4b	0c9c
0c52	0c5	0ca
0c59	0c59	0caa
0c60	0c6	0cb
0c67	0c67	0cb9
0c6e	0c6e	0cc
0c75	0c7	0cc7
0c7c	0c7c	0ccf
0c83	0c8	0cd
0c8a	0c8a	0cdd
0c91	0c9	0ce
0c98	0c98	0cec
0c9f	0c9f	0cf
0ca6	0ca	0cfa
0cad	0cad	0d
0cb4	0cb	0d09
0cbb	0cbb	0d1
0cc2	0cc	0d17
0cc9	0cc9	0d1f
0cd0	0cd	0d2
0cd7	0cd7	0d2d
0cde	0cde	0d3
0ce5	0ce	0d3c
0cec	0cec	0d4
0cf3	0cf	0d4a
0cfa	0cfa	0d5
0d01	0d	0d59
0d08	0d0	0d6
0d0f	0d0f	0d67
0d16	0d1	0d6e
0d1d	0d1d	0d7
0d24	0d2	0d7d
0d2b	0d2b	0d8
0d32	0d3	0d8b
0d39	0d39	0d9
0d40	0d4	0d9a
0d47	0d47	0da
0d4e	0d4e	0da8
0d55	0d5	0db
0d5c	0d5c	0db7
0d63	0d6	0dbe
0d6a	0d6a	0dc
0d71	0d7	0dcd
0d78	0d78	0dd
0d7f	0d7f	0ddb
0d86	0d8	0de
0d8d	0d8d	0dea
0d94	0d9	0df
0d9b	0d9b	0df8
0da2	0da	0dff
0da9	0da9	0e
0db0	0db	0e0e
0db7	0db7	0e1
0dbe	0dbe	0e1c
0dc5	0dc	0e2
0dcc	0dcc	0e2b
0dd3	0dd	0e3
0dda	0dda	0e3a
0de1	0de	0e4
0de8	0de8	0e48
0def	0def	0e4f
0df6	0df	0e5
0dfd	0dfd	0e5e
0e04	0e	0e6
0e0b	0e0	0e6c
0e12	0e1	0e7
0e19	0e19	0e7b
0e20	0e2	0e8
0e27	0e27	0e89
0e2e	0e2e	0e9
0e35	0e3	0e98
0e3c	0e3c	0e9f
0e43	0e4	0ea
0e4a	0e4a	0eae
0e51	0e5	0eb
0e58	0e58	0ebc
0e5f	0e5f	0ec
0e66	0e6	0ecb
0e6d	0e6d	0ed
0e74	0e7	0ed9
0e7b	0e7b	0ee
0e82	0e8	0ee8
0e89	0e89	0eef
0e90	0e9	0ef
0e97	0e97	0efd
0e9e	0e9e	0f
0ea5	0ea	0f0c
0eac	0eac	0f1
0eb3	0eb	0f1a
0eba	0eba	0f2
0ec1	0ec	0f29
0ec8	0ec8	0f3
0ecf	0ecf	0f38
0ed6	0ed	0f3f
0edd	0edd	0f4
0ee4	0ee	0f4d
0eeb	0eeb	0f5
0ef2	0ef	0f5c
0ef9	0ef9	0f6
0f00	0f	0f6a
0f07	0f0	0f7
0f0e	0f0e	0f79
0f15	0f1	0f8
0f1c	0f1c	0f87
0f23	0f2	0f8f
0f2a	0f2a	0f9
0f31	0f3	0f9d
0f38	0f38	0fa
0f3f	0f3f	0fac
0f46	0f4	0fb
0f4d	0f4d	0fba
0f54	0f5	0fc
0f5b	0f5b	0fc9
0f62	0f6	0fd
0f69	0f69	0fd7
0f70	0f7	0fde
0f77	0f77	0fe
0f7e	0f7e	0fed
0f85	0f8	0ff
0f8c	0f8c	0ffb
0f93	0f9	1
0f9a	0f9a	100a
0fa1	0fa	101
0fa8	0fa8	1018
0faf	0faf	102
0fb6	0fb	1027
0fbd	0fbd	102e
0fc4	0fc	103
0fcb	0fcb	103d
0fd2	0fd	104
0fd9	0fd9	104b
0fe0	0fe	105
0fe7	0fe7	105a
0fee	0fee	106
0ff5	0ff	1068
0ffc	0ffc	107
1003	1	1077
100a	10	107e
1011	101	108
1018	1018	108d
101f	101f	109
1026	102	109b
102d	102d	10a
1034	103	10aa
103b	103b	10b
1042	104	10b8
1049	1049	10bf
1050	105	10c
1057	1057	10ce
105e	105e	10d
1065	106	10dc
106c	106c	10e
1073	107	10eb
107a	107a	10f
1081	108	10f9
1088	1088	11
108f	108f	1108
1096	109	110f
109d	109d	111
10a4	10a	111e
10ab	10ab	112
10b2	10b	112c
10b9	10b9	113
10c0	10c	113b
10c7	10c7	114
10ce	10ce	1149
10d5	10d	115
10dc	10dc	1158
10e3	10e	115f
10ea	10ea	116
10f1	10f	116e
10f8	10f8	117
10ff	10ff	117c
1106	11	118
110d	110	118b
1114	111	119
111b	111b	1199
1122	112	11a
1129	1129	11a8
1130	113	11af
1137	1137	11b
113e	113e	11bd
1145	114	11c
114c	114c	11cc
1153	115	11d
115a	115a	11da
1161	116	11e
1168	1168	11e9
116f	116f	11f
1176	117	11f7
117d	117d	11ff
1184	118	12
118b	118b	120d
1192	119	121
1199	1199	121c
11a0	11a	122
11a7	11a7	122a
11ae	11ae	123
11b5	11b	1239
11bc	11bc	124
11c3	11c	1247
11ca	11ca	124e
11d1	11d	125
11d8	11d8	125d
11df	11df	126
11e6	11e	126c
11ed	11ed	127
11f4	11f	127a
11fb	11fb	128
1202	12	1289
1209	120	129
1210	121	1297
1217	1217	129e
121e	121e	12a
1225	122	12ad
122c	122c	12b
1233	123	12bb
123a	123a	12c
1241	124	12ca
1248	1248	12d
124f	124f	12d8
1256	125	12e
125d	125d	12e7
1264	126	12ee
126b	126b	12f
1272	127	12fd
1279	1279	13
1280	128	130b
1287	1287	131
128e	128e	131a
1295	129	132
129c	129c	1328
12a3	12a	132f
12aa	12aa	133
12b1	12b	133e
12b8	12b8	134
12bf	12bf	134c
12c6	12c	135
12cd	12cd	135b
12d4	12d	136
12db	12db	136a
12e2	12e	137
12e9	12e9	1378
12f0	12f	137f
12f7	12f7	138
12fe	12fe	138e
1305	13	139
130c	130	139c
1313	131	13a
131a	131a	13ab
1321	132	13b
1328	1328	13b9
132f	132f	13c
1336	133	13c8
133d	133d	13cf
1344	134	13d
134b	134b	13de
1352	135	13e
1359	1359	13ec
1360	136	13f
1367	1367	13fb
136e	136e	14
1375	137	1409
137c	137c	141
1383	138	1418
138a	138a	141f
1391	139	142
1398	1398	142d
139f	139f	143
13a6	13a	143c
13ad	13ad	144
13b4	13b	144a
13bb	13bb	145
13c2	13c	1459
13c9	13c9	146
13d0	13d	1467
13d7	13d7	146f
13de	13de	147
13e5	13e	147d
13ec	13ec	148
13f3	13f	148c
13fa	13fa	149
1401	14	149a
1408	140	14a
140f	140f	14a9
1416	141	14b
141d	141d	14b7
1424	142	14bf
142b	142b	14c
1432	143	14cd
1439	1439	14d
1440	144	14dc
1447	1447	14e
144e	144e	14ea
1455	145	14f
145c	145c	14f9
1463	146	15
146a	146a	1507
1471	147	150e
1478	1478	151
147f	147f	151d
1486	148	152
148d	148d	152b
1494	149	153
149b	149b	153a
14a2	14a	154
14a9	14a9	1548
14b0	14b	155
14b7	14b7	1557
14be	14be	155e
14c5	14c	156
14cc	14cc	156d
14d3	14d	157
14da	14da	157b
14e1	14e	158
14e8	14e8	158a
14ef	14ef	159
14f6	14f	1598
14fd	14fd	15a
1504	15	15a7
150b	150	15ae
1512	151	15b
1519	1519	15bd
1520	152	15c
1527	1527	15cb
152e	152e	15d
1535	153	15da
153c	153c	15e
1543	154	15e8
154a	154a	15ef
1551	155	15f
1558	1558	15fe
155f	155f	16
1566	156	160c
156d	156d	161
1574	157	161b
157b	157b	162
1582	158	1629
1589	1589	163
1590	159	1638
1597	1597	163f
159e	159e	164
15a5	15a	164e
15ac	15ac	165
15b3	15b	165c
15ba	15ba	166
15c1	15c	166b
15c8	15c8	167
15cf	15cf	1679
15d6	15d	168
15dd	15dd	1688
15e4	15e	168f
15eb	15eb	169
15f2	15f	169e
15f9	15f9	16a
1600	16	16ac
1607	160	16b
160e	160e	16bb
1615	161	16c
161c	161c	16c9
1623	162	16d
162a	162a	16d8
1631	163	16df
1638	1638	16e
163f	163f	16ed
1646	164	16f
164d	164d	16fc
1654	165	17
165b	165b	170a
1662	166	171
1669	1669	1719
1670	167	172
1677	1677	1727
167e	167e	172f
1685	168	173
168c	168c	173d
1693	169	174
169a	169a	174c
16a1	16a	175
16a8	16a8	175a
16af	16af	176
16b6	16b	1769
16bd	16bd	177
16c4	16c	1777
16cb	16cb	177e
16d2	16d	178
16d9	16d9	178d
16e0	16e	179
16e7	16e7	179c
16ee	16ee	17a
16f5	16f	17aa
16fc	16fc	17b
1703	17	17b9
170a	170	17c
1711	171	17c7
1718	1718	17ce
171f	171f	17d
1726	172	17dd
172d	172d	17e
1734	173	17eb
173b	173b	17f
1742	174	17fa
1749	1749	18
1750	175	1808
1757	1757	181
175e	175e	1817
1765	176	181e
176c	176c	182
1773	177	182d
177a	177a	183
1781	178	183b
1788	1788	184
178f	178f	184a
1796	179	185
179d	179d	1858
17a4	17a	185f
17ab	17ab	186
17b2	17b	186e
17b9	17b9	187
17c0	17c	187c
17c7	17c7	188
17ce	17ce	188b
17d5	17d	189
17dc	17dc	1899
17e3	17e	18a
17ea	17ea	18a8
17f1	17f	18af
17f8	17f8	18b
17ff	17ff	18be
1806	18	18c
180d	180	18cc
1814	181	18d
181b	181b	18db
1822	182	18e
1829	1829	18e9
1830	183	18f
1837	1837	18f8
183e	183e	18ff
1845	184	19
184c	184c	190e
1853	185	191
185a	185a	191c
1861	186	192
1868	1868	192b
186f	186f	193
1876	187	1939
187d	187d	194
1884	188	1948
188b	188b	194f
1892	189	195
1899	1899	195d
18a0	18a	196
18a7	18a7	196c
18ae	18ae	197
18b5	18b	197a
18bc	18bc	198
18c3	18c	1989
18ca	18ca	199
18d1	18d	1997
18d8	18d8	199f
18df	18df	19a
18e6	18e	19ad
18ed	18ed	19b
18f4	18f	19bc
18fb	18fb	19c
1902	19	19ca
1909	190	19d
1910	191	19d9
1917	1917	19e
191e	191e	19e7
1925	192	19ef
192c	192c	19f
1933	193	19fd
193a	193a	1a
1941	194	1a0c
1948	1948	1a1
194f	194f	1a1a
1956	195	1a2
195d	195d	1a29
1964	196	1a3
196b	196b	1a37
1972	197	1a3e
1979	1979	1a4
1980	198	1a4d
1987	1987	1a5
198e	198e	1a5b
1995	199	1a6
199c	199c	1a6a
19a3	19a	1a7
19aa	19aa	1a78
19b1	19b	1a8
19b8	19b8	1a87
19bf	19bf	1a8e
19c6	19c	1a9
19cd	19cd	1a9d
19d4	19d	1aa
19db	19db	1aab
19e2	19e	1ab
19e9	19e9	1aba
19f0	19f	1ac
19f7	19f7	1ac8
19fe	19fe	1ad
1a05	1a	1ad7
1a0c	1a0	1ade
1a13	1a1	1ae
1a1a	1a1a	1aed
1a21	1a2	1af
1a28	1a28	1afb
1a2f	1a2f	1b
1a36	1a3	1b0a
1a3d	1a3d	1b1
1a44	1a4	1b18
1a4b	1a4b	1b1f
1a52	1a5	1b2
1a59	1a59	1b2e
1a60	1a6	1b3
1a67	1a67	1b3c
1a6e	1a6e	1b4
1a75	1a7	1b4b
1a7c	1a7c	1b5
1a83	1a8	1b59
1a8a	1a8a	1b6
1a91	1a9	1b68
1a98	1a98	1b6f
1a9f	1a9f	1b7
1aa6	1aa	1b7e
1aad	1aad	1b8
1ab4	1ab	1b8c
1abb	1abb	1b9
1ac2	1ac	1b9b
1ac9	1ac9	1ba
1ad0	1ad	1ba9
1ad7	1ad7	1bb
1ade	1ade	1bb8
1ae5	1ae	1bbf
1aec	1aec	1bc
1af3	1af	1bce
1afa	1afa	1bd
1b01	1b	1bdc
1b08	1b0	1be
1b0f	1b0f	1beb
1b16	1b1	1bf
1b1d	1b1d	1bf9
1b24	1b2	1c
1b2b	1b2b	1c08
1b32	1b3	1c0f
1b39	1b39	1c1
1b40	1b4	1c1d
1b47	1b47	1c2
1b4e	1b4e	1c2c
1b55	1b5	1c3
1b5c	1b5c	1c3a
1b63	1b6	1c4
1b6a	1b6a	1c49
1b71	1b7	1c5
1b78	1b78	1c57
1b7f	1b7f	1c5f
1b86	1b8	1c6
1b8d	1b8d	1c6d
1b94	1b9	1c7
1b9b	1b9b	1c7c
1ba2	1ba	1c8
1ba9	1ba9	1c8a
1bb0	1bb	1c9
1bb7	1bb7	1c99
1bbe	1bbe	1ca
1bc5	1bc	1ca7
1bcc	1bcc	1cae
1bd3	1bd	1cb
1bda	1bda	1cbd
1be1	1be	1cc
1be8	1be8	1ccb
1bef	1bef	1cd
1bf6	1bf	1cda
1bfd	1bfd	1ce
1c04	1c	1ce9
1c0b	1c0	1cf
1c12	1c1	1cf7
1c19	1c19	1cfe
1c20	1c2	1d
1c27	1c27	1d0d
1c2e	1c2e	1d1
1c35	1c3	1d1b
1c3c	1c3c	1d2
1c43	1c4	1d2a
1c4a	1c4a	1d3
1c51	1c5	1d38
1c58	1c58	1d4
1c5f	1c5f	1d47
1c66	1c6	1d4e
1c6d	1c6d	1d5
1c74	1c7	1d5d
1c7b	1c7b	1d6
1c82	1c8	1d6b
1c89	1c89	1d7
1c90	1c9	1d7a
1c97	1c97	1d8
1c9e	1c9e	1d88
1ca5	1ca	1d8f
1cac	1cac	1d9
1cb3	1cb	1d9e
1cba	1cba	1da
1cc1	1cc	1dac
1cc8	1cc8	1db
1ccf	1ccf	1dbb
1cd6	1cd	1dc
1cdd	1cdd	1dc9
1ce4	1ce	1dd
1ceb	1ceb	1dd8
1cf2	1cf	1ddf
1cf9	1cf9	1de
1d00	1d	1dee
1d07	1d0	1df
1d0e	1d0e	1dfc
1d15	1d1	1e
1d1c	1d1c	1e0b
1d23	1d2	1e1
1d2a	1d2a	1e19
1d31	1d3	1e2
1d38	1d38	1e28
1d3f	1d3f	1e2f
1d46	1d4	1e3
1d4d	1d4d	1e3e
1d54	1d5	1e4
1d5b	1d5b	1e4c
1d62	1d6	1e5
1d69	1d69	1e5b
1d70	1d7	1e6
1d77	1d77	1e69
1d7e	1d7e	1e7
1d85	1d8	1e78
1d8c	1d8c	1e7f
1d93	1d9	1e8
1d9a	1d9a	1e8d
1da1	1da	1e9
1da8	1da8	1e9c
1daf	1daf	1ea
1db6	1db	1eaa
1dbd	1dbd	1eb
1dc4	1dc	1eb9
1dcb	1dcb	1ec
1dd2	1dd	1ec7
1dd9	1dd9	1ecf
1de0	1de	1ed
1de7	1de7	1edd
1dee	1dee	1ee
1df5	1df	1eec
1dfc	1dfc	1ef
1e03	1e	1efa
1e0a	1e0	1f
1e11	1e1	1f09
1e18	1e18	1f1
1e1f	1e1f	1f17
1e26	1e2	1f1f
1e2d	1e2d	1f2
1e34	1e3	1f2d
1e3b	1e3b	1f3
1e42	1e4	1f3c
1e49	1e49	1f4
1e50	1e5	1f4a
1e57	1e57	1f5
1e5e	1e5e	1f59
1e65	1e6	1f6
1e6c	1e6c	1f67
1e73	1e7	1f6e
1e7a	1e7a	1f7
1e81	1e8	1f7d
1e88	1e88	1f8
1e8f	1e8f	1f8b
1e96	1e9	1f9
1e9d	1e9d	1f9a
1ea4	1ea	1fa
1eab	1eab	1fa8
1eb2	1eb	1fb
1eb9	1eb9	1fb7
1ec0	1ec	1fbe
1ec7	1ec7	1fc
1ece	1ece	1fcd
1ed5	1ed	1fd
1edc	1edc	1fdb
1ee3	1ee	1fe
1eea	1eea	1fea
1ef1	1ef	1ff
1ef8	1ef8	1ff8


BigIntSameLen	BigIntShort	Mudder
1ef8	1ef8	1ff8
1ef1	1ef	1ff
1eea	1eea	1fea
1ee3	1ee	1fe
1edc	1edc	1fdb
1ed5	1ed	1fd
1ece	1ece	1fcd
1ec7	1ec7	1fc
1ec0	1ec	1fbe
1eb9	1eb9	1fb7
1eb2	1eb	1fb
1eab	1eab	1fa8
1ea4	1ea	1fa
1e9d	1e9d	1f9a
1e96	1e9	1f9
1e8f	1e8f	1f8b
1e88	1e88	1f8
1e81	1e8	1f7d
1e7a	1e7a	1f7
1e73	1e7	1f6e
1e6c	1e6c	1f67
1e65	1e6	1f6
1e5e	1e5e	1f59
1e57	1e57	1f5
1e50	1e5	1f4a
1e49	1e49	1f4
1e42	1e4	1f3c
1e3b	1e3b	1f3
1e34	1e3	1f2d
1e2d	1e2d	1f2
1e26	1e2	1f1f
1e1f	1e1f	1f17
1e18	1e18	1f1
1e11	1e1	1f09
1e0a	1e0	1f
1e03	1e	1efa
1dfc	1dfc	1ef
1df5	1df	1eec
1dee	1dee	1ee
1de7	1de7	1edd
1de0	1de	1ed
1dd9	1dd9	1ecf
1dd2	1dd	1ec7
1dcb	1dcb	1ec
1dc4	1dc	1eb9
1dbd	1dbd	1eb
1db6	1db	1eaa
1daf	1daf	1ea
1da8	1da8	1e9c
1da1	1da	1e9
1d9a	1d9a	1e8d
1d93	1d9	1e8
1d8c	1d8c	1e7f
1d85	1d8	1e78
1d7e	1d7e	1e7
1d77	1d77	1e69
1d70	1d7	1e6
1d69	1d69	1e5b
1d62	1d6	1e5
1d5b	1d5b	1e4c
1d54	1d5	1e4
1d4d	1d4d	1e3e
1d46	1d4	1e3
1d3f	1d3f	1e2f
1d38	1d38	1e28
1d31	1d3	1e2
1d2a	1d2a	1e19
1d23	1d2	1e1
1d1c	1d1c	1e0b
1d15	1d1	1e
1d0e	1d0e	1dfc
1d07	1d0	1df
1d00	1d	1dee
1cf9	1cf9	1de
1cf2	1cf	1ddf
1ceb	1ceb	1dd8
1ce4	1ce	1dd
1cdd	1cdd	1dc9
1cd6	1cd	1dc
1ccf	1ccf	1dbb
1cc8	1cc8	1db
1cc1	1cc	1dac
1cba	1cba	1da
1cb3	1cb	1d9e
1cac	1cac	1d9
1ca5	1ca	1d8f
1c9e	1c9e	1d88
1c97	1c97	1d8
1c90	1c9	1d7a
1c89	1c89	1d7
1c82	1c8	1d6b
1c7b	1c7b	1d6
1c74	1c7	1d5d
1c6d	1c6d	1d5
1c66	1c6	1d4e
1c5f	1c5f	1d47
1c58	1c58	1d4
1c51	1c5	1d38
1c4a	1c4a	1d3
1c43	1c4	1d2a
1c3c	1c3c	1d2
1c35	1c3	1d1b
1c2e	1c2e	1d1
1c27	1c27	1d0d
1c20	1c2	1d
1c19	1c19	1cfe
1c12	1c1	1cf7
1c0b	1c0	1cf
1c04	1c	1ce9
1bfd	1bfd	1ce
1bf6	1bf	1cda
1bef	1bef	1cd
1be8	1be8	1ccb
1be1	1be	1cc
1bda	1bda	1cbd
1bd3	1bd	1cb
1bcc	1bcc	1cae
1bc5	1bc	1ca7
1bbe	1bbe	1ca
1bb7	1bb7	1c99
1bb0	1bb	1c9
1ba9	1ba9	1c8a
1ba2	1ba	1c8
1b9b	1b9b	1c7c
1b94	1b9	1c7
1b8d	1b8d	1c6d
1b86	1b8	1c6
1b7f	1b7f	1c5f
1b78	1b78	1c57
1b71	1b7	1c5
1b6a	1b6a	1c49
1b63	1b6	1c4
1b5c	1b5c	1c3a
1b55	1b5	1c3
1b4e	1b4e	1c2c
1b47	1b47	1c2
1b40	1b4	1c1d
1b39	1b39	1c1
1b32	1b3	1c0f
1b2b	1b2b	1c08
1b24	1b2	1c
1b1d	1b1d	1bf9
1b16	1b1	1bf
1b0f	1b0f	1beb
1b08	1b0	1be
1b01	1b	1bdc
1afa	1afa	1bd
1af3	1af	1bce
1aec	1aec	1bc
1ae5	1ae	1bbf
1ade	1ade	1bb8
1ad7	1ad7	1bb
1ad0	1ad	1ba9
1ac9	1ac9	1ba
1ac2	1ac	1b9b
1abb	1abb	1b9
1ab4	1ab	1b8c
1aad	1aad	1b8
1aa6	1aa	1b7e
1a9f	1a9f	1b7
1a98	1a98	1b6f
1a91	1a9	1b68
1a8a	1a8a	1b6
1a83	1a8	1b59
1a7c	1a7c	1b5
1a75	1a7	1b4b
1a6e	1a6e	1b4
1a67	1a67	1b3c
1a60	1a6	1b3
1a59	1a59	1b2e
1a52	1a5	1b2
1a4b	1a4b	1b1f
1a44	1a4	1b18
1a3d	1a3d	1b1
1a36	1a3	1b0a
1a2f	1a2f	1b
1a28	1a28	1afb
1a21	1a2	1af
1a1a	1a1a	1aed
1a13	1a1	1ae
1a0c	1a0	1ade
1a05	1a	1ad7
19fe	19fe	1ad
19f7	19f7	1ac8
19f0	19f	1ac
19e9	19e9	1aba
19e2	19e	1ab
19db	19db	1aab
19d4	19d	1aa
19cd	19cd	1a9d
19c6	19c	1a9
19bf	19bf	1a8e
19b8	19b8	1a87
19b1	19b	1a8
19aa	19aa	1a78
19a3	19a	1a7
199c	199c	1a6a
1995	199	1a6
198e	198e	1a5b
1987	1987	1a5
1980	198	1a4d
1979	1979	1a4
1972	197	1a3e
196b	196b	1a37
1964	196	1a3
195d	195d	1a29
1956	195	1a2
194f	194f	1a1a
1948	1948	1a1
1941	194	1a0c
193a	193a	1a
1933	193	19fd
192c	192c	19f
1925	192	19ef
191e	191e	19e7
1917	1917	19e
1910	191	19d9
1909	190	19d
1902	19	19ca
18fb	18fb	19c
18f4	18f	19bc
18ed	18ed	19b
18e6	18e	19ad
18df	18df	19a
18d8	18d8	199f
18d1	18d	1997
18ca	18ca	199
18c3	18c	1989
18bc	18bc	198
18b5	18b	197a
18ae	18ae	197
18a7	18a7	196c
18a0	18a	196
1899	1899	195d
1892	189	195
188b	188b	194f
1884	188	1948
187d	187d	194
1876	187	1939
186f	186f	193
1868	1868	192b
1861	186	192
185a	185a	191c
1853	185	191
184c	184c	190e
1845	184	19
183e	183e	18ff
1837	1837	18f8
1830	183	18f
1829	1829	18e9
1822	182	18e
181b	181b	18db
1814	181	18d
180d	180	18cc
1806	18	18c
17ff	17ff	18be
17f8	17f8	18b
17f1	17f	18af
17ea	17ea	18a8
17e3	17e	18a
17dc	17dc	1899
17d5	17d	189
17ce	17ce	188b
17c7	17c7	188
17c0	17c	187c
17b9	17b9	187
17b2	17b	186e
17ab	17ab	186
17a4	17a	185f
179d	179d	1858
1796	179	185
178f	178f	184a
1788	1788	184
1781	178	183b
177a	177a	183
1773	177	182d
176c	176c	182
1765	176	181e
175e	175e	1817
1757	1757	181
1750	175	1808
1749	1749	18
1742	174	17fa
173b	173b	17f
1734	173	17eb
172d	172d	17e
1726	172	17dd
171f	171f	17d
1718	1718	17ce
1711	171	17c7
170a	170	17c
1703	17	17b9
16fc	16fc	17b
16f5	16f	17aa
16ee	16ee	17a
16e7	16e7	179c
16e0	16e	179
16d9	16d9	178d
16d2	16d	178
16cb	16cb	177e
16c4	16c	1777
16bd	16bd	177
16b6	16b	1769
16af	16af	176
16a8	16a8	175a
16a1	16a	175
169a	169a	174c
1693	169	174
168c	168c	173d
1685	168	173
167e	167e	172f
1677	1677	1727
1670	167	172
1669	1669	1719
1662	166	171
165b	165b	170a
1654	165	17
164d	164d	16fc
1646	164	16f
163f	163f	16ed
1638	1638	16e
1631	163	16df
162a	162a	16d8
1623	162	16d
161c	161c	16c9
1615	161	16c
160e	160e	16bb
1607	160	16b
1600	16	16ac
15f9	15f9	16a
15f2	15f	169e
15eb	15eb	169
15e4	15e	168f
15dd	15dd	1688
15d6	15d	168
15cf	15cf	1679
15c8	15c8	167
15c1	15c	166b
15ba	15ba	166
15b3	15b	165c
15ac	15ac	165
15a5	15a	164e
159e	159e	164
1597	1597	163f
1590	159	1638
1589	1589	163
1582	158	1629
157b	157b	162
1574	157	161b
156d	156d	161
1566	156	160c
155f	155f	16
1558	1558	15fe
1551	155	15f
154a	154a	15ef
1543	154	15e8
153c	153c	15e
1535	153	15da
152e	152e	15d
1527	1527	15cb
1520	152	15c
1519	1519	15bd
1512	151	15b
150b	150	15ae
1504	15	15a7
14fd	14fd	15a
14f6	14f	1598
14ef	14ef	159
14e8	14e8	158a
14e1	14e	158
14da	14da	157b
14d3	14d	157
14cc	14cc	156d
14c5	14c	156
14be	14be	155e
14b7	14b7	1557
14b0	14b	155
14a9	14a9	1548
14a2	14a	154
149b	149b	153a
1494	149	153
148d	148d	152b
1486	148	152
147f	147f	151d
1478	1478	151
1471	147	150e
146a	146a	1507
1463	146	15
145c	145c	14f9
1455	145	14f
144e	144e	14ea
1447	1447	14e
1440	144	14dc
1439	1439	14d
1432	143	14cd
142b	142b	14c
1424	142	14bf
141d	141d	14b7
1416	141	14b
140f	140f	14a9
1408	140	14a
1401	14	149a
13fa	13fa	149
13f3	13f	148c
13ec	13ec	148
13e5	13e	147d
13de	13de	147
13d7	13d7	146f
13d0	13d	1467
13c9	13c9	146
13c2	13c	1459
13bb	13bb	145
13b4	13b	144a
13ad	13ad	144
13a6	13a	143c
139f	139f	143
1398	1398	142d
1391	139	142
138a	138a	141f
1383	138	1418
137c	137c	141
1375	137	1409
136e	136e	14
1367	1367	13fb
1360	136	13f
1359	1359	13ec
1352	135	13e
134b	134b	13de
1344	134	13d
133d	133d	13cf
1336	133	13c8
132f	132f	13c
1328	1328	13b9
1321	132	13b
131a	131a	13ab
1313	131	13a
130c	130	139c
1305	13	139
12fe	12fe	138e
12f7	12f7	138
12f0	12f	137f
12e9	12e9	1378
12e2	12e	137
12db	12db	136a
12d4	12d	136
12cd	12cd	135b
12c6	12c	135
12bf	12bf	134c
12b8	12b8	134
12b1	12b	133e
12aa	12aa	133
12a3	12a	132f
129c	129c	1328
1295	129	132
128e	128e	131a
1287	1287	131
1280	128	130b
1279	1279	13
1272	127	12fd
126b	126b	12f
1264	126	12ee
125d	125d	12e7
1256	125	12e
124f	124f	12d8
1248	1248	12d
1241	124	12ca
123a	123a	12c
1233	123	12bb
122c	122c	12b
1225	122	12ad
121e	121e	12a
1217	1217	129e
1210	121	1297
1209	120	129
1202	12	1289
11fb	11fb	128
11f4	11f	127a
11ed	11ed	127
11e6	11e	126c
11df	11df	126
11d8	11d8	125d
11d1	11d	125
11ca	11ca	124e
11c3	11c	1247
11bc	11bc	124
11b5	11b	1239
11ae	11ae	123
11a7	11a7	122a
11a0	11a	122
1199	1199	121c
1192	119	121
118b	118b	120d
1184	118	12
117d	117d	11ff
1176	117	11f7
116f	116f	11f
1168	1168	11e9
1161	116	11e
115a	115a	11da
1153	115	11d
114c	114c	11cc
1145	114	11c
113e	113e	11bd
1137	1137	11b
1130	113	11af
1129	1129	11a8
1122	112	11a
111b	111b	1199
1114	111	119
110d	110	118b
1106	11	118
10ff	10ff	117c
10f8	10f8	117
10f1	10f	116e
10ea	10ea	116
10e3	10e	115f
10dc	10dc	1158
10d5	10d	115
10ce	10ce	1149
10c7	10c7	114
10c0	10c	113b
10b9	10b9	113
10b2	10b	112c
10ab	10ab	112
10a4	10a	111e
109d	109d	111
1096	109	110f
108f	108f	1108
1088	1088	11
1081	108	10f9
107a	107a	10f
1073	107	10eb
106c	106c	10e
1065	106	10dc
105e	105e	10d
1057	1057	10ce
1050	105	10c
1049	1049	10bf
1042	104	10b8
103b	103b	10b
1034	103	10aa
102d	102d	10a
1026	102	109b
101f	101f	109
1018	1018	108d
1011	101	108
100a	10	107e
1003	1	1077
0ffc	0ffc	107
0ff5	0ff	1068
0fee	0fee	106
0fe7	0fe7	105a
0fe0	0fe	105
0fd9	0fd9	104b
0fd2	0fd	104
0fcb	0fcb	103d
0fc4	0fc	103
0fbd	0fbd	102e
0fb6	0fb	1027
0faf	0faf	102
0fa8	0fa8	1018
0fa1	0fa	101
0f9a	0f9a	100a
0f93	0f9	1
0f8c	0f8c	0ffb
0f85	0f8	0ff
0f7e	0f7e	0fed
0f77	0f77	0fe
0f70	0f7	0fde
0f69	0f69	0fd7
0f62	0f6	0fd
0f5b	0f5b	0fc9
0f54	0f5	0fc
0f4d	0f4d	0fba
0f46	0f4	0fb
0f3f	0f3f	0fac
0f38	0f38	0fa
0f31	0f3	0f9d
0f2a	0f2a	0f9
0f23	0f2	0f8f
0f1c	0f1c	0f87
0f15	0f1	0f8
0f0e	0f0e	0f79
0f07	0f0	0f7
0f00	0f	0f6a
0ef9	0ef9	0f6
0ef2	0ef	0f5c
0eeb	0eeb	0f5
0ee4	0ee	0f4d
0edd	0edd	0f4
0ed6	0ed	0f3f
0ecf	0ecf	0f38
0ec8	0ec8	0f3
0ec1	0ec	0f29
0eba	0eba	0f2
0eb3	0eb	0f1a
0eac	0eac	0f1
0ea5	0ea	0f0c
0e9e	0e9e	0f
0e97	0e97	0efd
0e90	0e9	0ef
0e89	0e89	0eef
0e82	0e8	0ee8
0e7b	0e7b	0ee
0e74	0e7	0ed9
0e6d	0e6d	0ed
0e66	0e6	0ecb
0e5f	0e5f	0ec
0e58	0e58	0ebc
0e51	0e5	0eb
0e4a	0e4a	0eae
0e43	0e4	0ea
0e3c	0e3c	0e9f
0e35	0e3	0e98
0e2e	0e2e	0e9
0e27	0e27	0e89
0e20	0e2	0e8
0e19	0e19	0e7b
0e12	0e1	0e7
0e0b	0e0	0e6c
0e04	0e	0e6
0dfd	0dfd	0e5e
0df6	0df	0e5
0def	0def	0e4f
0de8	0de8	0e48
0de1	0de	0e4
0dda	0dda	0e3a
0dd3	0dd	0e3
0dcc	0dcc	0e2b
0dc5	0dc	0e2
0dbe	0dbe	0e1c
0db7	0db7	0e1
0db0	0db	0e0e
0da9	0da9	0e
0da2	0da	0dff
0d9b	0d9b	0df8
0d94	0d9	0df
0d8d	0d8d	0dea
0d86	0d8	0de
0d7f	0d7f	0ddb
0d78	0d78	0dd
0d71	0d7	0dcd
0d6a	0d6a	0dc
0d63	0d6	0dbe
0d5c	0d5c	0db7
0d55	0d5	0db
0d4e	0d4e	0da8
0d47	0d47	0da
0d40	0d4	0d9a
0d39	0d39	0d9
0d32	0d3	0d8b
0d2b	0d2b	0d8
0d24	0d2	0d7d
0d1d	0d1d	0d7
0d16	0d1	0d6e
0d0f	0d0f	0d67
0d08	0d0	0d6
0d01	0d	0d59
0cfa	0cfa	0d5
0cf3	0cf	0d4a
0cec	0cec	0d4
0ce5	0ce	0d3c
0cde	0cde	0d3
0cd7	0cd7	0d2d
0cd0	0cd	0d2
0cc9	0cc9	0d1f
0cc2	0cc	0d17
0cbb	0cbb	0d1
0cb4	0cb	0d09
0cad	0cad	0d
0ca6	0ca	0cfa
0c9f	0c9f	0cf
0c98	0c98	0cec
0c91	0c9	0ce
0c8a	0c8a	0cdd
0c83	0c8	0cd
0c7c	0c7c	0ccf
0c75	0c7	0cc7
0c6e	0c6e	0cc
0c67	0c67	0cb9
0c60	0c6	0cb
0c59	0c59	0caa
0c52	0c5	0ca
0c4b	0c4b	0c9c
0c44	0c4	0c9
0c3d	0c3d	0c8d
0c36	0c3	0c8
0c2f	0c2f	0c7f
0c28	0c28	0c78
0c21	0c2	0c7
0c1a	0c1a	0c69
0c13	0c1	0c6
0c0c	0c0	0c5b
0c05	0c	0c5
0bfe	0bfe	0c4c
0bf7	0bf7	0c4
0bf0	0bf	0c3e
0be9	0be9	0c3
0be2	0be	0c2f
0bdb	0bdb	0c28
0bd4	0bd	0c2
0bcd	0bcd	0c19
0bc6	0bc	0c1
0bbf	0bbf	0c0b
0bb8	0bb8	0c
0bb1	0bb	0bfc
0baa	0baa	0bf
0ba3	0ba	0bee
0b9c	0b9c	0be
0b95	0b9	0bdf
0b8e	0b8e	0bd8
0b87	0b87	0bd
0b80	0b8	0bc9
0b79	0b79	0bc
0b72	0b7	0bbb
0b6b	0b6b	0bb
0b64	0b6	0bac
0b5d	0b5d	0ba
0b56	0b5	0b9e
0b4f	0b4f	0b9
0b48	0b48	0b8f
0b41	0b4	0b88
0b3a	0b3a	0b8
0b33	0b3	0b7a
0b2c	0b2c	0b7
0b25	0b2	0b6b
0b1e	0b1e	0b6
0b17	0b17	0b5d
0b10	0b1	0b5
0b09	0b0	0b4e
0b02	0b	0b47
0afb	0afb	0b4
0af4	0af	0b38
0aed	0aed	0b3
0ae6	0ae	0b2a
0adf	0adf	0b2
0ad8	0ad8	0b1b
0ad1	0ad	0b1
0aca	0aca	0b0d
0ac3	0ac	0b
0abc	0abc	0afe
0ab5	0ab	0af7
0aae	0aae	0af
0aa7	0aa7	0ae8
0aa0	0aa	0ae
0a99	0a99	0ada
0a92	0a9	0ad
0a8b	0a8b	0acb
0a84	0a8	0ac
0a7d	0a7d	0abd
0a76	0a7	0ab
0a6f	0a6f	0aae
0a68	0a68	0aa7
0a61	0a6	0aa
0a5a	0a5a	0a99
0a53	0a5	0a9
0a4c	0a4c	0a8a
0a45	0a4	0a8
0a3e	0a3e	0a7c
0a37	0a37	0a7
0a30	0a3	0a6d
0a29	0a29	0a6
0a22	0a2	0a5f
0a1b	0a1b	0a57
0a14	0a1	0a5
0a0d	0a0	0a49
0a06	0a	0a4
09ff	09ff	0a3a
09f8	09f8	0a3
09f1	09f	0a2c
09ea	09ea	0a2
09e3	09e	0a1d
09dc	09dc	0a1
09d5	09d	0a0f
09ce	09ce	0a08
09c7	09c7	0a
09c0	09c	09f9
09b9	09b9	09f
09b2	09b	09ea
09ab	09ab	09e
09a4	09a	09dc
099d	099d	09d
0996	099	09cd
098f	098f	09c
0988	0988	09bf
0981	098	09b8
097a	097a	09b
0973	097	09a9
096c	096c	09a
0965	096	099b
095e	095e	099
0957	0957	098c
0950	095	098
0949	0949	097e
0942	094	097
093b	093b	096f
0934	093	0968
092d	092d	096
0926	092	0959
091f	091f	095
0918	0918	094b
0911	091	094
090a	090	093c
0903	09	093
08fc	08fc	092e
08f5	08f	092
08ee	08ee	091f
08e7	08e7	0918
08e0	08e	091
08d9	08d9	090a
08d2	08d	09
08cb	08cb	08fb
08c4	08c	08f
08bd	08bd	08ed
08b6	08b	08e
08af	08af	08de
08a8	08a8	08d
08a1	08a	08cf
089a	089a	08c8
0893	089	08c
088c	088c	08ba
0885	088	08b
087e	087e	08ab
0877	0877	08a
0870	087	089d
0869	0869	089
0862	086	088e
085b	085b	0887
0854	085	088
084d	084d	0878
0846	084	087
083f	083f	086a
0838	0838	086
0831	083	085b
082a	082a	085
0823	082	084d
081c	081c	084
0815	081	083e
080e	080e	0837
0807	080	083
0800	08	0829
07f9	07f9	082
07f2	07f	081a
07eb	07eb	081
07e4	07e	080c
07dd	07dd	08
07d6	07d	07fd
07cf	07cf	07f
07c8	07c8	07ef
07c1	07c	07e7
07ba	07ba	07e
07b3	07b	07d9
07ac	07ac	07d
07a5	07a	07ca
079e	079e	07c
0797	0797	07bc
0790	079	07b
0789	0789	07ad
0782	078	07a
077b	077b	079f
0774	077	0797
076d	076d	079
0766	076	0789
075f	075f	078
0758	0758	077a
0751	075	077
074a	074a	076c
0743	074	076
073c	073c	075d
0735	073	075
072e	072e	074f
0727	0727	0748
0720	072	074
0719	0719	0739
0712	071	073
070b	070	072b
0704	07	072
06fd	06fd	071c
06f6	06f	071
06ef	06ef	070e
06e8	06e8	07
06e1	06e	06ff
06da	06da	06f8
06d3	06d	06f
06cc	06cc	06e9
06c5	06c	06e
06be	06be	06db
06b7	06b7	06d
06b0	06b	06cc
06a9	06a9	06c
06a2	06a	06be
069b	069b	06b
0694	069	06af
068d	068d	06a8
0686	068	06a
067f	067f	0699
0678	0678	069
0671	067	068b
066a	066a	068
0663	066	067c
065c	065c	067
0655	065	066e
064e	064e	066
0647	0647	065f
0640	064	0658
0639	0639	065
0632	063	064a
062b	062b	064
0624	062	063b
061d	061d	063
0616	061	062d
060f	060f	062
0608	060	061e
0601	06	0617
05fa	05fa	061
05f3	05f	0608
05ec	05ec	06
05e5	05e	05fa
05de	05de	05f
05d7	05d7	05eb
05d0	05d	05e
05c9	05c9	05dd
05c2	05c	05d
05bb	05bb	05ce
05b4	05b	05c7
05ad	05ad	05c
05a6	05a	05b9
059f	059f	05b
0598	0598	05aa
0591	059	05a
058a	058a	059b
0583	058	059
057c	057c	058d
0575	057	058
056e	056e	057e
0567	0567	0577
0560	056	057
0559	0559	0569
0552	055	056
054b	054b	055a
0544	054	055
053d	053d	054c
0536	053	054
052f	052f	053d
0528	0528	053
0521	052	052f
051a	051a	0527
0513	051	052
050c	050	0519
0505	05	051
04fe	04fe	050a
04f7	04f7	05
04f0	04f	04fc
04e9	04e9	04f
04e2	04e	04ed
04db	04db	04e
04d4	04d	04df
04cd	04cd	04d8
04c6	04c	04d
04bf	04bf	04c9
04b8	04b8	04c
04b1	04b	04bb
04aa	04aa	04b
04a3	04a	04ac
049c	049c	04a
0495	049	049d
048e	048e	049
0487	0487	048f
0480	048	0488
0479	0479	048
0472	047	0479
046b	046b	047
0464	046	046b
045d	045d	046
0456	045	045c
044f	044f	045
0448	0448	044e
0441	044	044
043a	043a	043f
0433	043	0438
042c	042c	043
0425	042	0429
041e	041e	042
0417	0417	041b
0410	041	041
0409	040	040c
0402	04	04
03fb	03fb	03fe
03f4	03f	03f
03ed	03ed	03ef
03e6	03e	03e8
03df	03df	03e
03d8	03d8	03da
03d1	03d	03d
03ca	03ca	03cb
03c3	03c	03c
03bc	03bc	03bd
03b5	03b	03b
03ae	03ae	03ae
03a7	03a7	03a7

@fasiha
Copy link
Owner Author

fasiha commented May 25, 2019

Using the above proof-of-concept code, generating 20'000 strings between '03a' and '2' in hexadecimal symbol table:

  • ascending
    • BigInt same length keys: 68.451ms
    • BigInt shortest keys: 64.784ms
    • Mudder: 576.284ms
  • descending
    • BigInt same length keys: 49.125ms
    • BigInt shortest keys: 62.092ms
    • Mudder: 654.699ms

Certainly we should offer this for BigInt-enabled runtimes, with the fallback to the existing manual big-int-like implementation available.

@dekelpilli
Copy link

I know this is an old issue, but just a heads up - the above implementation can be buggy, especially around lower values of n:

>  main("03a", "2", 1, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '2' ] // bug - array contains value of right

>  main("03a", "2", 2, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '1', '2' ] // bug - array contains value of right

>  main("03a", "2", 3, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '0h', '1', '1z' ] //fine

This can be fixed by updating bigintSubdivide:

function bigIntSubdivide(l, r, n, base) {
  let divisor = n + 1n; //avoids situation where (delta * n) + l == r
  while ((r - l) / divisor === 0n) {
    r *= base;
    l *= base;
  }
  let delta = (r - l) / divisor;
  let ret = [];
  let nNumber = Number(n);
  {
    let prev = l;
    for (let i = 0; i < nNumber; i++) {
      let next = prev + delta;
      ret.push(next);
      prev = next;
    }
  }
  return ret;
}

New outputs:

> main("03a", "2", 1, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '1' ]
> main("03a", "2", 2, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '0h', '1' ]
> main("03a", "2", 3, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(''))
[ '0X', '1', '1V' ]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants