89 private static final int NP = 168;
90 private static final int PLIM = 1000;
93 private static final int[] PRIMES = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
94 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
95 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
96 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457,
97 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601,
98 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,
99 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
100 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 };
105 private static final int[] FAURE_LEMIEUX_FACTORS = { 1, 1, 3, 3, 4, 9, 7, 5, 9, 18, 18, 8, 13, 31, 9, 19, 36, 33, 21,
106 44, 43, 61, 60, 56, 26, 71, 32, 77, 26, 95, 92, 47, 29, 61, 57, 69, 115, 63, 92, 31, 104, 126, 50, 80, 55, 152,
107 114, 80, 83, 97, 95, 150, 148, 55, 80, 192, 71, 76, 82, 109, 105, 173, 58, 143, 56, 177, 203, 239, 196, 143,
108 278, 227, 87, 274, 264, 84, 226, 163, 231, 177, 95, 116, 165, 131, 156, 105, 188, 142, 105, 125, 269, 292, 215,
109 182, 294, 152, 148, 144, 382, 194, 346, 323, 220, 174, 133, 324, 215, 246, 159, 337, 254, 423, 484, 239, 440,
110 362, 464, 376, 398, 174, 149, 418, 306, 282, 434, 196, 458, 313, 512, 450, 161, 315, 441, 549, 555, 431, 295,
111 557, 172, 343, 472, 604, 297, 524, 251, 514, 385, 531, 663, 674, 255, 519, 324, 391, 394, 533, 253, 717, 651,
112 399, 596, 676, 425, 261, 404, 691, 604, 274, 627, 777, 269, 217, 599, 447, 581, 640, 666, 595, 669, 686, 305,
113 460, 599, 335, 258, 649, 771, 619, 666, 669, 707, 737, 854, 925, 818, 424, 493, 463, 535, 782, 476, 451, 520,
114 886, 340, 793, 390, 381, 274, 500, 581, 345, 363, 1024, 514, 773, 932, 556, 954, 793, 294, 863, 393, 827, 527,
115 1007, 622, 549, 613, 799, 408, 856, 601, 1072, 938, 322, 1142, 873, 629, 1071, 1063, 1205, 596, 973, 984, 875,
116 918, 1133, 1223, 933, 1110, 1228, 1017, 701, 480, 678, 1172, 689, 1138, 1022, 682, 613, 635, 984, 526, 1311,
117 459, 1348, 477, 716, 1075, 682, 1245, 401, 774, 1026, 499, 1314, 743, 693, 1282, 1003, 1181, 1079, 765, 815,
118 1350, 1144, 1449, 718, 805, 1203, 1173, 737, 562, 579, 701, 1104, 1105, 1379, 827, 1256, 759, 540, 1284, 1188,
119 776, 853, 1140, 445, 1265, 802, 932, 632, 1504, 856, 1229, 1619, 774, 1229, 1300, 1563, 1551, 1265, 905, 1333,
120 493, 913, 1397, 1250, 612, 1251, 1765, 1303, 595, 981, 671, 1403, 820, 1404, 1661, 973, 1340, 1015, 1649, 855,
121 1834, 1621, 1704, 893, 1033, 721, 1737, 1507, 1851, 1006, 994, 923, 872, 1860 };
123 private static final int NRILIM = 1000;
151 JMAX = (int) (32.0 * 0.69314718055994530941 / logb);
157 private long computeI(
double x) {
159 int[] digits =
new int[JMAX];
161 for (j = 0; (j < JMAX) && (x > 0.5e-15); j++) {
167 for (j = JMAX - 1; j >= 0; j--) {
168 i = i * b + digits[j];
188 int[] prime =
new int[n];
190 int n1 = Math.min(NP, n);
191 for (i = 0; i < n1; i++)
192 prime[i] = PRIMES[i];
195 for (
int candidate = PLIM + 1; i < n; candidate += 2) {
196 prime[i] = candidate;
197 for (
int j = 1; (moreTests = prime[j] <= candidate / prime[j]) && ((candidate % prime[j]) > 0); j++)
216 double digit, radical, inverse;
217 digit = radical = 1.0 / (double) b;
218 for (inverse = 0.0; i > 0; i /= b) {
219 inverse += digit * (double) (i % b);
242 int precision = Integer.MAX_VALUE / (2 * b * b);
243 while (x > 0 && inverse < precision) {
245 double y = Math.floor(x * p);
246 inverse += digit * (int) y;
270 long precision = Long.MAX_VALUE / (b * b * b);
271 while (x > 0 && inverse < precision) {
273 double y = Math.floor(x * p);
274 inverse += digit * (long) y;
300 final double ALMOST_ONE = 1.0 - 1e-10;
301 double nextInverse = x + invb;
302 if (nextInverse < ALMOST_ONE)
305 double digit1 = invb;
306 double digit2 = invb * invb;
307 while (x + digit2 >= ALMOST_ONE) {
311 return x + (digit1 - 1.0) + digit2;
339 final double ALMOST_ONE = 1.0 - 1e-10;
340 double nextInverse = xx + invb;
341 if (nextInverse < ALMOST_ONE) {
345 double digit1 = invb;
346 double digit2 = invb * invb;
347 while (xx + digit2 >= ALMOST_ONE) {
351 xx += (digit1 - 1.0) + digit2;
402 for (
int l = 0; l < k; l++)
403 idigits[l] = bdigits[k - l];
417 for (inverse = 0; i > 0; i /= b)
418 inverse = inverse * b + (i % b);
435 for (l = k - 1; l >= 0; l--)
436 if (idigits[l] == b - 1)
458 int f = FAURE_LEMIEUX_FACTORS[coordinate];
459 int b = PRIMES[coordinate];
460 for (
int k = 0; k < pi.length; k++)
479 }
else if ((b & 1) != 0) {
483 for (i = 0; i < b; i++)
486 for (i = b; i > b / 2; i--)
492 for (i = 0; i < b; i++) {
494 pi[i + b] = pi[i] + 1;
512 double digit, radical, inverse;
513 digit = radical = 1.0 / (double) b;
514 for (inverse = 0.0; i > 0; i /= b) {
515 inverse += digit * (double) pi[(
int) (i % b)];