1/* Copyright (C) 2007, 2009  Free Software Foundation, Inc.
2
3This file is part of GCC.
4
5GCC is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free
7Software Foundation; either version 3, or (at your option) any later
8version.
9
10GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or
12FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13for more details.
14
15Under Section 7 of GPL version 3, you are granted additional
16permissions described in the GCC Runtime Library Exception, version
173.1, as published by the Free Software Foundation.
18
19You should have received a copy of the GNU General Public License and
20a copy of the GCC Runtime Library Exception along with this program;
21see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22<http://www.gnu.org/licenses/>.  */
23
24#include "bid_internal.h"
25
26// the first entry of nr_digits[i - 1] (where 1 <= i <= 113), indicates
27// the number of decimal digits needed to represent a binary number with i bits;
28// however, if a binary number of i bits may require either k or k + 1 decimal
29// digits, then the first entry of nr_digits[i - 1] is 0; in this case if the
30// number is less than the value represented by the second and third entries
31// concatenated, then the number of decimal digits k is the fourth entry, else
32// the number of decimal digits is the fourth entry plus 1
33DEC_DIGITS nr_digits[] = {	// only the first entry is used if it is not 0
34  {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
35  ,	//   1-bit n < 10^1
36  {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
37  ,	//   2-bit n < 10^1
38  {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
39  ,	//   3-bit n < 10^1
40  {0, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
41  ,	//   4-bit n ? 10^1
42  {2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
43  ,	//   5-bit n < 10^2
44  {2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
45  ,	//   6-bit n < 10^2
46  {0, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
47  ,	//   7-bit n ? 10^2
48  {3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
49  ,	//   8-bit n < 10^3
50  {3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
51  ,	//   9-bit n < 10^3
52  {0, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
53  ,	//  10-bit n ? 10^3
54  {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
55  ,	//  11-bit n < 10^4
56  {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
57  ,	//  12-bit n < 10^4
58  {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
59  ,	//  13-bit n < 10^4
60  {0, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
61  ,	//  14-bit n ? 10^4
62  {5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
63  ,	//  15-bit n < 10^5
64  {5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
65  ,	//  16-bit n < 10^5
66  {0, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
67  ,	//  17-bit n ? 10^5
68  {6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
69  ,	//  18-bit n < 10^6
70  {6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
71  ,	//  19-bit n < 10^6
72  {0, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
73  ,	//  20-bit n ? 10^6
74  {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
75  ,	//  21-bit n < 10^7
76  {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
77  ,	//  22-bit n < 10^7
78  {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
79  ,	//  23-bit n < 10^7
80  {0, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
81  ,	//  24-bit n ? 10^7
82  {8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
83  ,	//  25-bit n < 10^8
84  {8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
85  ,	//  26-bit n < 10^8
86  {0, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
87  ,	//  27-bit n ? 10^8
88  {9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
89  ,	//  28-bit n < 10^9
90  {9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
91  ,	//  29-bit n < 10^9
92  {0, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
93  ,	//  30-bit n ? 10^9
94  {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
95  ,	//  31-bit n < 10^10
96  {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
97  ,	//  32-bit n < 10^10
98  {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
99  ,	//  33-bit n < 10^10
100  {0, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
101  ,	//  34-bit n ? 10^10
102  {11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
103  ,	//  35-bit n < 10^11
104  {11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
105  ,	//  36-bit n < 10^11
106  {0, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
107  ,	//  37-bit n ? 10^11
108  {12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
109  ,	//  38-bit n < 10^12
110  {12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
111  ,	//  39-bit n < 10^12
112  {0, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
113  ,	//  40-bit n ? 10^12
114  {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
115  ,	//  41-bit n < 10^13
116  {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
117  ,	//  42-bit n < 10^13
118  {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
119  ,	//  43-bit n < 10^13
120  {0, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
121  ,	//  44-bit n ? 10^13
122  {14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
123  ,	//  45-bit n < 10^14
124  {14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
125  ,	//  46-bit n < 10^14
126  {0, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
127  ,	//  47-bit n ? 10^14
128  {15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
129  ,	//  48-bit n < 10^15
130  {15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
131  ,	//  49-bit n < 10^15
132  {0, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
133  ,	//  50-bit n ? 10^15
134  {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
135  ,	//  51-bit n < 10^16
136  {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
137  ,	//  52-bit n < 10^16
138  {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
139  ,	//  53-bit n < 10^16
140  {0, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
141  ,	//  54-bit n ? 10^16
142  {17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
143  ,	//  55-bit n < 10^17
144  {17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
145  ,	//  56-bit n < 10^17
146  {0, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
147  ,	//  57-bit n ? 10^17
148  {18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
149  ,	//  58-bit n < 10^18
150  {18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
151  ,	//  59-bit n < 10^18
152  {0, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
153  ,	//  60-bit n ? 10^18
154  {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
155  ,	//  61-bit n < 10^19
156  {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
157  ,	//  62-bit n < 10^19
158  {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
159  ,	//  63-bit n < 10^19
160  {0, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
161  ,	//  64-bit n ? 10^19
162  {20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
163  ,	//  65-bit n < 10^20
164  {20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
165  ,	//  66-bit n < 10^20
166  {0, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
167  ,	//  67-bit n ? 10^20
168  {21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
169  ,	//  68-bit n < 10^21
170  {21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
171  ,	//  69-bit n < 10^21
172  {0, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
173  ,	//  70-bit n ? 10^21
174  {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
175  ,	//  71-bit n < 10^22
176  {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
177  ,	//  72-bit n < 10^22
178  {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
179  ,	//  73-bit n < 10^22
180  {0, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
181  ,	//  74-bit n ? 10^22
182  {23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
183  ,	//  75-bit n < 10^23
184  {23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
185  ,	//  76-bit n < 10^23
186  {0, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
187  ,	//  77-bit n ? 10^23
188  {24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
189  ,	//  78-bit n < 10^24
190  {24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
191  ,	//  79-bit n < 10^24
192  {0, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
193  ,	//  80-bit n ? 10^24
194  {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
195  ,	//  81-bit n < 10^25
196  {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
197  ,	//  82-bit n < 10^25
198  {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
199  ,	//  83-bit n < 10^25
200  {0, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
201  ,	//  84-bit n ? 10^25
202  {26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
203  ,	//  85-bit n < 10^26
204  {26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
205  ,	//  86-bit n < 10^26
206  {0, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
207  ,	//  87-bit n ? 10^26
208  {27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
209  ,	//  88-bit n < 10^27
210  {27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
211  ,	//  89-bit n < 10^27
212  {0, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
213  ,	//  90-bit n ? 10^27
214  {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
215  ,	//  91-bit n < 10^28
216  {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
217  ,	//  92-bit n < 10^28
218  {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
219  ,	//  93-bit n < 10^28
220  {0, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
221  ,	//  94-bit n ? 10^28
222  {29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
223  ,	//  95-bit n < 10^29
224  {29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
225  ,	//  96-bit n < 10^29
226  {0, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
227  ,	//  97-bit n ? 10^29
228  {30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
229  ,	//  98-bit n < 10^30
230  {30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
231  ,	//  99-bit n < 10^30
232  {0, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
233  ,	// 100-bit n ? 10^30
234  {31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
235  ,	// 101-bit n < 10^31
236  {31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
237  ,	// 102-bit n < 10^31
238  {0, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
239  ,	// 103-bit n ? 10^31
240  {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
241  ,	// 104-bit n < 10^32
242  {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
243  ,	// 105-bit n < 10^32
244  {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
245  ,	// 106-bit n < 10^32
246  {0, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
247  ,	// 107-bit n ? 10^32
248  {33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
249  ,	// 108-bit n < 10^33
250  {33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
251  ,	// 109-bit n < 10^33
252  {0, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
253  ,	// 100-bit n ? 10^33
254  {34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
255  ,	// 111-bit n < 10^34
256  {34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
257  ,	// 112-bit n < 10^34
258  {0, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}	// 113-bit n ? 10^34
259//{ 35, 0x0013426172c74d82ULL, 0x2b878fe800000000ULL, 35 }  // 114-bit n < 10^35
260};
261
262// midpoint64[i - 1] = 1/2 * 10^i = 5 * 10^(i-1), 1 <= i <= 19
263UINT64 midpoint64[] = {
264  0x0000000000000005ULL,	// 1/2 * 10^1 = 5 * 10^0
265  0x0000000000000032ULL,	// 1/2 * 10^2 = 5 * 10^1
266  0x00000000000001f4ULL,	// 1/2 * 10^3 = 5 * 10^2
267  0x0000000000001388ULL,	// 1/2 * 10^4 = 5 * 10^3
268  0x000000000000c350ULL,	// 1/2 * 10^5 = 5 * 10^4
269  0x000000000007a120ULL,	// 1/2 * 10^6 = 5 * 10^5
270  0x00000000004c4b40ULL,	// 1/2 * 10^7 = 5 * 10^6
271  0x0000000002faf080ULL,	// 1/2 * 10^8 = 5 * 10^7
272  0x000000001dcd6500ULL,	// 1/2 * 10^9 = 5 * 10^8
273  0x000000012a05f200ULL,	// 1/2 * 10^10 = 5 * 10^9
274  0x0000000ba43b7400ULL,	// 1/2 * 10^11 = 5 * 10^10
275  0x000000746a528800ULL,	// 1/2 * 10^12 = 5 * 10^11
276  0x0000048c27395000ULL,	// 1/2 * 10^13 = 5 * 10^12
277  0x00002d79883d2000ULL,	// 1/2 * 10^14 = 5 * 10^13
278  0x0001c6bf52634000ULL,	// 1/2 * 10^15 = 5 * 10^14
279  0x0011c37937e08000ULL,	// 1/2 * 10^16 = 5 * 10^15
280  0x00b1a2bc2ec50000ULL,	// 1/2 * 10^17 = 5 * 10^16
281  0x06f05b59d3b20000ULL,	// 1/2 * 10^18 = 5 * 10^17
282  0x4563918244f40000ULL	// 1/2 * 10^19 = 5 * 10^18
283};
284
285// midpoint128[i - 20] = 1/2 * 10^i = 5 * 10^(i-1), 20 <= i <= 38
286UINT128 midpoint128[] = {	// the 64-bit word order is L, H
287  {{0xb5e3af16b1880000ULL, 0x0000000000000002ULL}
288   }
289  ,	// 1/2 * 10^20 = 5 * 10^19
290  {{0x1ae4d6e2ef500000ULL, 0x000000000000001bULL}
291   }
292  ,	// 1/2 * 10^21 = 5 * 10^20
293  {{0x0cf064dd59200000ULL, 0x000000000000010fULL}
294   }
295  ,	// 1/2 * 10^22 = 5 * 10^21
296  {{0x8163f0a57b400000ULL, 0x0000000000000a96ULL}
297   }
298  ,	// 1/2 * 10^23 = 5 * 10^22
299  {{0x0de76676d0800000ULL, 0x00000000000069e1ULL}
300   }
301  ,	// 1/2 * 10^24 = 5 * 10^23
302  {{0x8b0a00a425000000ULL, 0x00000000000422caULL}
303   }
304  ,	// 1/2 * 10^25 = 5 * 10^24
305  {{0x6e64066972000000ULL, 0x0000000000295be9ULL}
306   }
307  ,	// 1/2 * 10^26 = 5 * 10^25
308  {{0x4fe8401e74000000ULL, 0x00000000019d971eULL}
309   }
310  ,	// 1/2 * 10^27 = 5 * 10^26
311  {{0x1f12813088000000ULL, 0x000000001027e72fULL}
312   }
313  ,	// 1/2 * 10^28 = 5 * 10^27
314  {{0x36b90be550000000ULL, 0x00000000a18f07d7ULL}
315   }
316  ,	// 1/2 * 10^29 = 5 * 10^28
317  {{0x233a76f520000000ULL, 0x000000064f964e68ULL}
318   }
319  ,	// 1/2 * 10^30 = 5 * 10^29
320  {{0x6048a59340000000ULL, 0x0000003f1bdf1011ULL}
321   }
322  ,	// 1/2 * 10^31 = 5 * 10^30
323  {{0xc2d677c080000000ULL, 0x0000027716b6a0adULL}
324   }
325  ,	// 1/2 * 10^32 = 5 * 10^31
326  {{0x9c60ad8500000000ULL, 0x000018a6e32246c9ULL}
327   }
328  ,	// 1/2 * 10^33 = 5 * 10^32
329  {{0x1bc6c73200000000ULL, 0x0000f684df56c3e0ULL}
330   }
331  ,	// 1/2 * 10^34 = 5 * 10^33
332  {{0x15c3c7f400000000ULL, 0x0009a130b963a6c1ULL}
333   }
334  ,	// 1/2 * 10^35 = 5 * 10^34
335  {{0xd9a5cf8800000000ULL, 0x00604be73de4838aULL}
336   }
337  ,	// 1/2 * 10^36 = 5 * 10^35
338  {{0x807a1b5000000000ULL, 0x03c2f7086aed236cULL}
339   }
340  ,	// 1/2 * 10^37 = 5 * 10^36
341  {{0x04c5112000000000ULL, 0x259da6542d43623dULL}
342   }	// 1/2 * 10^38 = 5 * 10^37
343};
344
345// midpoint192[i - 39] = 1/2 * 10^i = 5 * 10^(i-1), 39 <= i <= 58
346UINT192 midpoint192[] = {	// the 64-bit word order is L, M, H
347  {{0x2fb2ab4000000000ULL, 0x78287f49c4a1d662ULL, 0x0000000000000001ULL}
348   }
349  ,
350  // 1/2 * 10^39 = 5 * 10^38
351  {{0xdcfab08000000000ULL, 0xb194f8e1ae525fd5ULL, 0x000000000000000eULL}
352   }
353  ,
354  // 1/2 * 10^40 = 5 * 10^39
355  {{0xa1cae50000000000ULL, 0xefd1b8d0cf37be5aULL, 0x0000000000000092ULL}
356   }
357  ,
358  // 1/2 * 10^41 = 5 * 10^40
359  {{0x51ecf20000000000ULL, 0x5e313828182d6f8aULL, 0x00000000000005bdULL}
360   }
361  ,
362  // 1/2 * 10^42 = 5 * 10^41
363  {{0x3341740000000000ULL, 0xadec3190f1c65b67ULL, 0x0000000000003965ULL}
364   }
365  ,
366  // 1/2 * 10^43 = 5 * 10^42
367  {{0x008e880000000000ULL, 0xcb39efa971bf9208ULL, 0x0000000000023df8ULL}
368   }
369  ,
370  // 1/2 * 10^44 = 5 * 10^43
371  {{0x0591500000000000ULL, 0xf0435c9e717bb450ULL, 0x0000000000166bb7ULL}
372   }
373  ,
374  // 1/2 * 10^45 = 5 * 10^44
375  {{0x37ad200000000000ULL, 0x62a19e306ed50b20ULL, 0x0000000000e0352fULL}
376   }
377  ,
378  // 1/2 * 10^46 = 5 * 10^45
379  {{0x2cc3400000000000ULL, 0xda502de454526f42ULL, 0x0000000008c213d9ULL}
380   }
381  ,
382  // 1/2 * 10^47 = 5 * 10^46
383  {{0xbfa0800000000000ULL, 0x8721caeb4b385895ULL, 0x000000005794c682ULL}
384   }
385  ,
386  // 1/2 * 10^48 = 5 * 10^47
387  {{0x7c45000000000000ULL, 0x4751ed30f03375d9ULL, 0x000000036bcfc119ULL}
388   }
389  ,
390  // 1/2 * 10^49 = 5 * 10^48
391  {{0xdab2000000000000ULL, 0xc93343e962029a7eULL, 0x00000022361d8afcULL}
392   }
393  ,
394  // 1/2 * 10^50 = 5 * 10^49
395  {{0x8af4000000000000ULL, 0xdc00a71dd41a08f4ULL, 0x000001561d276ddfULL}
396   }
397  ,
398  // 1/2 * 10^51 = 5 * 10^50
399  {{0x6d88000000000000ULL, 0x9806872a4904598dULL, 0x00000d5d238a4abeULL}
400   }
401  ,
402  // 1/2 * 10^52 = 5 * 10^51
403  {{0x4750000000000000ULL, 0xf04147a6da2b7f86ULL, 0x000085a36366eb71ULL}
404   }
405  ,
406  // 1/2 * 10^53 = 5 * 10^52
407  {{0xc920000000000000ULL, 0x628ccc8485b2fb3eULL, 0x00053861e2053273ULL}
408   }
409  ,
410  // 1/2 * 10^54 = 5 * 10^53
411  {{0xdb40000000000000ULL, 0xd97ffd2d38fdd073ULL, 0x003433d2d433f881ULL}
412   }
413  ,
414  // 1/2 * 10^55 = 5 * 10^54
415  {{0x9080000000000000ULL, 0x7effe3c439ea2486ULL, 0x020a063c4a07b512ULL}
416   }
417  ,
418  // 1/2 * 10^56 = 5 * 10^55
419  {{0xa500000000000000ULL, 0xf5fee5aa43256d41ULL, 0x14643e5ae44d12b8ULL}
420   }
421  ,
422  // 1/2 * 10^57 = 5 * 10^56
423  {{0x7200000000000000ULL, 0x9bf4f8a69f764490ULL, 0xcbea6f8ceb02bb39ULL}
424   }
425  // 1/2 * 10^58 = 5 * 10^57
426};
427
428// midpoint256[i - 59] = 1/2 * 10^i = 5 * 10^(i-1), 59 <= i <= 68
429UINT256 midpoint256[] = {	// the 64-bit word order is LL, LH, HL, HH
430  {{0x7400000000000000ULL, 0x1791b6823a9eada4ULL,
431    0xf7285b812e1b5040ULL, 0x0000000000000007ULL}
432   }
433  ,	// 1/2 * 10^59 = 5 * 10^58
434  {{0x8800000000000000ULL, 0xebb121164a32c86cULL,
435    0xa793930bcd112280ULL, 0x000000000000004fULL}
436   }
437  ,	// 1/2 * 10^60 = 5 * 10^59
438  {{0x5000000000000000ULL, 0x34eb4adee5fbd43dULL,
439    0x8bc3be7602ab5909ULL, 0x000000000000031cULL}
440   }
441  ,	// 1/2 * 10^61 = 5 * 10^60
442  {{0x2000000000000000ULL, 0x1130ecb4fbd64a65ULL,
443    0x75a5709c1ab17a5cULL, 0x0000000000001f1dULL}
444   }
445  ,	// 1/2 * 10^62 = 5 * 10^61
446  {{0x4000000000000000ULL, 0xabe93f11d65ee7f3ULL,
447    0x987666190aeec798ULL, 0x0000000000013726ULL}
448   }
449  ,	// 1/2 * 10^63 = 5 * 10^62
450  {{0x8000000000000000ULL, 0xb71c76b25fb50f80ULL,
451    0xf49ffcfa6d53cbf6ULL, 0x00000000000c2781ULL}
452   }
453  ,	// 1/2 * 10^64 = 5 * 10^63
454  {{0x0000000000000000ULL, 0x271ca2f7bd129b05ULL,
455    0x8e3fe1c84545f7a3ULL, 0x0000000000798b13ULL}
456   }
457  ,	// 1/2 * 10^65 = 5 * 10^64
458  {{0x0000000000000000ULL, 0x871e5dad62ba0e32ULL,
459    0x8e7ed1d2b4bbac5fULL, 0x0000000004bf6ec3ULL}
460   }
461  ,	// 1/2 * 10^66 = 5 * 10^65
462  {{0x0000000000000000ULL, 0x472fa8c5db448df4ULL,
463    0x90f4323b0f54bbbbULL, 0x000000002f7a53a3ULL}
464   }
465  ,	// 1/2 * 10^67 = 5 * 10^66
466  {{0x0000000000000000ULL, 0xc7dc97ba90ad8b88ULL,
467    0xa989f64e994f5550ULL, 0x00000001dac74463ULL}
468   }
469  ,	// 1/2 * 10^68 = 5 * 10^67
470  {{0x0000000000000000ULL, 0xce9ded49a6c77350ULL,
471    0x9f639f11fd195527ULL, 0x000000128bc8abe4ULL}
472   }
473  ,	// 1/2 * 10^69 = 5 * 10^68
474  {{0x0000000000000000ULL, 0x122b44e083ca8120ULL,
475    0x39e436b3e2fd538eULL, 0x000000b975d6b6eeULL}
476   }
477  ,	// 1/2 * 10^70 = 5 * 10^69
478  {{0x0000000000000000ULL, 0xb5b0b0c525e90b40ULL,
479    0x42ea2306dde5438cULL, 0x0000073e9a63254eULL}
480   }
481  ,	// 1/2 * 10^71 = 5 * 10^70
482  {{0x0000000000000000ULL, 0x18e6e7b37b1a7080ULL,
483    0x9d255e44aaf4a37fULL, 0x0000487207df750eULL}
484   }
485  ,	// 1/2 * 10^72 = 5 * 10^71
486  {{0x0000000000000000ULL, 0xf9050d02cf086500ULL,
487    0x2375aeaead8e62f6ULL, 0x0002d4744eba9292ULL}
488   }
489  ,	// 1/2 * 10^73 = 5 * 10^72
490  {{0x0000000000000000ULL, 0xba32821c1653f200ULL,
491    0x6298d2d2c78fdda5ULL, 0x001c4c8b1349b9b5ULL}
492   }
493  ,	// 1/2 * 10^74 = 5 * 10^73
494  {{0x0000000000000000ULL, 0x45f91518df477400ULL,
495    0xd9f83c3bcb9ea879ULL, 0x011afd6ec0e14115ULL}
496   }
497  ,	// 1/2 * 10^75 = 5 * 10^74
498  {{0x0000000000000000ULL, 0xbbbad2f8b8ca8800ULL,
499    0x83b25a55f43294bcULL, 0x0b0de65388cc8adaULL}
500   }
501  ,	// 1/2 * 10^76 = 5 * 10^75
502  {{0x0000000000000000ULL, 0x554c3db737e95000ULL,
503    0x24f7875b89f9cf5fULL, 0x6e8aff4357fd6c89ULL}
504   }	// 1/2 * 10^77 = 5 * 10^76
505};
506
507// ten2k64[i] = 10^i, 0 <= i <= 19
508UINT64 ten2k64[] = {
509  0x0000000000000001ULL,	// 10^0
510  0x000000000000000aULL,	// 10^1
511  0x0000000000000064ULL,	// 10^2
512  0x00000000000003e8ULL,	// 10^3
513  0x0000000000002710ULL,	// 10^4
514  0x00000000000186a0ULL,	// 10^5
515  0x00000000000f4240ULL,	// 10^6
516  0x0000000000989680ULL,	// 10^7
517  0x0000000005f5e100ULL,	// 10^8
518  0x000000003b9aca00ULL,	// 10^9
519  0x00000002540be400ULL,	// 10^10
520  0x000000174876e800ULL,	// 10^11
521  0x000000e8d4a51000ULL,	// 10^12
522  0x000009184e72a000ULL,	// 10^13
523  0x00005af3107a4000ULL,	// 10^14
524  0x00038d7ea4c68000ULL,	// 10^15
525  0x002386f26fc10000ULL,	// 10^16
526  0x016345785d8a0000ULL,	// 10^17
527  0x0de0b6b3a7640000ULL,	// 10^18
528  0x8ac7230489e80000ULL	// 10^19 (20 digits)
529};
530
531
532// ten2k128[i - 20] = 10^i, 20 <= i <= 38
533UINT128 ten2k128[] = {	// the 64-bit word order is L, H
534  {{0x6bc75e2d63100000ULL, 0x0000000000000005ULL}
535   }
536  ,	// 10^20
537  {{0x35c9adc5dea00000ULL, 0x0000000000000036ULL}
538   }
539  ,	// 10^21
540  {{0x19e0c9bab2400000ULL, 0x000000000000021eULL}
541   }
542  ,	// 10^22
543  {{0x02c7e14af6800000ULL, 0x000000000000152dULL}
544   }
545  ,	// 10^23
546  {{0x1bcecceda1000000ULL, 0x000000000000d3c2ULL}
547   }
548  ,	// 10^24
549  {{0x161401484a000000ULL, 0x0000000000084595ULL}
550   }
551  ,	// 10^25
552  {{0xdcc80cd2e4000000ULL, 0x000000000052b7d2ULL}
553   }
554  ,	// 10^26
555  {{0x9fd0803ce8000000ULL, 0x00000000033b2e3cULL}
556   }
557  ,	// 10^27
558  {{0x3e25026110000000ULL, 0x00000000204fce5eULL}
559   }
560  ,	// 10^28
561  {{0x6d7217caa0000000ULL, 0x00000001431e0faeULL}
562   }
563  ,	// 10^29
564  {{0x4674edea40000000ULL, 0x0000000c9f2c9cd0ULL}
565   }
566  ,	// 10^30
567  {{0xc0914b2680000000ULL, 0x0000007e37be2022ULL}
568   }
569  ,	// 10^31
570  {{0x85acef8100000000ULL, 0x000004ee2d6d415bULL}
571   }
572  ,	// 10^32
573  {{0x38c15b0a00000000ULL, 0x0000314dc6448d93ULL}
574   }
575  ,	// 10^33
576  {{0x378d8e6400000000ULL, 0x0001ed09bead87c0ULL}
577   }
578  ,	// 10^34
579  {{0x2b878fe800000000ULL, 0x0013426172c74d82ULL}
580   }
581  ,	// 10^35
582  {{0xb34b9f1000000000ULL, 0x00c097ce7bc90715ULL}
583   }
584  ,	// 10^36
585  {{0x00f436a000000000ULL, 0x0785ee10d5da46d9ULL}
586   }
587  ,	// 10^37
588  {{0x098a224000000000ULL, 0x4b3b4ca85a86c47aULL}
589   }	// 10^38 (39 digits)
590};
591
592// might split into ten2k192[] and ten2k256[]
593
594// ten2k256[i - 39] = 10^i, 39 <= i <= 68
595UINT256 ten2k256[] = {	// the 64-bit word order is LL, LH, HL, HH
596  {{0x5f65568000000000ULL, 0xf050fe938943acc4ULL,
597    0x0000000000000002ULL, 0x0000000000000000ULL}
598   }
599  ,	// 10^39
600  {{0xb9f5610000000000ULL, 0x6329f1c35ca4bfabULL,
601    0x000000000000001dULL, 0x0000000000000000ULL}
602   }
603  ,	// 10^40
604  {{0x4395ca0000000000ULL, 0xdfa371a19e6f7cb5ULL,
605    0x0000000000000125ULL, 0x0000000000000000ULL}
606   }
607  ,	// 10^41
608  {{0xa3d9e40000000000ULL, 0xbc627050305adf14ULL,
609    0x0000000000000b7aULL, 0x0000000000000000ULL}
610   }
611  ,	// 10^42
612  {{0x6682e80000000000ULL, 0x5bd86321e38cb6ceULL,
613    0x00000000000072cbULL, 0x0000000000000000ULL}
614   }
615  ,	// 10^43
616  {{0x011d100000000000ULL, 0x9673df52e37f2410ULL,
617    0x0000000000047bf1ULL, 0x0000000000000000ULL}
618   }
619  ,	// 10^44
620  {{0x0b22a00000000000ULL, 0xe086b93ce2f768a0ULL,
621    0x00000000002cd76fULL, 0x0000000000000000ULL}
622   }
623  ,	// 10^45
624  {{0x6f5a400000000000ULL, 0xc5433c60ddaa1640ULL,
625    0x0000000001c06a5eULL, 0x0000000000000000ULL}
626   }
627  ,	// 10^46
628  {{0x5986800000000000ULL, 0xb4a05bc8a8a4de84ULL,
629    0x00000000118427b3ULL, 0x0000000000000000ULL}
630   }
631  ,	// 10^47
632  {{0x7f41000000000000ULL, 0x0e4395d69670b12bULL,
633    0x00000000af298d05ULL, 0x0000000000000000ULL}
634   }
635  ,	// 10^48
636  {{0xf88a000000000000ULL, 0x8ea3da61e066ebb2ULL,
637    0x00000006d79f8232ULL, 0x0000000000000000ULL}
638   }
639  ,	// 10^49
640  {{0xb564000000000000ULL, 0x926687d2c40534fdULL,
641    0x000000446c3b15f9ULL, 0x0000000000000000ULL}
642   }
643  ,	// 10^50
644  {{0x15e8000000000000ULL, 0xb8014e3ba83411e9ULL,
645    0x000002ac3a4edbbfULL, 0x0000000000000000ULL}
646   }
647  ,	// 10^51
648  {{0xdb10000000000000ULL, 0x300d0e549208b31aULL,
649    0x00001aba4714957dULL, 0x0000000000000000ULL}
650   }
651  ,	// 10^52
652  {{0x8ea0000000000000ULL, 0xe0828f4db456ff0cULL,
653    0x00010b46c6cdd6e3ULL, 0x0000000000000000ULL}
654   }
655  ,	// 10^53
656  {{0x9240000000000000ULL, 0xc51999090b65f67dULL,
657    0x000a70c3c40a64e6ULL, 0x0000000000000000ULL}
658   }
659  ,	// 10^54
660  {{0xb680000000000000ULL, 0xb2fffa5a71fba0e7ULL,
661    0x006867a5a867f103ULL, 0x0000000000000000ULL}
662   }
663  ,	// 10^55
664  {{0x2100000000000000ULL, 0xfdffc78873d4490dULL,
665    0x04140c78940f6a24ULL, 0x0000000000000000ULL}
666   }
667  ,	// 10^56
668  {{0x4a00000000000000ULL, 0xebfdcb54864ada83ULL,
669    0x28c87cb5c89a2571ULL, 0x0000000000000000ULL}
670   }
671  ,	// 10^57 (58 digits)
672  {{0xe400000000000000ULL, 0x37e9f14d3eec8920ULL,
673    0x97d4df19d6057673ULL, 0x0000000000000001ULL}
674   }
675  ,	// 10^58
676  {{0xe800000000000000ULL, 0x2f236d04753d5b48ULL,
677    0xee50b7025c36a080ULL, 0x000000000000000fULL}
678   }
679  ,	// 10^59
680  {{0x1000000000000000ULL, 0xd762422c946590d9ULL,
681    0x4f2726179a224501ULL, 0x000000000000009fULL}
682   }
683  ,	// 10^60
684  {{0xa000000000000000ULL, 0x69d695bdcbf7a87aULL,
685    0x17877cec0556b212ULL, 0x0000000000000639ULL}
686   }
687  ,	// 10^61
688  {{0x4000000000000000ULL, 0x2261d969f7ac94caULL,
689    0xeb4ae1383562f4b8ULL, 0x0000000000003e3aULL}
690   }
691  ,	// 10^62
692  {{0x8000000000000000ULL, 0x57d27e23acbdcfe6ULL,
693    0x30eccc3215dd8f31ULL, 0x0000000000026e4dULL}
694   }
695  ,	// 10^63
696  {{0x0000000000000000ULL, 0x6e38ed64bf6a1f01ULL,
697    0xe93ff9f4daa797edULL, 0x0000000000184f03ULL}
698   }
699  ,	// 10^64
700  {{0x0000000000000000ULL, 0x4e3945ef7a25360aULL,
701    0x1c7fc3908a8bef46ULL, 0x0000000000f31627ULL}
702   }
703  ,	// 10^65
704  {{0x0000000000000000ULL, 0x0e3cbb5ac5741c64ULL,
705    0x1cfda3a5697758bfULL, 0x00000000097edd87ULL}
706   }
707  ,	// 10^66
708  {{0x0000000000000000ULL, 0x8e5f518bb6891be8ULL,
709    0x21e864761ea97776ULL, 0x000000005ef4a747ULL}
710   }
711  ,	// 10^67
712  {{0x0000000000000000ULL, 0x8fb92f75215b1710ULL,
713    0x5313ec9d329eaaa1ULL, 0x00000003b58e88c7ULL}
714   }
715  ,	// 10^68
716  {{0x0000000000000000ULL, 0x9d3bda934d8ee6a0ULL,
717    0x3ec73e23fa32aa4fULL, 0x00000025179157c9ULL}
718   }
719  ,	// 10^69
720  {{0x0000000000000000ULL, 0x245689c107950240ULL,
721    0x73c86d67c5faa71cULL, 0x00000172ebad6ddcULL}
722   }
723  ,	// 10^70
724  {{0x0000000000000000ULL, 0x6b61618a4bd21680ULL,
725    0x85d4460dbbca8719ULL, 0x00000e7d34c64a9cULL}
726   }
727  ,	// 10^71
728  {{0x0000000000000000ULL, 0x31cdcf66f634e100ULL,
729    0x3a4abc8955e946feULL, 0x000090e40fbeea1dULL}
730   }
731  ,	// 10^72
732  {{0x0000000000000000ULL, 0xf20a1a059e10ca00ULL,
733    0x46eb5d5d5b1cc5edULL, 0x0005a8e89d752524ULL}
734   }
735  ,	// 10^73
736  {{0x0000000000000000ULL, 0x746504382ca7e400ULL,
737    0xc531a5a58f1fbb4bULL, 0x003899162693736aULL}
738   }
739  ,	// 10^74
740  {{0x0000000000000000ULL, 0x8bf22a31be8ee800ULL,
741    0xb3f07877973d50f2ULL, 0x0235fadd81c2822bULL}
742   }
743  ,	// 10^75
744  {{0x0000000000000000ULL, 0x7775a5f171951000ULL,
745    0x0764b4abe8652979ULL, 0x161bcca7119915b5ULL}
746   }
747  ,	// 10^76
748  {{0x0000000000000000ULL, 0xaa987b6e6fd2a000ULL,
749    0x49ef0eb713f39ebeULL, 0xdd15fe86affad912ULL}
750   }	// 10^77
751};
752
753// ten2mk128[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 34 and
754// exp (k) = shiftright128[k - 1] + 128
755UINT128 ten2mk128[] = {
756  {{0x999999999999999aULL, 0x1999999999999999ULL}
757   }
758  ,	//  10^(-1) * 2^128
759  {{0x28f5c28f5c28f5c3ULL, 0x028f5c28f5c28f5cULL}
760   }
761  ,	//  10^(-2) * 2^128
762  {{0x9db22d0e56041894ULL, 0x004189374bc6a7efULL}
763   }
764  ,	//  10^(-3) * 2^128
765  {{0x4af4f0d844d013aaULL, 0x00346dc5d6388659ULL}
766   }
767  ,	//  10^(-4) * 2^131
768  {{0x08c3f3e0370cdc88ULL, 0x0029f16b11c6d1e1ULL}
769   }
770  ,	//  10^(-5) * 2^134
771  {{0x6d698fe69270b06dULL, 0x00218def416bdb1aULL}
772   }
773  ,	//  10^(-6) * 2^137
774  {{0xaf0f4ca41d811a47ULL, 0x0035afe535795e90ULL}
775   }
776  ,	//  10^(-7) * 2^141
777  {{0xbf3f70834acdaea0ULL, 0x002af31dc4611873ULL}
778   }
779  ,	//  10^(-8) * 2^144
780  {{0x65cc5a02a23e254dULL, 0x00225c17d04dad29ULL}
781   }
782  ,	//  10^(-9) * 2^147
783  {{0x6fad5cd10396a214ULL, 0x0036f9bfb3af7b75ULL}
784   }
785  ,	// 10^(-10) * 2^151
786  {{0xbfbde3da69454e76ULL, 0x002bfaffc2f2c92aULL}
787   }
788  ,	// 10^(-11) * 2^154
789  {{0x32fe4fe1edd10b92ULL, 0x00232f33025bd422ULL}
790   }
791  ,	// 10^(-12) * 2^157
792  {{0x84ca19697c81ac1cULL, 0x00384b84d092ed03ULL}
793   }
794  ,	// 10^(-13) * 2^161
795  {{0x03d4e1213067bce4ULL, 0x002d09370d425736ULL}
796   }
797  ,	// 10^(-14) * 2^164
798  {{0x3643e74dc052fd83ULL, 0x0024075f3dceac2bULL}
799   }
800  ,	// 10^(-15) * 2^167
801  {{0x56d30baf9a1e626bULL, 0x0039a5652fb11378ULL}
802   }
803  ,	// 10^(-16) * 2^171
804  {{0x12426fbfae7eb522ULL, 0x002e1dea8c8da92dULL}
805   }
806  ,	// 10^(-17) * 2^174
807  {{0x41cebfcc8b9890e8ULL, 0x0024e4bba3a48757ULL}
808   }
809  ,	// 10^(-18) * 2^177
810  {{0x694acc7a78f41b0dULL, 0x003b07929f6da558ULL}
811   }
812  ,	// 10^(-19) * 2^181
813  {{0xbaa23d2ec729af3eULL, 0x002f394219248446ULL}
814   }
815  ,	// 10^(-20) * 2^184
816  {{0xfbb4fdbf05baf298ULL, 0x0025c768141d369eULL}
817   }
818  ,	// 10^(-21) * 2^187
819  {{0x2c54c931a2c4b759ULL, 0x003c7240202ebdcbULL}
820   }
821  ,	// 10^(-22) * 2^191
822  {{0x89dd6dc14f03c5e1ULL, 0x00305b66802564a2ULL}
823   }
824  ,	// 10^(-23) * 2^194
825  {{0xd4b1249aa59c9e4eULL, 0x0026af8533511d4eULL}
826   }
827  ,	// 10^(-24) * 2^197
828  {{0x544ea0f76f60fd49ULL, 0x003de5a1ebb4fbb1ULL}
829   }
830  ,	// 10^(-25) * 2^201
831  {{0x76a54d92bf80caa1ULL, 0x00318481895d9627ULL}
832   }
833  ,	// 10^(-26) * 2^204
834  {{0x921dd7a89933d54eULL, 0x00279d346de4781fULL}
835   }
836  ,	// 10^(-27) * 2^207
837  {{0x8362f2a75b862215ULL, 0x003f61ed7ca0c032ULL}
838   }
839  ,	// 10^(-28) * 2^211
840  {{0xcf825bb91604e811ULL, 0x0032b4bdfd4d668eULL}
841   }
842  ,	// 10^(-29) * 2^214
843  {{0x0c684960de6a5341ULL, 0x00289097fdd7853fULL}
844   }
845  ,	// 10^(-30) * 2^217
846  {{0x3d203ab3e521dc34ULL, 0x002073accb12d0ffULL}
847   }
848  ,	// 10^(-31) * 2^220
849  {{0x2e99f7863b696053ULL, 0x0033ec47ab514e65ULL}
850   }
851  ,	// 10^(-32) * 2^224
852  {{0x587b2c6b62bab376ULL, 0x002989d2ef743eb7ULL}
853   }
854  ,	// 10^(-33) * 2^227
855  {{0xad2f56bc4efbc2c5ULL, 0x00213b0f25f69892ULL}
856   }
857  ,	// 10^(-34) * 2^230
858};
859
860
861// shiftright128[] contains the right shift count to obtain C2* from the top
862// 128 bits of the 128x128-bit product C2 * Kx
863int shiftright128[] = {
864  0,	// 128 - 128
865  0,	// 128 - 128
866  0,	// 128 - 128
867
868  3,	// 131 - 128
869  6,	// 134 - 128
870  9,	// 137 - 128
871  13,	// 141 - 128
872  16,	// 144 - 128
873  19,	// 147 - 128
874  23,	// 151 - 128
875  26,	// 154 - 128
876  29,	// 157 - 128
877  33,	// 161 - 128
878  36,	// 164 - 128
879  39,	// 167 - 128
880  43,	// 171 - 128
881  46,	// 174 - 128
882  49,	// 177 - 128
883  53,	// 181 - 128
884  56,	// 184 - 128
885  59,	// 187 - 128
886  63,	// 191 - 128
887
888  66,	// 194 - 128
889  69,	// 197 - 128
890  73,	// 201 - 128
891  76,	// 204 - 128
892  79,	// 207 - 128
893  83,	// 211 - 128
894  86,	// 214 - 128
895  89,	// 217 - 128
896  92,	// 220 - 128
897  96,	// 224 - 128
898  99,	// 227 - 128
899  102	// 230 - 128
900};
901
902
903// maskhigh128[] contains the mask to apply to the top 128 bits of the
904// 128x128-bit product in order to obtain the high bits of f2*
905// the 64-bit word order is L, H
906UINT64 maskhigh128[] = {
907  0x0000000000000000ULL,	//  0 = 128 - 128 bits
908  0x0000000000000000ULL,	//  0 = 128 - 128 bits
909  0x0000000000000000ULL,	//  0 = 128 - 128 bits
910  0x0000000000000007ULL,	//  3 = 131 - 128 bits
911  0x000000000000003fULL,	//  6 = 134 - 128 bits
912  0x00000000000001ffULL,	//  9 = 137 - 128 bits
913  0x0000000000001fffULL,	// 13 = 141 - 128 bits
914  0x000000000000ffffULL,	// 16 = 144 - 128 bits
915  0x000000000007ffffULL,	// 19 = 147 - 128 bits
916  0x00000000007fffffULL,	// 23 = 151 - 128 bits
917  0x0000000003ffffffULL,	// 26 = 154 - 128 bits
918  0x000000001fffffffULL,	// 29 = 157 - 128 bits
919  0x00000001ffffffffULL,	// 33 = 161 - 128 bits
920  0x0000000fffffffffULL,	// 36 = 164 - 128 bits
921  0x0000007fffffffffULL,	// 39 = 167 - 128 bits
922  0x000007ffffffffffULL,	// 43 = 171 - 128 bits
923  0x00003fffffffffffULL,	// 46 = 174 - 128 bits
924  0x0001ffffffffffffULL,	// 49 = 177 - 128 bits
925  0x001fffffffffffffULL,	// 53 = 181 - 128 bits
926  0x00ffffffffffffffULL,	// 56 = 184 - 128 bits
927  0x07ffffffffffffffULL,	// 59 = 187 - 128 bits
928  0x7fffffffffffffffULL,	// 63 = 191 - 128 bits
929  0x0000000000000003ULL,	//  2 = 194 - 192 bits
930  0x000000000000001fULL,	//  5 = 197 - 192 bits
931  0x00000000000001ffULL,	//  9 = 201 - 192 bits
932  0x0000000000000fffULL,	// 12 = 204 - 192 bits
933  0x0000000000007fffULL,	// 15 = 207 - 192 bits
934  0x000000000007ffffULL,	// 21 = 211 - 192 bits
935  0x00000000003fffffULL,	// 22 = 214 - 192 bits
936  0x0000000001ffffffULL,	// 25 = 217 - 192 bits
937  0x000000000fffffffULL,	// 28 = 220 - 192 bits
938  0x00000000ffffffffULL,	// 32 = 224 - 192 bits
939  0x00000007ffffffffULL,	// 35 = 227 - 192 bits
940  0x0000003fffffffffULL	// 38 = 230 - 192 bits
941};
942
943
944// onehalf128[] contains the high bits of 1/2 positioned correctly for
945// comparison with the high bits of f2*
946// the 64-bit word order is L, H
947UINT64 onehalf128[] = {
948  0x0000000000000000ULL,	//  0 bits
949  0x0000000000000000ULL,	//  0 bits
950  0x0000000000000000ULL,	//  0 bits
951  0x0000000000000004ULL,	//  3 bits
952  0x0000000000000020ULL,	//  6 bits
953  0x0000000000000100ULL,	//  9 bits
954  0x0000000000001000ULL,	// 13 bits
955  0x0000000000008000ULL,	// 16 bits
956  0x0000000000040000ULL,	// 19 bits
957  0x0000000000400000ULL,	// 23 bits
958  0x0000000002000000ULL,	// 26 bits
959  0x0000000010000000ULL,	// 29 bits
960  0x0000000100000000ULL,	// 33 bits
961  0x0000000800000000ULL,	// 36 bits
962  0x0000004000000000ULL,	// 39 bits
963  0x0000040000000000ULL,	// 43 bits
964  0x0000200000000000ULL,	// 46 bits
965  0x0001000000000000ULL,	// 49 bits
966  0x0010000000000000ULL,	// 53 bits
967  0x0080000000000000ULL,	// 56 bits
968  0x0400000000000000ULL,	// 59 bits
969  0x4000000000000000ULL,	// 63 bits
970  0x0000000000000002ULL,	// 66 bits
971  0x0000000000000010ULL,	// 69 bits
972  0x0000000000000100ULL,	// 73 bits
973  0x0000000000000800ULL,	// 76 bits
974  0x0000000000004000ULL,	// 79 bits
975  0x0000000000040000ULL,	// 83 bits
976  0x0000000000200000ULL,	// 86 bits
977  0x0000000001000000ULL,	// 89 bits
978  0x0000000008000000ULL,	// 92 bits
979  0x0000000080000000ULL,	// 96 bits
980  0x0000000400000000ULL,	// 99 bits
981  0x0000002000000000ULL	// 102 bits
982};
983
984UINT64 ten2mk64[] = {
985  0x199999999999999aULL,	//  10^(-1) * 2^ 64
986  0x028f5c28f5c28f5dULL,	//  10^(-2) * 2^ 64
987  0x004189374bc6a7f0ULL,	//  10^(-3) * 2^ 64
988  0x00346dc5d638865aULL,	//  10^(-4) * 2^ 67
989  0x0029f16b11c6d1e2ULL,	//  10^(-5) * 2^ 70
990  0x00218def416bdb1bULL,	//  10^(-6) * 2^ 73
991  0x0035afe535795e91ULL,	//  10^(-7) * 2^ 77
992  0x002af31dc4611874ULL,	//  10^(-8) * 2^ 80
993  0x00225c17d04dad2aULL,	//  10^(-9) * 2^ 83
994  0x0036f9bfb3af7b76ULL,	// 10^(-10) * 2^ 87
995  0x002bfaffc2f2c92bULL,	// 10^(-11) * 2^ 90
996  0x00232f33025bd423ULL,	// 10^(-12) * 2^ 93
997  0x00384b84d092ed04ULL,	// 10^(-13) * 2^ 97
998  0x002d09370d425737ULL,	// 10^(-14) * 2^100
999  0x0024075f3dceac2cULL,	// 10^(-15) * 2^103
1000  0x0039a5652fb11379ULL,	// 10^(-16) * 2^107
1001};
1002
1003// ten2mk128trunc[] contains T*, the top Ex >= 128 bits of 10^(-k),
1004// for 1 <= k <= 34
1005// the 64-bit word order is L, H
1006UINT128 ten2mk128trunc[] = {
1007  {{0x9999999999999999ULL, 0x1999999999999999ULL}},	//  10^(-1) * 2^128
1008  {{0x28f5c28f5c28f5c2ULL, 0x028f5c28f5c28f5cULL}},	//  10^(-2) * 2^128
1009  {{0x9db22d0e56041893ULL, 0x004189374bc6a7efULL}},	//  10^(-3) * 2^128
1010  {{0x4af4f0d844d013a9ULL, 0x00346dc5d6388659ULL}},	//  10^(-4) * 2^131
1011  {{0x08c3f3e0370cdc87ULL, 0x0029f16b11c6d1e1ULL}},	//  10^(-5) * 2^134
1012  {{0x6d698fe69270b06cULL, 0x00218def416bdb1aULL}},	//  10^(-6) * 2^137
1013  {{0xaf0f4ca41d811a46ULL, 0x0035afe535795e90ULL}},	//  10^(-7) * 2^141
1014  {{0xbf3f70834acdae9fULL, 0x002af31dc4611873ULL}},	//  10^(-8) * 2^144
1015  {{0x65cc5a02a23e254cULL, 0x00225c17d04dad29ULL}},	//  10^(-9) * 2^147
1016  {{0x6fad5cd10396a213ULL, 0x0036f9bfb3af7b75ULL}},	// 10^(-10) * 2^151
1017  {{0xbfbde3da69454e75ULL, 0x002bfaffc2f2c92aULL}},	// 10^(-11) * 2^154
1018  {{0x32fe4fe1edd10b91ULL, 0x00232f33025bd422ULL}},	// 10^(-12) * 2^157
1019  {{0x84ca19697c81ac1bULL, 0x00384b84d092ed03ULL}},	// 10^(-13) * 2^161
1020  {{0x03d4e1213067bce3ULL, 0x002d09370d425736ULL}},	// 10^(-14) * 2^164
1021  {{0x3643e74dc052fd82ULL, 0x0024075f3dceac2bULL}},	// 10^(-15) * 2^167
1022  {{0x56d30baf9a1e626aULL, 0x0039a5652fb11378ULL}},	// 10^(-16) * 2^171
1023  {{0x12426fbfae7eb521ULL, 0x002e1dea8c8da92dULL}},	// 10^(-17) * 2^174
1024  {{0x41cebfcc8b9890e7ULL, 0x0024e4bba3a48757ULL}},	// 10^(-18) * 2^177
1025  {{0x694acc7a78f41b0cULL, 0x003b07929f6da558ULL}},	// 10^(-19) * 2^181
1026  {{0xbaa23d2ec729af3dULL, 0x002f394219248446ULL}},	// 10^(-20) * 2^184
1027  {{0xfbb4fdbf05baf297ULL, 0x0025c768141d369eULL}},	// 10^(-21) * 2^187
1028  {{0x2c54c931a2c4b758ULL, 0x003c7240202ebdcbULL}},	// 10^(-22) * 2^191
1029  {{0x89dd6dc14f03c5e0ULL, 0x00305b66802564a2ULL}},	// 10^(-23) * 2^194
1030  {{0xd4b1249aa59c9e4dULL, 0x0026af8533511d4eULL}},	// 10^(-24) * 2^197
1031  {{0x544ea0f76f60fd48ULL, 0x003de5a1ebb4fbb1ULL}},	// 10^(-25) * 2^201
1032  {{0x76a54d92bf80caa0ULL, 0x00318481895d9627ULL}},	// 10^(-26) * 2^204
1033  {{0x921dd7a89933d54dULL, 0x00279d346de4781fULL}},	// 10^(-27) * 2^207
1034  {{0x8362f2a75b862214ULL, 0x003f61ed7ca0c032ULL}},	// 10^(-28) * 2^211
1035  {{0xcf825bb91604e810ULL, 0x0032b4bdfd4d668eULL}},	// 10^(-29) * 2^214
1036  {{0x0c684960de6a5340ULL, 0x00289097fdd7853fULL}},	// 10^(-30) * 2^217
1037  {{0x3d203ab3e521dc33ULL, 0x002073accb12d0ffULL}},	// 10^(-31) * 2^220
1038  {{0x2e99f7863b696052ULL, 0x0033ec47ab514e65ULL}},	// 10^(-32) * 2^224
1039  {{0x587b2c6b62bab375ULL, 0x002989d2ef743eb7ULL}},	// 10^(-33) * 2^227
1040  {{0xad2f56bc4efbc2c4ULL, 0x00213b0f25f69892ULL}},	// 10^(-34) * 2^230
1041};
1042
1043// ten2mk128M[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 4 and
1044// exp (k) = shiftright128[k - 1] + 128
1045// the 64-bit word order is L, H
1046UINT128 ten2mk128M[] = {
1047  {{0xcccccccccccccccdULL, 0xccccccccccccccccULL}},	//  10^(-1) * 2^131
1048  {{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}},	//  10^(-2) * 2^134
1049  {{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}},	//  10^(-3) * 2^137
1050  {{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}}	//  10^(-4) * 2^141
1051};
1052
1053// ten2mk128truncM[] contains T*, the top Ex >= 128 bits of 10^(-k),
1054// for 1 <= k <= 4; the top bits which are 0 are not represented
1055// the 64-bit word order is L, H
1056UINT128 ten2mk128truncM[] = {
1057  {{0xccccccccccccccccULL, 0xccccccccccccccccULL}},	//  10^(-1) * 2^131
1058  {{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},	//  10^(-2) * 2^134
1059  {{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},	//  10^(-3) * 2^137
1060  {{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}}	//  10^(-4) * 2^141
1061};
1062
1063// shiftright128M[] contains the right shift count to obtain C2* from the top
1064// 128 bits of the 128x128-bit product C2 * Kx
1065int shiftright128M[] = {
1066  3,	// 131 - 128
1067  6,	// 134 - 128
1068  9,	// 137 - 128
1069  13	// 141 - 128
1070};
1071
1072// maskhigh128M[] contains the mask to apply to the top 128 bits of the
1073// 128x128-bit product in order to obtain the high bits of f*
1074// the high 64 bits of the mask are 0, so only the low 64 bits are represented
1075UINT64 maskhigh128M[] = {
1076  0x0000000000000007ULL,	//  3 = 131 - 128 bits
1077  0x000000000000003fULL,	//  6 = 134 - 128 bits
1078  0x00000000000001ffULL,	//  9 = 137 - 128 bits
1079  0x0000000000001fffULL	// 13 = 141 - 128 bits
1080};
1081
1082// onehalf128M[] contains 1/2 positioned correctly for
1083// comparison with the high bits of f*
1084// the high 64 bits are 0, so only the low 64 bits are represented
1085UINT64 onehalf128M[] = {
1086  0x0000000000000004ULL,	//  3 bits
1087  0x0000000000000020ULL,	//  6 bits
1088  0x0000000000000100ULL,	//  9 bits
1089  0x0000000000001000ULL	// 13 bits
1090};
1091
1092// ten2mk192M[k - 1] = 10^(-k-4) * 2^exp (k), where 1 <= k <= 19 and
1093// exp (k) = shiftright128[k - 1] + 128
1094// the 64-bit word order is L, M, H
1095UINT192 ten2mk192M[] = {
1096  {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
1097    0xa7c5ac471b478423ULL}},
1098  //  10^(-5) * 2^208
1099  {{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
1100    0x8637bd05af6c69b5ULL}},
1101  //  10^(-6) * 2^211
1102  {{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
1103    0xd6bf94d5e57a42bcULL}},
1104  //  10^(-7) * 2^215
1105  {{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
1106    0xabcc77118461cefcULL}},
1107  //  10^(-8) * 2^218
1108  {{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
1109    0x89705f4136b4a597ULL}},
1110  //  10^(-9) * 2^221
1111  {{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
1112    0xdbe6fecebdedd5beULL}},
1113  //  10^(-10) * 2^225
1114  {{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
1115    0xafebff0bcb24aafeULL}},
1116  //  10^(-11) * 2^228
1117  {{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
1118    0x8cbccc096f5088cbULL}},
1119  //  10^(-12) * 2^231
1120  {{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
1121    0xe12e13424bb40e13ULL}},
1122  //  10^(-13) * 2^235
1123  {{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
1124    0xb424dc35095cd80fULL}},
1125  //  10^(-14) * 2^238
1126  {{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
1127    0x901d7cf73ab0acd9ULL}},
1128  //  10^(-15) * 2^241
1129  {{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
1130    0xe69594bec44de15bULL}},
1131  //  10^(-16) * 2^245
1132  {{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
1133    0xb877aa3236a4b449ULL}},
1134  //  10^(-17) * 2^248
1135  {{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
1136    0x9392ee8e921d5d07ULL}},
1137  //  10^(-18) * 2^251
1138  {{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
1139    0xec1e4a7db69561a5ULL}},
1140  //  10^(-19) * 2^255
1141  {{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
1142    0xbce5086492111aeaULL}},
1143  //  10^(-20) * 2^258
1144  {{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
1145    0x971da05074da7beeULL}},
1146  //  10^(-21) * 2^261
1147  {{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
1148    0xf1c90080baf72cb1ULL}},
1149  //  10^(-22) * 2^265
1150  {{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
1151  //  10^(-23) * 2^268
1152};
1153
1154// ten2mk192truncM[] contains T*, the top Ex >= 192 bits of 10^(-k),
1155// for 5 <= k <= 23; the top bits which are 0 are not represented
1156// the 64-bit word order is L, M, H
1157UINT192 ten2mk192truncM[] = {
1158  {{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
1159    0xa7c5ac471b478423ULL}},
1160  //  10^(-5) * 2^208
1161  {{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
1162    0x8637bd05af6c69b5ULL}},
1163  //  10^(-6) * 2^211
1164  {{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
1165    0xd6bf94d5e57a42bcULL}},
1166  //  10^(-7) * 2^215
1167  {{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
1168    0xabcc77118461cefcULL}},
1169  //  10^(-8) * 2^218
1170  {{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
1171    0x89705f4136b4a597ULL}},
1172  //  10^(-9) * 2^221
1173  {{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
1174    0xdbe6fecebdedd5beULL}},
1175  //  10^(-10) * 2^225
1176  {{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
1177    0xafebff0bcb24aafeULL}},
1178  //  10^(-11) * 2^228
1179  {{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
1180    0x8cbccc096f5088cbULL}},
1181  //  10^(-12) * 2^231
1182  {{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
1183    0xe12e13424bb40e13ULL}},
1184  //  10^(-13) * 2^235
1185  {{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
1186    0xb424dc35095cd80fULL}},
1187  //  10^(-14) * 2^238
1188  {{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
1189    0x901d7cf73ab0acd9ULL}},
1190  //  10^(-15) * 2^241
1191  {{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
1192    0xe69594bec44de15bULL}},
1193  //  10^(-16) * 2^245
1194  {{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
1195    0xb877aa3236a4b449ULL}},
1196  //  10^(-17) * 2^248
1197  {{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
1198    0x9392ee8e921d5d07ULL}},
1199  //  10^(-18) * 2^251
1200  {{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
1201    0xec1e4a7db69561a5ULL}},
1202  //  10^(-19) * 2^255
1203  {{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
1204    0xbce5086492111aeaULL}},
1205  //  10^(-20) * 2^258
1206  {{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
1207    0x971da05074da7beeULL}},
1208  //  10^(-21) * 2^261
1209  {{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
1210    0xf1c90080baf72cb1ULL}},
1211  //  10^(-22) * 2^265
1212  {{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
1213  //  10^(-23) * 2^268
1214};
1215
1216// shiftright192M[] contains the right shift count to obtain C2* from the top
1217// 192 bits of the 192x192-bit product C2 * Kx if 0 <= ind <= 14 where ind is
1218// the index in the table, or from the top 128 bits if 15 <= ind <= 18
1219int shiftright192M[] = {
1220  16,	// 208 - 192
1221  19,	// 211 - 192
1222  23,	// 215 - 192
1223  26,	// 218 - 192
1224  29,	// 221 - 192
1225  33,	// 225 - 192
1226  36,	// 228 - 192
1227  39,	// 231 - 192
1228  43,	// 235 - 192
1229  46,	// 238 - 192
1230  49,	// 241 - 192
1231  53,	// 245 - 192
1232  56,	// 248 - 192
1233  59,	// 251 - 192
1234  63,	// 255 - 192
1235  2,	// 258 - 256
1236  5,	// 261 - 256
1237  9,	// 265 - 256
1238  12	// 268 - 256
1239};
1240
1241// maskhigh192M[] contains the mask to apply to the top 192 bits of the
1242// 192x192-bit product in order to obtain the high bits of f*
1243// if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
1244// of the 384-bit mask are 0;  if 15 <= ind <= 18 then the high 64 bits are 0
1245UINT64 maskhigh192M[] = {
1246  0x000000000000ffffULL,	//  16 = 208 - 192 bits
1247  0x000000000007ffffULL,	//  19 = 211 - 192 bits
1248  0x00000000007fffffULL,	//  23 = 215 - 192 bits
1249  0x0000000003ffffffULL,	//  26 = 218 - 192 bits
1250  0x000000001fffffffULL,	//  29 = 221 - 192 bits
1251  0x00000001ffffffffULL,	//  33 = 225 - 192 bits
1252  0x0000000fffffffffULL,	//  36 = 228 - 192 bits
1253  0x0000007fffffffffULL,	//  39 = 231 - 192 bits
1254  0x000007ffffffffffULL,	//  43 = 235 - 192 bits
1255  0x00003fffffffffffULL,	//  46 = 238 - 192 bits
1256  0x0001ffffffffffffULL,	//  49 = 241 - 192 bits
1257  0x001fffffffffffffULL,	//  53 = 245 - 192 bits
1258  0x00ffffffffffffffULL,	//  56 = 248 - 192 bits
1259  0x07ffffffffffffffULL,	//  59 = 251 - 192 bits
1260  0x7fffffffffffffffULL,	//  63 = 255 - 192 bits
1261  0x0000000000000003ULL,	//   2 = 258 - 256 bits
1262  0x000000000000001fULL,	//   5 = 261 - 256 bits
1263  0x00000000000001ffULL,	//   9 = 265 - 256 bits
1264  0x0000000000000fffULL	//  12 = 268 - 256 bits
1265};
1266
1267// onehalf192M[] contains 1/2 positioned correctly for
1268// comparison with the high bits of f*
1269// if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
1270// of the 384-bit mask are 0;  if 15 <= ind <= 18 then the high 648 bits are 0
1271UINT64 onehalf192M[] = {
1272  0x0000000000008000ULL,	//  16 = 208 - 192 bits
1273  0x0000000000040000ULL,	//  19 = 211 - 192 bits
1274  0x0000000000400000ULL,	//  23 = 215 - 192 bits
1275  0x0000000002000000ULL,	//  26 = 218 - 192 bits
1276  0x0000000010000000ULL,	//  29 = 221 - 192 bits
1277  0x0000000100000000ULL,	//  33 = 225 - 192 bits
1278  0x0000000800000000ULL,	//  36 = 228 - 192 bits
1279  0x0000004000000000ULL,	//  39 = 231 - 192 bits
1280  0x0000040000000000ULL,	//  43 = 235 - 192 bits
1281  0x0000200000000000ULL,	//  46 = 238 - 192 bits
1282  0x0001000000000000ULL,	//  49 = 241 - 192 bits
1283  0x0010000000000000ULL,	//  53 = 245 - 192 bits
1284  0x0080000000000000ULL,	//  56 = 248 - 192 bits
1285  0x0400000000000000ULL,	//  59 = 251 - 192 bits
1286  0x4000000000000000ULL,	//  63 = 255 - 192 bits
1287  0x0000000000000002ULL,	//   2 = 258 - 256 bits
1288  0x0000000000000010ULL,	//   5 = 261 - 256 bits
1289  0x0000000000000100ULL,	//   9 = 265 - 256 bits
1290  0x0000000000000800ULL	//  12 = 268 - 256 bits
1291};
1292
1293// ten2mk256M[k - 1] = 10^(-k-23) * 2^exp (k), where 1 <= k <= 11 and
1294// exp (k) = shiftright128[k - 1] + 128
1295UINT256 ten2mk256M[] = {	// the 64-bit word order is LL, LH, HL, HH
1296  {{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
1297    0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},	//  10^(-24) * 2^335
1298  {{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
1299    0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},	//  10^(-25) * 2^339
1300  {{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
1301    0x95364afe032a819dULL, 0xc612062576589ddaULL}},	//  10^(-26) * 2^342
1302  {{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
1303    0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},	//  10^(-27) * 2^345
1304  {{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
1305    0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},	//  10^(-28) * 2^349
1306  {{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
1307    0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},	//  10^(-29) * 2^352
1308  {{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
1309    0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},	//  10^(-30) * 2^355
1310  {{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
1311    0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},	//  10^(-31) * 2^358
1312  {{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
1313    0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},	//  10^(-32) * 2^362
1314  {{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
1315    0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},	//  10^(-33) * 2^365
1316  {{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
1317    0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}}	//  10^(-34) * 2^368
1318};
1319
1320// ten2mk256truncM[] contains T*, the top Ex >= 256 bits of 10^(-k),
1321// for 24 <= k <= 34; the top bits which are 0 are not represented
1322UINT256 ten2mk256truncM[] = {	// the 64-bit word order is LL, LH, HL, HH
1323  {{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
1324    0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},	//  10^(-24) * 2^335
1325  {{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
1326    0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},	//  10^(-25) * 2^339
1327  {{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
1328    0x95364afe032a819dULL, 0xc612062576589ddaULL}},	//  10^(-26) * 2^342
1329  {{0x775ea264cf55347cULL, 0x9ff42b5717739986ULL,
1330    0xca49f1c05120c9c7ULL, 0x9e74d1b791e07e48ULL}},	//  10^(-27) * 2^345
1331  {{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
1332    0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},	//  10^(-28) * 2^349
1333  {{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
1334    0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},	//  10^(-29) * 2^352
1335  {{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
1336    0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},	//  10^(-30) * 2^355
1337  {{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
1338    0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},	//  10^(-31) * 2^358
1339  {{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
1340    0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},	//  10^(-32) * 2^362
1341  {{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
1342    0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},	//  10^(-33) * 2^365
1343  {{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
1344    0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}}	//  10^(-34) * 2^368
1345};
1346
1347// shiftright256M[] contains the right shift count to obtain C2* from the top
1348// 192 bits of the 256x256-bit product C2 * Kx
1349int shiftright256M[] = {
1350  15,	// 335 - 320
1351  19,	// 339 - 320
1352  22,	// 342 - 320
1353  25,	// 345 - 320
1354  29,	// 349 - 320
1355  32,	// 352 - 320 // careful of 32-bit machines!
1356  35,	// 355 - 320
1357  38,	// 358 - 320
1358  42,	// 362 - 320
1359  45,	// 365 - 320
1360  48	// 368 - 320
1361};
1362
1363// maskhigh256M[] contains the mask to apply to the top 192 bits of the
1364// 256x256-bit product in order to obtain the high bits of f*
1365UINT64 maskhigh256M[] = {
1366  0x0000000000007fffULL,	//  15 = 335 - 320 bits
1367  0x000000000007ffffULL,	//  19 = 339 - 320 bits
1368  0x00000000003fffffULL,	//  22 = 342 - 320 bits
1369  0x0000000001ffffffULL,	//  25 = 345 - 320 bits
1370  0x000000001fffffffULL,	//  29 = 349 - 320 bits
1371  0x00000000ffffffffULL,	//  32 = 352 - 320 bits
1372  0x00000007ffffffffULL,	//  35 = 355 - 320 bits
1373  0x0000003fffffffffULL,	//  38 = 358 - 320 bits
1374  0x000003ffffffffffULL,	//  42 = 362 - 320 bits
1375  0x00001fffffffffffULL,	//  45 = 365 - 320 bits
1376  0x0000ffffffffffffULL	//  48 = 368 - 320 bits
1377};
1378
1379// onehalf256M[] contains 1/2 positioned correctly for comparison with the
1380// high bits of f*; the high 128 bits of the 512-bit mask are 0
1381UINT64 onehalf256M[] = {
1382  0x0000000000004000ULL,	//  15 = 335 - 320 bits
1383  0x0000000000040000ULL,	//  19 = 339 - 320 bits
1384  0x0000000000200000ULL,	//  22 = 342 - 320 bits
1385  0x0000000001000000ULL,	//  25 = 345 - 320 bits
1386  0x0000000010000000ULL,	//  29 = 349 - 320 bits
1387  0x0000000080000000ULL,	//  32 = 352 - 320 bits
1388  0x0000000400000000ULL,	//  35 = 355 - 320 bits
1389  0x0000002000000000ULL,	//  38 = 358 - 320 bits
1390  0x0000020000000000ULL,	//  42 = 362 - 320 bits
1391  0x0000100000000000ULL,	//  45 = 365 - 320 bits
1392  0x0000800000000000ULL	//  48 = 368 - 320 bits
1393};
1394
1395
1396// char_table2[] is used to convert n to string, where 10 <= n <= 99
1397unsigned char char_table2[180] = {
1398  '1', '0',
1399  '1', '1',
1400  '1', '2',
1401  '1', '3',
1402  '1', '4',
1403  '1', '5',
1404  '1', '6',
1405  '1', '7',
1406  '1', '8',
1407  '1', '9',
1408  '2', '0',
1409  '2', '1',
1410  '2', '2',
1411  '2', '3',
1412  '2', '4',
1413  '2', '5',
1414  '2', '6',
1415  '2', '7',
1416  '2', '8',
1417  '2', '9',
1418  '3', '0',
1419  '3', '1',
1420  '3', '2',
1421  '3', '3',
1422  '3', '4',
1423  '3', '5',
1424  '3', '6',
1425  '3', '7',
1426  '3', '8',
1427  '3', '9',
1428  '4', '0',
1429  '4', '1',
1430  '4', '2',
1431  '4', '3',
1432  '4', '4',
1433  '4', '5',
1434  '4', '6',
1435  '4', '7',
1436  '4', '8',
1437  '4', '9',
1438  '5', '0',
1439  '5', '1',
1440  '5', '2',
1441  '5', '3',
1442  '5', '4',
1443  '5', '5',
1444  '5', '6',
1445  '5', '7',
1446  '5', '8',
1447  '5', '9',
1448  '6', '0',
1449  '6', '1',
1450  '6', '2',
1451  '6', '3',
1452  '6', '4',
1453  '6', '5',
1454  '6', '6',
1455  '6', '7',
1456  '6', '8',
1457  '6', '9',
1458  '7', '0',
1459  '7', '1',
1460  '7', '2',
1461  '7', '3',
1462  '7', '4',
1463  '7', '5',
1464  '7', '6',
1465  '7', '7',
1466  '7', '8',
1467  '7', '9',
1468  '8', '0',
1469  '8', '1',
1470  '8', '2',
1471  '8', '3',
1472  '8', '4',
1473  '8', '5',
1474  '8', '6',
1475  '8', '7',
1476  '8', '8',
1477  '8', '9',
1478  '9', '0',
1479  '9', '1',
1480  '9', '2',
1481  '9', '3',
1482  '9', '4',
1483  '9', '5',
1484  '9', '6',
1485  '9', '7',
1486  '9', '8',
1487  '9', '9'
1488};
1489
1490
1491// char_table3[] is used to convert n to string, where 000 <= n <= 999
1492unsigned char char_table3[3000] = {
1493  '0', '0', '0',
1494  '0', '0', '1',
1495  '0', '0', '2',
1496  '0', '0', '3',
1497  '0', '0', '4',
1498  '0', '0', '5',
1499  '0', '0', '6',
1500  '0', '0', '7',
1501  '0', '0', '8',
1502  '0', '0', '9',
1503  '0', '1', '0',
1504  '0', '1', '1',
1505  '0', '1', '2',
1506  '0', '1', '3',
1507  '0', '1', '4',
1508  '0', '1', '5',
1509  '0', '1', '6',
1510  '0', '1', '7',
1511  '0', '1', '8',
1512  '0', '1', '9',
1513  '0', '2', '0',
1514  '0', '2', '1',
1515  '0', '2', '2',
1516  '0', '2', '3',
1517  '0', '2', '4',
1518  '0', '2', '5',
1519  '0', '2', '6',
1520  '0', '2', '7',
1521  '0', '2', '8',
1522  '0', '2', '9',
1523  '0', '3', '0',
1524  '0', '3', '1',
1525  '0', '3', '2',
1526  '0', '3', '3',
1527  '0', '3', '4',
1528  '0', '3', '5',
1529  '0', '3', '6',
1530  '0', '3', '7',
1531  '0', '3', '8',
1532  '0', '3', '9',
1533  '0', '4', '0',
1534  '0', '4', '1',
1535  '0', '4', '2',
1536  '0', '4', '3',
1537  '0', '4', '4',
1538  '0', '4', '5',
1539  '0', '4', '6',
1540  '0', '4', '7',
1541  '0', '4', '8',
1542  '0', '4', '9',
1543  '0', '5', '0',
1544  '0', '5', '1',
1545  '0', '5', '2',
1546  '0', '5', '3',
1547  '0', '5', '4',
1548  '0', '5', '5',
1549  '0', '5', '6',
1550  '0', '5', '7',
1551  '0', '5', '8',
1552  '0', '5', '9',
1553  '0', '6', '0',
1554  '0', '6', '1',
1555  '0', '6', '2',
1556  '0', '6', '3',
1557  '0', '6', '4',
1558  '0', '6', '5',
1559  '0', '6', '6',
1560  '0', '6', '7',
1561  '0', '6', '8',
1562  '0', '6', '9',
1563  '0', '7', '0',
1564  '0', '7', '1',
1565  '0', '7', '2',
1566  '0', '7', '3',
1567  '0', '7', '4',
1568  '0', '7', '5',
1569  '0', '7', '6',
1570  '0', '7', '7',
1571  '0', '7', '8',
1572  '0', '7', '9',
1573  '0', '8', '0',
1574  '0', '8', '1',
1575  '0', '8', '2',
1576  '0', '8', '3',
1577  '0', '8', '4',
1578  '0', '8', '5',
1579  '0', '8', '6',
1580  '0', '8', '7',
1581  '0', '8', '8',
1582  '0', '8', '9',
1583  '0', '9', '0',
1584  '0', '9', '1',
1585  '0', '9', '2',
1586  '0', '9', '3',
1587  '0', '9', '4',
1588  '0', '9', '5',
1589  '0', '9', '6',
1590  '0', '9', '7',
1591  '0', '9', '8',
1592  '0', '9', '9',
1593  '1', '0', '0',
1594  '1', '0', '1',
1595  '1', '0', '2',
1596  '1', '0', '3',
1597  '1', '0', '4',
1598  '1', '0', '5',
1599  '1', '0', '6',
1600  '1', '0', '7',
1601  '1', '0', '8',
1602  '1', '0', '9',
1603  '1', '1', '0',
1604  '1', '1', '1',
1605  '1', '1', '2',
1606  '1', '1', '3',
1607  '1', '1', '4',
1608  '1', '1', '5',
1609  '1', '1', '6',
1610  '1', '1', '7',
1611  '1', '1', '8',
1612  '1', '1', '9',
1613  '1', '2', '0',
1614  '1', '2', '1',
1615  '1', '2', '2',
1616  '1', '2', '3',
1617  '1', '2', '4',
1618  '1', '2', '5',
1619  '1', '2', '6',
1620  '1', '2', '7',
1621  '1', '2', '8',
1622  '1', '2', '9',
1623  '1', '3', '0',
1624  '1', '3', '1',
1625  '1', '3', '2',
1626  '1', '3', '3',
1627  '1', '3', '4',
1628  '1', '3', '5',
1629  '1', '3', '6',
1630  '1', '3', '7',
1631  '1', '3', '8',
1632  '1', '3', '9',
1633  '1', '4', '0',
1634  '1', '4', '1',
1635  '1', '4', '2',
1636  '1', '4', '3',
1637  '1', '4', '4',
1638  '1', '4', '5',
1639  '1', '4', '6',
1640  '1', '4', '7',
1641  '1', '4', '8',
1642  '1', '4', '9',
1643  '1', '5', '0',
1644  '1', '5', '1',
1645  '1', '5', '2',
1646  '1', '5', '3',
1647  '1', '5', '4',
1648  '1', '5', '5',
1649  '1', '5', '6',
1650  '1', '5', '7',
1651  '1', '5', '8',
1652  '1', '5', '9',
1653  '1', '6', '0',
1654  '1', '6', '1',
1655  '1', '6', '2',
1656  '1', '6', '3',
1657  '1', '6', '4',
1658  '1', '6', '5',
1659  '1', '6', '6',
1660  '1', '6', '7',
1661  '1', '6', '8',
1662  '1', '6', '9',
1663  '1', '7', '0',
1664  '1', '7', '1',
1665  '1', '7', '2',
1666  '1', '7', '3',
1667  '1', '7', '4',
1668  '1', '7', '5',
1669  '1', '7', '6',
1670  '1', '7', '7',
1671  '1', '7', '8',
1672  '1', '7', '9',
1673  '1', '8', '0',
1674  '1', '8', '1',
1675  '1', '8', '2',
1676  '1', '8', '3',
1677  '1', '8', '4',
1678  '1', '8', '5',
1679  '1', '8', '6',
1680  '1', '8', '7',
1681  '1', '8', '8',
1682  '1', '8', '9',
1683  '1', '9', '0',
1684  '1', '9', '1',
1685  '1', '9', '2',
1686  '1', '9', '3',
1687  '1', '9', '4',
1688  '1', '9', '5',
1689  '1', '9', '6',
1690  '1', '9', '7',
1691  '1', '9', '8',
1692  '1', '9', '9',
1693  '2', '0', '0',
1694  '2', '0', '1',
1695  '2', '0', '2',
1696  '2', '0', '3',
1697  '2', '0', '4',
1698  '2', '0', '5',
1699  '2', '0', '6',
1700  '2', '0', '7',
1701  '2', '0', '8',
1702  '2', '0', '9',
1703  '2', '1', '0',
1704  '2', '1', '1',
1705  '2', '1', '2',
1706  '2', '1', '3',
1707  '2', '1', '4',
1708  '2', '1', '5',
1709  '2', '1', '6',
1710  '2', '1', '7',
1711  '2', '1', '8',
1712  '2', '1', '9',
1713  '2', '2', '0',
1714  '2', '2', '1',
1715  '2', '2', '2',
1716  '2', '2', '3',
1717  '2', '2', '4',
1718  '2', '2', '5',
1719  '2', '2', '6',
1720  '2', '2', '7',
1721  '2', '2', '8',
1722  '2', '2', '9',
1723  '2', '3', '0',
1724  '2', '3', '1',
1725  '2', '3', '2',
1726  '2', '3', '3',
1727  '2', '3', '4',
1728  '2', '3', '5',
1729  '2', '3', '6',
1730  '2', '3', '7',
1731  '2', '3', '8',
1732  '2', '3', '9',
1733  '2', '4', '0',
1734  '2', '4', '1',
1735  '2', '4', '2',
1736  '2', '4', '3',
1737  '2', '4', '4',
1738  '2', '4', '5',
1739  '2', '4', '6',
1740  '2', '4', '7',
1741  '2', '4', '8',
1742  '2', '4', '9',
1743  '2', '5', '0',
1744  '2', '5', '1',
1745  '2', '5', '2',
1746  '2', '5', '3',
1747  '2', '5', '4',
1748  '2', '5', '5',
1749  '2', '5', '6',
1750  '2', '5', '7',
1751  '2', '5', '8',
1752  '2', '5', '9',
1753  '2', '6', '0',
1754  '2', '6', '1',
1755  '2', '6', '2',
1756  '2', '6', '3',
1757  '2', '6', '4',
1758  '2', '6', '5',
1759  '2', '6', '6',
1760  '2', '6', '7',
1761  '2', '6', '8',
1762  '2', '6', '9',
1763  '2', '7', '0',
1764  '2', '7', '1',
1765  '2', '7', '2',
1766  '2', '7', '3',
1767  '2', '7', '4',
1768  '2', '7', '5',
1769  '2', '7', '6',
1770  '2', '7', '7',
1771  '2', '7', '8',
1772  '2', '7', '9',
1773  '2', '8', '0',
1774  '2', '8', '1',
1775  '2', '8', '2',
1776  '2', '8', '3',
1777  '2', '8', '4',
1778  '2', '8', '5',
1779  '2', '8', '6',
1780  '2', '8', '7',
1781  '2', '8', '8',
1782  '2', '8', '9',
1783  '2', '9', '0',
1784  '2', '9', '1',
1785  '2', '9', '2',
1786  '2', '9', '3',
1787  '2', '9', '4',
1788  '2', '9', '5',
1789  '2', '9', '6',
1790  '2', '9', '7',
1791  '2', '9', '8',
1792  '2', '9', '9',
1793  '3', '0', '0',
1794  '3', '0', '1',
1795  '3', '0', '2',
1796  '3', '0', '3',
1797  '3', '0', '4',
1798  '3', '0', '5',
1799  '3', '0', '6',
1800  '3', '0', '7',
1801  '3', '0', '8',
1802  '3', '0', '9',
1803  '3', '1', '0',
1804  '3', '1', '1',
1805  '3', '1', '2',
1806  '3', '1', '3',
1807  '3', '1', '4',
1808  '3', '1', '5',
1809  '3', '1', '6',
1810  '3', '1', '7',
1811  '3', '1', '8',
1812  '3', '1', '9',
1813  '3', '2', '0',
1814  '3', '2', '1',
1815  '3', '2', '2',
1816  '3', '2', '3',
1817  '3', '2', '4',
1818  '3', '2', '5',
1819  '3', '2', '6',
1820  '3', '2', '7',
1821  '3', '2', '8',
1822  '3', '2', '9',
1823  '3', '3', '0',
1824  '3', '3', '1',
1825  '3', '3', '2',
1826  '3', '3', '3',
1827  '3', '3', '4',
1828  '3', '3', '5',
1829  '3', '3', '6',
1830  '3', '3', '7',
1831  '3', '3', '8',
1832  '3', '3', '9',
1833  '3', '4', '0',
1834  '3', '4', '1',
1835  '3', '4', '2',
1836  '3', '4', '3',
1837  '3', '4', '4',
1838  '3', '4', '5',
1839  '3', '4', '6',
1840  '3', '4', '7',
1841  '3', '4', '8',
1842  '3', '4', '9',
1843  '3', '5', '0',
1844  '3', '5', '1',
1845  '3', '5', '2',
1846  '3', '5', '3',
1847  '3', '5', '4',
1848  '3', '5', '5',
1849  '3', '5', '6',
1850  '3', '5', '7',
1851  '3', '5', '8',
1852  '3', '5', '9',
1853  '3', '6', '0',
1854  '3', '6', '1',
1855  '3', '6', '2',
1856  '3', '6', '3',
1857  '3', '6', '4',
1858  '3', '6', '5',
1859  '3', '6', '6',
1860  '3', '6', '7',
1861  '3', '6', '8',
1862  '3', '6', '9',
1863  '3', '7', '0',
1864  '3', '7', '1',
1865  '3', '7', '2',
1866  '3', '7', '3',
1867  '3', '7', '4',
1868  '3', '7', '5',
1869  '3', '7', '6',
1870  '3', '7', '7',
1871  '3', '7', '8',
1872  '3', '7', '9',
1873  '3', '8', '0',
1874  '3', '8', '1',
1875  '3', '8', '2',
1876  '3', '8', '3',
1877  '3', '8', '4',
1878  '3', '8', '5',
1879  '3', '8', '6',
1880  '3', '8', '7',
1881  '3', '8', '8',
1882  '3', '8', '9',
1883  '3', '9', '0',
1884  '3', '9', '1',
1885  '3', '9', '2',
1886  '3', '9', '3',
1887  '3', '9', '4',
1888  '3', '9', '5',
1889  '3', '9', '6',
1890  '3', '9', '7',
1891  '3', '9', '8',
1892  '3', '9', '9',
1893  '4', '0', '0',
1894  '4', '0', '1',
1895  '4', '0', '2',
1896  '4', '0', '3',
1897  '4', '0', '4',
1898  '4', '0', '5',
1899  '4', '0', '6',
1900  '4', '0', '7',
1901  '4', '0', '8',
1902  '4', '0', '9',
1903  '4', '1', '0',
1904  '4', '1', '1',
1905  '4', '1', '2',
1906  '4', '1', '3',
1907  '4', '1', '4',
1908  '4', '1', '5',
1909  '4', '1', '6',
1910  '4', '1', '7',
1911  '4', '1', '8',
1912  '4', '1', '9',
1913  '4', '2', '0',
1914  '4', '2', '1',
1915  '4', '2', '2',
1916  '4', '2', '3',
1917  '4', '2', '4',
1918  '4', '2', '5',
1919  '4', '2', '6',
1920  '4', '2', '7',
1921  '4', '2', '8',
1922  '4', '2', '9',
1923  '4', '3', '0',
1924  '4', '3', '1',
1925  '4', '3', '2',
1926  '4', '3', '3',
1927  '4', '3', '4',
1928  '4', '3', '5',
1929  '4', '3', '6',
1930  '4', '3', '7',
1931  '4', '3', '8',
1932  '4', '3', '9',
1933  '4', '4', '0',
1934  '4', '4', '1',
1935  '4', '4', '2',
1936  '4', '4', '3',
1937  '4', '4', '4',
1938  '4', '4', '5',
1939  '4', '4', '6',
1940  '4', '4', '7',
1941  '4', '4', '8',
1942  '4', '4', '9',
1943  '4', '5', '0',
1944  '4', '5', '1',
1945  '4', '5', '2',
1946  '4', '5', '3',
1947  '4', '5', '4',
1948  '4', '5', '5',
1949  '4', '5', '6',
1950  '4', '5', '7',
1951  '4', '5', '8',
1952  '4', '5', '9',
1953  '4', '6', '0',
1954  '4', '6', '1',
1955  '4', '6', '2',
1956  '4', '6', '3',
1957  '4', '6', '4',
1958  '4', '6', '5',
1959  '4', '6', '6',
1960  '4', '6', '7',
1961  '4', '6', '8',
1962  '4', '6', '9',
1963  '4', '7', '0',
1964  '4', '7', '1',
1965  '4', '7', '2',
1966  '4', '7', '3',
1967  '4', '7', '4',
1968  '4', '7', '5',
1969  '4', '7', '6',
1970  '4', '7', '7',
1971  '4', '7', '8',
1972  '4', '7', '9',
1973  '4', '8', '0',
1974  '4', '8', '1',
1975  '4', '8', '2',
1976  '4', '8', '3',
1977  '4', '8', '4',
1978  '4', '8', '5',
1979  '4', '8', '6',
1980  '4', '8', '7',
1981  '4', '8', '8',
1982  '4', '8', '9',
1983  '4', '9', '0',
1984  '4', '9', '1',
1985  '4', '9', '2',
1986  '4', '9', '3',
1987  '4', '9', '4',
1988  '4', '9', '5',
1989  '4', '9', '6',
1990  '4', '9', '7',
1991  '4', '9', '8',
1992  '4', '9', '9',
1993  '5', '0', '0',
1994  '5', '0', '1',
1995  '5', '0', '2',
1996  '5', '0', '3',
1997  '5', '0', '4',
1998  '5', '0', '5',
1999  '5', '0', '6',
2000  '5', '0', '7',
2001  '5', '0', '8',
2002  '5', '0', '9',
2003  '5', '1', '0',
2004  '5', '1', '1',
2005  '5', '1', '2',
2006  '5', '1', '3',
2007  '5', '1', '4',
2008  '5', '1', '5',
2009  '5', '1', '6',
2010  '5', '1', '7',
2011  '5', '1', '8',
2012  '5', '1', '9',
2013  '5', '2', '0',
2014  '5', '2', '1',
2015  '5', '2', '2',
2016  '5', '2', '3',
2017  '5', '2', '4',
2018  '5', '2', '5',
2019  '5', '2', '6',
2020  '5', '2', '7',
2021  '5', '2', '8',
2022  '5', '2', '9',
2023  '5', '3', '0',
2024  '5', '3', '1',
2025  '5', '3', '2',
2026  '5', '3', '3',
2027  '5', '3', '4',
2028  '5', '3', '5',
2029  '5', '3', '6',
2030  '5', '3', '7',
2031  '5', '3', '8',
2032  '5', '3', '9',
2033  '5', '4', '0',
2034  '5', '4', '1',
2035  '5', '4', '2',
2036  '5', '4', '3',
2037  '5', '4', '4',
2038  '5', '4', '5',
2039  '5', '4', '6',
2040  '5', '4', '7',
2041  '5', '4', '8',
2042  '5', '4', '9',
2043  '5', '5', '0',
2044  '5', '5', '1',
2045  '5', '5', '2',
2046  '5', '5', '3',
2047  '5', '5', '4',
2048  '5', '5', '5',
2049  '5', '5', '6',
2050  '5', '5', '7',
2051  '5', '5', '8',
2052  '5', '5', '9',
2053  '5', '6', '0',
2054  '5', '6', '1',
2055  '5', '6', '2',
2056  '5', '6', '3',
2057  '5', '6', '4',
2058  '5', '6', '5',
2059  '5', '6', '6',
2060  '5', '6', '7',
2061  '5', '6', '8',
2062  '5', '6', '9',
2063  '5', '7', '0',
2064  '5', '7', '1',
2065  '5', '7', '2',
2066  '5', '7', '3',
2067  '5', '7', '4',
2068  '5', '7', '5',
2069  '5', '7', '6',
2070  '5', '7', '7',
2071  '5', '7', '8',
2072  '5', '7', '9',
2073  '5', '8', '0',
2074  '5', '8', '1',
2075  '5', '8', '2',
2076  '5', '8', '3',
2077  '5', '8', '4',
2078  '5', '8', '5',
2079  '5', '8', '6',
2080  '5', '8', '7',
2081  '5', '8', '8',
2082  '5', '8', '9',
2083  '5', '9', '0',
2084  '5', '9', '1',
2085  '5', '9', '2',
2086  '5', '9', '3',
2087  '5', '9', '4',
2088  '5', '9', '5',
2089  '5', '9', '6',
2090  '5', '9', '7',
2091  '5', '9', '8',
2092  '5', '9', '9',
2093  '6', '0', '0',
2094  '6', '0', '1',
2095  '6', '0', '2',
2096  '6', '0', '3',
2097  '6', '0', '4',
2098  '6', '0', '5',
2099  '6', '0', '6',
2100  '6', '0', '7',
2101  '6', '0', '8',
2102  '6', '0', '9',
2103  '6', '1', '0',
2104  '6', '1', '1',
2105  '6', '1', '2',
2106  '6', '1', '3',
2107  '6', '1', '4',
2108  '6', '1', '5',
2109  '6', '1', '6',
2110  '6', '1', '7',
2111  '6', '1', '8',
2112  '6', '1', '9',
2113  '6', '2', '0',
2114  '6', '2', '1',
2115  '6', '2', '2',
2116  '6', '2', '3',
2117  '6', '2', '4',
2118  '6', '2', '5',
2119  '6', '2', '6',
2120  '6', '2', '7',
2121  '6', '2', '8',
2122  '6', '2', '9',
2123  '6', '3', '0',
2124  '6', '3', '1',
2125  '6', '3', '2',
2126  '6', '3', '3',
2127  '6', '3', '4',
2128  '6', '3', '5',
2129  '6', '3', '6',
2130  '6', '3', '7',
2131  '6', '3', '8',
2132  '6', '3', '9',
2133  '6', '4', '0',
2134  '6', '4', '1',
2135  '6', '4', '2',
2136  '6', '4', '3',
2137  '6', '4', '4',
2138  '6', '4', '5',
2139  '6', '4', '6',
2140  '6', '4', '7',
2141  '6', '4', '8',
2142  '6', '4', '9',
2143  '6', '5', '0',
2144  '6', '5', '1',
2145  '6', '5', '2',
2146  '6', '5', '3',
2147  '6', '5', '4',
2148  '6', '5', '5',
2149  '6', '5', '6',
2150  '6', '5', '7',
2151  '6', '5', '8',
2152  '6', '5', '9',
2153  '6', '6', '0',
2154  '6', '6', '1',
2155  '6', '6', '2',
2156  '6', '6', '3',
2157  '6', '6', '4',
2158  '6', '6', '5',
2159  '6', '6', '6',
2160  '6', '6', '7',
2161  '6', '6', '8',
2162  '6', '6', '9',
2163  '6', '7', '0',
2164  '6', '7', '1',
2165  '6', '7', '2',
2166  '6', '7', '3',
2167  '6', '7', '4',
2168  '6', '7', '5',
2169  '6', '7', '6',
2170  '6', '7', '7',
2171  '6', '7', '8',
2172  '6', '7', '9',
2173  '6', '8', '0',
2174  '6', '8', '1',
2175  '6', '8', '2',
2176  '6', '8', '3',
2177  '6', '8', '4',
2178  '6', '8', '5',
2179  '6', '8', '6',
2180  '6', '8', '7',
2181  '6', '8', '8',
2182  '6', '8', '9',
2183  '6', '9', '0',
2184  '6', '9', '1',
2185  '6', '9', '2',
2186  '6', '9', '3',
2187  '6', '9', '4',
2188  '6', '9', '5',
2189  '6', '9', '6',
2190  '6', '9', '7',
2191  '6', '9', '8',
2192  '6', '9', '9',
2193  '7', '0', '0',
2194  '7', '0', '1',
2195  '7', '0', '2',
2196  '7', '0', '3',
2197  '7', '0', '4',
2198  '7', '0', '5',
2199  '7', '0', '6',
2200  '7', '0', '7',
2201  '7', '0', '8',
2202  '7', '0', '9',
2203  '7', '1', '0',
2204  '7', '1', '1',
2205  '7', '1', '2',
2206  '7', '1', '3',
2207  '7', '1', '4',
2208  '7', '1', '5',
2209  '7', '1', '6',
2210  '7', '1', '7',
2211  '7', '1', '8',
2212  '7', '1', '9',
2213  '7', '2', '0',
2214  '7', '2', '1',
2215  '7', '2', '2',
2216  '7', '2', '3',
2217  '7', '2', '4',
2218  '7', '2', '5',
2219  '7', '2', '6',
2220  '7', '2', '7',
2221  '7', '2', '8',
2222  '7', '2', '9',
2223  '7', '3', '0',
2224  '7', '3', '1',
2225  '7', '3', '2',
2226  '7', '3', '3',
2227  '7', '3', '4',
2228  '7', '3', '5',
2229  '7', '3', '6',
2230  '7', '3', '7',
2231  '7', '3', '8',
2232  '7', '3', '9',
2233  '7', '4', '0',
2234  '7', '4', '1',
2235  '7', '4', '2',
2236  '7', '4', '3',
2237  '7', '4', '4',
2238  '7', '4', '5',
2239  '7', '4', '6',
2240  '7', '4', '7',
2241  '7', '4', '8',
2242  '7', '4', '9',
2243  '7', '5', '0',
2244  '7', '5', '1',
2245  '7', '5', '2',
2246  '7', '5', '3',
2247  '7', '5', '4',
2248  '7', '5', '5',
2249  '7', '5', '6',
2250  '7', '5', '7',
2251  '7', '5', '8',
2252  '7', '5', '9',
2253  '7', '6', '0',
2254  '7', '6', '1',
2255  '7', '6', '2',
2256  '7', '6', '3',
2257  '7', '6', '4',
2258  '7', '6', '5',
2259  '7', '6', '6',
2260  '7', '6', '7',
2261  '7', '6', '8',
2262  '7', '6', '9',
2263  '7', '7', '0',
2264  '7', '7', '1',
2265  '7', '7', '2',
2266  '7', '7', '3',
2267  '7', '7', '4',
2268  '7', '7', '5',
2269  '7', '7', '6',
2270  '7', '7', '7',
2271  '7', '7', '8',
2272  '7', '7', '9',
2273  '7', '8', '0',
2274  '7', '8', '1',
2275  '7', '8', '2',
2276  '7', '8', '3',
2277  '7', '8', '4',
2278  '7', '8', '5',
2279  '7', '8', '6',
2280  '7', '8', '7',
2281  '7', '8', '8',
2282  '7', '8', '9',
2283  '7', '9', '0',
2284  '7', '9', '1',
2285  '7', '9', '2',
2286  '7', '9', '3',
2287  '7', '9', '4',
2288  '7', '9', '5',
2289  '7', '9', '6',
2290  '7', '9', '7',
2291  '7', '9', '8',
2292  '7', '9', '9',
2293  '8', '0', '0',
2294  '8', '0', '1',
2295  '8', '0', '2',
2296  '8', '0', '3',
2297  '8', '0', '4',
2298  '8', '0', '5',
2299  '8', '0', '6',
2300  '8', '0', '7',
2301  '8', '0', '8',
2302  '8', '0', '9',
2303  '8', '1', '0',
2304  '8', '1', '1',
2305  '8', '1', '2',
2306  '8', '1', '3',
2307  '8', '1', '4',
2308  '8', '1', '5',
2309  '8', '1', '6',
2310  '8', '1', '7',
2311  '8', '1', '8',
2312  '8', '1', '9',
2313  '8', '2', '0',
2314  '8', '2', '1',
2315  '8', '2', '2',
2316  '8', '2', '3',
2317  '8', '2', '4',
2318  '8', '2', '5',
2319  '8', '2', '6',
2320  '8', '2', '7',
2321  '8', '2', '8',
2322  '8', '2', '9',
2323  '8', '3', '0',
2324  '8', '3', '1',
2325  '8', '3', '2',
2326  '8', '3', '3',
2327  '8', '3', '4',
2328  '8', '3', '5',
2329  '8', '3', '6',
2330  '8', '3', '7',
2331  '8', '3', '8',
2332  '8', '3', '9',
2333  '8', '4', '0',
2334  '8', '4', '1',
2335  '8', '4', '2',
2336  '8', '4', '3',
2337  '8', '4', '4',
2338  '8', '4', '5',
2339  '8', '4', '6',
2340  '8', '4', '7',
2341  '8', '4', '8',
2342  '8', '4', '9',
2343  '8', '5', '0',
2344  '8', '5', '1',
2345  '8', '5', '2',
2346  '8', '5', '3',
2347  '8', '5', '4',
2348  '8', '5', '5',
2349  '8', '5', '6',
2350  '8', '5', '7',
2351  '8', '5', '8',
2352  '8', '5', '9',
2353  '8', '6', '0',
2354  '8', '6', '1',
2355  '8', '6', '2',
2356  '8', '6', '3',
2357  '8', '6', '4',
2358  '8', '6', '5',
2359  '8', '6', '6',
2360  '8', '6', '7',
2361  '8', '6', '8',
2362  '8', '6', '9',
2363  '8', '7', '0',
2364  '8', '7', '1',
2365  '8', '7', '2',
2366  '8', '7', '3',
2367  '8', '7', '4',
2368  '8', '7', '5',
2369  '8', '7', '6',
2370  '8', '7', '7',
2371  '8', '7', '8',
2372  '8', '7', '9',
2373  '8', '8', '0',
2374  '8', '8', '1',
2375  '8', '8', '2',
2376  '8', '8', '3',
2377  '8', '8', '4',
2378  '8', '8', '5',
2379  '8', '8', '6',
2380  '8', '8', '7',
2381  '8', '8', '8',
2382  '8', '8', '9',
2383  '8', '9', '0',
2384  '8', '9', '1',
2385  '8', '9', '2',
2386  '8', '9', '3',
2387  '8', '9', '4',
2388  '8', '9', '5',
2389  '8', '9', '6',
2390  '8', '9', '7',
2391  '8', '9', '8',
2392  '8', '9', '9',
2393  '9', '0', '0',
2394  '9', '0', '1',
2395  '9', '0', '2',
2396  '9', '0', '3',
2397  '9', '0', '4',
2398  '9', '0', '5',
2399  '9', '0', '6',
2400  '9', '0', '7',
2401  '9', '0', '8',
2402  '9', '0', '9',
2403  '9', '1', '0',
2404  '9', '1', '1',
2405  '9', '1', '2',
2406  '9', '1', '3',
2407  '9', '1', '4',
2408  '9', '1', '5',
2409  '9', '1', '6',
2410  '9', '1', '7',
2411  '9', '1', '8',
2412  '9', '1', '9',
2413  '9', '2', '0',
2414  '9', '2', '1',
2415  '9', '2', '2',
2416  '9', '2', '3',
2417  '9', '2', '4',
2418  '9', '2', '5',
2419  '9', '2', '6',
2420  '9', '2', '7',
2421  '9', '2', '8',
2422  '9', '2', '9',
2423  '9', '3', '0',
2424  '9', '3', '1',
2425  '9', '3', '2',
2426  '9', '3', '3',
2427  '9', '3', '4',
2428  '9', '3', '5',
2429  '9', '3', '6',
2430  '9', '3', '7',
2431  '9', '3', '8',
2432  '9', '3', '9',
2433  '9', '4', '0',
2434  '9', '4', '1',
2435  '9', '4', '2',
2436  '9', '4', '3',
2437  '9', '4', '4',
2438  '9', '4', '5',
2439  '9', '4', '6',
2440  '9', '4', '7',
2441  '9', '4', '8',
2442  '9', '4', '9',
2443  '9', '5', '0',
2444  '9', '5', '1',
2445  '9', '5', '2',
2446  '9', '5', '3',
2447  '9', '5', '4',
2448  '9', '5', '5',
2449  '9', '5', '6',
2450  '9', '5', '7',
2451  '9', '5', '8',
2452  '9', '5', '9',
2453  '9', '6', '0',
2454  '9', '6', '1',
2455  '9', '6', '2',
2456  '9', '6', '3',
2457  '9', '6', '4',
2458  '9', '6', '5',
2459  '9', '6', '6',
2460  '9', '6', '7',
2461  '9', '6', '8',
2462  '9', '6', '9',
2463  '9', '7', '0',
2464  '9', '7', '1',
2465  '9', '7', '2',
2466  '9', '7', '3',
2467  '9', '7', '4',
2468  '9', '7', '5',
2469  '9', '7', '6',
2470  '9', '7', '7',
2471  '9', '7', '8',
2472  '9', '7', '9',
2473  '9', '8', '0',
2474  '9', '8', '1',
2475  '9', '8', '2',
2476  '9', '8', '3',
2477  '9', '8', '4',
2478  '9', '8', '5',
2479  '9', '8', '6',
2480  '9', '8', '7',
2481  '9', '8', '8',
2482  '9', '8', '9',
2483  '9', '9', '0',
2484  '9', '9', '1',
2485  '9', '9', '2',
2486  '9', '9', '3',
2487  '9', '9', '4',
2488  '9', '9', '5',
2489  '9', '9', '6',
2490  '9', '9', '7',
2491  '9', '9', '8',
2492  '9', '9', '9'
2493};
2494
2495// ten2m3k64[], shift_ten2m3k64[] used for conversion from BID128 to string
2496UINT64 ten2m3k64[] = {
2497  0x4189374bc6a7ef9eull,	// 4189374bc6a7ef9e * 2^-72 = (10^-3)RP,63
2498  0x10c6f7a0b5ed8d37ull,	// 10c6f7a0b5ed8d37 * 2^-80 = (10^-6)RP,61
2499  0x44b82fa09b5a52ccull,	// 44b82fa09b5a52cc * 2^-92 = (10^-9)RP,63
2500  0x119799812dea111aull,	// 119799812dea111a * 2^-100 = (10^-12)RP,61
2501  0x480ebe7b9d58566dull	// 480ebe7b9d58566d * 2^-112 = (10^-15)RP,63
2502};
2503
2504unsigned int shift_ten2m3k64[] = {
2505  8,	// 72 - 64
2506  16,	// 80 - 64
2507  28,	// 92 - 64
2508  36,	// 100 - 64
2509  48	// 112 - 64
2510};
2511
2512UINT128 ten2m3k128[] = {
2513  {{0xb22d0e5604189375ull, 0x4189374bc6a7ef9dull}},
2514  // 4189374bc6a7ef9d  b22d0e5604189375  * 2^-136 = (10^-3)RP,127
2515  {{0xb4c7f34938583622ull, 0x10c6f7a0b5ed8d36ull}},
2516  // 10c6f7a0b5ed8d36  b4c7f34938583622  * 2^-144 = (10^-6)RP,125
2517  {{0x98b405447c4a9819ull, 0x44b82fa09b5a52cbull}},
2518  // 44b82fa09b5a52cb  98b405447c4a9819  * 2^-156 = (10^-9)RP,127
2519  {{0x7f27f0f6e885c8bbull, 0x119799812dea1119ull}},
2520  // 119799812dea1119  7f27f0f6e885c8bb  * 2^-164 = (10^-12)RP,125
2521  {{0x87ce9b80a5fb0509ull, 0x480ebe7b9d58566cull}},
2522  // 480ebe7b9d58566c  87ce9b80a5fb0509  * 2^-176 = (10^-15)RP,127
2523  {{0xe75fe645cc4873faull, 0x12725dd1d243aba0ull}},
2524  // 12725dd1d243aba0  e75fe645cc4873fa  * 2^-184 = (10^-18)RP,125
2525  {{0x69fb7e0b75e52f02ull, 0x4b8ed0283a6d3df7ull}},
2526  // 4b8ed0283a6d3df7  69fb7e0b75e52f02  * 2^-196 = (10^-21)RP,127
2527  {{0x58924d52ce4f26a9ull, 0x1357c299a88ea76aull}},
2528  // 1357c299a88ea76a  58924d52ce4f26a9  * 2^-204 = (10^-24)RP,125
2529  {{0x3baf513267aa9a3full, 0x4f3a68dbc8f03f24ull}},
2530  // 4f3a68dbc8f03f24  3baf513267aa9a3f  * 2^-216 = (10^-27)RP,127
2531  {{0x3424b06f3529a052ull, 0x14484bfeebc29f86ull}},
2532  // 14484bfeebc29f86  3424b06f3529a052  * 2^-224 = (10^-30)RP,125
2533  {{0xf658d6c57566eac8ull, 0x5313a5dee87d6eb0ull}}
2534  // 5313a5dee87d6eb0  f658d6c57566eac8  * 2^-236 = (10^-33)RP,127
2535};
2536
2537unsigned int shift_ten2m3k128[] = {
2538  8,	// 136 - 128
2539  16,	// 144 - 128
2540  28,	// 156 - 128
2541  36,	// 164 - 128
2542  48,	// 176 - 128
2543  56,	// 184 - 128
2544  4,	// 196 - 192
2545  12,	// 204 - 192
2546  24,	// 216 - 192
2547  32,	// 224 - 192
2548  44	// 236 - 192
2549};
2550
2551
2552/***************************************************************************
2553 *************** TABLES FOR GENERAL ROUNDING FUNCTIONS *********************
2554 ***************************************************************************/
2555// Note: not all entries in these tables will be used with IEEE 754R decimal
2556// floating-point arithmetic
2557// a) In round128_2_18() numbers with 2 <= q <= 18 will be rounded only
2558//    for 1 <= x <= 3:
2559//     x = 1 or x = 2 when q = 17
2560//     x = 2 or x = 3 when q = 18
2561// b) In round128_19_38() numbers with 19 <= q <= 38 will be rounded only
2562//    for 1 <= x <= 23:
2563//     x = 3 or x = 4 when q = 19
2564//     x = 4 or x = 5 when q = 20
2565//     ...
2566//     x = 18 or x = 19 when q = 34
2567//     x = 1 or x = 2 or x = 19 or x = 20 when q = 35
2568//     x = 2 or x = 3 or x = 20 or x = 21 when q = 36
2569//     x = 3 or x = 4 or x = 21 or x = 22 when q = 37
2570//     x = 4 or x = 5 or x = 22 or x = 23 when q = 38
2571// c) ...
2572// However, for generality and possible uses outside the frame of IEEE 754R
2573// this implementation includes table values for all x in [1, q - 1]
2574
2575// Note: 64-bit tables generated with ten2mx64.ma; output in ten2mx64.out
2576
2577// Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
2578UINT64 Kx64[] = {
2579  0xcccccccccccccccdULL,	// 10^-1 ~= cccccccccccccccd * 2^-67
2580  0xa3d70a3d70a3d70bULL,	// 10^-2 ~= a3d70a3d70a3d70b * 2^-70
2581  0x83126e978d4fdf3cULL,	// 10^-3 ~= 83126e978d4fdf3c * 2^-73
2582  0xd1b71758e219652cULL,	// 10^-4 ~= d1b71758e219652c * 2^-77
2583  0xa7c5ac471b478424ULL,	// 10^-5 ~= a7c5ac471b478424 * 2^-80
2584  0x8637bd05af6c69b6ULL,	// 10^-6 ~= 8637bd05af6c69b6 * 2^-83
2585  0xd6bf94d5e57a42bdULL,	// 10^-7 ~= d6bf94d5e57a42bd * 2^-87
2586  0xabcc77118461cefdULL,	// 10^-8 ~= abcc77118461cefd * 2^-90
2587  0x89705f4136b4a598ULL,	// 10^-9 ~= 89705f4136b4a598 * 2^-93
2588  0xdbe6fecebdedd5bfULL,	// 10^-10 ~= dbe6fecebdedd5bf * 2^-97
2589  0xafebff0bcb24aaffULL,	// 10^-11 ~= afebff0bcb24aaff * 2^-100
2590  0x8cbccc096f5088ccULL,	// 10^-12 ~= 8cbccc096f5088cc * 2^-103
2591  0xe12e13424bb40e14ULL,	// 10^-13 ~= e12e13424bb40e14 * 2^-107
2592  0xb424dc35095cd810ULL,	// 10^-14 ~= b424dc35095cd810 * 2^-110
2593  0x901d7cf73ab0acdaULL,	// 10^-15 ~= 901d7cf73ab0acda * 2^-113
2594  0xe69594bec44de15cULL,	// 10^-16 ~= e69594bec44de15c * 2^-117
2595  0xb877aa3236a4b44aULL	// 10^-17 ~= b877aa3236a4b44a * 2^-120
2596};
2597
2598// Ex-64 from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
2599unsigned int Ex64m64[] = {
2600  3,	// 67 - 64, Ex = 67
2601  6,	// 70 - 64, Ex = 70
2602  9,	// 73 - 64, Ex = 73
2603  13,	// 77 - 64, Ex = 77
2604  16,	// 80 - 64, Ex = 80
2605  19,	// 83 - 64, Ex = 83
2606  23,	// 87 - 64, Ex = 87
2607  26,	// 90 - 64, Ex = 90
2608  29,	// 93 - 64, Ex = 93
2609  33,	// 97 - 64, Ex = 97
2610  36,	// 100 - 64, Ex = 100
2611  39,	// 103 - 64, Ex = 103
2612  43,	// 107 - 64, Ex = 107
2613  46,	// 110 - 64, Ex = 110
2614  49,	// 113 - 64, Ex = 113
2615  53,	// 117 - 64, Ex = 117
2616  56	// 120 - 64, Ex = 120
2617};
2618
2619// Values of 1/2 in the right position to be compared with the fraction from
2620// C * kx, 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
2621// (these values are aligned with the high 64 bits of the fraction)
2622UINT64 half64[] = {
2623  0x0000000000000004ULL,	// half / 2^64 = 4
2624  0x0000000000000020ULL,	// half / 2^64 = 20
2625  0x0000000000000100ULL,	// half / 2^64 = 100
2626  0x0000000000001000ULL,	// half / 2^64 = 1000
2627  0x0000000000008000ULL,	// half / 2^64 = 8000
2628  0x0000000000040000ULL,	// half / 2^64 = 40000
2629  0x0000000000400000ULL,	// half / 2^64 = 400000
2630  0x0000000002000000ULL,	// half / 2^64 = 2000000
2631  0x0000000010000000ULL,	// half / 2^64 = 10000000
2632  0x0000000100000000ULL,	// half / 2^64 = 100000000
2633  0x0000000800000000ULL,	// half / 2^64 = 800000000
2634  0x0000004000000000ULL,	// half / 2^64 = 4000000000
2635  0x0000040000000000ULL,	// half / 2^64 = 40000000000
2636  0x0000200000000000ULL,	// half / 2^64 = 200000000000
2637  0x0001000000000000ULL,	// half / 2^64 = 1000000000000
2638  0x0010000000000000ULL,	// half / 2^64 = 10000000000000
2639  0x0080000000000000ULL	// half / 2^64 = 80000000000000
2640};
2641
2642// Values of mask in the right position to obtain the high Ex - 64 bits
2643// of the fraction from C * kx, 1 <= x <= 17; the fraction consists of
2644// the low Ex bits in C * kx
2645UINT64 mask64[] = {
2646  0x0000000000000007ULL,	// mask / 2^64
2647  0x000000000000003fULL,	// mask / 2^64
2648  0x00000000000001ffULL,	// mask / 2^64
2649  0x0000000000001fffULL,	// mask / 2^64
2650  0x000000000000ffffULL,	// mask / 2^64
2651  0x000000000007ffffULL,	// mask / 2^64
2652  0x00000000007fffffULL,	// mask / 2^64
2653  0x0000000003ffffffULL,	// mask / 2^64
2654  0x000000001fffffffULL,	// mask / 2^64
2655  0x00000001ffffffffULL,	// mask / 2^64
2656  0x0000000fffffffffULL,	// mask / 2^64
2657  0x0000007fffffffffULL,	// mask / 2^64
2658  0x000007ffffffffffULL,	// mask / 2^64
2659  0x00003fffffffffffULL,	// mask / 2^64
2660  0x0001ffffffffffffULL,	// mask / 2^64
2661  0x001fffffffffffffULL,	// mask / 2^64
2662  0x00ffffffffffffffULL	// mask / 2^64
2663};
2664
2665// Values of 10^(-x) trancated to Ex bits beyond the binary point, and
2666// in the right position to be compared with the fraction from C * kx,
2667// 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
2668// (these values are aligned with the low 64 bits of the fraction)
2669UINT64 ten2mxtrunc64[] = {
2670  0xccccccccccccccccULL,	// (ten2mx >> 64) = cccccccccccccccc
2671  0xa3d70a3d70a3d70aULL,	// (ten2mx >> 64) = a3d70a3d70a3d70a
2672  0x83126e978d4fdf3bULL,	// (ten2mx >> 64) = 83126e978d4fdf3b
2673  0xd1b71758e219652bULL,	// (ten2mx >> 64) = d1b71758e219652b
2674  0xa7c5ac471b478423ULL,	// (ten2mx >> 64) = a7c5ac471b478423
2675  0x8637bd05af6c69b5ULL,	// (ten2mx >> 64) = 8637bd05af6c69b5
2676  0xd6bf94d5e57a42bcULL,	// (ten2mx >> 64) = d6bf94d5e57a42bc
2677  0xabcc77118461cefcULL,	// (ten2mx >> 64) = abcc77118461cefc
2678  0x89705f4136b4a597ULL,	// (ten2mx >> 64) = 89705f4136b4a597
2679  0xdbe6fecebdedd5beULL,	// (ten2mx >> 64) = dbe6fecebdedd5be
2680  0xafebff0bcb24aafeULL,	// (ten2mx >> 64) = afebff0bcb24aafe
2681  0x8cbccc096f5088cbULL,	// (ten2mx >> 64) = 8cbccc096f5088cb
2682  0xe12e13424bb40e13ULL,	// (ten2mx >> 64) = e12e13424bb40e13
2683  0xb424dc35095cd80fULL,	// (ten2mx >> 64) = b424dc35095cd80f
2684  0x901d7cf73ab0acd9ULL,	// (ten2mx >> 64) = 901d7cf73ab0acd9
2685  0xe69594bec44de15bULL,	// (ten2mx >> 64) = e69594bec44de15b
2686  0xb877aa3236a4b449ULL	// (ten2mx >> 64) = b877aa3236a4b449
2687};
2688
2689// Note: 128-bit tables generated with ten2mx128.ma; output in ten2mx128.out
2690// The order of the 64-bit components is L, H
2691
2692// Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
2693UINT128 Kx128[] = {
2694  {{0xcccccccccccccccdULL, 0xccccccccccccccccULL}},
2695  // 10^-1 ~= cccccccccccccccccccccccccccccccd * 2^-131
2696  {{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}},
2697  // 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a4 * 2^-134
2698  {{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}},
2699  // 10^-3 ~= 83126e978d4fdf3b645a1cac083126ea * 2^-137
2700  {{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}},
2701  // 10^-4 ~= d1b71758e219652bd3c36113404ea4a9 * 2^-141
2702  {{0x0fcf80dc33721d54ULL, 0xa7c5ac471b478423ULL}},
2703  // 10^-5 ~= a7c5ac471b4784230fcf80dc33721d54 * 2^-144
2704  {{0xa63f9a49c2c1b110ULL, 0x8637bd05af6c69b5ULL}},
2705  // 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b110 * 2^-147
2706  {{0x3d32907604691b4dULL, 0xd6bf94d5e57a42bcULL}},
2707  // 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4d * 2^-151
2708  {{0xfdc20d2b36ba7c3eULL, 0xabcc77118461cefcULL}},
2709  // 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3e * 2^-154
2710  {{0x31680a88f8953031ULL, 0x89705f4136b4a597ULL}},
2711  // 10^-9 ~= 89705f4136b4a59731680a88f8953031 * 2^-157
2712  {{0xb573440e5a884d1cULL, 0xdbe6fecebdedd5beULL}},
2713  // 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1c * 2^-161
2714  {{0xf78f69a51539d749ULL, 0xafebff0bcb24aafeULL}},
2715  // 10^-11 ~= afebff0bcb24aafef78f69a51539d749 * 2^-164
2716  {{0xf93f87b7442e45d4ULL, 0x8cbccc096f5088cbULL}},
2717  // 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d4 * 2^-167
2718  {{0x2865a5f206b06fbaULL, 0xe12e13424bb40e13ULL}},
2719  // 10^-13 ~= e12e13424bb40e132865a5f206b06fba * 2^-171
2720  {{0x538484c19ef38c95ULL, 0xb424dc35095cd80fULL}},
2721  // 10^-14 ~= b424dc35095cd80f538484c19ef38c95 * 2^-174
2722  {{0x0f9d37014bf60a11ULL, 0x901d7cf73ab0acd9ULL}},
2723  // 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a11 * 2^-177
2724  {{0x4c2ebe687989a9b4ULL, 0xe69594bec44de15bULL}},
2725  // 10^-16 ~= e69594bec44de15b4c2ebe687989a9b4 * 2^-181
2726  {{0x09befeb9fad487c3ULL, 0xb877aa3236a4b449ULL}},
2727  // 10^-17 ~= b877aa3236a4b44909befeb9fad487c3 * 2^-184
2728  {{0x3aff322e62439fd0ULL, 0x9392ee8e921d5d07ULL}},
2729  // 10^-18 ~= 9392ee8e921d5d073aff322e62439fd0 * 2^-187
2730  {{0x2b31e9e3d06c32e6ULL, 0xec1e4a7db69561a5ULL}},
2731  // 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e6 * 2^-191
2732  {{0x88f4bb1ca6bcf585ULL, 0xbce5086492111aeaULL}},
2733  // 10^-20 ~= bce5086492111aea88f4bb1ca6bcf585 * 2^-194
2734  {{0xd3f6fc16ebca5e04ULL, 0x971da05074da7beeULL}},
2735  // 10^-21 ~= 971da05074da7beed3f6fc16ebca5e04 * 2^-197
2736  {{0x5324c68b12dd6339ULL, 0xf1c90080baf72cb1ULL}},
2737  // 10^-22 ~= f1c90080baf72cb15324c68b12dd6339 * 2^-201
2738  {{0x75b7053c0f178294ULL, 0xc16d9a0095928a27ULL}},
2739  // 10^-23 ~= c16d9a0095928a2775b7053c0f178294 * 2^-204
2740  {{0xc4926a9672793543ULL, 0x9abe14cd44753b52ULL}},
2741  // 10^-24 ~= 9abe14cd44753b52c4926a9672793543 * 2^-207
2742  {{0x3a83ddbd83f52205ULL, 0xf79687aed3eec551ULL}},
2743  // 10^-25 ~= f79687aed3eec5513a83ddbd83f52205 * 2^-211
2744  {{0x95364afe032a819eULL, 0xc612062576589ddaULL}},
2745  // 10^-26 ~= c612062576589dda95364afe032a819e * 2^-214
2746  {{0x775ea264cf55347eULL, 0x9e74d1b791e07e48ULL}},
2747  // 10^-27 ~= 9e74d1b791e07e48775ea264cf55347e * 2^-217
2748  {{0x8bca9d6e188853fdULL, 0xfd87b5f28300ca0dULL}},
2749  // 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fd * 2^-221
2750  {{0x096ee45813a04331ULL, 0xcad2f7f5359a3b3eULL}},
2751  // 10^-29 ~= cad2f7f5359a3b3e096ee45813a04331 * 2^-224
2752  {{0xa1258379a94d028eULL, 0xa2425ff75e14fc31ULL}},
2753  // 10^-30 ~= a2425ff75e14fc31a1258379a94d028e * 2^-227
2754  {{0x80eacf948770ced8ULL, 0x81ceb32c4b43fcf4ULL}},
2755  // 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced8 * 2^-230
2756  {{0x67de18eda5814af3ULL, 0xcfb11ead453994baULL}},
2757  // 10^-32 ~= cfb11ead453994ba67de18eda5814af3 * 2^-234
2758  {{0xecb1ad8aeacdd58fULL, 0xa6274bbdd0fadd61ULL}},
2759  // 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58f * 2^-237
2760  {{0xbd5af13bef0b113fULL, 0x84ec3c97da624ab4ULL}},
2761  // 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113f * 2^-240
2762  {{0x955e4ec64b44e865ULL, 0xd4ad2dbfc3d07787ULL}},
2763  // 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e865 * 2^-244
2764  {{0xdde50bd1d5d0b9eaULL, 0xaa242499697392d2ULL}},
2765  // 10^-36 ~= aa242499697392d2dde50bd1d5d0b9ea * 2^-247
2766  {{0x7e50d64177da2e55ULL, 0x881cea14545c7575ULL}}
2767  // 10^-37 ~= 881cea14545c75757e50d64177da2e55 * 2^-250
2768};
2769
2770// Ex-128 from 10^(-x) ~= Kx*2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
2771unsigned int Ex128m128[] = {
2772  3,	// 131 - 128, Ex = 131
2773  6,	// 134 - 128, Ex = 134
2774  9,	// 137 - 128, Ex = 137
2775  13,	// 141 - 128, Ex = 141
2776  16,	// 144 - 128, Ex = 144
2777  19,	// 147 - 128, Ex = 147
2778  23,	// 151 - 128, Ex = 151
2779  26,	// 154 - 128, Ex = 154
2780  29,	// 157 - 128, Ex = 157
2781  33,	// 161 - 128, Ex = 161
2782  36,	// 164 - 128, Ex = 164
2783  39,	// 167 - 128, Ex = 167
2784  43,	// 171 - 128, Ex = 171
2785  46,	// 174 - 128, Ex = 174
2786  49,	// 177 - 128, Ex = 177
2787  53,	// 181 - 128, Ex = 181
2788  56,	// 184 - 128, Ex = 184
2789  59,	// 187 - 128, Ex = 187
2790  63,	// 191 - 128, Ex = 191
2791  2,	// 194 - 192, Ex = 194
2792  5,	// 197 - 192, Ex = 197
2793  9,	// 201 - 192, Ex = 201
2794  12,	// 204 - 192, Ex = 204
2795  15,	// 207 - 192, Ex = 207
2796  19,	// 211 - 192, Ex = 211
2797  22,	// 214 - 192, Ex = 214
2798  25,	// 217 - 192, Ex = 217
2799  29,	// 221 - 192, Ex = 221
2800  32,	// 224 - 192, Ex = 224
2801  35,	// 227 - 192, Ex = 227
2802  38,	// 230 - 192, Ex = 230
2803  42,	// 234 - 192, Ex = 234
2804  45,	// 237 - 192, Ex = 237
2805  48,	// 240 - 192, Ex = 240
2806  52,	// 244 - 192, Ex = 244
2807  55,	// 247 - 192, Ex = 247
2808  58	// 250 - 192, Ex = 250
2809};
2810
2811// Values of 1/2 in the right position to be compared with the fraction from
2812// C * kx, 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
2813// (these values are aligned with the high 128 bits of the fraction)
2814UINT64 half128[] = {
2815  0x0000000000000004ULL,	// half / 2^128 = 4
2816  0x0000000000000020ULL,	// half / 2^128 = 20
2817  0x0000000000000100ULL,	// half / 2^128 = 100
2818  0x0000000000001000ULL,	// half / 2^128 = 1000
2819  0x0000000000008000ULL,	// half / 2^128 = 8000
2820  0x0000000000040000ULL,	// half / 2^128 = 40000
2821  0x0000000000400000ULL,	// half / 2^128 = 400000
2822  0x0000000002000000ULL,	// half / 2^128 = 2000000
2823  0x0000000010000000ULL,	// half / 2^128 = 10000000
2824  0x0000000100000000ULL,	// half / 2^128 = 100000000
2825  0x0000000800000000ULL,	// half / 2^128 = 800000000
2826  0x0000004000000000ULL,	// half / 2^128 = 4000000000
2827  0x0000040000000000ULL,	// half / 2^128 = 40000000000
2828  0x0000200000000000ULL,	// half / 2^128 = 200000000000
2829  0x0001000000000000ULL,	// half / 2^128 = 1000000000000
2830  0x0010000000000000ULL,	// half / 2^128 = 10000000000000
2831  0x0080000000000000ULL,	// half / 2^128 = 80000000000000
2832  0x0400000000000000ULL,	// half / 2^128 = 400000000000000
2833  0x4000000000000000ULL,	// half / 2^128 = 4000000000000000
2834  0x0000000000000002ULL,	// half / 2^192 = 2
2835  0x0000000000000010ULL,	// half / 2^192 = 10
2836  0x0000000000000100ULL,	// half / 2^192 = 100
2837  0x0000000000000800ULL,	// half / 2^192 = 800
2838  0x0000000000004000ULL,	// half / 2^192 = 4000
2839  0x0000000000040000ULL,	// half / 2^192 = 40000
2840  0x0000000000200000ULL,	// half / 2^192 = 200000
2841  0x0000000001000000ULL,	// half / 2^192 = 1000000
2842  0x0000000010000000ULL,	// half / 2^192 = 10000000
2843  0x0000000080000000ULL,	// half / 2^192 = 80000000
2844  0x0000000400000000ULL,	// half / 2^192 = 400000000
2845  0x0000002000000000ULL,	// half / 2^192 = 2000000000
2846  0x0000020000000000ULL,	// half / 2^192 = 20000000000
2847  0x0000100000000000ULL,	// half / 2^192 = 100000000000
2848  0x0000800000000000ULL,	// half / 2^192 = 800000000000
2849  0x0008000000000000ULL,	// half / 2^192 = 8000000000000
2850  0x0040000000000000ULL,	// half / 2^192 = 40000000000000
2851  0x0200000000000000ULL	// half / 2^192 = 200000000000000
2852};
2853
2854// Values of mask in the right position to obtain the high Ex - 128 or Ex - 192
2855// bits of the fraction from C * kx, 1 <= x <= 37; the fraction consists of
2856// the low Ex bits in C * kx
2857UINT64 mask128[] = {
2858  0x0000000000000007ULL,	// mask / 2^128
2859  0x000000000000003fULL,	// mask / 2^128
2860  0x00000000000001ffULL,	// mask / 2^128
2861  0x0000000000001fffULL,	// mask / 2^128
2862  0x000000000000ffffULL,	// mask / 2^128
2863  0x000000000007ffffULL,	// mask / 2^128
2864  0x00000000007fffffULL,	// mask / 2^128
2865  0x0000000003ffffffULL,	// mask / 2^128
2866  0x000000001fffffffULL,	// mask / 2^128
2867  0x00000001ffffffffULL,	// mask / 2^128
2868  0x0000000fffffffffULL,	// mask / 2^128
2869  0x0000007fffffffffULL,	// mask / 2^128
2870  0x000007ffffffffffULL,	// mask / 2^128
2871  0x00003fffffffffffULL,	// mask / 2^128
2872  0x0001ffffffffffffULL,	// mask / 2^128
2873  0x001fffffffffffffULL,	// mask / 2^128
2874  0x00ffffffffffffffULL,	// mask / 2^128
2875  0x07ffffffffffffffULL,	// mask / 2^128
2876  0x7fffffffffffffffULL,	// mask / 2^128
2877  0x0000000000000003ULL,	// mask / 2^192
2878  0x000000000000001fULL,	// mask / 2^192
2879  0x00000000000001ffULL,	// mask / 2^192
2880  0x0000000000000fffULL,	// mask / 2^192
2881  0x0000000000007fffULL,	// mask / 2^192
2882  0x000000000007ffffULL,	// mask / 2^192
2883  0x00000000003fffffULL,	// mask / 2^192
2884  0x0000000001ffffffULL,	// mask / 2^192
2885  0x000000001fffffffULL,	// mask / 2^192
2886  0x00000000ffffffffULL,	// mask / 2^192
2887  0x00000007ffffffffULL,	// mask / 2^192
2888  0x0000003fffffffffULL,	// mask / 2^192
2889  0x000003ffffffffffULL,	// mask / 2^192
2890  0x00001fffffffffffULL,	// mask / 2^192
2891  0x0000ffffffffffffULL,	// mask / 2^192
2892  0x000fffffffffffffULL,	// mask / 2^192
2893  0x007fffffffffffffULL,	// mask / 2^192
2894  0x03ffffffffffffffULL	// mask / 2^192
2895};
2896
2897// Values of 10^(-x) trancated to Ex bits beyond the binary point, and
2898// in the right position to be compared with the fraction from C * kx,
2899// 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
2900// (these values are aligned with the low 128 bits of the fraction)
2901UINT128 ten2mxtrunc128[] = {
2902  {{0xccccccccccccccccULL, 0xccccccccccccccccULL}},
2903  // (ten2mx >> 128) = cccccccccccccccccccccccccccccccc
2904  {{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
2905  // (ten2mx >> 128) = a3d70a3d70a3d70a3d70a3d70a3d70a3
2906  {{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
2907  // (ten2mx >> 128) = 83126e978d4fdf3b645a1cac083126e9
2908  {{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
2909  // (ten2mx >> 128) = d1b71758e219652bd3c36113404ea4a8
2910  {{0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
2911  // (ten2mx >> 128) = a7c5ac471b4784230fcf80dc33721d53
2912  {{0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
2913  // (ten2mx >> 128) = 8637bd05af6c69b5a63f9a49c2c1b10f
2914  {{0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
2915  // (ten2mx >> 128) = d6bf94d5e57a42bc3d32907604691b4c
2916  {{0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
2917  // (ten2mx >> 128) = abcc77118461cefcfdc20d2b36ba7c3d
2918  {{0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
2919  // (ten2mx >> 128) = 89705f4136b4a59731680a88f8953030
2920  {{0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
2921  // (ten2mx >> 128) = dbe6fecebdedd5beb573440e5a884d1b
2922  {{0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
2923  // (ten2mx >> 128) = afebff0bcb24aafef78f69a51539d748
2924  {{0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
2925  // (ten2mx >> 128) = 8cbccc096f5088cbf93f87b7442e45d3
2926  {{0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
2927  // (ten2mx >> 128) = e12e13424bb40e132865a5f206b06fb9
2928  {{0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
2929  // (ten2mx >> 128) = b424dc35095cd80f538484c19ef38c94
2930  {{0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
2931  // (ten2mx >> 128) = 901d7cf73ab0acd90f9d37014bf60a10
2932  {{0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
2933  // (ten2mx >> 128) = e69594bec44de15b4c2ebe687989a9b3
2934  {{0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
2935  // (ten2mx >> 128) = b877aa3236a4b44909befeb9fad487c2
2936  {{0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
2937  // (ten2mx >> 128) = 9392ee8e921d5d073aff322e62439fcf
2938  {{0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
2939  // (ten2mx >> 128) = ec1e4a7db69561a52b31e9e3d06c32e5
2940  {{0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
2941  // (ten2mx >> 128) = bce5086492111aea88f4bb1ca6bcf584
2942  {{0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
2943  // (ten2mx >> 128) = 971da05074da7beed3f6fc16ebca5e03
2944  {{0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
2945  // (ten2mx >> 128) = f1c90080baf72cb15324c68b12dd6338
2946  {{0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
2947  // (ten2mx >> 128) = c16d9a0095928a2775b7053c0f178293
2948  {{0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
2949  // (ten2mx >> 128) = 9abe14cd44753b52c4926a9672793542
2950  {{0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
2951  // (ten2mx >> 128) = f79687aed3eec5513a83ddbd83f52204
2952  {{0x95364afe032a819dULL, 0xc612062576589ddaULL}},
2953  // (ten2mx >> 128) = c612062576589dda95364afe032a819d
2954  {{0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
2955  // (ten2mx >> 128) = 9e74d1b791e07e48775ea264cf55347d
2956  {{0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
2957  // (ten2mx >> 128) = fd87b5f28300ca0d8bca9d6e188853fc
2958  {{0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
2959  // (ten2mx >> 128) = cad2f7f5359a3b3e096ee45813a04330
2960  {{0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
2961  // (ten2mx >> 128) = a2425ff75e14fc31a1258379a94d028d
2962  {{0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
2963  // (ten2mx >> 128) = 81ceb32c4b43fcf480eacf948770ced7
2964  {{0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
2965  // (ten2mx >> 128) = cfb11ead453994ba67de18eda5814af2
2966  {{0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
2967  // (ten2mx >> 128) = a6274bbdd0fadd61ecb1ad8aeacdd58e
2968  {{0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
2969  // (ten2mx >> 128) = 84ec3c97da624ab4bd5af13bef0b113e
2970  {{0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
2971  // (ten2mx >> 128) = d4ad2dbfc3d07787955e4ec64b44e864
2972  {{0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
2973  // (ten2mx >> 128) = aa242499697392d2dde50bd1d5d0b9e9
2974  {{0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}}
2975  // (ten2mx >> 128) = 881cea14545c75757e50d64177da2e54
2976};
2977
2978UINT192 Kx192[] = {
2979  {{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
2980    0xccccccccccccccccULL}},
2981  // 10^-1 ~= cccccccccccccccccccccccccccccccccccccccccccccccd * 2^-195
2982  {{0xd70a3d70a3d70a3eULL, 0x3d70a3d70a3d70a3ULL,
2983    0xa3d70a3d70a3d70aULL}},
2984  // 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3e * 2^-198
2985  {{0x78d4fdf3b645a1cbULL, 0x645a1cac083126e9ULL,
2986    0x83126e978d4fdf3bULL}},
2987  // 10^-3 ~= 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1cb * 2^-201
2988  {{0xc154c985f06f6945ULL, 0xd3c36113404ea4a8ULL,
2989    0xd1b71758e219652bULL}},
2990  // 10^-4 ~= d1b71758e219652bd3c36113404ea4a8c154c985f06f6945 * 2^-205
2991  {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
2992    0xa7c5ac471b478423ULL}},
2993  // 10^-5 ~= a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592104 * 2^-208
2994  {{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
2995    0x8637bd05af6c69b5ULL}},
2996  // 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a6a * 2^-211
2997  {{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
2998    0xd6bf94d5e57a42bcULL}},
2999  // 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3dc * 2^-215
3000  {{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
3001    0xabcc77118461cefcULL}},
3002  // 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697d * 2^-218
3003  {{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
3004    0x89705f4136b4a597ULL}},
3005  // 10^-9 ~= 89705f4136b4a59731680a88f8953030fdd7645e011abaca * 2^-221
3006  {{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
3007    0xdbe6fecebdedd5beULL}},
3008  // 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912add * 2^-225
3009  {{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
3010    0xafebff0bcb24aafeULL}},
3011  // 10^-11 ~= afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b1 * 2^-228
3012  {{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
3013    0x8cbccc096f5088cbULL}},
3014  // 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08e * 2^-231
3015  {{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
3016    0xe12e13424bb40e13ULL}},
3017  // 10^-13 ~= e12e13424bb40e132865a5f206b06fb988f4c3923bf900e3 * 2^-235
3018  {{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
3019    0xb424dc35095cd80fULL}},
3020  // 10^-14 ~= b424dc35095cd80f538484c19ef38c946d909c74fcc733e9 * 2^-238
3021  {{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
3022    0x901d7cf73ab0acd9ULL}},
3023  // 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f654 * 2^-241
3024  {{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
3025    0xe69594bec44de15bULL}},
3026  // 10^-16 ~= e69594bec44de15b4c2ebe687989a9b3bf716c1add27f086 * 2^-245
3027  {{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
3028    0xb877aa3236a4b449ULL}},
3029  // 10^-17 ~= b877aa3236a4b44909befeb9fad487c2ff8df0157db98d38 * 2^-248
3030  {{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
3031    0x9392ee8e921d5d07ULL}},
3032  // 10^-18 ~= 9392ee8e921d5d073aff322e62439fcf32d7f344649470fa * 2^-251
3033  {{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
3034    0xec1e4a7db69561a5ULL}},
3035  // 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f5 * 2^-255
3036  {{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
3037    0xbce5086492111aeaULL}},
3038  // 10^-20 ~= bce5086492111aea88f4bb1ca6bcf584181ea8059f76532b * 2^-258
3039  {{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
3040    0x971da05074da7beeULL}},
3041  // 10^-21 ~= 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ef * 2^-261
3042  {{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
3043    0xf1c90080baf72cb1ULL}},
3044  // 10^-22 ~= f1c90080baf72cb15324c68b12dd633870cb148213caa7e5 * 2^-265
3045  {{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL,
3046    0xc16d9a0095928a27ULL}},
3047  // 10^-23 ~= c16d9a0095928a2775b7053c0f1782938d6f439b43088651 * 2^-268
3048  {{0xd78c3615cf3a050dULL, 0xc4926a9672793542ULL,
3049    0x9abe14cd44753b52ULL}},
3050  // 10^-24 ~= 9abe14cd44753b52c4926a9672793542d78c3615cf3a050d * 2^-271
3051  {{0x8c1389bc7ec33b48ULL, 0x3a83ddbd83f52204ULL,
3052    0xf79687aed3eec551ULL}},
3053  // 10^-25 ~= f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b48 * 2^-275
3054  {{0x3cdc6e306568fc3aULL, 0x95364afe032a819dULL,
3055    0xc612062576589ddaULL}},
3056  // 10^-26 ~= c612062576589dda95364afe032a819d3cdc6e306568fc3a * 2^-278
3057  {{0xca49f1c05120c9c8ULL, 0x775ea264cf55347dULL,
3058    0x9e74d1b791e07e48ULL}},
3059  // 10^-27 ~= 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c8 * 2^-281
3060  {{0x76dcb60081ce0fa6ULL, 0x8bca9d6e188853fcULL,
3061    0xfd87b5f28300ca0dULL}},
3062  // 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa6 * 2^-285
3063  {{0x5f16f80067d80c85ULL, 0x096ee45813a04330ULL,
3064    0xcad2f7f5359a3b3eULL}},
3065  // 10^-29 ~= cad2f7f5359a3b3e096ee45813a043305f16f80067d80c85 * 2^-288
3066  {{0x18df2ccd1fe00a04ULL, 0xa1258379a94d028dULL,
3067    0xa2425ff75e14fc31ULL}},
3068  // 10^-30 ~= a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a04 * 2^-291
3069  {{0x4718f0a419800803ULL, 0x80eacf948770ced7ULL,
3070    0x81ceb32c4b43fcf4ULL}},
3071  // 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced74718f0a419800803 * 2^-294
3072  {{0x0b5b1aa028ccd99fULL, 0x67de18eda5814af2ULL,
3073    0xcfb11ead453994baULL}},
3074  // 10^-32 ~= cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99f * 2^-298
3075  {{0x6f7c154ced70ae19ULL, 0xecb1ad8aeacdd58eULL,
3076    0xa6274bbdd0fadd61ULL}},
3077  // 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae19 * 2^-301
3078  {{0xbf967770bdf3be7aULL, 0xbd5af13bef0b113eULL,
3079    0x84ec3c97da624ab4ULL}},
3080  // 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be7a * 2^-304
3081  {{0x65bd8be79652ca5dULL, 0x955e4ec64b44e864ULL,
3082    0xd4ad2dbfc3d07787ULL}},
3083  // 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5d * 2^-308
3084  {{0xeafe098611dbd517ULL, 0xdde50bd1d5d0b9e9ULL,
3085    0xaa242499697392d2ULL}},
3086  // 10^-36 ~= aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd517 * 2^-311
3087  {{0xbbfe6e04db164413ULL, 0x7e50d64177da2e54ULL,
3088    0x881cea14545c7575ULL}},
3089  // 10^-37 ~= 881cea14545c75757e50d64177da2e54bbfe6e04db164413 * 2^-314
3090  {{0x2cca49a15e8a0684ULL, 0x96e7bd358c904a21ULL,
3091    0xd9c7dced53c72255ULL}},
3092  // 10^-38 ~= d9c7dced53c7225596e7bd358c904a212cca49a15e8a0684 * 2^-318
3093  {{0x8a3b6e1ab2080537ULL, 0xabec975e0a0d081aULL,
3094    0xae397d8aa96c1b77ULL}},
3095  // 10^-39 ~= ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080537 * 2^-321
3096  {{0x3b62be7bc1a0042cULL, 0x2323ac4b3b3da015ULL,
3097    0x8b61313bbabce2c6ULL}},
3098  // 10^-40 ~= 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042c * 2^-324
3099  {{0x5f0463f935ccd379ULL, 0x6b6c46dec52f6688ULL,
3100    0xdf01e85f912e37a3ULL}},
3101  // 10^-41 ~= df01e85f912e37a36b6c46dec52f66885f0463f935ccd379 * 2^-328
3102  {{0x7f36b660f7d70f94ULL, 0x55f038b237591ed3ULL,
3103    0xb267ed1940f1c61cULL}},
3104  // 10^-42 ~= b267ed1940f1c61c55f038b237591ed37f36b660f7d70f94 * 2^-331
3105  {{0xcc2bc51a5fdf3faaULL, 0x77f3608e92adb242ULL,
3106    0x8eb98a7a9a5b04e3ULL}},
3107  // 10^-43 ~= 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3faa * 2^-334
3108  {{0xe046082a32fecc42ULL, 0x8cb89a7db77c506aULL,
3109    0xe45c10c42a2b3b05ULL}},
3110  // 10^-44 ~= e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc42 * 2^-338
3111  {{0x4d04d354f598a368ULL, 0x3d607b97c5fd0d22ULL,
3112    0xb6b00d69bb55c8d1ULL}},
3113  // 10^-45 ~= b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a368 * 2^-341
3114  {{0x3d9d75dd9146e920ULL, 0xcab3961304ca70e8ULL,
3115    0x9226712162ab070dULL}},
3116  // 10^-46 ~= 9226712162ab070dcab3961304ca70e83d9d75dd9146e920 * 2^-344
3117  {{0xc8fbefc8e8717500ULL, 0xaab8f01e6e10b4a6ULL,
3118    0xe9d71b689dde71afULL}},
3119  // 10^-47 ~= e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e8717500 * 2^-348
3120  {{0x3a63263a538df734ULL, 0x5560c018580d5d52ULL,
3121    0xbb127c53b17ec159ULL}},
3122  // 10^-48 ~= bb127c53b17ec1595560c018580d5d523a63263a538df734 * 2^-351
3123  {{0x2eb5b82ea93e5f5dULL, 0xdde7001379a44aa8ULL,
3124    0x95a8637627989aadULL}},
3125  // 10^-49 ~= 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5d * 2^-354
3126  {{0x4abc59e441fd6561ULL, 0x963e66858f6d4440ULL,
3127    0xef73d256a5c0f77cULL}},
3128  // 10^-50 ~= ef73d256a5c0f77c963e66858f6d44404abc59e441fd6561 * 2^-358
3129  {{0x6efd14b69b311de7ULL, 0xde98520472bdd033ULL,
3130    0xbf8fdb78849a5f96ULL}},
3131  // 10^-51 ~= bf8fdb78849a5f96de98520472bdd0336efd14b69b311de7 * 2^-361
3132  {{0x259743c548f417ecULL, 0xe546a8038efe4029ULL,
3133    0x993fe2c6d07b7fabULL}},
3134  // 10^-52 ~= 993fe2c6d07b7fabe546a8038efe4029259743c548f417ec * 2^-364
3135  {{0x3c25393ba7ecf313ULL, 0xd53dd99f4b3066a8ULL,
3136    0xf53304714d9265dfULL}},
3137  // 10^-53 ~= f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf313 * 2^-368
3138  {{0x96842dc95323f5a9ULL, 0xaa97e14c3c26b886ULL,
3139    0xc428d05aa4751e4cULL}},
3140  // 10^-54 ~= c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a9 * 2^-371
3141  {{0xab9cf16ddc1cc487ULL, 0x55464dd69685606bULL,
3142    0x9ced737bb6c4183dULL}},
3143  // 10^-55 ~= 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc487 * 2^-374
3144  {{0xac2e4f162cfad40bULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
3145  // 10^-56 ~= fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40b * 2^-378
3146};
3147
3148unsigned int Ex192m192[] = {
3149  3,	// 195 - 192, Ex = 195
3150  6,	// 198 - 192, Ex = 198
3151  9,	// 201 - 192, Ex = 201
3152  13,	// 205 - 192, Ex = 205
3153  16,	// 208 - 192, Ex = 208
3154  19,	// 211 - 192, Ex = 211
3155  23,	// 215 - 192, Ex = 215
3156  26,	// 218 - 192, Ex = 218
3157  29,	// 221 - 192, Ex = 221
3158  33,	// 225 - 192, Ex = 225
3159  36,	// 228 - 192, Ex = 228
3160  39,	// 231 - 192, Ex = 231
3161  43,	// 235 - 192, Ex = 235
3162  46,	// 238 - 192, Ex = 238
3163  49,	// 241 - 192, Ex = 241
3164  53,	// 245 - 192, Ex = 245
3165  56,	// 248 - 192, Ex = 248
3166  59,	// 251 - 192, Ex = 251
3167  63,	// 255 - 192, Ex = 255
3168  2,	// 258 - 256, Ex = 258
3169  5,	// 261 - 256, Ex = 261
3170  9,	// 265 - 256, Ex = 265
3171  12,	// 268 - 256, Ex = 268
3172  15,	// 271 - 256, Ex = 271
3173  19,	// 275 - 256, Ex = 275
3174  22,	// 278 - 256, Ex = 278
3175  25,	// 281 - 256, Ex = 281
3176  29,	// 285 - 256, Ex = 285
3177  32,	// 288 - 256, Ex = 288
3178  35,	// 291 - 256, Ex = 291
3179  38,	// 294 - 256, Ex = 294
3180  42,	// 298 - 256, Ex = 298
3181  45,	// 301 - 256, Ex = 301
3182  48,	// 304 - 256, Ex = 304
3183  52,	// 308 - 256, Ex = 308
3184  55,	// 311 - 256, Ex = 311
3185  58,	// 314 - 256, Ex = 314
3186  62,	// 318 - 256, Ex = 318
3187  1,	// 321 - 320, Ex = 321
3188  4,	// 324 - 320, Ex = 324
3189  8,	// 328 - 320, Ex = 328
3190  11,	// 331 - 320, Ex = 331
3191  14,	// 334 - 320, Ex = 334
3192  18,	// 338 - 320, Ex = 338
3193  21,	// 341 - 320, Ex = 341
3194  24,	// 344 - 320, Ex = 344
3195  28,	// 348 - 320, Ex = 348
3196  31,	// 351 - 320, Ex = 351
3197  34,	// 354 - 320, Ex = 354
3198  38,	// 358 - 320, Ex = 358
3199  41,	// 361 - 320, Ex = 361
3200  44,	// 364 - 320, Ex = 364
3201  48,	// 368 - 320, Ex = 368
3202  51,	// 371 - 320, Ex = 371
3203  54,	// 374 - 320, Ex = 374
3204  58	// 378 - 320, Ex = 378
3205};
3206
3207UINT64 half192[] = {
3208  0x0000000000000004ULL,	// half / 2^192 = 4
3209  0x0000000000000020ULL,	// half / 2^192 = 20
3210  0x0000000000000100ULL,	// half / 2^192 = 100
3211  0x0000000000001000ULL,	// half / 2^192 = 1000
3212  0x0000000000008000ULL,	// half / 2^192 = 8000
3213  0x0000000000040000ULL,	// half / 2^192 = 40000
3214  0x0000000000400000ULL,	// half / 2^192 = 400000
3215  0x0000000002000000ULL,	// half / 2^192 = 2000000
3216  0x0000000010000000ULL,	// half / 2^192 = 10000000
3217  0x0000000100000000ULL,	// half / 2^192 = 100000000
3218  0x0000000800000000ULL,	// half / 2^192 = 800000000
3219  0x0000004000000000ULL,	// half / 2^192 = 4000000000
3220  0x0000040000000000ULL,	// half / 2^192 = 40000000000
3221  0x0000200000000000ULL,	// half / 2^192 = 200000000000
3222  0x0001000000000000ULL,	// half / 2^192 = 1000000000000
3223  0x0010000000000000ULL,	// half / 2^192 = 10000000000000
3224  0x0080000000000000ULL,	// half / 2^192 = 80000000000000
3225  0x0400000000000000ULL,	// half / 2^192 = 400000000000000
3226  0x4000000000000000ULL,	// half / 2^192 = 4000000000000000
3227  0x0000000000000002ULL,	// half / 2^256 = 2
3228  0x0000000000000010ULL,	// half / 2^256 = 10
3229  0x0000000000000100ULL,	// half / 2^256 = 100
3230  0x0000000000000800ULL,	// half / 2^256 = 800
3231  0x0000000000004000ULL,	// half / 2^256 = 4000
3232  0x0000000000040000ULL,	// half / 2^256 = 40000
3233  0x0000000000200000ULL,	// half / 2^256 = 200000
3234  0x0000000001000000ULL,	// half / 2^256 = 1000000
3235  0x0000000010000000ULL,	// half / 2^256 = 10000000
3236  0x0000000080000000ULL,	// half / 2^256 = 80000000
3237  0x0000000400000000ULL,	// half / 2^256 = 400000000
3238  0x0000002000000000ULL,	// half / 2^256 = 2000000000
3239  0x0000020000000000ULL,	// half / 2^256 = 20000000000
3240  0x0000100000000000ULL,	// half / 2^256 = 100000000000
3241  0x0000800000000000ULL,	// half / 2^256 = 800000000000
3242  0x0008000000000000ULL,	// half / 2^256 = 8000000000000
3243  0x0040000000000000ULL,	// half / 2^256 = 40000000000000
3244  0x0200000000000000ULL,	// half / 2^256 = 200000000000000
3245  0x2000000000000000ULL,	// half / 2^256 = 2000000000000000
3246  0x0000000000000001ULL,	// half / 2^320 = 1
3247  0x0000000000000008ULL,	// half / 2^320 = 8
3248  0x0000000000000080ULL,	// half / 2^320 = 80
3249  0x0000000000000400ULL,	// half / 2^320 = 400
3250  0x0000000000002000ULL,	// half / 2^320 = 2000
3251  0x0000000000020000ULL,	// half / 2^320 = 20000
3252  0x0000000000100000ULL,	// half / 2^320 = 100000
3253  0x0000000000800000ULL,	// half / 2^320 = 800000
3254  0x0000000008000000ULL,	// half / 2^320 = 8000000
3255  0x0000000040000000ULL,	// half / 2^320 = 40000000
3256  0x0000000200000000ULL,	// half / 2^320 = 200000000
3257  0x0000002000000000ULL,	// half / 2^320 = 2000000000
3258  0x0000010000000000ULL,	// half / 2^320 = 10000000000
3259  0x0000080000000000ULL,	// half / 2^320 = 80000000000
3260  0x0000800000000000ULL,	// half / 2^320 = 800000000000
3261  0x0004000000000000ULL,	// half / 2^320 = 4000000000000
3262  0x0020000000000000ULL,	// half / 2^320 = 20000000000000
3263  0x0200000000000000ULL	// half / 2^320 = 200000000000000
3264};
3265
3266UINT64 mask192[] = {
3267  0x0000000000000007ULL,	// mask / 2^192
3268  0x000000000000003fULL,	// mask / 2^192
3269  0x00000000000001ffULL,	// mask / 2^192
3270  0x0000000000001fffULL,	// mask / 2^192
3271  0x000000000000ffffULL,	// mask / 2^192
3272  0x000000000007ffffULL,	// mask / 2^192
3273  0x00000000007fffffULL,	// mask / 2^192
3274  0x0000000003ffffffULL,	// mask / 2^192
3275  0x000000001fffffffULL,	// mask / 2^192
3276  0x00000001ffffffffULL,	// mask / 2^192
3277  0x0000000fffffffffULL,	// mask / 2^192
3278  0x0000007fffffffffULL,	// mask / 2^192
3279  0x000007ffffffffffULL,	// mask / 2^192
3280  0x00003fffffffffffULL,	// mask / 2^192
3281  0x0001ffffffffffffULL,	// mask / 2^192
3282  0x001fffffffffffffULL,	// mask / 2^192
3283  0x00ffffffffffffffULL,	// mask / 2^192
3284  0x07ffffffffffffffULL,	// mask / 2^192
3285  0x7fffffffffffffffULL,	// mask / 2^192
3286  0x0000000000000003ULL,	// mask / 2^256
3287  0x000000000000001fULL,	// mask / 2^256
3288  0x00000000000001ffULL,	// mask / 2^256
3289  0x0000000000000fffULL,	// mask / 2^256
3290  0x0000000000007fffULL,	// mask / 2^256
3291  0x000000000007ffffULL,	// mask / 2^256
3292  0x00000000003fffffULL,	// mask / 2^256
3293  0x0000000001ffffffULL,	// mask / 2^256
3294  0x000000001fffffffULL,	// mask / 2^256
3295  0x00000000ffffffffULL,	// mask / 2^256
3296  0x00000007ffffffffULL,	// mask / 2^256
3297  0x0000003fffffffffULL,	// mask / 2^256
3298  0x000003ffffffffffULL,	// mask / 2^256
3299  0x00001fffffffffffULL,	// mask / 2^256
3300  0x0000ffffffffffffULL,	// mask / 2^256
3301  0x000fffffffffffffULL,	// mask / 2^256
3302  0x007fffffffffffffULL,	// mask / 2^256
3303  0x03ffffffffffffffULL,	// mask / 2^256
3304  0x3fffffffffffffffULL,	// mask / 2^256
3305  0x0000000000000001ULL,	// mask / 2^320
3306  0x000000000000000fULL,	// mask / 2^320
3307  0x00000000000000ffULL,	// mask / 2^320
3308  0x00000000000007ffULL,	// mask / 2^320
3309  0x0000000000003fffULL,	// mask / 2^320
3310  0x000000000003ffffULL,	// mask / 2^320
3311  0x00000000001fffffULL,	// mask / 2^320
3312  0x0000000000ffffffULL,	// mask / 2^320
3313  0x000000000fffffffULL,	// mask / 2^320
3314  0x000000007fffffffULL,	// mask / 2^320
3315  0x00000003ffffffffULL,	// mask / 2^320
3316  0x0000003fffffffffULL,	// mask / 2^320
3317  0x000001ffffffffffULL,	// mask / 2^320
3318  0x00000fffffffffffULL,	// mask / 2^320
3319  0x0000ffffffffffffULL,	// mask / 2^320
3320  0x0007ffffffffffffULL,	// mask / 2^320
3321  0x003fffffffffffffULL,	// mask / 2^320
3322  0x03ffffffffffffffULL	// mask / 2^320
3323};
3324
3325UINT192 ten2mxtrunc192[] = {
3326  {{0xccccccccccccccccULL, 0xccccccccccccccccULL,
3327    0xccccccccccccccccULL}},
3328  // (ten2mx >> 192) = cccccccccccccccccccccccccccccccccccccccccccccccc
3329  {{0xd70a3d70a3d70a3dULL, 0x3d70a3d70a3d70a3ULL,
3330    0xa3d70a3d70a3d70aULL}},
3331  // (ten2mx >> 192) = a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d
3332  {{0x78d4fdf3b645a1caULL, 0x645a1cac083126e9ULL,
3333    0x83126e978d4fdf3bULL}},
3334  // (ten2mx >> 192) = 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1ca
3335  {{0xc154c985f06f6944ULL, 0xd3c36113404ea4a8ULL,
3336    0xd1b71758e219652bULL}},
3337  // (ten2mx >> 192) = d1b71758e219652bd3c36113404ea4a8c154c985f06f6944
3338  {{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
3339    0xa7c5ac471b478423ULL}},
3340  // (ten2mx >> 192) = a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592103
3341  {{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
3342    0x8637bd05af6c69b5ULL}},
3343  // (ten2mx >> 192) = 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a69
3344  {{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
3345    0xd6bf94d5e57a42bcULL}},
3346  // (ten2mx >> 192) = d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3db
3347  {{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
3348    0xabcc77118461cefcULL}},
3349  // (ten2mx >> 192) = abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697c
3350  {{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
3351    0x89705f4136b4a597ULL}},
3352  // (ten2mx >> 192) = 89705f4136b4a59731680a88f8953030fdd7645e011abac9
3353  {{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
3354    0xdbe6fecebdedd5beULL}},
3355  // (ten2mx >> 192) = dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912adc
3356  {{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
3357    0xafebff0bcb24aafeULL}},
3358  // (ten2mx >> 192) = afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b0
3359  {{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
3360    0x8cbccc096f5088cbULL}},
3361  // (ten2mx >> 192) = 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08d
3362  {{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
3363    0xe12e13424bb40e13ULL}},
3364  // (ten2mx >> 192) = e12e13424bb40e132865a5f206b06fb988f4c3923bf900e2
3365  {{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
3366    0xb424dc35095cd80fULL}},
3367  // (ten2mx >> 192) = b424dc35095cd80f538484c19ef38c946d909c74fcc733e8
3368  {{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
3369    0x901d7cf73ab0acd9ULL}},
3370  // (ten2mx >> 192) = 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f653
3371  {{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
3372    0xe69594bec44de15bULL}},
3373  // (ten2mx >> 192) = e69594bec44de15b4c2ebe687989a9b3bf716c1add27f085
3374  {{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
3375    0xb877aa3236a4b449ULL}},
3376  // (ten2mx >> 192) = b877aa3236a4b44909befeb9fad487c2ff8df0157db98d37
3377  {{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
3378    0x9392ee8e921d5d07ULL}},
3379  // (ten2mx >> 192) = 9392ee8e921d5d073aff322e62439fcf32d7f344649470f9
3380  {{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
3381    0xec1e4a7db69561a5ULL}},
3382  // (ten2mx >> 192) = ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f4
3383  {{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
3384    0xbce5086492111aeaULL}},
3385  // (ten2mx >> 192) = bce5086492111aea88f4bb1ca6bcf584181ea8059f76532a
3386  {{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
3387    0x971da05074da7beeULL}},
3388  // (ten2mx >> 192) = 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ee
3389  {{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
3390    0xf1c90080baf72cb1ULL}},
3391  // (ten2mx >> 192) = f1c90080baf72cb15324c68b12dd633870cb148213caa7e4
3392  {{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL,
3393    0xc16d9a0095928a27ULL}},
3394  // (ten2mx >> 192) = c16d9a0095928a2775b7053c0f1782938d6f439b43088650
3395  {{0xd78c3615cf3a050cULL, 0xc4926a9672793542ULL,
3396    0x9abe14cd44753b52ULL}},
3397  // (ten2mx >> 192) = 9abe14cd44753b52c4926a9672793542d78c3615cf3a050c
3398  {{0x8c1389bc7ec33b47ULL, 0x3a83ddbd83f52204ULL,
3399    0xf79687aed3eec551ULL}},
3400  // (ten2mx >> 192) = f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b47
3401  {{0x3cdc6e306568fc39ULL, 0x95364afe032a819dULL,
3402    0xc612062576589ddaULL}},
3403  // (ten2mx >> 192) = c612062576589dda95364afe032a819d3cdc6e306568fc39
3404  {{0xca49f1c05120c9c7ULL, 0x775ea264cf55347dULL,
3405    0x9e74d1b791e07e48ULL}},
3406  // (ten2mx >> 192) = 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c7
3407  {{0x76dcb60081ce0fa5ULL, 0x8bca9d6e188853fcULL,
3408    0xfd87b5f28300ca0dULL}},
3409  // (ten2mx >> 192) = fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa5
3410  {{0x5f16f80067d80c84ULL, 0x096ee45813a04330ULL,
3411    0xcad2f7f5359a3b3eULL}},
3412  // (ten2mx >> 192) = cad2f7f5359a3b3e096ee45813a043305f16f80067d80c84
3413  {{0x18df2ccd1fe00a03ULL, 0xa1258379a94d028dULL,
3414    0xa2425ff75e14fc31ULL}},
3415  // (ten2mx >> 192) = a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a03
3416  {{0x4718f0a419800802ULL, 0x80eacf948770ced7ULL,
3417    0x81ceb32c4b43fcf4ULL}},
3418  // (ten2mx >> 192) = 81ceb32c4b43fcf480eacf948770ced74718f0a419800802
3419  {{0x0b5b1aa028ccd99eULL, 0x67de18eda5814af2ULL,
3420    0xcfb11ead453994baULL}},
3421  // (ten2mx >> 192) = cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99e
3422  {{0x6f7c154ced70ae18ULL, 0xecb1ad8aeacdd58eULL,
3423    0xa6274bbdd0fadd61ULL}},
3424  // (ten2mx >> 192) = a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae18
3425  {{0xbf967770bdf3be79ULL, 0xbd5af13bef0b113eULL,
3426    0x84ec3c97da624ab4ULL}},
3427  // (ten2mx >> 192) = 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be79
3428  {{0x65bd8be79652ca5cULL, 0x955e4ec64b44e864ULL,
3429    0xd4ad2dbfc3d07787ULL}},
3430  // (ten2mx >> 192) = d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5c
3431  {{0xeafe098611dbd516ULL, 0xdde50bd1d5d0b9e9ULL,
3432    0xaa242499697392d2ULL}},
3433  // (ten2mx >> 192) = aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd516
3434  {{0xbbfe6e04db164412ULL, 0x7e50d64177da2e54ULL,
3435    0x881cea14545c7575ULL}},
3436  // (ten2mx >> 192) = 881cea14545c75757e50d64177da2e54bbfe6e04db164412
3437  {{0x2cca49a15e8a0683ULL, 0x96e7bd358c904a21ULL,
3438    0xd9c7dced53c72255ULL}},
3439  // (ten2mx >> 192) = d9c7dced53c7225596e7bd358c904a212cca49a15e8a0683
3440  {{0x8a3b6e1ab2080536ULL, 0xabec975e0a0d081aULL,
3441    0xae397d8aa96c1b77ULL}},
3442  // (ten2mx >> 192) = ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080536
3443  {{0x3b62be7bc1a0042bULL, 0x2323ac4b3b3da015ULL,
3444    0x8b61313bbabce2c6ULL}},
3445  // (ten2mx >> 192) = 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042b
3446  {{0x5f0463f935ccd378ULL, 0x6b6c46dec52f6688ULL,
3447    0xdf01e85f912e37a3ULL}},
3448  // (ten2mx >> 192) = df01e85f912e37a36b6c46dec52f66885f0463f935ccd378
3449  {{0x7f36b660f7d70f93ULL, 0x55f038b237591ed3ULL,
3450    0xb267ed1940f1c61cULL}},
3451  // (ten2mx >> 192) = b267ed1940f1c61c55f038b237591ed37f36b660f7d70f93
3452  {{0xcc2bc51a5fdf3fa9ULL, 0x77f3608e92adb242ULL,
3453    0x8eb98a7a9a5b04e3ULL}},
3454  // (ten2mx >> 192) = 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3fa9
3455  {{0xe046082a32fecc41ULL, 0x8cb89a7db77c506aULL,
3456    0xe45c10c42a2b3b05ULL}},
3457  // (ten2mx >> 192) = e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc41
3458  {{0x4d04d354f598a367ULL, 0x3d607b97c5fd0d22ULL,
3459    0xb6b00d69bb55c8d1ULL}},
3460  // (ten2mx >> 192) = b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a367
3461  {{0x3d9d75dd9146e91fULL, 0xcab3961304ca70e8ULL,
3462    0x9226712162ab070dULL}},
3463  // (ten2mx >> 192) = 9226712162ab070dcab3961304ca70e83d9d75dd9146e91f
3464  {{0xc8fbefc8e87174ffULL, 0xaab8f01e6e10b4a6ULL,
3465    0xe9d71b689dde71afULL}},
3466  // (ten2mx >> 192) = e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e87174ff
3467  {{0x3a63263a538df733ULL, 0x5560c018580d5d52ULL,
3468    0xbb127c53b17ec159ULL}},
3469  // (ten2mx >> 192) = bb127c53b17ec1595560c018580d5d523a63263a538df733
3470  {{0x2eb5b82ea93e5f5cULL, 0xdde7001379a44aa8ULL,
3471    0x95a8637627989aadULL}},
3472  // (ten2mx >> 192) = 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5c
3473  {{0x4abc59e441fd6560ULL, 0x963e66858f6d4440ULL,
3474    0xef73d256a5c0f77cULL}},
3475  // (ten2mx >> 192) = ef73d256a5c0f77c963e66858f6d44404abc59e441fd6560
3476  {{0x6efd14b69b311de6ULL, 0xde98520472bdd033ULL,
3477    0xbf8fdb78849a5f96ULL}},
3478  // (ten2mx >> 192) = bf8fdb78849a5f96de98520472bdd0336efd14b69b311de6
3479  {{0x259743c548f417ebULL, 0xe546a8038efe4029ULL,
3480    0x993fe2c6d07b7fabULL}},
3481  // (ten2mx >> 192) = 993fe2c6d07b7fabe546a8038efe4029259743c548f417eb
3482  {{0x3c25393ba7ecf312ULL, 0xd53dd99f4b3066a8ULL,
3483    0xf53304714d9265dfULL}},
3484  // (ten2mx >> 192) = f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf312
3485  {{0x96842dc95323f5a8ULL, 0xaa97e14c3c26b886ULL,
3486    0xc428d05aa4751e4cULL}},
3487  // (ten2mx >> 192) = c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a8
3488  {{0xab9cf16ddc1cc486ULL, 0x55464dd69685606bULL,
3489    0x9ced737bb6c4183dULL}},
3490  // (ten2mx >> 192) = 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc486
3491  {{0xac2e4f162cfad40aULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
3492  // (ten2mx >> 192) = fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40a
3493};
3494
3495UINT256 Kx256[] = {
3496  {{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
3497    0xccccccccccccccccULL, 0xccccccccccccccccULL}},
3498  // 10^-1 ~= cccccccccccccccc  cccccccccccccccc
3499  //   cccccccccccccccccccccccccccccccd   * 2^-259
3500  {{0x70a3d70a3d70a3d8ULL, 0xd70a3d70a3d70a3dULL,
3501    0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
3502  // 10^-2 ~= a3d70a3d70a3d70a  3d70a3d70a3d70a3
3503  //   d70a3d70a3d70a3d70a3d70a3d70a3d8   * 2^-262
3504  {{0xc083126e978d4fe0ULL, 0x78d4fdf3b645a1caULL,
3505    0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
3506  // 10^-3 ~= 83126e978d4fdf3b  645a1cac083126e9
3507  //   78d4fdf3b645a1cac083126e978d4fe0   * 2^-265
3508  {{0x67381d7dbf487fccULL, 0xc154c985f06f6944ULL,
3509    0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
3510  // 10^-4 ~= d1b71758e219652b  d3c36113404ea4a8
3511  //   c154c985f06f694467381d7dbf487fcc   * 2^-269
3512  {{0x85c67dfe32a0663dULL, 0xcddd6e04c0592103ULL,
3513    0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
3514  // 10^-5 ~= a7c5ac471b478423  fcf80dc33721d53
3515  //   cddd6e04c059210385c67dfe32a0663d   * 2^-272
3516  {{0x37d1fe64f54d1e97ULL, 0xd7e45803cd141a69ULL,
3517    0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
3518  // 10^-6 ~= 8637bd05af6c69b5  a63f9a49c2c1b10f
3519  //   d7e45803cd141a6937d1fe64f54d1e97   * 2^-275
3520  {{0x8c8330a1887b6425ULL, 0x8ca08cd2e1b9c3dbULL,
3521    0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
3522  // 10^-7 ~= d6bf94d5e57a42bc  3d32907604691b4c
3523  //   8ca08cd2e1b9c3db8c8330a1887b6425   * 2^-279
3524  {{0x7068f3b46d2f8351ULL, 0x3d4d3d758161697cULL,
3525    0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
3526  // 10^-8 ~= abcc77118461cefc  fdc20d2b36ba7c3d
3527  //   3d4d3d758161697c7068f3b46d2f8351   * 2^-282
3528  {{0xf387295d242602a7ULL, 0xfdd7645e011abac9ULL,
3529    0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
3530  // 10^-9 ~= 89705f4136b4a597  31680a88f8953030
3531  //   fdd7645e011abac9f387295d242602a7   * 2^-285
3532  {{0xb8d8422ea03cd10bULL, 0x2fbf06fcce912adcULL,
3533    0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
3534  // 10^-10 ~= dbe6fecebdedd5be  b573440e5a884d1b
3535  //   2fbf06fcce912adcb8d8422ea03cd10b   * 2^-289
3536  {{0x93e034f219ca40d6ULL, 0xf2ff38ca3eda88b0ULL,
3537    0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
3538  // 10^-11 ~= afebff0bcb24aafe  f78f69a51539d748
3539  //   f2ff38ca3eda88b093e034f219ca40d6   * 2^-292
3540  {{0x4319c3f4e16e9a45ULL, 0xf598fa3b657ba08dULL,
3541    0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
3542  // 10^-12 ~= 8cbccc096f5088cb  f93f87b7442e45d3
3543  //   f598fa3b657ba08d4319c3f4e16e9a45   * 2^-295
3544  {{0x04f606549be42a07ULL, 0x88f4c3923bf900e2ULL,
3545    0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
3546  // 10^-13 ~= e12e13424bb40e13  2865a5f206b06fb9
3547  //   88f4c3923bf900e204f606549be42a07   * 2^-299
3548  {{0x03f805107cb68806ULL, 0x6d909c74fcc733e8ULL,
3549    0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
3550  // 10^-14 ~= b424dc35095cd80f  538484c19ef38c94
3551  //   6d909c74fcc733e803f805107cb68806   * 2^-302
3552  {{0x3660040d3092066bULL, 0x57a6e390ca38f653ULL,
3553    0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
3554  // 10^-15 ~= 901d7cf73ab0acd9  f9d37014bf60a10
3555  //   57a6e390ca38f6533660040d3092066b   * 2^-305
3556  {{0x23ccd3484db670abULL, 0xbf716c1add27f085ULL,
3557    0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
3558  // 10^-16 ~= e69594bec44de15b  4c2ebe687989a9b3
3559  //   bf716c1add27f08523ccd3484db670ab   * 2^-309
3560  {{0x4fd70f6d0af85a23ULL, 0xff8df0157db98d37ULL,
3561    0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
3562  // 10^-17 ~= b877aa3236a4b449  9befeb9fad487c2
3563  //   ff8df0157db98d374fd70f6d0af85a23   * 2^-312
3564  {{0x0cac0c573bf9e1b6ULL, 0x32d7f344649470f9ULL,
3565    0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
3566  // 10^-18 ~= 9392ee8e921d5d07  3aff322e62439fcf
3567  //   32d7f344649470f90cac0c573bf9e1b6   * 2^-315
3568  {{0xe11346f1f98fcf89ULL, 0x1e2652070753e7f4ULL,
3569    0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
3570  // 10^-19 ~= ec1e4a7db69561a5  2b31e9e3d06c32e5
3571  //   1e2652070753e7f4e11346f1f98fcf89   * 2^-319
3572  {{0x4da9058e613fd93aULL, 0x181ea8059f76532aULL,
3573    0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
3574  // 10^-20 ~= bce5086492111aea  88f4bb1ca6bcf584
3575  //   181ea8059f76532a4da9058e613fd93a   * 2^-322
3576  {{0xa48737a51a997a95ULL, 0x467eecd14c5ea8eeULL,
3577    0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
3578  // 10^-21 ~= 971da05074da7bee  d3f6fc16ebca5e03
3579  //   467eecd14c5ea8eea48737a51a997a95   * 2^-325
3580  {{0x3a71f2a1c428c421ULL, 0x70cb148213caa7e4ULL,
3581    0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
3582  // 10^-22 ~= f1c90080baf72cb1  5324c68b12dd6338
3583  //   70cb148213caa7e43a71f2a1c428c421   * 2^-329
3584  {{0x2ec18ee7d0209ce8ULL, 0x8d6f439b43088650ULL,
3585    0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
3586  // 10^-23 ~= c16d9a0095928a27  75b7053c0f178293
3587  //   8d6f439b430886502ec18ee7d0209ce8   * 2^-332
3588  {{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
3589    0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
3590  // 10^-24 ~= 9abe14cd44753b52  c4926a9672793542
3591  //   d78c3615cf3a050cf23472530ce6e3ed   * 2^-335
3592  {{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
3593    0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
3594  // 10^-25 ~= f79687aed3eec551  3a83ddbd83f52204
3595  //   8c1389bc7ec33b47e9ed83b814a49fe1   * 2^-339
3596  {{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
3597    0x95364afe032a819dULL, 0xc612062576589ddaULL}},
3598  // 10^-26 ~= c612062576589dda  95364afe032a819d
3599  //   3cdc6e306568fc3987f1362cdd507fe7   * 2^-342
3600  {{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
3601    0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
3602  // 10^-27 ~= 9e74d1b791e07e48  775ea264cf55347d
3603  //   ca49f1c05120c9c79ff42b5717739986   * 2^-345
3604  {{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
3605    0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
3606  // 10^-28 ~= fd87b5f28300ca0d  8bca9d6e188853fc
3607  //   76dcb60081ce0fa5ccb9def1bf1f5c09   * 2^-349
3608  {{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
3609    0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
3610  // 10^-29 ~= cad2f7f5359a3b3e  96ee45813a04330
3611  //   5f16f80067d80c84a3c7e58e327f7cd4   * 2^-352
3612  {{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
3613    0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
3614  // 10^-30 ~= a2425ff75e14fc31  a1258379a94d028d
3615  //   18df2ccd1fe00a03b6398471c1ff9710   * 2^-355
3616  {{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
3617    0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
3618  // 10^-31 ~= 81ceb32c4b43fcf4  80eacf948770ced7
3619  //   4718f0a419800802f82e038e34cc78da   * 2^-358
3620  {{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
3621    0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
3622  // 10^-32 ~= cfb11ead453994ba  67de18eda5814af2
3623  //   b5b1aa028ccd99e59e338e387ad8e29   * 2^-362
3624  {{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
3625    0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
3626  // 10^-33 ~= a6274bbdd0fadd61  ecb1ad8aeacdd58e
3627  //   6f7c154ced70ae1847e8fa4f9fbe0b54   * 2^-365
3628  {{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
3629    0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
3630  // 10^-34 ~= 84ec3c97da624ab4  bd5af13bef0b113e
3631  //   bf967770bdf3be79d320c83fb2fe6f76   * 2^-368
3632  {{0x85014065eb30b257ULL, 0x65bd8be79652ca5cULL,
3633    0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
3634  // 10^-35 ~= d4ad2dbfc3d07787  955e4ec64b44e864
3635  //   65bd8be79652ca5c85014065eb30b257   * 2^-372
3636  {{0xd0cdcd1e55c08eacULL, 0xeafe098611dbd516ULL,
3637    0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
3638  // 10^-36 ~= aa242499697392d2  dde50bd1d5d0b9e9
3639  //   eafe098611dbd516d0cdcd1e55c08eac   * 2^-375
3640  {{0x40a4a418449a0bbdULL, 0xbbfe6e04db164412ULL,
3641    0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
3642  // 10^-37 ~= 881cea14545c7575  7e50d64177da2e54
3643  //   bbfe6e04db16441240a4a418449a0bbd   * 2^-378
3644  {{0x9aa1068d3a9012c8ULL, 0x2cca49a15e8a0683ULL,
3645    0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
3646  // 10^-38 ~= d9c7dced53c72255  96e7bd358c904a21
3647  //   2cca49a15e8a06839aa1068d3a9012c8   * 2^-382
3648  {{0x154d9ed7620cdbd3ULL, 0x8a3b6e1ab2080536ULL,
3649    0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
3650  // 10^-39 ~= ae397d8aa96c1b77  abec975e0a0d081a
3651  //   8a3b6e1ab2080536154d9ed7620cdbd3   * 2^-385
3652  {{0x443e18ac4e70afdcULL, 0x3b62be7bc1a0042bULL,
3653    0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
3654  // 10^-40 ~= 8b61313bbabce2c6  2323ac4b3b3da015
3655  //   3b62be7bc1a0042b443e18ac4e70afdc   * 2^-388
3656  {{0x6d30277a171ab2f9ULL, 0x5f0463f935ccd378ULL,
3657    0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
3658  // 10^-41 ~= df01e85f912e37a3  6b6c46dec52f6688
3659  //   5f0463f935ccd3786d30277a171ab2f9   * 2^-392
3660  {{0x8a8cec61ac155bfbULL, 0x7f36b660f7d70f93ULL,
3661    0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
3662  // 10^-42 ~= b267ed1940f1c61c  55f038b237591ed3
3663  //   7f36b660f7d70f938a8cec61ac155bfb   * 2^-395
3664  {{0x3ba3f04e23444996ULL, 0xcc2bc51a5fdf3fa9ULL,
3665    0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
3666  // 10^-43 ~= 8eb98a7a9a5b04e3  77f3608e92adb242
3667  //   cc2bc51a5fdf3fa93ba3f04e23444996   * 2^-398
3668  {{0xf9064d49d206dc22ULL, 0xe046082a32fecc41ULL,
3669    0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
3670  // 10^-44 ~= e45c10c42a2b3b05  8cb89a7db77c506a
3671  //   e046082a32fecc41f9064d49d206dc22   * 2^-402
3672  {{0xfa6b7107db38b01bULL, 0x4d04d354f598a367ULL,
3673    0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
3674  // 10^-45 ~= b6b00d69bb55c8d1  3d607b97c5fd0d22
3675  //   4d04d354f598a367fa6b7107db38b01b   * 2^-405
3676  {{0xfb8927397c2d59b0ULL, 0x3d9d75dd9146e91fULL,
3677    0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
3678  // 10^-46 ~= 9226712162ab070d  cab3961304ca70e8
3679  //   3d9d75dd9146e91ffb8927397c2d59b0   * 2^-408
3680  {{0xf8db71f5937bc2b2ULL, 0xc8fbefc8e87174ffULL,
3681    0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
3682  // 10^-47 ~= e9d71b689dde71af  aab8f01e6e10b4a6
3683  //   c8fbefc8e87174fff8db71f5937bc2b2   * 2^-412
3684  {{0x2d7c5b2adc630228ULL, 0x3a63263a538df733ULL,
3685    0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
3686  // 10^-48 ~= bb127c53b17ec159  5560c018580d5d52
3687  //   3a63263a538df7332d7c5b2adc630228   * 2^-415
3688  {{0x24637c2249e8ce87ULL, 0x2eb5b82ea93e5f5cULL,
3689    0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
3690  // 10^-49 ~= 95a8637627989aad  dde7001379a44aa8
3691  //   2eb5b82ea93e5f5c24637c2249e8ce87   * 2^-418
3692  {{0x3a38c69d430e173eULL, 0x4abc59e441fd6560ULL,
3693    0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
3694  // 10^-50 ~= ef73d256a5c0f77c  963e66858f6d4440
3695  //   4abc59e441fd65603a38c69d430e173e   * 2^-422
3696  {{0x94fa387dcf3e78feULL, 0x6efd14b69b311de6ULL,
3697    0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
3698  // 10^-51 ~= bf8fdb78849a5f96  de98520472bdd033
3699  //   6efd14b69b311de694fa387dcf3e78fe   * 2^-425
3700  {{0xaa61c6cb0c31fa65ULL, 0x259743c548f417ebULL,
3701    0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
3702  // 10^-52 ~= 993fe2c6d07b7fab  e546a8038efe4029
3703  //   259743c548f417ebaa61c6cb0c31fa65   * 2^-428
3704  {{0xaa360ade79e990a2ULL, 0x3c25393ba7ecf312ULL,
3705    0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
3706  // 10^-53 ~= f53304714d9265df  d53dd99f4b3066a8
3707  //   3c25393ba7ecf312aa360ade79e990a2   * 2^-432
3708  {{0x882b3be52e5473b5ULL, 0x96842dc95323f5a8ULL,
3709    0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
3710  // 10^-54 ~= c428d05aa4751e4c  aa97e14c3c26b886
3711  //   96842dc95323f5a8882b3be52e5473b5   * 2^-435
3712  {{0xd355c98425105c91ULL, 0xab9cf16ddc1cc486ULL,
3713    0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
3714  // 10^-55 ~= 9ced737bb6c4183d  55464dd69685606b
3715  //   ab9cf16ddc1cc486d355c98425105c91   * 2^-438
3716  {{0xebbc75a03b4d60e7ULL, 0xac2e4f162cfad40aULL,
3717    0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
3718  // 10^-56 ~= fb158592be068d2e  eed6e2f0f0d56712
3719  //   ac2e4f162cfad40aebbc75a03b4d60e7   * 2^-442
3720  {{0x8963914cfc3de71fULL, 0x568b727823fbdcd5ULL,
3721    0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
3722  // 10^-57 ~= c8de047564d20a8b  f245825a5a445275
3723  //   568b727823fbdcd58963914cfc3de71f   * 2^-445
3724  {{0xd44fa770c9cb1f4cULL, 0x453c5b934ffcb0aaULL,
3725    0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
3726  // 10^-58 ~= a0b19d2ab70e6ed6  5b6aceaeae9d0ec4
3727  //   453c5b934ffcb0aad44fa770c9cb1f4c   * 2^-448
3728  {{0xdd0c85f3d4a27f70ULL, 0x37637c75d996f3bbULL,
3729    0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
3730  // 10^-59 ~= 808e17555f3ebf11  e2bbd88bbee40bd0
3731  //   37637c75d996f3bbdd0c85f3d4a27f70   * 2^-451
3732  {{0x61ada31fba9d98b3ULL, 0x256bfa5628f185f9ULL,
3733    0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
3734  // 10^-60 ~= cdb02555653131b6  3792f412cb06794d
3735  //   256bfa5628f185f961ada31fba9d98b3   * 2^-455
3736  {{0xe7be1c196217ad5cULL, 0x51232eab53f46b2dULL,
3737    0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
3738  // 10^-61 ~= a48ceaaab75a8e2b  5fa8c3423c052dd7
3739  //   51232eab53f46b2de7be1c196217ad5c   * 2^-458
3740  {{0x52fe7ce11b46244aULL, 0x40e8f222a99055beULL,
3741    0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
3742  // 10^-62 ~= 83a3eeeef9153e89  1953cf68300424ac
3743  //   40e8f222a99055be52fe7ce11b46244a   * 2^-461
3744  {{0x51972e34f8703a10ULL, 0x34a7e9d10f4d55fdULL,
3745    0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
3746  // 10^-63 ~= d29fe4b18e88640e  8eec7f0d19a03aad
3747  //   34a7e9d10f4d55fd51972e34f8703a10   * 2^-465
3748  {{0x0e128b5d938cfb40ULL, 0x2a1fee40d90aab31ULL,
3749    0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
3750  // 10^-64 ~= a87fea27a539e9a5  3f2398d747b36224
3751  //   2a1fee40d90aab310e128b5d938cfb40   * 2^-468
3752  {{0x3e753c4adc70c900ULL, 0xbb4cbe9a473bbc27ULL,
3753    0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
3754  // 10^-65 ~= 86ccbb52ea94baea  98e947129fc2b4e9
3755  //   bb4cbe9a473bbc273e753c4adc70c900   * 2^-471
3756  {{0x30bb93aafa4e0e66ULL, 0x9214642a0b92c6a5ULL,
3757    0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
3758  // 10^-66 ~= d7adf884aa879177  5b0ed81dcc6abb0f
3759  //   9214642a0b92c6a530bb93aafa4e0e66   * 2^-475
3760  {{0xc0960fbbfb71a51fULL, 0xa8105021a2dbd21dULL,
3761    0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
3762  // 10^-67 ~= ac8b2d36eed2dac5  e272467e3d222f3f
3763  //   a8105021a2dbd21dc0960fbbfb71a51f   * 2^-478
3764  {{0x66de72fcc927b74cULL, 0xb9a6a6814f1641b1ULL,
3765    0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
3766  // 10^-68 ~= 8a08f0f8bf0f156b  1b8e9ecb641b58ff
3767  //   b9a6a6814f1641b166de72fcc927b74c   * 2^-481
3768  {{0xd7ca5194750c5879ULL, 0xf5d770cee4f0691bULL,
3769    0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
3770  // 10^-69 ~= dcdb1b2798182244  f8e431456cf88e65
3771  //   f5d770cee4f0691bd7ca5194750c5879   * 2^-485
3772  {{0xdfd50e105da379faULL, 0x9179270bea59edafULL,
3773    0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
3774  // 10^-70 ~= b0af48ec79ace837  2d835a9df0c6d851
3775  //   9179270bea59edafdfd50e105da379fa   * 2^-488
3776  {{0x19773e737e1c6195ULL, 0x0dfa85a321e18af3ULL,
3777    0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
3778  // 10^-71 ~= 8d590723948a535f  579c487e5a38ad0e
3779  //   dfa85a321e18af319773e737e1c6195   * 2^-491
3780  {{0xf58b971f302d68efULL, 0x165da29e9c9c1184ULL,
3781    0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
3782  // 10^-72 ~= e2280b6c20dd5232  25c6da63c38de1b0
3783  //   165da29e9c9c1184f58b971f302d68ef   * 2^-495
3784  {{0xc46fac18f3578725ULL, 0x4517b54bb07cdad0ULL,
3785    0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
3786  // 10^-73 ~= b4ecd5f01a4aa828  1e38aeb6360b1af3
3787  //   4517b54bb07cdad0c46fac18f3578725   * 2^-498
3788  {{0x36bfbce0c2ac6c1eULL, 0x9dac910959fd7bdaULL,
3789    0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
3790  // 10^-74 ~= 90bd77f3483bb9b9  b1c6f22b5e6f48c2
3791  //   9dac910959fd7bda36bfbce0c2ac6c1e   * 2^-501
3792  {{0x2465fb01377a4696ULL, 0x2f7a81a88ffbf95dULL,
3793    0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
3794  // 10^-75 ~= e7958cb87392c2c2  b60b1d1230b20e04
3795  //   2f7a81a88ffbf95d2465fb01377a4696   * 2^-505
3796};
3797
3798unsigned int Ex256m256[] = {
3799  3,	// 259 - 256, Ex = 259
3800  6,	// 262 - 256, Ex = 262
3801  9,	// 265 - 256, Ex = 265
3802  13,	// 269 - 256, Ex = 269
3803  16,	// 272 - 256, Ex = 272
3804  19,	// 275 - 256, Ex = 275
3805  23,	// 279 - 256, Ex = 279
3806  26,	// 282 - 256, Ex = 282
3807  29,	// 285 - 256, Ex = 285
3808  33,	// 289 - 256, Ex = 289
3809  36,	// 292 - 256, Ex = 292
3810  39,	// 295 - 256, Ex = 295
3811  43,	// 299 - 256, Ex = 299
3812  46,	// 302 - 256, Ex = 302
3813  49,	// 305 - 256, Ex = 305
3814  53,	// 309 - 256, Ex = 309
3815  56,	// 312 - 256, Ex = 312
3816  59,	// 315 - 256, Ex = 315
3817  63,	// 319 - 256, Ex = 319
3818  2,	// 322 - 320, Ex = 322
3819  5,	// 325 - 320, Ex = 325
3820  9,	// 329 - 320, Ex = 329
3821  12,	// 332 - 320, Ex = 332
3822  15,	// 335 - 320, Ex = 335
3823  19,	// 339 - 320, Ex = 339
3824  22,	// 342 - 320, Ex = 342
3825  25,	// 345 - 320, Ex = 345
3826  29,	// 349 - 320, Ex = 349
3827  32,	// 352 - 320, Ex = 352
3828  35,	// 355 - 320, Ex = 355
3829  38,	// 358 - 320, Ex = 358
3830  42,	// 362 - 320, Ex = 362
3831  45,	// 365 - 320, Ex = 365
3832  48,	// 368 - 320, Ex = 368
3833  52,	// 372 - 320, Ex = 372
3834  55,	// 375 - 320, Ex = 375
3835  58,	// 378 - 320, Ex = 378
3836  62,	// 382 - 320, Ex = 382
3837  1,	// 385 - 384, Ex = 385
3838  4,	// 388 - 384, Ex = 388
3839  8,	// 392 - 384, Ex = 392
3840  11,	// 395 - 384, Ex = 395
3841  14,	// 398 - 384, Ex = 398
3842  18,	// 402 - 384, Ex = 402
3843  21,	// 405 - 384, Ex = 405
3844  24,	// 408 - 384, Ex = 408
3845  28,	// 412 - 384, Ex = 412
3846  31,	// 415 - 384, Ex = 415
3847  34,	// 418 - 384, Ex = 418
3848  38,	// 422 - 384, Ex = 422
3849  41,	// 425 - 384, Ex = 425
3850  44,	// 428 - 384, Ex = 428
3851  48,	// 432 - 384, Ex = 432
3852  51,	// 435 - 384, Ex = 435
3853  54,	// 438 - 384, Ex = 438
3854  58,	// 442 - 384, Ex = 442
3855  61,	// 445 - 384, Ex = 445
3856  0,	// 448 - 448, Ex = 448
3857  3,	// 451 - 448, Ex = 451
3858  7,	// 455 - 448, Ex = 455
3859  10,	// 458 - 448, Ex = 458
3860  13,	// 461 - 448, Ex = 461
3861  17,	// 465 - 448, Ex = 465
3862  20,	// 468 - 448, Ex = 468
3863  23,	// 471 - 448, Ex = 471
3864  27,	// 475 - 448, Ex = 475
3865  30,	// 478 - 448, Ex = 478
3866  33,	// 481 - 448, Ex = 481
3867  37,	// 485 - 448, Ex = 485
3868  40,	// 488 - 448, Ex = 488
3869  43,	// 491 - 448, Ex = 491
3870  47,	// 495 - 448, Ex = 495
3871  50,	// 498 - 448, Ex = 498
3872  53,	// 501 - 448, Ex = 501
3873  57	// 505 - 448, Ex = 505
3874};
3875
3876UINT64 half256[] = {
3877  0x0000000000000004ULL,	// half / 2^256 = 4
3878  0x0000000000000020ULL,	// half / 2^256 = 20
3879  0x0000000000000100ULL,	// half / 2^256 = 100
3880  0x0000000000001000ULL,	// half / 2^256 = 1000
3881  0x0000000000008000ULL,	// half / 2^256 = 8000
3882  0x0000000000040000ULL,	// half / 2^256 = 40000
3883  0x0000000000400000ULL,	// half / 2^256 = 400000
3884  0x0000000002000000ULL,	// half / 2^256 = 2000000
3885  0x0000000010000000ULL,	// half / 2^256 = 10000000
3886  0x0000000100000000ULL,	// half / 2^256 = 100000000
3887  0x0000000800000000ULL,	// half / 2^256 = 800000000
3888  0x0000004000000000ULL,	// half / 2^256 = 4000000000
3889  0x0000040000000000ULL,	// half / 2^256 = 40000000000
3890  0x0000200000000000ULL,	// half / 2^256 = 200000000000
3891  0x0001000000000000ULL,	// half / 2^256 = 1000000000000
3892  0x0010000000000000ULL,	// half / 2^256 = 10000000000000
3893  0x0080000000000000ULL,	// half / 2^256 = 80000000000000
3894  0x0400000000000000ULL,	// half / 2^256 = 400000000000000
3895  0x4000000000000000ULL,	// half / 2^256 = 4000000000000000
3896  0x0000000000000002ULL,	// half / 2^320 = 2
3897  0x0000000000000010ULL,	// half / 2^320 = 10
3898  0x0000000000000100ULL,	// half / 2^320 = 100
3899  0x0000000000000800ULL,	// half / 2^320 = 800
3900  0x0000000000004000ULL,	// half / 2^320 = 4000
3901  0x0000000000040000ULL,	// half / 2^320 = 40000
3902  0x0000000000200000ULL,	// half / 2^320 = 200000
3903  0x0000000001000000ULL,	// half / 2^320 = 1000000
3904  0x0000000010000000ULL,	// half / 2^320 = 10000000
3905  0x0000000080000000ULL,	// half / 2^320 = 80000000
3906  0x0000000400000000ULL,	// half / 2^320 = 400000000
3907  0x0000002000000000ULL,	// half / 2^320 = 2000000000
3908  0x0000020000000000ULL,	// half / 2^320 = 20000000000
3909  0x0000100000000000ULL,	// half / 2^320 = 100000000000
3910  0x0000800000000000ULL,	// half / 2^320 = 800000000000
3911  0x0008000000000000ULL,	// half / 2^320 = 8000000000000
3912  0x0040000000000000ULL,	// half / 2^320 = 40000000000000
3913  0x0200000000000000ULL,	// half / 2^320 = 200000000000000
3914  0x2000000000000000ULL,	// half / 2^320 = 2000000000000000
3915  0x0000000000000001ULL,	// half / 2^384 = 1
3916  0x0000000000000008ULL,	// half / 2^384 = 8
3917  0x0000000000000080ULL,	// half / 2^384 = 80
3918  0x0000000000000400ULL,	// half / 2^384 = 400
3919  0x0000000000002000ULL,	// half / 2^384 = 2000
3920  0x0000000000020000ULL,	// half / 2^384 = 20000
3921  0x0000000000100000ULL,	// half / 2^384 = 100000
3922  0x0000000000800000ULL,	// half / 2^384 = 800000
3923  0x0000000008000000ULL,	// half / 2^384 = 8000000
3924  0x0000000040000000ULL,	// half / 2^384 = 40000000
3925  0x0000000200000000ULL,	// half / 2^384 = 200000000
3926  0x0000002000000000ULL,	// half / 2^384 = 2000000000
3927  0x0000010000000000ULL,	// half / 2^384 = 10000000000
3928  0x0000080000000000ULL,	// half / 2^384 = 80000000000
3929  0x0000800000000000ULL,	// half / 2^384 = 800000000000
3930  0x0004000000000000ULL,	// half / 2^384 = 4000000000000
3931  0x0020000000000000ULL,	// half / 2^384 = 20000000000000
3932  0x0200000000000000ULL,	// half / 2^384 = 200000000000000
3933  0x1000000000000000ULL,	// half / 2^384 = 1000000000000000
3934  0x8000000000000000ULL,	// half / 2^384 = 8000000000000000
3935  0x0000000000000004ULL,	// half / 2^448 = 4
3936  0x0000000000000040ULL,	// half / 2^448 = 40
3937  0x0000000000000200ULL,	// half / 2^448 = 200
3938  0x0000000000001000ULL,	// half / 2^448 = 1000
3939  0x0000000000010000ULL,	// half / 2^448 = 10000
3940  0x0000000000080000ULL,	// half / 2^448 = 80000
3941  0x0000000000400000ULL,	// half / 2^448 = 400000
3942  0x0000000004000000ULL,	// half / 2^448 = 4000000
3943  0x0000000020000000ULL,	// half / 2^448 = 20000000
3944  0x0000000100000000ULL,	// half / 2^448 = 100000000
3945  0x0000001000000000ULL,	// half / 2^448 = 1000000000
3946  0x0000008000000000ULL,	// half / 2^448 = 8000000000
3947  0x0000040000000000ULL,	// half / 2^448 = 40000000000
3948  0x0000400000000000ULL,	// half / 2^448 = 400000000000
3949  0x0002000000000000ULL,	// half / 2^448 = 2000000000000
3950  0x0010000000000000ULL,	// half / 2^448 = 10000000000000
3951  0x0100000000000000ULL	// half / 2^448 = 100000000000000
3952};
3953
3954UINT64 mask256[] = {
3955  0x0000000000000007ULL,	// mask / 2^256
3956  0x000000000000003fULL,	// mask / 2^256
3957  0x00000000000001ffULL,	// mask / 2^256
3958  0x0000000000001fffULL,	// mask / 2^256
3959  0x000000000000ffffULL,	// mask / 2^256
3960  0x000000000007ffffULL,	// mask / 2^256
3961  0x00000000007fffffULL,	// mask / 2^256
3962  0x0000000003ffffffULL,	// mask / 2^256
3963  0x000000001fffffffULL,	// mask / 2^256
3964  0x00000001ffffffffULL,	// mask / 2^256
3965  0x0000000fffffffffULL,	// mask / 2^256
3966  0x0000007fffffffffULL,	// mask / 2^256
3967  0x000007ffffffffffULL,	// mask / 2^256
3968  0x00003fffffffffffULL,	// mask / 2^256
3969  0x0001ffffffffffffULL,	// mask / 2^256
3970  0x001fffffffffffffULL,	// mask / 2^256
3971  0x00ffffffffffffffULL,	// mask / 2^256
3972  0x07ffffffffffffffULL,	// mask / 2^256
3973  0x7fffffffffffffffULL,	// mask / 2^256
3974  0x0000000000000003ULL,	// mask / 2^320
3975  0x000000000000001fULL,	// mask / 2^320
3976  0x00000000000001ffULL,	// mask / 2^320
3977  0x0000000000000fffULL,	// mask / 2^320
3978  0x0000000000007fffULL,	// mask / 2^320
3979  0x000000000007ffffULL,	// mask / 2^320
3980  0x00000000003fffffULL,	// mask / 2^320
3981  0x0000000001ffffffULL,	// mask / 2^320
3982  0x000000001fffffffULL,	// mask / 2^320
3983  0x00000000ffffffffULL,	// mask / 2^320
3984  0x00000007ffffffffULL,	// mask / 2^320
3985  0x0000003fffffffffULL,	// mask / 2^320
3986  0x000003ffffffffffULL,	// mask / 2^320
3987  0x00001fffffffffffULL,	// mask / 2^320
3988  0x0000ffffffffffffULL,	// mask / 2^320
3989  0x000fffffffffffffULL,	// mask / 2^320
3990  0x007fffffffffffffULL,	// mask / 2^320
3991  0x03ffffffffffffffULL,	// mask / 2^320
3992  0x3fffffffffffffffULL,	// mask / 2^320
3993  0x0000000000000001ULL,	// mask / 2^384
3994  0x000000000000000fULL,	// mask / 2^384
3995  0x00000000000000ffULL,	// mask / 2^384
3996  0x00000000000007ffULL,	// mask / 2^384
3997  0x0000000000003fffULL,	// mask / 2^384
3998  0x000000000003ffffULL,	// mask / 2^384
3999  0x00000000001fffffULL,	// mask / 2^384
4000  0x0000000000ffffffULL,	// mask / 2^384
4001  0x000000000fffffffULL,	// mask / 2^384
4002  0x000000007fffffffULL,	// mask / 2^384
4003  0x00000003ffffffffULL,	// mask / 2^384
4004  0x0000003fffffffffULL,	// mask / 2^384
4005  0x000001ffffffffffULL,	// mask / 2^384
4006  0x00000fffffffffffULL,	// mask / 2^384
4007  0x0000ffffffffffffULL,	// mask / 2^384
4008  0x0007ffffffffffffULL,	// mask / 2^384
4009  0x003fffffffffffffULL,	// mask / 2^384
4010  0x03ffffffffffffffULL,	// mask / 2^384
4011  0x1fffffffffffffffULL,	// mask / 2^384
4012  0xffffffffffffffffULL,	// mask / 2^384
4013  0x0000000000000007ULL,	// mask / 2^448
4014  0x000000000000007fULL,	// mask / 2^448
4015  0x00000000000003ffULL,	// mask / 2^448
4016  0x0000000000001fffULL,	// mask / 2^448
4017  0x000000000001ffffULL,	// mask / 2^448
4018  0x00000000000fffffULL,	// mask / 2^448
4019  0x00000000007fffffULL,	// mask / 2^448
4020  0x0000000007ffffffULL,	// mask / 2^448
4021  0x000000003fffffffULL,	// mask / 2^448
4022  0x00000001ffffffffULL,	// mask / 2^448
4023  0x0000001fffffffffULL,	// mask / 2^448
4024  0x000000ffffffffffULL,	// mask / 2^448
4025  0x000007ffffffffffULL,	// mask / 2^448
4026  0x00007fffffffffffULL,	// mask / 2^448
4027  0x0003ffffffffffffULL,	// mask / 2^448
4028  0x001fffffffffffffULL,	// mask / 2^448
4029  0x01ffffffffffffffULL	// mask / 2^448
4030};
4031
4032UINT256 ten2mxtrunc256[] = {
4033  {{0xccccccccccccccccULL, 0xccccccccccccccccULL,
4034    0xccccccccccccccccULL, 0xccccccccccccccccULL}},
4035  // (ten2mx >> 256) = cccccccccccccccc  cccccccccccccccc
4036  //   cccccccccccccccccccccccccccccccc
4037  {{0x70a3d70a3d70a3d7ULL, 0xd70a3d70a3d70a3dULL,
4038    0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
4039  // (ten2mx >> 256) = a3d70a3d70a3d70a  3d70a3d70a3d70a3
4040  //   d70a3d70a3d70a3d70a3d70a3d70a3d7
4041  {{0xc083126e978d4fdfULL, 0x78d4fdf3b645a1caULL,
4042    0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
4043  // (ten2mx >> 256) = 83126e978d4fdf3b  645a1cac083126e9
4044  //   78d4fdf3b645a1cac083126e978d4fdf
4045  {{0x67381d7dbf487fcbULL, 0xc154c985f06f6944ULL,
4046    0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
4047  // (ten2mx >> 256) = d1b71758e219652b  d3c36113404ea4a8
4048  //   c154c985f06f694467381d7dbf487fcb
4049  {{0x85c67dfe32a0663cULL, 0xcddd6e04c0592103ULL,
4050    0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
4051  // (ten2mx >> 256) = a7c5ac471b478423  fcf80dc33721d53
4052  //   cddd6e04c059210385c67dfe32a0663c
4053  {{0x37d1fe64f54d1e96ULL, 0xd7e45803cd141a69ULL,
4054    0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
4055  // (ten2mx >> 256) = 8637bd05af6c69b5  a63f9a49c2c1b10f
4056  //   d7e45803cd141a6937d1fe64f54d1e96
4057  {{0x8c8330a1887b6424ULL, 0x8ca08cd2e1b9c3dbULL,
4058    0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
4059  // (ten2mx >> 256) = d6bf94d5e57a42bc  3d32907604691b4c
4060  //   8ca08cd2e1b9c3db8c8330a1887b6424
4061  {{0x7068f3b46d2f8350ULL, 0x3d4d3d758161697cULL,
4062    0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
4063  // (ten2mx >> 256) = abcc77118461cefc  fdc20d2b36ba7c3d
4064  //   3d4d3d758161697c7068f3b46d2f8350
4065  {{0xf387295d242602a6ULL, 0xfdd7645e011abac9ULL,
4066    0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
4067  // (ten2mx >> 256) = 89705f4136b4a597  31680a88f8953030
4068  //   fdd7645e011abac9f387295d242602a6
4069  {{0xb8d8422ea03cd10aULL, 0x2fbf06fcce912adcULL,
4070    0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
4071  // (ten2mx >> 256) = dbe6fecebdedd5be  b573440e5a884d1b
4072  //   2fbf06fcce912adcb8d8422ea03cd10a
4073  {{0x93e034f219ca40d5ULL, 0xf2ff38ca3eda88b0ULL,
4074    0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
4075  // (ten2mx >> 256) = afebff0bcb24aafe  f78f69a51539d748
4076  //   f2ff38ca3eda88b093e034f219ca40d5
4077  {{0x4319c3f4e16e9a44ULL, 0xf598fa3b657ba08dULL,
4078    0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
4079  // (ten2mx >> 256) = 8cbccc096f5088cb  f93f87b7442e45d3
4080  //   f598fa3b657ba08d4319c3f4e16e9a44
4081  {{0x04f606549be42a06ULL, 0x88f4c3923bf900e2ULL,
4082    0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
4083  // (ten2mx >> 256) = e12e13424bb40e13  2865a5f206b06fb9
4084  //   88f4c3923bf900e204f606549be42a06
4085  {{0x03f805107cb68805ULL, 0x6d909c74fcc733e8ULL,
4086    0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
4087  // (ten2mx >> 256) = b424dc35095cd80f  538484c19ef38c94
4088  //   6d909c74fcc733e803f805107cb68805
4089  {{0x3660040d3092066aULL, 0x57a6e390ca38f653ULL,
4090    0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
4091  // (ten2mx >> 256) = 901d7cf73ab0acd9  f9d37014bf60a10
4092  //   57a6e390ca38f6533660040d3092066a
4093  {{0x23ccd3484db670aaULL, 0xbf716c1add27f085ULL,
4094    0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
4095  // (ten2mx >> 256) = e69594bec44de15b  4c2ebe687989a9b3
4096  //   bf716c1add27f08523ccd3484db670aa
4097  {{0x4fd70f6d0af85a22ULL, 0xff8df0157db98d37ULL,
4098    0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
4099  // (ten2mx >> 256) = b877aa3236a4b449  9befeb9fad487c2
4100  //   ff8df0157db98d374fd70f6d0af85a22
4101  {{0x0cac0c573bf9e1b5ULL, 0x32d7f344649470f9ULL,
4102    0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
4103  // (ten2mx >> 256) = 9392ee8e921d5d07  3aff322e62439fcf
4104  //   32d7f344649470f90cac0c573bf9e1b5
4105  {{0xe11346f1f98fcf88ULL, 0x1e2652070753e7f4ULL,
4106    0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
4107  // (ten2mx >> 256) = ec1e4a7db69561a5  2b31e9e3d06c32e5
4108  //   1e2652070753e7f4e11346f1f98fcf88
4109  {{0x4da9058e613fd939ULL, 0x181ea8059f76532aULL,
4110    0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
4111  // (ten2mx >> 256) = bce5086492111aea  88f4bb1ca6bcf584
4112  //   181ea8059f76532a4da9058e613fd939
4113  {{0xa48737a51a997a94ULL, 0x467eecd14c5ea8eeULL,
4114    0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
4115  // (ten2mx >> 256) = 971da05074da7bee  d3f6fc16ebca5e03
4116  //   467eecd14c5ea8eea48737a51a997a94
4117  {{0x3a71f2a1c428c420ULL, 0x70cb148213caa7e4ULL,
4118    0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
4119  // (ten2mx >> 256) = f1c90080baf72cb1  5324c68b12dd6338
4120  //   70cb148213caa7e43a71f2a1c428c420
4121  {{0x2ec18ee7d0209ce7ULL, 0x8d6f439b43088650ULL,
4122    0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
4123  // (ten2mx >> 256) = c16d9a0095928a27  75b7053c0f178293
4124  //   8d6f439b430886502ec18ee7d0209ce7
4125  {{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
4126    0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
4127  // (ten2mx >> 256) = 9abe14cd44753b52  c4926a9672793542
4128  //   d78c3615cf3a050cf23472530ce6e3ec
4129  {{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
4130    0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
4131  // (ten2mx >> 256) = f79687aed3eec551  3a83ddbd83f52204
4132  //   8c1389bc7ec33b47e9ed83b814a49fe0
4133  {{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
4134    0x95364afe032a819dULL, 0xc612062576589ddaULL}},
4135  // (ten2mx >> 256) = c612062576589dda  95364afe032a819d
4136  //   3cdc6e306568fc3987f1362cdd507fe6
4137  {{0x9ff42b5717739985ULL, 0xca49f1c05120c9c7ULL,
4138    0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
4139  // (ten2mx >> 256) = 9e74d1b791e07e48  775ea264cf55347d
4140  //   ca49f1c05120c9c79ff42b5717739985
4141  {{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
4142    0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
4143  // (ten2mx >> 256) = fd87b5f28300ca0d  8bca9d6e188853fc
4144  //   76dcb60081ce0fa5ccb9def1bf1f5c08
4145  {{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
4146    0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
4147  // (ten2mx >> 256) = cad2f7f5359a3b3e  96ee45813a04330
4148  //   5f16f80067d80c84a3c7e58e327f7cd3
4149  {{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
4150    0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
4151  // (ten2mx >> 256) = a2425ff75e14fc31  a1258379a94d028d
4152  //   18df2ccd1fe00a03b6398471c1ff970f
4153  {{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
4154    0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
4155  // (ten2mx >> 256) = 81ceb32c4b43fcf4  80eacf948770ced7
4156  //   4718f0a419800802f82e038e34cc78d9
4157  {{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
4158    0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
4159  // (ten2mx >> 256) = cfb11ead453994ba  67de18eda5814af2
4160  //   b5b1aa028ccd99e59e338e387ad8e28
4161  {{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
4162    0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
4163  // (ten2mx >> 256) = a6274bbdd0fadd61  ecb1ad8aeacdd58e
4164  //   6f7c154ced70ae1847e8fa4f9fbe0b53
4165  {{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
4166    0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
4167  // (ten2mx >> 256) = 84ec3c97da624ab4  bd5af13bef0b113e
4168  //   bf967770bdf3be79d320c83fb2fe6f75
4169  {{0x85014065eb30b256ULL, 0x65bd8be79652ca5cULL,
4170    0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
4171  // (ten2mx >> 256) = d4ad2dbfc3d07787  955e4ec64b44e864
4172  //   65bd8be79652ca5c85014065eb30b256
4173  {{0xd0cdcd1e55c08eabULL, 0xeafe098611dbd516ULL,
4174    0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
4175  // (ten2mx >> 256) = aa242499697392d2  dde50bd1d5d0b9e9
4176  //   eafe098611dbd516d0cdcd1e55c08eab
4177  {{0x40a4a418449a0bbcULL, 0xbbfe6e04db164412ULL,
4178    0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
4179  // (ten2mx >> 256) = 881cea14545c7575  7e50d64177da2e54
4180  //   bbfe6e04db16441240a4a418449a0bbc
4181  {{0x9aa1068d3a9012c7ULL, 0x2cca49a15e8a0683ULL,
4182    0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
4183  // (ten2mx >> 256) = d9c7dced53c72255  96e7bd358c904a21
4184  //   2cca49a15e8a06839aa1068d3a9012c7
4185  {{0x154d9ed7620cdbd2ULL, 0x8a3b6e1ab2080536ULL,
4186    0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
4187  // (ten2mx >> 256) = ae397d8aa96c1b77  abec975e0a0d081a
4188  //   8a3b6e1ab2080536154d9ed7620cdbd2
4189  {{0x443e18ac4e70afdbULL, 0x3b62be7bc1a0042bULL,
4190    0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
4191  // (ten2mx >> 256) = 8b61313bbabce2c6  2323ac4b3b3da015
4192  //   3b62be7bc1a0042b443e18ac4e70afdb
4193  {{0x6d30277a171ab2f8ULL, 0x5f0463f935ccd378ULL,
4194    0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
4195  // (ten2mx >> 256) = df01e85f912e37a3  6b6c46dec52f6688
4196  //   5f0463f935ccd3786d30277a171ab2f8
4197  {{0x8a8cec61ac155bfaULL, 0x7f36b660f7d70f93ULL,
4198    0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
4199  // (ten2mx >> 256) = b267ed1940f1c61c  55f038b237591ed3
4200  //   7f36b660f7d70f938a8cec61ac155bfa
4201  {{0x3ba3f04e23444995ULL, 0xcc2bc51a5fdf3fa9ULL,
4202    0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
4203  // (ten2mx >> 256) = 8eb98a7a9a5b04e3  77f3608e92adb242
4204  //   cc2bc51a5fdf3fa93ba3f04e23444995
4205  {{0xf9064d49d206dc21ULL, 0xe046082a32fecc41ULL,
4206    0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
4207  // (ten2mx >> 256) = e45c10c42a2b3b05  8cb89a7db77c506a
4208  //   e046082a32fecc41f9064d49d206dc21
4209  {{0xfa6b7107db38b01aULL, 0x4d04d354f598a367ULL,
4210    0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
4211  // (ten2mx >> 256) = b6b00d69bb55c8d1  3d607b97c5fd0d22
4212  //   4d04d354f598a367fa6b7107db38b01a
4213  {{0xfb8927397c2d59afULL, 0x3d9d75dd9146e91fULL,
4214    0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
4215  // (ten2mx >> 256) = 9226712162ab070d  cab3961304ca70e8
4216  //   3d9d75dd9146e91ffb8927397c2d59af
4217  {{0xf8db71f5937bc2b1ULL, 0xc8fbefc8e87174ffULL,
4218    0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
4219  // (ten2mx >> 256) = e9d71b689dde71af  aab8f01e6e10b4a6
4220  //   c8fbefc8e87174fff8db71f5937bc2b1
4221  {{0x2d7c5b2adc630227ULL, 0x3a63263a538df733ULL,
4222    0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
4223  // (ten2mx >> 256) = bb127c53b17ec159  5560c018580d5d52
4224  //   3a63263a538df7332d7c5b2adc630227
4225  {{0x24637c2249e8ce86ULL, 0x2eb5b82ea93e5f5cULL,
4226    0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
4227  // (ten2mx >> 256) = 95a8637627989aad  dde7001379a44aa8
4228  //   2eb5b82ea93e5f5c24637c2249e8ce86
4229  {{0x3a38c69d430e173dULL, 0x4abc59e441fd6560ULL,
4230    0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
4231  // (ten2mx >> 256) = ef73d256a5c0f77c  963e66858f6d4440
4232  //   4abc59e441fd65603a38c69d430e173d
4233  {{0x94fa387dcf3e78fdULL, 0x6efd14b69b311de6ULL,
4234    0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
4235  // (ten2mx >> 256) = bf8fdb78849a5f96  de98520472bdd033
4236  //   6efd14b69b311de694fa387dcf3e78fd
4237  {{0xaa61c6cb0c31fa64ULL, 0x259743c548f417ebULL,
4238    0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
4239  // (ten2mx >> 256) = 993fe2c6d07b7fab  e546a8038efe4029
4240  //   259743c548f417ebaa61c6cb0c31fa64
4241  {{0xaa360ade79e990a1ULL, 0x3c25393ba7ecf312ULL,
4242    0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
4243  // (ten2mx >> 256) = f53304714d9265df  d53dd99f4b3066a8
4244  //   3c25393ba7ecf312aa360ade79e990a1
4245  {{0x882b3be52e5473b4ULL, 0x96842dc95323f5a8ULL,
4246    0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
4247  // (ten2mx >> 256) = c428d05aa4751e4c  aa97e14c3c26b886
4248  //   96842dc95323f5a8882b3be52e5473b4
4249  {{0xd355c98425105c90ULL, 0xab9cf16ddc1cc486ULL,
4250    0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
4251  // (ten2mx >> 256) = 9ced737bb6c4183d  55464dd69685606b
4252  //   ab9cf16ddc1cc486d355c98425105c90
4253  {{0xebbc75a03b4d60e6ULL, 0xac2e4f162cfad40aULL,
4254    0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
4255  // (ten2mx >> 256) = fb158592be068d2e  eed6e2f0f0d56712
4256  //   ac2e4f162cfad40aebbc75a03b4d60e6
4257  {{0x8963914cfc3de71eULL, 0x568b727823fbdcd5ULL,
4258    0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
4259  // (ten2mx >> 256) = c8de047564d20a8b  f245825a5a445275
4260  //   568b727823fbdcd58963914cfc3de71e
4261  {{0xd44fa770c9cb1f4bULL, 0x453c5b934ffcb0aaULL,
4262    0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
4263  // (ten2mx >> 256) = a0b19d2ab70e6ed6  5b6aceaeae9d0ec4
4264  //   453c5b934ffcb0aad44fa770c9cb1f4b
4265  {{0xdd0c85f3d4a27f6fULL, 0x37637c75d996f3bbULL,
4266    0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
4267  // (ten2mx >> 256) = 808e17555f3ebf11  e2bbd88bbee40bd0
4268  //   37637c75d996f3bbdd0c85f3d4a27f6f
4269  {{0x61ada31fba9d98b2ULL, 0x256bfa5628f185f9ULL,
4270    0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
4271  // (ten2mx >> 256) = cdb02555653131b6  3792f412cb06794d
4272  //   256bfa5628f185f961ada31fba9d98b2
4273  {{0xe7be1c196217ad5bULL, 0x51232eab53f46b2dULL,
4274    0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
4275  // (ten2mx >> 256) = a48ceaaab75a8e2b  5fa8c3423c052dd7
4276  //   51232eab53f46b2de7be1c196217ad5b
4277  {{0x52fe7ce11b462449ULL, 0x40e8f222a99055beULL,
4278    0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
4279  // (ten2mx >> 256) = 83a3eeeef9153e89  1953cf68300424ac
4280  //   40e8f222a99055be52fe7ce11b462449
4281  {{0x51972e34f8703a0fULL, 0x34a7e9d10f4d55fdULL,
4282    0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
4283  // (ten2mx >> 256) = d29fe4b18e88640e  8eec7f0d19a03aad
4284  //   34a7e9d10f4d55fd51972e34f8703a0f
4285  {{0x0e128b5d938cfb3fULL, 0x2a1fee40d90aab31ULL,
4286    0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
4287  // (ten2mx >> 256) = a87fea27a539e9a5  3f2398d747b36224
4288  //   2a1fee40d90aab310e128b5d938cfb3f
4289  {{0x3e753c4adc70c8ffULL, 0xbb4cbe9a473bbc27ULL,
4290    0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
4291  // (ten2mx >> 256) = 86ccbb52ea94baea  98e947129fc2b4e9
4292  //   bb4cbe9a473bbc273e753c4adc70c8ff
4293  {{0x30bb93aafa4e0e65ULL, 0x9214642a0b92c6a5ULL,
4294    0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
4295  // (ten2mx >> 256) = d7adf884aa879177  5b0ed81dcc6abb0f
4296  //   9214642a0b92c6a530bb93aafa4e0e65
4297  {{0xc0960fbbfb71a51eULL, 0xa8105021a2dbd21dULL,
4298    0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
4299  // (ten2mx >> 256) = ac8b2d36eed2dac5  e272467e3d222f3f
4300  //   a8105021a2dbd21dc0960fbbfb71a51e
4301  {{0x66de72fcc927b74bULL, 0xb9a6a6814f1641b1ULL,
4302    0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
4303  // (ten2mx >> 256) = 8a08f0f8bf0f156b  1b8e9ecb641b58ff
4304  //   b9a6a6814f1641b166de72fcc927b74b
4305  {{0xd7ca5194750c5878ULL, 0xf5d770cee4f0691bULL,
4306    0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
4307  // (ten2mx >> 256) = dcdb1b2798182244  f8e431456cf88e65
4308  //   f5d770cee4f0691bd7ca5194750c5878
4309  {{0xdfd50e105da379f9ULL, 0x9179270bea59edafULL,
4310    0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
4311  // (ten2mx >> 256) = b0af48ec79ace837  2d835a9df0c6d851
4312  //   9179270bea59edafdfd50e105da379f9
4313  {{0x19773e737e1c6194ULL, 0x0dfa85a321e18af3ULL,
4314    0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
4315  // (ten2mx >> 256) = 8d590723948a535f  579c487e5a38ad0e
4316  //   dfa85a321e18af319773e737e1c6194
4317  {{0xf58b971f302d68eeULL, 0x165da29e9c9c1184ULL,
4318    0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
4319  // (ten2mx >> 256) = e2280b6c20dd5232  25c6da63c38de1b0
4320  //   165da29e9c9c1184f58b971f302d68ee
4321  {{0xc46fac18f3578724ULL, 0x4517b54bb07cdad0ULL,
4322    0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
4323  // (ten2mx >> 256) = b4ecd5f01a4aa828  1e38aeb6360b1af3
4324  //   4517b54bb07cdad0c46fac18f3578724
4325  {{0x36bfbce0c2ac6c1dULL, 0x9dac910959fd7bdaULL,
4326    0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
4327  // (ten2mx >> 256) = 90bd77f3483bb9b9  b1c6f22b5e6f48c2
4328  //   9dac910959fd7bda36bfbce0c2ac6c1d
4329  {{0x2465fb01377a4695ULL, 0x2f7a81a88ffbf95dULL,
4330    0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
4331  // (ten2mx >> 256) = e7958cb87392c2c2  b60b1d1230b20e04
4332  //   2f7a81a88ffbf95d2465fb01377a4695
4333};
4334