xref: /llvm-project-15.0.7/libcxx/src/hash.cpp (revision bbb0f2c7)
1eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
23e519524SHoward Hinnant //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63e519524SHoward Hinnant //
73e519524SHoward Hinnant //===----------------------------------------------------------------------===//
83e519524SHoward Hinnant 
9*bbb0f2c7SArthur O'Dwyer #include <__hash_table>
10*bbb0f2c7SArthur O'Dwyer #include <algorithm>
11*bbb0f2c7SArthur O'Dwyer #include <stdexcept>
12*bbb0f2c7SArthur O'Dwyer #include <type_traits>
1343d978e5SHoward Hinnant 
14a7c2a628SNikolas Klauser _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wtautological-constant-out-of-range-compare")
153e519524SHoward Hinnant 
163e519524SHoward Hinnant _LIBCPP_BEGIN_NAMESPACE_STD
173e519524SHoward Hinnant 
183e519524SHoward Hinnant namespace {
193e519524SHoward Hinnant 
203e519524SHoward Hinnant // handle all next_prime(i) for i in [1, 210), special case 0
213e519524SHoward Hinnant const unsigned small_primes[] =
223e519524SHoward Hinnant {
233e519524SHoward Hinnant     0,
243e519524SHoward Hinnant     2,
253e519524SHoward Hinnant     3,
263e519524SHoward Hinnant     5,
273e519524SHoward Hinnant     7,
283e519524SHoward Hinnant     11,
293e519524SHoward Hinnant     13,
303e519524SHoward Hinnant     17,
313e519524SHoward Hinnant     19,
323e519524SHoward Hinnant     23,
333e519524SHoward Hinnant     29,
343e519524SHoward Hinnant     31,
353e519524SHoward Hinnant     37,
363e519524SHoward Hinnant     41,
373e519524SHoward Hinnant     43,
383e519524SHoward Hinnant     47,
393e519524SHoward Hinnant     53,
403e519524SHoward Hinnant     59,
413e519524SHoward Hinnant     61,
423e519524SHoward Hinnant     67,
433e519524SHoward Hinnant     71,
443e519524SHoward Hinnant     73,
453e519524SHoward Hinnant     79,
463e519524SHoward Hinnant     83,
473e519524SHoward Hinnant     89,
483e519524SHoward Hinnant     97,
493e519524SHoward Hinnant     101,
503e519524SHoward Hinnant     103,
513e519524SHoward Hinnant     107,
523e519524SHoward Hinnant     109,
533e519524SHoward Hinnant     113,
543e519524SHoward Hinnant     127,
553e519524SHoward Hinnant     131,
563e519524SHoward Hinnant     137,
573e519524SHoward Hinnant     139,
583e519524SHoward Hinnant     149,
593e519524SHoward Hinnant     151,
603e519524SHoward Hinnant     157,
613e519524SHoward Hinnant     163,
623e519524SHoward Hinnant     167,
633e519524SHoward Hinnant     173,
643e519524SHoward Hinnant     179,
653e519524SHoward Hinnant     181,
663e519524SHoward Hinnant     191,
673e519524SHoward Hinnant     193,
683e519524SHoward Hinnant     197,
693e519524SHoward Hinnant     199,
703e519524SHoward Hinnant     211
713e519524SHoward Hinnant };
723e519524SHoward Hinnant 
733e519524SHoward Hinnant // potential primes = 210*k + indices[i], k >= 1
743e519524SHoward Hinnant //   these numbers are not divisible by 2, 3, 5 or 7
753e519524SHoward Hinnant //   (or any integer 2 <= j <= 10 for that matter).
763e519524SHoward Hinnant const unsigned indices[] =
773e519524SHoward Hinnant {
783e519524SHoward Hinnant     1,
793e519524SHoward Hinnant     11,
803e519524SHoward Hinnant     13,
813e519524SHoward Hinnant     17,
823e519524SHoward Hinnant     19,
833e519524SHoward Hinnant     23,
843e519524SHoward Hinnant     29,
853e519524SHoward Hinnant     31,
863e519524SHoward Hinnant     37,
873e519524SHoward Hinnant     41,
883e519524SHoward Hinnant     43,
893e519524SHoward Hinnant     47,
903e519524SHoward Hinnant     53,
913e519524SHoward Hinnant     59,
923e519524SHoward Hinnant     61,
933e519524SHoward Hinnant     67,
943e519524SHoward Hinnant     71,
953e519524SHoward Hinnant     73,
963e519524SHoward Hinnant     79,
973e519524SHoward Hinnant     83,
983e519524SHoward Hinnant     89,
993e519524SHoward Hinnant     97,
1003e519524SHoward Hinnant     101,
1013e519524SHoward Hinnant     103,
1023e519524SHoward Hinnant     107,
1033e519524SHoward Hinnant     109,
1043e519524SHoward Hinnant     113,
1053e519524SHoward Hinnant     121,
1063e519524SHoward Hinnant     127,
1073e519524SHoward Hinnant     131,
1083e519524SHoward Hinnant     137,
1093e519524SHoward Hinnant     139,
1103e519524SHoward Hinnant     143,
1113e519524SHoward Hinnant     149,
1123e519524SHoward Hinnant     151,
1133e519524SHoward Hinnant     157,
1143e519524SHoward Hinnant     163,
1153e519524SHoward Hinnant     167,
1163e519524SHoward Hinnant     169,
1173e519524SHoward Hinnant     173,
1183e519524SHoward Hinnant     179,
1193e519524SHoward Hinnant     181,
1203e519524SHoward Hinnant     187,
1213e519524SHoward Hinnant     191,
1223e519524SHoward Hinnant     193,
1233e519524SHoward Hinnant     197,
1243e519524SHoward Hinnant     199,
1253e519524SHoward Hinnant     209
1263e519524SHoward Hinnant };
1273e519524SHoward Hinnant 
1283e519524SHoward Hinnant }
1293e519524SHoward Hinnant 
1303e519524SHoward Hinnant // Returns:  If n == 0, returns 0.  Else returns the lowest prime number that
1313e519524SHoward Hinnant // is greater than or equal to n.
1323e519524SHoward Hinnant //
1333e519524SHoward Hinnant // The algorithm creates a list of small primes, plus an open-ended list of
1343e519524SHoward Hinnant // potential primes.  All prime numbers are potential prime numbers.  However
1353e519524SHoward Hinnant // some potential prime numbers are not prime.  In an ideal world, all potential
136f03763a4SAlp Toker // prime numbers would be prime.  Candidate prime numbers are chosen as the next
1373e519524SHoward Hinnant // highest potential prime.  Then this number is tested for prime by dividing it
1383e519524SHoward Hinnant // by all potential prime numbers less than the sqrt of the candidate.
1393e519524SHoward Hinnant //
1403e519524SHoward Hinnant // This implementation defines potential primes as those numbers not divisible
1413e519524SHoward Hinnant // by 2, 3, 5, and 7.  Other (common) implementations define potential primes
1423e519524SHoward Hinnant // as those not divisible by 2.  A few other implementations define potential
1433e519524SHoward Hinnant // primes as those not divisible by 2 or 3.  By raising the number of small
1443e519524SHoward Hinnant // primes which the potential prime is not divisible by, the set of potential
1453e519524SHoward Hinnant // primes more closely approximates the set of prime numbers.  And thus there
1463e519524SHoward Hinnant // are fewer potential primes to search, and fewer potential primes to divide
1473e519524SHoward Hinnant // against.
1483e519524SHoward Hinnant 
14943d978e5SHoward Hinnant template <size_t _Sz = sizeof(size_t)>
1505ec18264SHoward Hinnant inline _LIBCPP_INLINE_VISIBILITY
15143d978e5SHoward Hinnant typename enable_if<_Sz == 4, void>::type
__check_for_overflow(size_t N)15243d978e5SHoward Hinnant __check_for_overflow(size_t N)
1535ec18264SHoward Hinnant {
1545ec18264SHoward Hinnant     if (N > 0xFFFFFFFB)
1557232a84eSLouis Dionne         __throw_overflow_error("__next_prime overflow");
1565ec18264SHoward Hinnant }
1575ec18264SHoward Hinnant 
15843d978e5SHoward Hinnant template <size_t _Sz = sizeof(size_t)>
1595ec18264SHoward Hinnant inline _LIBCPP_INLINE_VISIBILITY
16043d978e5SHoward Hinnant typename enable_if<_Sz == 8, void>::type
__check_for_overflow(size_t N)16143d978e5SHoward Hinnant __check_for_overflow(size_t N)
1625ec18264SHoward Hinnant {
1635ec18264SHoward Hinnant     if (N > 0xFFFFFFFFFFFFFFC5ull)
1647232a84eSLouis Dionne         __throw_overflow_error("__next_prime overflow");
1655ec18264SHoward Hinnant }
1665ec18264SHoward Hinnant 
1673e519524SHoward Hinnant size_t
__next_prime(size_t n)1683e519524SHoward Hinnant __next_prime(size_t n)
1693e519524SHoward Hinnant {
1703e519524SHoward Hinnant     const size_t L = 210;
1713e519524SHoward Hinnant     const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
1723e519524SHoward Hinnant     // If n is small enough, search in small_primes
1733e519524SHoward Hinnant     if (n <= small_primes[N-1])
1743e519524SHoward Hinnant         return *std::lower_bound(small_primes, small_primes + N, n);
1753e519524SHoward Hinnant     // Else n > largest small_primes
1765ec18264SHoward Hinnant     // Check for overflow
17743d978e5SHoward Hinnant     __check_for_overflow(n);
1783e519524SHoward Hinnant     // Start searching list of potential primes: L * k0 + indices[in]
1793e519524SHoward Hinnant     const size_t M = sizeof(indices) / sizeof(indices[0]);
1803e519524SHoward Hinnant     // Select first potential prime >= n
1813e519524SHoward Hinnant     //   Known a-priori n >= L
1823e519524SHoward Hinnant     size_t k0 = n / L;
183c206366fSHoward Hinnant     size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
184c206366fSHoward Hinnant                                     - indices);
1853e519524SHoward Hinnant     n = L * k0 + indices[in];
1863e519524SHoward Hinnant     while (true)
1873e519524SHoward Hinnant     {
1883e519524SHoward Hinnant         // Divide n by all primes or potential primes (i) until:
1893e519524SHoward Hinnant         //    1.  The division is even, so try next potential prime.
1903e519524SHoward Hinnant         //    2.  The i > sqrt(n), in which case n is prime.
1913e519524SHoward Hinnant         // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
1923e519524SHoward Hinnant         //    so don't test those (j == 5 ->  divide by 11 first).  And the
1933e519524SHoward Hinnant         //    potential primes start with 211, so don't test against the last
1943e519524SHoward Hinnant         //    small prime.
1953e519524SHoward Hinnant         for (size_t j = 5; j < N - 1; ++j)
1963e519524SHoward Hinnant         {
1978fb62e39SHoward Hinnant             const std::size_t p = small_primes[j];
1988fb62e39SHoward Hinnant             const std::size_t q = n / p;
1998fb62e39SHoward Hinnant             if (q < p)
2003e519524SHoward Hinnant                 return n;
2018fb62e39SHoward Hinnant             if (n == q * p)
2028fb62e39SHoward Hinnant                 goto next;
2033e519524SHoward Hinnant         }
2043e519524SHoward Hinnant         // n wasn't divisible by small primes, try potential primes
2053e519524SHoward Hinnant         {
2063e519524SHoward Hinnant             size_t i = 211;
2073e519524SHoward Hinnant             while (true)
2083e519524SHoward Hinnant             {
2098fb62e39SHoward Hinnant                 std::size_t q = n / i;
2108fb62e39SHoward Hinnant                 if (q < i)
2113e519524SHoward Hinnant                     return n;
2128fb62e39SHoward Hinnant                 if (n == q * i)
2138fb62e39SHoward Hinnant                     break;
2143e519524SHoward Hinnant 
2153e519524SHoward Hinnant                 i += 10;
2168fb62e39SHoward Hinnant                 q = n / i;
2178fb62e39SHoward Hinnant                 if (q < i)
2183e519524SHoward Hinnant                     return n;
2198fb62e39SHoward Hinnant                 if (n == q * i)
2208fb62e39SHoward Hinnant                     break;
2213e519524SHoward Hinnant 
2223e519524SHoward Hinnant                 i += 2;
2238fb62e39SHoward Hinnant                 q = n / i;
2248fb62e39SHoward Hinnant                 if (q < i)
2253e519524SHoward Hinnant                     return n;
2268fb62e39SHoward Hinnant                 if (n == q * i)
2278fb62e39SHoward Hinnant                     break;
2283e519524SHoward Hinnant 
2293e519524SHoward Hinnant                 i += 4;
2308fb62e39SHoward Hinnant                 q = n / i;
2318fb62e39SHoward Hinnant                 if (q < i)
2323e519524SHoward Hinnant                     return n;
2338fb62e39SHoward Hinnant                 if (n == q * i)
2348fb62e39SHoward Hinnant                     break;
2353e519524SHoward Hinnant 
2363e519524SHoward Hinnant                 i += 2;
2378fb62e39SHoward Hinnant                 q = n / i;
2388fb62e39SHoward Hinnant                 if (q < i)
2393e519524SHoward Hinnant                     return n;
2408fb62e39SHoward Hinnant                 if (n == q * i)
2418fb62e39SHoward Hinnant                     break;
2423e519524SHoward Hinnant 
2433e519524SHoward Hinnant                 i += 4;
2448fb62e39SHoward Hinnant                 q = n / i;
2458fb62e39SHoward Hinnant                 if (q < i)
2463e519524SHoward Hinnant                     return n;
2478fb62e39SHoward Hinnant                 if (n == q * i)
2488fb62e39SHoward Hinnant                     break;
2493e519524SHoward Hinnant 
2503e519524SHoward Hinnant                 i += 6;
2518fb62e39SHoward Hinnant                 q = n / i;
2528fb62e39SHoward Hinnant                 if (q < i)
2533e519524SHoward Hinnant                     return n;
2548fb62e39SHoward Hinnant                 if (n == q * i)
2558fb62e39SHoward Hinnant                     break;
2563e519524SHoward Hinnant 
2573e519524SHoward Hinnant                 i += 2;
2588fb62e39SHoward Hinnant                 q = n / i;
2598fb62e39SHoward Hinnant                 if (q < i)
2603e519524SHoward Hinnant                     return n;
2618fb62e39SHoward Hinnant                 if (n == q * i)
2628fb62e39SHoward Hinnant                     break;
2633e519524SHoward Hinnant 
2643e519524SHoward Hinnant                 i += 6;
2658fb62e39SHoward Hinnant                 q = n / i;
2668fb62e39SHoward Hinnant                 if (q < i)
2673e519524SHoward Hinnant                     return n;
2688fb62e39SHoward Hinnant                 if (n == q * i)
2698fb62e39SHoward Hinnant                     break;
2703e519524SHoward Hinnant 
2713e519524SHoward Hinnant                 i += 4;
2728fb62e39SHoward Hinnant                 q = n / i;
2738fb62e39SHoward Hinnant                 if (q < i)
2743e519524SHoward Hinnant                     return n;
2758fb62e39SHoward Hinnant                 if (n == q * i)
2768fb62e39SHoward Hinnant                     break;
2773e519524SHoward Hinnant 
2783e519524SHoward Hinnant                 i += 2;
2798fb62e39SHoward Hinnant                 q = n / i;
2808fb62e39SHoward Hinnant                 if (q < i)
2813e519524SHoward Hinnant                     return n;
2828fb62e39SHoward Hinnant                 if (n == q * i)
2838fb62e39SHoward Hinnant                     break;
2843e519524SHoward Hinnant 
2853e519524SHoward Hinnant                 i += 4;
2868fb62e39SHoward Hinnant                 q = n / i;
2878fb62e39SHoward Hinnant                 if (q < i)
2883e519524SHoward Hinnant                     return n;
2898fb62e39SHoward Hinnant                 if (n == q * i)
2908fb62e39SHoward Hinnant                     break;
2913e519524SHoward Hinnant 
2923e519524SHoward Hinnant                 i += 6;
2938fb62e39SHoward Hinnant                 q = n / i;
2948fb62e39SHoward Hinnant                 if (q < i)
2953e519524SHoward Hinnant                     return n;
2968fb62e39SHoward Hinnant                 if (n == q * i)
2978fb62e39SHoward Hinnant                     break;
2983e519524SHoward Hinnant 
2993e519524SHoward Hinnant                 i += 6;
3008fb62e39SHoward Hinnant                 q = n / i;
3018fb62e39SHoward Hinnant                 if (q < i)
3023e519524SHoward Hinnant                     return n;
3038fb62e39SHoward Hinnant                 if (n == q * i)
3048fb62e39SHoward Hinnant                     break;
3053e519524SHoward Hinnant 
3063e519524SHoward Hinnant                 i += 2;
3078fb62e39SHoward Hinnant                 q = n / i;
3088fb62e39SHoward Hinnant                 if (q < i)
3093e519524SHoward Hinnant                     return n;
3108fb62e39SHoward Hinnant                 if (n == q * i)
3118fb62e39SHoward Hinnant                     break;
3123e519524SHoward Hinnant 
3133e519524SHoward Hinnant                 i += 6;
3148fb62e39SHoward Hinnant                 q = n / i;
3158fb62e39SHoward Hinnant                 if (q < i)
3163e519524SHoward Hinnant                     return n;
3178fb62e39SHoward Hinnant                 if (n == q * i)
3188fb62e39SHoward Hinnant                     break;
3193e519524SHoward Hinnant 
3203e519524SHoward Hinnant                 i += 4;
3218fb62e39SHoward Hinnant                 q = n / i;
3228fb62e39SHoward Hinnant                 if (q < i)
3233e519524SHoward Hinnant                     return n;
3248fb62e39SHoward Hinnant                 if (n == q * i)
3258fb62e39SHoward Hinnant                     break;
3263e519524SHoward Hinnant 
3273e519524SHoward Hinnant                 i += 2;
3288fb62e39SHoward Hinnant                 q = n / i;
3298fb62e39SHoward Hinnant                 if (q < i)
3303e519524SHoward Hinnant                     return n;
3318fb62e39SHoward Hinnant                 if (n == q * i)
3328fb62e39SHoward Hinnant                     break;
3333e519524SHoward Hinnant 
3343e519524SHoward Hinnant                 i += 6;
3358fb62e39SHoward Hinnant                 q = n / i;
3368fb62e39SHoward Hinnant                 if (q < i)
3373e519524SHoward Hinnant                     return n;
3388fb62e39SHoward Hinnant                 if (n == q * i)
3398fb62e39SHoward Hinnant                     break;
3403e519524SHoward Hinnant 
3413e519524SHoward Hinnant                 i += 4;
3428fb62e39SHoward Hinnant                 q = n / i;
3438fb62e39SHoward Hinnant                 if (q < i)
3443e519524SHoward Hinnant                     return n;
3458fb62e39SHoward Hinnant                 if (n == q * i)
3468fb62e39SHoward Hinnant                     break;
3473e519524SHoward Hinnant 
3483e519524SHoward Hinnant                 i += 6;
3498fb62e39SHoward Hinnant                 q = n / i;
3508fb62e39SHoward Hinnant                 if (q < i)
3513e519524SHoward Hinnant                     return n;
3528fb62e39SHoward Hinnant                 if (n == q * i)
3538fb62e39SHoward Hinnant                     break;
3543e519524SHoward Hinnant 
3553e519524SHoward Hinnant                 i += 8;
3568fb62e39SHoward Hinnant                 q = n / i;
3578fb62e39SHoward Hinnant                 if (q < i)
3583e519524SHoward Hinnant                     return n;
3598fb62e39SHoward Hinnant                 if (n == q * i)
3608fb62e39SHoward Hinnant                     break;
3613e519524SHoward Hinnant 
3623e519524SHoward Hinnant                 i += 4;
3638fb62e39SHoward Hinnant                 q = n / i;
3648fb62e39SHoward Hinnant                 if (q < i)
3653e519524SHoward Hinnant                     return n;
3668fb62e39SHoward Hinnant                 if (n == q * i)
3678fb62e39SHoward Hinnant                     break;
3683e519524SHoward Hinnant 
3693e519524SHoward Hinnant                 i += 2;
3708fb62e39SHoward Hinnant                 q = n / i;
3718fb62e39SHoward Hinnant                 if (q < i)
3723e519524SHoward Hinnant                     return n;
3738fb62e39SHoward Hinnant                 if (n == q * i)
3748fb62e39SHoward Hinnant                     break;
3753e519524SHoward Hinnant 
3763e519524SHoward Hinnant                 i += 4;
3778fb62e39SHoward Hinnant                 q = n / i;
3788fb62e39SHoward Hinnant                 if (q < i)
3793e519524SHoward Hinnant                     return n;
3808fb62e39SHoward Hinnant                 if (n == q * i)
3818fb62e39SHoward Hinnant                     break;
3823e519524SHoward Hinnant 
3833e519524SHoward Hinnant                 i += 2;
3848fb62e39SHoward Hinnant                 q = n / i;
3858fb62e39SHoward Hinnant                 if (q < i)
3863e519524SHoward Hinnant                     return n;
3878fb62e39SHoward Hinnant                 if (n == q * i)
3888fb62e39SHoward Hinnant                     break;
3893e519524SHoward Hinnant 
3903e519524SHoward Hinnant                 i += 4;
3918fb62e39SHoward Hinnant                 q = n / i;
3928fb62e39SHoward Hinnant                 if (q < i)
3933e519524SHoward Hinnant                     return n;
3948fb62e39SHoward Hinnant                 if (n == q * i)
3958fb62e39SHoward Hinnant                     break;
3963e519524SHoward Hinnant 
3973e519524SHoward Hinnant                 i += 8;
3988fb62e39SHoward Hinnant                 q = n / i;
3998fb62e39SHoward Hinnant                 if (q < i)
4003e519524SHoward Hinnant                     return n;
4018fb62e39SHoward Hinnant                 if (n == q * i)
4028fb62e39SHoward Hinnant                     break;
4033e519524SHoward Hinnant 
4043e519524SHoward Hinnant                 i += 6;
4058fb62e39SHoward Hinnant                 q = n / i;
4068fb62e39SHoward Hinnant                 if (q < i)
4073e519524SHoward Hinnant                     return n;
4088fb62e39SHoward Hinnant                 if (n == q * i)
4098fb62e39SHoward Hinnant                     break;
4103e519524SHoward Hinnant 
4113e519524SHoward Hinnant                 i += 4;
4128fb62e39SHoward Hinnant                 q = n / i;
4138fb62e39SHoward Hinnant                 if (q < i)
4143e519524SHoward Hinnant                     return n;
4158fb62e39SHoward Hinnant                 if (n == q * i)
4168fb62e39SHoward Hinnant                     break;
4173e519524SHoward Hinnant 
4183e519524SHoward Hinnant                 i += 6;
4198fb62e39SHoward Hinnant                 q = n / i;
4208fb62e39SHoward Hinnant                 if (q < i)
4213e519524SHoward Hinnant                     return n;
4228fb62e39SHoward Hinnant                 if (n == q * i)
4238fb62e39SHoward Hinnant                     break;
4243e519524SHoward Hinnant 
4253e519524SHoward Hinnant                 i += 2;
4268fb62e39SHoward Hinnant                 q = n / i;
4278fb62e39SHoward Hinnant                 if (q < i)
4283e519524SHoward Hinnant                     return n;
4298fb62e39SHoward Hinnant                 if (n == q * i)
4308fb62e39SHoward Hinnant                     break;
4313e519524SHoward Hinnant 
4323e519524SHoward Hinnant                 i += 4;
4338fb62e39SHoward Hinnant                 q = n / i;
4348fb62e39SHoward Hinnant                 if (q < i)
4353e519524SHoward Hinnant                     return n;
4368fb62e39SHoward Hinnant                 if (n == q * i)
4378fb62e39SHoward Hinnant                     break;
4383e519524SHoward Hinnant 
4393e519524SHoward Hinnant                 i += 6;
4408fb62e39SHoward Hinnant                 q = n / i;
4418fb62e39SHoward Hinnant                 if (q < i)
4423e519524SHoward Hinnant                     return n;
4438fb62e39SHoward Hinnant                 if (n == q * i)
4448fb62e39SHoward Hinnant                     break;
4453e519524SHoward Hinnant 
4463e519524SHoward Hinnant                 i += 2;
4478fb62e39SHoward Hinnant                 q = n / i;
4488fb62e39SHoward Hinnant                 if (q < i)
4493e519524SHoward Hinnant                     return n;
4508fb62e39SHoward Hinnant                 if (n == q * i)
4518fb62e39SHoward Hinnant                     break;
4523e519524SHoward Hinnant 
4533e519524SHoward Hinnant                 i += 6;
4548fb62e39SHoward Hinnant                 q = n / i;
4558fb62e39SHoward Hinnant                 if (q < i)
4563e519524SHoward Hinnant                     return n;
4578fb62e39SHoward Hinnant                 if (n == q * i)
4588fb62e39SHoward Hinnant                     break;
4593e519524SHoward Hinnant 
4603e519524SHoward Hinnant                 i += 6;
4618fb62e39SHoward Hinnant                 q = n / i;
4628fb62e39SHoward Hinnant                 if (q < i)
4633e519524SHoward Hinnant                     return n;
4648fb62e39SHoward Hinnant                 if (n == q * i)
4658fb62e39SHoward Hinnant                     break;
4663e519524SHoward Hinnant 
4673e519524SHoward Hinnant                 i += 4;
4688fb62e39SHoward Hinnant                 q = n / i;
4698fb62e39SHoward Hinnant                 if (q < i)
4703e519524SHoward Hinnant                     return n;
4718fb62e39SHoward Hinnant                 if (n == q * i)
4728fb62e39SHoward Hinnant                     break;
4733e519524SHoward Hinnant 
4743e519524SHoward Hinnant                 i += 2;
4758fb62e39SHoward Hinnant                 q = n / i;
4768fb62e39SHoward Hinnant                 if (q < i)
4773e519524SHoward Hinnant                     return n;
4788fb62e39SHoward Hinnant                 if (n == q * i)
4798fb62e39SHoward Hinnant                     break;
4803e519524SHoward Hinnant 
4813e519524SHoward Hinnant                 i += 4;
4828fb62e39SHoward Hinnant                 q = n / i;
4838fb62e39SHoward Hinnant                 if (q < i)
4843e519524SHoward Hinnant                     return n;
4858fb62e39SHoward Hinnant                 if (n == q * i)
4868fb62e39SHoward Hinnant                     break;
4873e519524SHoward Hinnant 
4883e519524SHoward Hinnant                 i += 6;
4898fb62e39SHoward Hinnant                 q = n / i;
4908fb62e39SHoward Hinnant                 if (q < i)
4913e519524SHoward Hinnant                     return n;
4928fb62e39SHoward Hinnant                 if (n == q * i)
4938fb62e39SHoward Hinnant                     break;
4943e519524SHoward Hinnant 
4953e519524SHoward Hinnant                 i += 2;
4968fb62e39SHoward Hinnant                 q = n / i;
4978fb62e39SHoward Hinnant                 if (q < i)
4983e519524SHoward Hinnant                     return n;
4998fb62e39SHoward Hinnant                 if (n == q * i)
5008fb62e39SHoward Hinnant                     break;
5013e519524SHoward Hinnant 
5023e519524SHoward Hinnant                 i += 6;
5038fb62e39SHoward Hinnant                 q = n / i;
5048fb62e39SHoward Hinnant                 if (q < i)
5053e519524SHoward Hinnant                     return n;
5068fb62e39SHoward Hinnant                 if (n == q * i)
5078fb62e39SHoward Hinnant                     break;
5083e519524SHoward Hinnant 
5093e519524SHoward Hinnant                 i += 4;
5108fb62e39SHoward Hinnant                 q = n / i;
5118fb62e39SHoward Hinnant                 if (q < i)
5123e519524SHoward Hinnant                     return n;
5138fb62e39SHoward Hinnant                 if (n == q * i)
5148fb62e39SHoward Hinnant                     break;
5153e519524SHoward Hinnant 
5163e519524SHoward Hinnant                 i += 2;
5178fb62e39SHoward Hinnant                 q = n / i;
5188fb62e39SHoward Hinnant                 if (q < i)
5193e519524SHoward Hinnant                     return n;
5208fb62e39SHoward Hinnant                 if (n == q * i)
5218fb62e39SHoward Hinnant                     break;
5223e519524SHoward Hinnant 
5233e519524SHoward Hinnant                 i += 4;
5248fb62e39SHoward Hinnant                 q = n / i;
5258fb62e39SHoward Hinnant                 if (q < i)
5263e519524SHoward Hinnant                     return n;
5278fb62e39SHoward Hinnant                 if (n == q * i)
5288fb62e39SHoward Hinnant                     break;
5293e519524SHoward Hinnant 
5303e519524SHoward Hinnant                 i += 2;
5318fb62e39SHoward Hinnant                 q = n / i;
5328fb62e39SHoward Hinnant                 if (q < i)
5333e519524SHoward Hinnant                     return n;
5348fb62e39SHoward Hinnant                 if (n == q * i)
5358fb62e39SHoward Hinnant                     break;
5363e519524SHoward Hinnant 
5373e519524SHoward Hinnant                 i += 10;
5388fb62e39SHoward Hinnant                 q = n / i;
5398fb62e39SHoward Hinnant                 if (q < i)
5403e519524SHoward Hinnant                     return n;
5418fb62e39SHoward Hinnant                 if (n == q * i)
5428fb62e39SHoward Hinnant                     break;
5433e519524SHoward Hinnant 
5443e519524SHoward Hinnant                 // This will loop i to the next "plane" of potential primes
5453e519524SHoward Hinnant                 i += 2;
5463e519524SHoward Hinnant             }
5473e519524SHoward Hinnant         }
5483e519524SHoward Hinnant next:
5493e519524SHoward Hinnant         // n is not prime.  Increment n to next potential prime.
5503e519524SHoward Hinnant         if (++in == M)
5513e519524SHoward Hinnant         {
5523e519524SHoward Hinnant             ++k0;
5533e519524SHoward Hinnant             in = 0;
5543e519524SHoward Hinnant         }
5553e519524SHoward Hinnant         n = L * k0 + indices[in];
5563e519524SHoward Hinnant     }
5573e519524SHoward Hinnant }
5583e519524SHoward Hinnant 
5593e519524SHoward Hinnant _LIBCPP_END_NAMESPACE_STD
560