xref: /freebsd/contrib/llvm-project/libcxx/src/hash.cpp (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
1349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
981ad6265SDimitry Andric #include <__hash_table>
1081ad6265SDimitry Andric #include <algorithm>
1181ad6265SDimitry Andric #include <stdexcept>
1281ad6265SDimitry Andric #include <type_traits>
130b57cec5SDimitry Andric 
1481ad6265SDimitry Andric _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wtautological-constant-out-of-range-compare")
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric namespace {
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric // handle all next_prime(i) for i in [1, 210), special case 0
21*cb14a3feSDimitry Andric const unsigned small_primes[] = {
22*cb14a3feSDimitry Andric     0,   2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,  43,  47,
23*cb14a3feSDimitry Andric     53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101, 103, 107, 109, 113, 127,
24*cb14a3feSDimitry Andric     131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211};
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric // potential primes = 210*k + indices[i], k >= 1
270b57cec5SDimitry Andric //   these numbers are not divisible by 2, 3, 5 or 7
280b57cec5SDimitry Andric //   (or any integer 2 <= j <= 10 for that matter).
29*cb14a3feSDimitry Andric const unsigned indices[] = {
30*cb14a3feSDimitry Andric     1,   11,  13,  17,  19,  23,  29,  31,  37,  41,  43,  47,  53,  59,  61,  67,
31*cb14a3feSDimitry Andric     71,  73,  79,  83,  89,  97,  101, 103, 107, 109, 113, 121, 127, 131, 137, 139,
32*cb14a3feSDimitry Andric     143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209};
330b57cec5SDimitry Andric 
34*cb14a3feSDimitry Andric } // namespace
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric // Returns:  If n == 0, returns 0.  Else returns the lowest prime number that
370b57cec5SDimitry Andric // is greater than or equal to n.
380b57cec5SDimitry Andric //
390b57cec5SDimitry Andric // The algorithm creates a list of small primes, plus an open-ended list of
400b57cec5SDimitry Andric // potential primes.  All prime numbers are potential prime numbers.  However
410b57cec5SDimitry Andric // some potential prime numbers are not prime.  In an ideal world, all potential
420b57cec5SDimitry Andric // prime numbers would be prime.  Candidate prime numbers are chosen as the next
430b57cec5SDimitry Andric // highest potential prime.  Then this number is tested for prime by dividing it
440b57cec5SDimitry Andric // by all potential prime numbers less than the sqrt of the candidate.
450b57cec5SDimitry Andric //
460b57cec5SDimitry Andric // This implementation defines potential primes as those numbers not divisible
470b57cec5SDimitry Andric // by 2, 3, 5, and 7.  Other (common) implementations define potential primes
480b57cec5SDimitry Andric // as those not divisible by 2.  A few other implementations define potential
490b57cec5SDimitry Andric // primes as those not divisible by 2 or 3.  By raising the number of small
500b57cec5SDimitry Andric // primes which the potential prime is not divisible by, the set of potential
510b57cec5SDimitry Andric // primes more closely approximates the set of prime numbers.  And thus there
520b57cec5SDimitry Andric // are fewer potential primes to search, and fewer potential primes to divide
530b57cec5SDimitry Andric // against.
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric template <size_t _Sz = sizeof(size_t)>
56*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 4, void>::type __check_for_overflow(size_t N) {
570b57cec5SDimitry Andric   if (N > 0xFFFFFFFB)
580b57cec5SDimitry Andric     __throw_overflow_error("__next_prime overflow");
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric template <size_t _Sz = sizeof(size_t)>
62*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 8, void>::type __check_for_overflow(size_t N) {
630b57cec5SDimitry Andric   if (N > 0xFFFFFFFFFFFFFFC5ull)
640b57cec5SDimitry Andric     __throw_overflow_error("__next_prime overflow");
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
67*cb14a3feSDimitry Andric size_t __next_prime(size_t n) {
680b57cec5SDimitry Andric   const size_t L = 210;
690b57cec5SDimitry Andric   const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
700b57cec5SDimitry Andric   // If n is small enough, search in small_primes
710b57cec5SDimitry Andric   if (n <= small_primes[N - 1])
720b57cec5SDimitry Andric     return *std::lower_bound(small_primes, small_primes + N, n);
730b57cec5SDimitry Andric   // Else n > largest small_primes
740b57cec5SDimitry Andric   // Check for overflow
750b57cec5SDimitry Andric   __check_for_overflow(n);
760b57cec5SDimitry Andric   // Start searching list of potential primes: L * k0 + indices[in]
770b57cec5SDimitry Andric   const size_t M = sizeof(indices) / sizeof(indices[0]);
780b57cec5SDimitry Andric   // Select first potential prime >= n
790b57cec5SDimitry Andric   //   Known a-priori n >= L
800b57cec5SDimitry Andric   size_t k0 = n / L;
81*cb14a3feSDimitry Andric   size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) - indices);
820b57cec5SDimitry Andric   n         = L * k0 + indices[in];
83*cb14a3feSDimitry Andric   while (true) {
840b57cec5SDimitry Andric     // Divide n by all primes or potential primes (i) until:
850b57cec5SDimitry Andric     //    1.  The division is even, so try next potential prime.
860b57cec5SDimitry Andric     //    2.  The i > sqrt(n), in which case n is prime.
870b57cec5SDimitry Andric     // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
880b57cec5SDimitry Andric     //    so don't test those (j == 5 ->  divide by 11 first).  And the
890b57cec5SDimitry Andric     //    potential primes start with 211, so don't test against the last
900b57cec5SDimitry Andric     //    small prime.
91*cb14a3feSDimitry Andric     for (size_t j = 5; j < N - 1; ++j) {
920b57cec5SDimitry Andric       const std::size_t p = small_primes[j];
930b57cec5SDimitry Andric       const std::size_t q = n / p;
940b57cec5SDimitry Andric       if (q < p)
950b57cec5SDimitry Andric         return n;
960b57cec5SDimitry Andric       if (n == q * p)
970b57cec5SDimitry Andric         goto next;
980b57cec5SDimitry Andric     }
990b57cec5SDimitry Andric     // n wasn't divisible by small primes, try potential primes
1000b57cec5SDimitry Andric     {
1010b57cec5SDimitry Andric       size_t i = 211;
102*cb14a3feSDimitry Andric       while (true) {
1030b57cec5SDimitry Andric         std::size_t q = n / i;
1040b57cec5SDimitry Andric         if (q < i)
1050b57cec5SDimitry Andric           return n;
1060b57cec5SDimitry Andric         if (n == q * i)
1070b57cec5SDimitry Andric           break;
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric         i += 10;
1100b57cec5SDimitry Andric         q = n / i;
1110b57cec5SDimitry Andric         if (q < i)
1120b57cec5SDimitry Andric           return n;
1130b57cec5SDimitry Andric         if (n == q * i)
1140b57cec5SDimitry Andric           break;
1150b57cec5SDimitry Andric 
1160b57cec5SDimitry Andric         i += 2;
1170b57cec5SDimitry Andric         q = n / i;
1180b57cec5SDimitry Andric         if (q < i)
1190b57cec5SDimitry Andric           return n;
1200b57cec5SDimitry Andric         if (n == q * i)
1210b57cec5SDimitry Andric           break;
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric         i += 4;
1240b57cec5SDimitry Andric         q = n / i;
1250b57cec5SDimitry Andric         if (q < i)
1260b57cec5SDimitry Andric           return n;
1270b57cec5SDimitry Andric         if (n == q * i)
1280b57cec5SDimitry Andric           break;
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric         i += 2;
1310b57cec5SDimitry Andric         q = n / i;
1320b57cec5SDimitry Andric         if (q < i)
1330b57cec5SDimitry Andric           return n;
1340b57cec5SDimitry Andric         if (n == q * i)
1350b57cec5SDimitry Andric           break;
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric         i += 4;
1380b57cec5SDimitry Andric         q = n / i;
1390b57cec5SDimitry Andric         if (q < i)
1400b57cec5SDimitry Andric           return n;
1410b57cec5SDimitry Andric         if (n == q * i)
1420b57cec5SDimitry Andric           break;
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric         i += 6;
1450b57cec5SDimitry Andric         q = n / i;
1460b57cec5SDimitry Andric         if (q < i)
1470b57cec5SDimitry Andric           return n;
1480b57cec5SDimitry Andric         if (n == q * i)
1490b57cec5SDimitry Andric           break;
1500b57cec5SDimitry Andric 
1510b57cec5SDimitry Andric         i += 2;
1520b57cec5SDimitry Andric         q = n / i;
1530b57cec5SDimitry Andric         if (q < i)
1540b57cec5SDimitry Andric           return n;
1550b57cec5SDimitry Andric         if (n == q * i)
1560b57cec5SDimitry Andric           break;
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric         i += 6;
1590b57cec5SDimitry Andric         q = n / i;
1600b57cec5SDimitry Andric         if (q < i)
1610b57cec5SDimitry Andric           return n;
1620b57cec5SDimitry Andric         if (n == q * i)
1630b57cec5SDimitry Andric           break;
1640b57cec5SDimitry Andric 
1650b57cec5SDimitry Andric         i += 4;
1660b57cec5SDimitry Andric         q = n / i;
1670b57cec5SDimitry Andric         if (q < i)
1680b57cec5SDimitry Andric           return n;
1690b57cec5SDimitry Andric         if (n == q * i)
1700b57cec5SDimitry Andric           break;
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric         i += 2;
1730b57cec5SDimitry Andric         q = n / i;
1740b57cec5SDimitry Andric         if (q < i)
1750b57cec5SDimitry Andric           return n;
1760b57cec5SDimitry Andric         if (n == q * i)
1770b57cec5SDimitry Andric           break;
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric         i += 4;
1800b57cec5SDimitry Andric         q = n / i;
1810b57cec5SDimitry Andric         if (q < i)
1820b57cec5SDimitry Andric           return n;
1830b57cec5SDimitry Andric         if (n == q * i)
1840b57cec5SDimitry Andric           break;
1850b57cec5SDimitry Andric 
1860b57cec5SDimitry Andric         i += 6;
1870b57cec5SDimitry Andric         q = n / i;
1880b57cec5SDimitry Andric         if (q < i)
1890b57cec5SDimitry Andric           return n;
1900b57cec5SDimitry Andric         if (n == q * i)
1910b57cec5SDimitry Andric           break;
1920b57cec5SDimitry Andric 
1930b57cec5SDimitry Andric         i += 6;
1940b57cec5SDimitry Andric         q = n / i;
1950b57cec5SDimitry Andric         if (q < i)
1960b57cec5SDimitry Andric           return n;
1970b57cec5SDimitry Andric         if (n == q * i)
1980b57cec5SDimitry Andric           break;
1990b57cec5SDimitry Andric 
2000b57cec5SDimitry Andric         i += 2;
2010b57cec5SDimitry Andric         q = n / i;
2020b57cec5SDimitry Andric         if (q < i)
2030b57cec5SDimitry Andric           return n;
2040b57cec5SDimitry Andric         if (n == q * i)
2050b57cec5SDimitry Andric           break;
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric         i += 6;
2080b57cec5SDimitry Andric         q = n / i;
2090b57cec5SDimitry Andric         if (q < i)
2100b57cec5SDimitry Andric           return n;
2110b57cec5SDimitry Andric         if (n == q * i)
2120b57cec5SDimitry Andric           break;
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric         i += 4;
2150b57cec5SDimitry Andric         q = n / i;
2160b57cec5SDimitry Andric         if (q < i)
2170b57cec5SDimitry Andric           return n;
2180b57cec5SDimitry Andric         if (n == q * i)
2190b57cec5SDimitry Andric           break;
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric         i += 2;
2220b57cec5SDimitry Andric         q = n / i;
2230b57cec5SDimitry Andric         if (q < i)
2240b57cec5SDimitry Andric           return n;
2250b57cec5SDimitry Andric         if (n == q * i)
2260b57cec5SDimitry Andric           break;
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric         i += 6;
2290b57cec5SDimitry Andric         q = n / i;
2300b57cec5SDimitry Andric         if (q < i)
2310b57cec5SDimitry Andric           return n;
2320b57cec5SDimitry Andric         if (n == q * i)
2330b57cec5SDimitry Andric           break;
2340b57cec5SDimitry Andric 
2350b57cec5SDimitry Andric         i += 4;
2360b57cec5SDimitry Andric         q = n / i;
2370b57cec5SDimitry Andric         if (q < i)
2380b57cec5SDimitry Andric           return n;
2390b57cec5SDimitry Andric         if (n == q * i)
2400b57cec5SDimitry Andric           break;
2410b57cec5SDimitry Andric 
2420b57cec5SDimitry Andric         i += 6;
2430b57cec5SDimitry Andric         q = n / i;
2440b57cec5SDimitry Andric         if (q < i)
2450b57cec5SDimitry Andric           return n;
2460b57cec5SDimitry Andric         if (n == q * i)
2470b57cec5SDimitry Andric           break;
2480b57cec5SDimitry Andric 
2490b57cec5SDimitry Andric         i += 8;
2500b57cec5SDimitry Andric         q = n / i;
2510b57cec5SDimitry Andric         if (q < i)
2520b57cec5SDimitry Andric           return n;
2530b57cec5SDimitry Andric         if (n == q * i)
2540b57cec5SDimitry Andric           break;
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric         i += 4;
2570b57cec5SDimitry Andric         q = n / i;
2580b57cec5SDimitry Andric         if (q < i)
2590b57cec5SDimitry Andric           return n;
2600b57cec5SDimitry Andric         if (n == q * i)
2610b57cec5SDimitry Andric           break;
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric         i += 2;
2640b57cec5SDimitry Andric         q = n / i;
2650b57cec5SDimitry Andric         if (q < i)
2660b57cec5SDimitry Andric           return n;
2670b57cec5SDimitry Andric         if (n == q * i)
2680b57cec5SDimitry Andric           break;
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric         i += 4;
2710b57cec5SDimitry Andric         q = n / i;
2720b57cec5SDimitry Andric         if (q < i)
2730b57cec5SDimitry Andric           return n;
2740b57cec5SDimitry Andric         if (n == q * i)
2750b57cec5SDimitry Andric           break;
2760b57cec5SDimitry Andric 
2770b57cec5SDimitry Andric         i += 2;
2780b57cec5SDimitry Andric         q = n / i;
2790b57cec5SDimitry Andric         if (q < i)
2800b57cec5SDimitry Andric           return n;
2810b57cec5SDimitry Andric         if (n == q * i)
2820b57cec5SDimitry Andric           break;
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric         i += 4;
2850b57cec5SDimitry Andric         q = n / i;
2860b57cec5SDimitry Andric         if (q < i)
2870b57cec5SDimitry Andric           return n;
2880b57cec5SDimitry Andric         if (n == q * i)
2890b57cec5SDimitry Andric           break;
2900b57cec5SDimitry Andric 
2910b57cec5SDimitry Andric         i += 8;
2920b57cec5SDimitry Andric         q = n / i;
2930b57cec5SDimitry Andric         if (q < i)
2940b57cec5SDimitry Andric           return n;
2950b57cec5SDimitry Andric         if (n == q * i)
2960b57cec5SDimitry Andric           break;
2970b57cec5SDimitry Andric 
2980b57cec5SDimitry Andric         i += 6;
2990b57cec5SDimitry Andric         q = n / i;
3000b57cec5SDimitry Andric         if (q < i)
3010b57cec5SDimitry Andric           return n;
3020b57cec5SDimitry Andric         if (n == q * i)
3030b57cec5SDimitry Andric           break;
3040b57cec5SDimitry Andric 
3050b57cec5SDimitry Andric         i += 4;
3060b57cec5SDimitry Andric         q = n / i;
3070b57cec5SDimitry Andric         if (q < i)
3080b57cec5SDimitry Andric           return n;
3090b57cec5SDimitry Andric         if (n == q * i)
3100b57cec5SDimitry Andric           break;
3110b57cec5SDimitry Andric 
3120b57cec5SDimitry Andric         i += 6;
3130b57cec5SDimitry Andric         q = n / i;
3140b57cec5SDimitry Andric         if (q < i)
3150b57cec5SDimitry Andric           return n;
3160b57cec5SDimitry Andric         if (n == q * i)
3170b57cec5SDimitry Andric           break;
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric         i += 2;
3200b57cec5SDimitry Andric         q = n / i;
3210b57cec5SDimitry Andric         if (q < i)
3220b57cec5SDimitry Andric           return n;
3230b57cec5SDimitry Andric         if (n == q * i)
3240b57cec5SDimitry Andric           break;
3250b57cec5SDimitry Andric 
3260b57cec5SDimitry Andric         i += 4;
3270b57cec5SDimitry Andric         q = n / i;
3280b57cec5SDimitry Andric         if (q < i)
3290b57cec5SDimitry Andric           return n;
3300b57cec5SDimitry Andric         if (n == q * i)
3310b57cec5SDimitry Andric           break;
3320b57cec5SDimitry Andric 
3330b57cec5SDimitry Andric         i += 6;
3340b57cec5SDimitry Andric         q = n / i;
3350b57cec5SDimitry Andric         if (q < i)
3360b57cec5SDimitry Andric           return n;
3370b57cec5SDimitry Andric         if (n == q * i)
3380b57cec5SDimitry Andric           break;
3390b57cec5SDimitry Andric 
3400b57cec5SDimitry Andric         i += 2;
3410b57cec5SDimitry Andric         q = n / i;
3420b57cec5SDimitry Andric         if (q < i)
3430b57cec5SDimitry Andric           return n;
3440b57cec5SDimitry Andric         if (n == q * i)
3450b57cec5SDimitry Andric           break;
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric         i += 6;
3480b57cec5SDimitry Andric         q = n / i;
3490b57cec5SDimitry Andric         if (q < i)
3500b57cec5SDimitry Andric           return n;
3510b57cec5SDimitry Andric         if (n == q * i)
3520b57cec5SDimitry Andric           break;
3530b57cec5SDimitry Andric 
3540b57cec5SDimitry Andric         i += 6;
3550b57cec5SDimitry Andric         q = n / i;
3560b57cec5SDimitry Andric         if (q < i)
3570b57cec5SDimitry Andric           return n;
3580b57cec5SDimitry Andric         if (n == q * i)
3590b57cec5SDimitry Andric           break;
3600b57cec5SDimitry Andric 
3610b57cec5SDimitry Andric         i += 4;
3620b57cec5SDimitry Andric         q = n / i;
3630b57cec5SDimitry Andric         if (q < i)
3640b57cec5SDimitry Andric           return n;
3650b57cec5SDimitry Andric         if (n == q * i)
3660b57cec5SDimitry Andric           break;
3670b57cec5SDimitry Andric 
3680b57cec5SDimitry Andric         i += 2;
3690b57cec5SDimitry Andric         q = n / i;
3700b57cec5SDimitry Andric         if (q < i)
3710b57cec5SDimitry Andric           return n;
3720b57cec5SDimitry Andric         if (n == q * i)
3730b57cec5SDimitry Andric           break;
3740b57cec5SDimitry Andric 
3750b57cec5SDimitry Andric         i += 4;
3760b57cec5SDimitry Andric         q = n / i;
3770b57cec5SDimitry Andric         if (q < i)
3780b57cec5SDimitry Andric           return n;
3790b57cec5SDimitry Andric         if (n == q * i)
3800b57cec5SDimitry Andric           break;
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric         i += 6;
3830b57cec5SDimitry Andric         q = n / i;
3840b57cec5SDimitry Andric         if (q < i)
3850b57cec5SDimitry Andric           return n;
3860b57cec5SDimitry Andric         if (n == q * i)
3870b57cec5SDimitry Andric           break;
3880b57cec5SDimitry Andric 
3890b57cec5SDimitry Andric         i += 2;
3900b57cec5SDimitry Andric         q = n / i;
3910b57cec5SDimitry Andric         if (q < i)
3920b57cec5SDimitry Andric           return n;
3930b57cec5SDimitry Andric         if (n == q * i)
3940b57cec5SDimitry Andric           break;
3950b57cec5SDimitry Andric 
3960b57cec5SDimitry Andric         i += 6;
3970b57cec5SDimitry Andric         q = n / i;
3980b57cec5SDimitry Andric         if (q < i)
3990b57cec5SDimitry Andric           return n;
4000b57cec5SDimitry Andric         if (n == q * i)
4010b57cec5SDimitry Andric           break;
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric         i += 4;
4040b57cec5SDimitry Andric         q = n / i;
4050b57cec5SDimitry Andric         if (q < i)
4060b57cec5SDimitry Andric           return n;
4070b57cec5SDimitry Andric         if (n == q * i)
4080b57cec5SDimitry Andric           break;
4090b57cec5SDimitry Andric 
4100b57cec5SDimitry Andric         i += 2;
4110b57cec5SDimitry Andric         q = n / i;
4120b57cec5SDimitry Andric         if (q < i)
4130b57cec5SDimitry Andric           return n;
4140b57cec5SDimitry Andric         if (n == q * i)
4150b57cec5SDimitry Andric           break;
4160b57cec5SDimitry Andric 
4170b57cec5SDimitry Andric         i += 4;
4180b57cec5SDimitry Andric         q = n / i;
4190b57cec5SDimitry Andric         if (q < i)
4200b57cec5SDimitry Andric           return n;
4210b57cec5SDimitry Andric         if (n == q * i)
4220b57cec5SDimitry Andric           break;
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric         i += 2;
4250b57cec5SDimitry Andric         q = n / i;
4260b57cec5SDimitry Andric         if (q < i)
4270b57cec5SDimitry Andric           return n;
4280b57cec5SDimitry Andric         if (n == q * i)
4290b57cec5SDimitry Andric           break;
4300b57cec5SDimitry Andric 
4310b57cec5SDimitry Andric         i += 10;
4320b57cec5SDimitry Andric         q = n / i;
4330b57cec5SDimitry Andric         if (q < i)
4340b57cec5SDimitry Andric           return n;
4350b57cec5SDimitry Andric         if (n == q * i)
4360b57cec5SDimitry Andric           break;
4370b57cec5SDimitry Andric 
4380b57cec5SDimitry Andric         // This will loop i to the next "plane" of potential primes
4390b57cec5SDimitry Andric         i += 2;
4400b57cec5SDimitry Andric       }
4410b57cec5SDimitry Andric     }
4420b57cec5SDimitry Andric   next:
4430b57cec5SDimitry Andric     // n is not prime.  Increment n to next potential prime.
444*cb14a3feSDimitry Andric     if (++in == M) {
4450b57cec5SDimitry Andric       ++k0;
4460b57cec5SDimitry Andric       in = 0;
4470b57cec5SDimitry Andric     }
4480b57cec5SDimitry Andric     n = L * k0 + indices[in];
4490b57cec5SDimitry Andric   }
4500b57cec5SDimitry Andric }
4510b57cec5SDimitry Andric 
4520b57cec5SDimitry Andric _LIBCPP_END_NAMESPACE_STD
453