hash.cpp revision d2a9251977be7d3cb9421b263d8a604dff709dad
1//===-------------------------- hash.cpp ----------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "__hash_table" 11#include "algorithm" 12 13_LIBCPP_BEGIN_NAMESPACE_STD 14 15namespace { 16 17// handle all next_prime(i) for i in [1, 210), special case 0 18const unsigned small_primes[] = 19{ 20 0, 21 2, 22 3, 23 5, 24 7, 25 11, 26 13, 27 17, 28 19, 29 23, 30 29, 31 31, 32 37, 33 41, 34 43, 35 47, 36 53, 37 59, 38 61, 39 67, 40 71, 41 73, 42 79, 43 83, 44 89, 45 97, 46 101, 47 103, 48 107, 49 109, 50 113, 51 127, 52 131, 53 137, 54 139, 55 149, 56 151, 57 157, 58 163, 59 167, 60 173, 61 179, 62 181, 63 191, 64 193, 65 197, 66 199, 67 211 68}; 69 70// potential primes = 210*k + indices[i], k >= 1 71// these numbers are not divisible by 2, 3, 5 or 7 72// (or any integer 2 <= j <= 10 for that matter). 73const unsigned indices[] = 74{ 75 1, 76 11, 77 13, 78 17, 79 19, 80 23, 81 29, 82 31, 83 37, 84 41, 85 43, 86 47, 87 53, 88 59, 89 61, 90 67, 91 71, 92 73, 93 79, 94 83, 95 89, 96 97, 97 101, 98 103, 99 107, 100 109, 101 113, 102 121, 103 127, 104 131, 105 137, 106 139, 107 143, 108 149, 109 151, 110 157, 111 163, 112 167, 113 169, 114 173, 115 179, 116 181, 117 187, 118 191, 119 193, 120 197, 121 199, 122 209 123}; 124 125} 126 127// Returns: If n == 0, returns 0. Else returns the lowest prime number that 128// is greater than or equal to n. 129// 130// The algorithm creates a list of small primes, plus an open-ended list of 131// potential primes. All prime numbers are potential prime numbers. However 132// some potential prime numbers are not prime. In an ideal world, all potential 133// prime numbers would be prime. Candiate prime numbers are chosen as the next 134// highest potential prime. Then this number is tested for prime by dividing it 135// by all potential prime numbers less than the sqrt of the candidate. 136// 137// This implementation defines potential primes as those numbers not divisible 138// by 2, 3, 5, and 7. Other (common) implementations define potential primes 139// as those not divisible by 2. A few other implementations define potential 140// primes as those not divisible by 2 or 3. By raising the number of small 141// primes which the potential prime is not divisible by, the set of potential 142// primes more closely approximates the set of prime numbers. And thus there 143// are fewer potential primes to search, and fewer potential primes to divide 144// against. 145 146size_t 147__next_prime(size_t n) 148{ 149 const size_t L = 210; 150 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); 151 // If n is small enough, search in small_primes 152 if (n <= small_primes[N-1]) 153 return *std::lower_bound(small_primes, small_primes + N, n); 154 // Else n > largest small_primes 155 // Start searching list of potential primes: L * k0 + indices[in] 156 const size_t M = sizeof(indices) / sizeof(indices[0]); 157 // Select first potential prime >= n 158 // Known a-priori n >= L 159 size_t k0 = n / L; 160 size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices; 161 n = L * k0 + indices[in]; 162 while (true) 163 { 164 // Divide n by all primes or potential primes (i) until: 165 // 1. The division is even, so try next potential prime. 166 // 2. The i > sqrt(n), in which case n is prime. 167 // It is known a-priori that n is not divisible by 2, 3, 5 or 7, 168 // so don't test those (j == 5 -> divide by 11 first). And the 169 // potential primes start with 211, so don't test against the last 170 // small prime. 171 for (size_t j = 5; j < N - 1; ++j) 172 { 173 const std::size_t p = small_primes[j]; 174 const std::size_t q = n / p; 175 if (q < p) 176 return n; 177 if (n == q * p) 178 goto next; 179 } 180 // n wasn't divisible by small primes, try potential primes 181 { 182 size_t i = 211; 183 while (true) 184 { 185 std::size_t q = n / i; 186 if (q < i) 187 return n; 188 if (n == q * i) 189 break; 190 191 i += 10; 192 q = n / i; 193 if (q < i) 194 return n; 195 if (n == q * i) 196 break; 197 198 i += 2; 199 q = n / i; 200 if (q < i) 201 return n; 202 if (n == q * i) 203 break; 204 205 i += 4; 206 q = n / i; 207 if (q < i) 208 return n; 209 if (n == q * i) 210 break; 211 212 i += 2; 213 q = n / i; 214 if (q < i) 215 return n; 216 if (n == q * i) 217 break; 218 219 i += 4; 220 q = n / i; 221 if (q < i) 222 return n; 223 if (n == q * i) 224 break; 225 226 i += 6; 227 q = n / i; 228 if (q < i) 229 return n; 230 if (n == q * i) 231 break; 232 233 i += 2; 234 q = n / i; 235 if (q < i) 236 return n; 237 if (n == q * i) 238 break; 239 240 i += 6; 241 q = n / i; 242 if (q < i) 243 return n; 244 if (n == q * i) 245 break; 246 247 i += 4; 248 q = n / i; 249 if (q < i) 250 return n; 251 if (n == q * i) 252 break; 253 254 i += 2; 255 q = n / i; 256 if (q < i) 257 return n; 258 if (n == q * i) 259 break; 260 261 i += 4; 262 q = n / i; 263 if (q < i) 264 return n; 265 if (n == q * i) 266 break; 267 268 i += 6; 269 q = n / i; 270 if (q < i) 271 return n; 272 if (n == q * i) 273 break; 274 275 i += 6; 276 q = n / i; 277 if (q < i) 278 return n; 279 if (n == q * i) 280 break; 281 282 i += 2; 283 q = n / i; 284 if (q < i) 285 return n; 286 if (n == q * i) 287 break; 288 289 i += 6; 290 q = n / i; 291 if (q < i) 292 return n; 293 if (n == q * i) 294 break; 295 296 i += 4; 297 q = n / i; 298 if (q < i) 299 return n; 300 if (n == q * i) 301 break; 302 303 i += 2; 304 q = n / i; 305 if (q < i) 306 return n; 307 if (n == q * i) 308 break; 309 310 i += 6; 311 q = n / i; 312 if (q < i) 313 return n; 314 if (n == q * i) 315 break; 316 317 i += 4; 318 q = n / i; 319 if (q < i) 320 return n; 321 if (n == q * i) 322 break; 323 324 i += 6; 325 q = n / i; 326 if (q < i) 327 return n; 328 if (n == q * i) 329 break; 330 331 i += 8; 332 q = n / i; 333 if (q < i) 334 return n; 335 if (n == q * i) 336 break; 337 338 i += 4; 339 q = n / i; 340 if (q < i) 341 return n; 342 if (n == q * i) 343 break; 344 345 i += 2; 346 q = n / i; 347 if (q < i) 348 return n; 349 if (n == q * i) 350 break; 351 352 i += 4; 353 q = n / i; 354 if (q < i) 355 return n; 356 if (n == q * i) 357 break; 358 359 i += 2; 360 q = n / i; 361 if (q < i) 362 return n; 363 if (n == q * i) 364 break; 365 366 i += 4; 367 q = n / i; 368 if (q < i) 369 return n; 370 if (n == q * i) 371 break; 372 373 i += 8; 374 q = n / i; 375 if (q < i) 376 return n; 377 if (n == q * i) 378 break; 379 380 i += 6; 381 q = n / i; 382 if (q < i) 383 return n; 384 if (n == q * i) 385 break; 386 387 i += 4; 388 q = n / i; 389 if (q < i) 390 return n; 391 if (n == q * i) 392 break; 393 394 i += 6; 395 q = n / i; 396 if (q < i) 397 return n; 398 if (n == q * i) 399 break; 400 401 i += 2; 402 q = n / i; 403 if (q < i) 404 return n; 405 if (n == q * i) 406 break; 407 408 i += 4; 409 q = n / i; 410 if (q < i) 411 return n; 412 if (n == q * i) 413 break; 414 415 i += 6; 416 q = n / i; 417 if (q < i) 418 return n; 419 if (n == q * i) 420 break; 421 422 i += 2; 423 q = n / i; 424 if (q < i) 425 return n; 426 if (n == q * i) 427 break; 428 429 i += 6; 430 q = n / i; 431 if (q < i) 432 return n; 433 if (n == q * i) 434 break; 435 436 i += 6; 437 q = n / i; 438 if (q < i) 439 return n; 440 if (n == q * i) 441 break; 442 443 i += 4; 444 q = n / i; 445 if (q < i) 446 return n; 447 if (n == q * i) 448 break; 449 450 i += 2; 451 q = n / i; 452 if (q < i) 453 return n; 454 if (n == q * i) 455 break; 456 457 i += 4; 458 q = n / i; 459 if (q < i) 460 return n; 461 if (n == q * i) 462 break; 463 464 i += 6; 465 q = n / i; 466 if (q < i) 467 return n; 468 if (n == q * i) 469 break; 470 471 i += 2; 472 q = n / i; 473 if (q < i) 474 return n; 475 if (n == q * i) 476 break; 477 478 i += 6; 479 q = n / i; 480 if (q < i) 481 return n; 482 if (n == q * i) 483 break; 484 485 i += 4; 486 q = n / i; 487 if (q < i) 488 return n; 489 if (n == q * i) 490 break; 491 492 i += 2; 493 q = n / i; 494 if (q < i) 495 return n; 496 if (n == q * i) 497 break; 498 499 i += 4; 500 q = n / i; 501 if (q < i) 502 return n; 503 if (n == q * i) 504 break; 505 506 i += 2; 507 q = n / i; 508 if (q < i) 509 return n; 510 if (n == q * i) 511 break; 512 513 i += 10; 514 q = n / i; 515 if (q < i) 516 return n; 517 if (n == q * i) 518 break; 519 520 // This will loop i to the next "plane" of potential primes 521 i += 2; 522 } 523 } 524next: 525 // n is not prime. Increment n to next potential prime. 526 if (++in == M) 527 { 528 ++k0; 529 in = 0; 530 } 531 n = L * k0 + indices[in]; 532 } 533} 534 535_LIBCPP_END_NAMESPACE_STD 536