OSDN Git Service

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