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