14684ddb6SLionel Sambuc //===-------------------------- hash.cpp ----------------------------------===//
24684ddb6SLionel Sambuc //
34684ddb6SLionel Sambuc // The LLVM Compiler Infrastructure
44684ddb6SLionel Sambuc //
54684ddb6SLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open
64684ddb6SLionel Sambuc // Source Licenses. See LICENSE.TXT for details.
74684ddb6SLionel Sambuc //
84684ddb6SLionel Sambuc //===----------------------------------------------------------------------===//
94684ddb6SLionel Sambuc
104684ddb6SLionel Sambuc #include "__hash_table"
114684ddb6SLionel Sambuc #include "algorithm"
124684ddb6SLionel Sambuc #include "stdexcept"
134684ddb6SLionel Sambuc #include "type_traits"
144684ddb6SLionel Sambuc
154684ddb6SLionel Sambuc #ifdef __clang__
164684ddb6SLionel Sambuc #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
174684ddb6SLionel Sambuc #endif
184684ddb6SLionel Sambuc
194684ddb6SLionel Sambuc _LIBCPP_BEGIN_NAMESPACE_STD
204684ddb6SLionel Sambuc
214684ddb6SLionel Sambuc namespace {
224684ddb6SLionel Sambuc
234684ddb6SLionel Sambuc // handle all next_prime(i) for i in [1, 210), special case 0
244684ddb6SLionel Sambuc const unsigned small_primes[] =
254684ddb6SLionel Sambuc {
264684ddb6SLionel Sambuc 0,
274684ddb6SLionel Sambuc 2,
284684ddb6SLionel Sambuc 3,
294684ddb6SLionel Sambuc 5,
304684ddb6SLionel Sambuc 7,
314684ddb6SLionel Sambuc 11,
324684ddb6SLionel Sambuc 13,
334684ddb6SLionel Sambuc 17,
344684ddb6SLionel Sambuc 19,
354684ddb6SLionel Sambuc 23,
364684ddb6SLionel Sambuc 29,
374684ddb6SLionel Sambuc 31,
384684ddb6SLionel Sambuc 37,
394684ddb6SLionel Sambuc 41,
404684ddb6SLionel Sambuc 43,
414684ddb6SLionel Sambuc 47,
424684ddb6SLionel Sambuc 53,
434684ddb6SLionel Sambuc 59,
444684ddb6SLionel Sambuc 61,
454684ddb6SLionel Sambuc 67,
464684ddb6SLionel Sambuc 71,
474684ddb6SLionel Sambuc 73,
484684ddb6SLionel Sambuc 79,
494684ddb6SLionel Sambuc 83,
504684ddb6SLionel Sambuc 89,
514684ddb6SLionel Sambuc 97,
524684ddb6SLionel Sambuc 101,
534684ddb6SLionel Sambuc 103,
544684ddb6SLionel Sambuc 107,
554684ddb6SLionel Sambuc 109,
564684ddb6SLionel Sambuc 113,
574684ddb6SLionel Sambuc 127,
584684ddb6SLionel Sambuc 131,
594684ddb6SLionel Sambuc 137,
604684ddb6SLionel Sambuc 139,
614684ddb6SLionel Sambuc 149,
624684ddb6SLionel Sambuc 151,
634684ddb6SLionel Sambuc 157,
644684ddb6SLionel Sambuc 163,
654684ddb6SLionel Sambuc 167,
664684ddb6SLionel Sambuc 173,
674684ddb6SLionel Sambuc 179,
684684ddb6SLionel Sambuc 181,
694684ddb6SLionel Sambuc 191,
704684ddb6SLionel Sambuc 193,
714684ddb6SLionel Sambuc 197,
724684ddb6SLionel Sambuc 199,
734684ddb6SLionel Sambuc 211
744684ddb6SLionel Sambuc };
754684ddb6SLionel Sambuc
764684ddb6SLionel Sambuc // potential primes = 210*k + indices[i], k >= 1
774684ddb6SLionel Sambuc // these numbers are not divisible by 2, 3, 5 or 7
784684ddb6SLionel Sambuc // (or any integer 2 <= j <= 10 for that matter).
794684ddb6SLionel Sambuc const unsigned indices[] =
804684ddb6SLionel Sambuc {
814684ddb6SLionel Sambuc 1,
824684ddb6SLionel Sambuc 11,
834684ddb6SLionel Sambuc 13,
844684ddb6SLionel Sambuc 17,
854684ddb6SLionel Sambuc 19,
864684ddb6SLionel Sambuc 23,
874684ddb6SLionel Sambuc 29,
884684ddb6SLionel Sambuc 31,
894684ddb6SLionel Sambuc 37,
904684ddb6SLionel Sambuc 41,
914684ddb6SLionel Sambuc 43,
924684ddb6SLionel Sambuc 47,
934684ddb6SLionel Sambuc 53,
944684ddb6SLionel Sambuc 59,
954684ddb6SLionel Sambuc 61,
964684ddb6SLionel Sambuc 67,
974684ddb6SLionel Sambuc 71,
984684ddb6SLionel Sambuc 73,
994684ddb6SLionel Sambuc 79,
1004684ddb6SLionel Sambuc 83,
1014684ddb6SLionel Sambuc 89,
1024684ddb6SLionel Sambuc 97,
1034684ddb6SLionel Sambuc 101,
1044684ddb6SLionel Sambuc 103,
1054684ddb6SLionel Sambuc 107,
1064684ddb6SLionel Sambuc 109,
1074684ddb6SLionel Sambuc 113,
1084684ddb6SLionel Sambuc 121,
1094684ddb6SLionel Sambuc 127,
1104684ddb6SLionel Sambuc 131,
1114684ddb6SLionel Sambuc 137,
1124684ddb6SLionel Sambuc 139,
1134684ddb6SLionel Sambuc 143,
1144684ddb6SLionel Sambuc 149,
1154684ddb6SLionel Sambuc 151,
1164684ddb6SLionel Sambuc 157,
1174684ddb6SLionel Sambuc 163,
1184684ddb6SLionel Sambuc 167,
1194684ddb6SLionel Sambuc 169,
1204684ddb6SLionel Sambuc 173,
1214684ddb6SLionel Sambuc 179,
1224684ddb6SLionel Sambuc 181,
1234684ddb6SLionel Sambuc 187,
1244684ddb6SLionel Sambuc 191,
1254684ddb6SLionel Sambuc 193,
1264684ddb6SLionel Sambuc 197,
1274684ddb6SLionel Sambuc 199,
1284684ddb6SLionel Sambuc 209
1294684ddb6SLionel Sambuc };
1304684ddb6SLionel Sambuc
1314684ddb6SLionel Sambuc }
1324684ddb6SLionel Sambuc
1334684ddb6SLionel Sambuc // Returns: If n == 0, returns 0. Else returns the lowest prime number that
1344684ddb6SLionel Sambuc // is greater than or equal to n.
1354684ddb6SLionel Sambuc //
1364684ddb6SLionel Sambuc // The algorithm creates a list of small primes, plus an open-ended list of
1374684ddb6SLionel Sambuc // potential primes. All prime numbers are potential prime numbers. However
1384684ddb6SLionel Sambuc // some potential prime numbers are not prime. In an ideal world, all potential
139*0a6a1f1dSLionel Sambuc // prime numbers would be prime. Candidate prime numbers are chosen as the next
1404684ddb6SLionel Sambuc // highest potential prime. Then this number is tested for prime by dividing it
1414684ddb6SLionel Sambuc // by all potential prime numbers less than the sqrt of the candidate.
1424684ddb6SLionel Sambuc //
1434684ddb6SLionel Sambuc // This implementation defines potential primes as those numbers not divisible
1444684ddb6SLionel Sambuc // by 2, 3, 5, and 7. Other (common) implementations define potential primes
1454684ddb6SLionel Sambuc // as those not divisible by 2. A few other implementations define potential
1464684ddb6SLionel Sambuc // primes as those not divisible by 2 or 3. By raising the number of small
1474684ddb6SLionel Sambuc // primes which the potential prime is not divisible by, the set of potential
1484684ddb6SLionel Sambuc // primes more closely approximates the set of prime numbers. And thus there
1494684ddb6SLionel Sambuc // are fewer potential primes to search, and fewer potential primes to divide
1504684ddb6SLionel Sambuc // against.
1514684ddb6SLionel Sambuc
1524684ddb6SLionel Sambuc template <size_t _Sz = sizeof(size_t)>
1534684ddb6SLionel Sambuc inline _LIBCPP_INLINE_VISIBILITY
1544684ddb6SLionel Sambuc typename enable_if<_Sz == 4, void>::type
__check_for_overflow(size_t N)1554684ddb6SLionel Sambuc __check_for_overflow(size_t N)
1564684ddb6SLionel Sambuc {
1574684ddb6SLionel Sambuc #ifndef _LIBCPP_NO_EXCEPTIONS
1584684ddb6SLionel Sambuc if (N > 0xFFFFFFFB)
1594684ddb6SLionel Sambuc throw overflow_error("__next_prime overflow");
1604684ddb6SLionel Sambuc #else
1614684ddb6SLionel Sambuc (void)N;
1624684ddb6SLionel Sambuc #endif
1634684ddb6SLionel Sambuc }
1644684ddb6SLionel Sambuc
1654684ddb6SLionel Sambuc template <size_t _Sz = sizeof(size_t)>
1664684ddb6SLionel Sambuc inline _LIBCPP_INLINE_VISIBILITY
1674684ddb6SLionel Sambuc typename enable_if<_Sz == 8, void>::type
__check_for_overflow(size_t N)1684684ddb6SLionel Sambuc __check_for_overflow(size_t N)
1694684ddb6SLionel Sambuc {
1704684ddb6SLionel Sambuc #ifndef _LIBCPP_NO_EXCEPTIONS
1714684ddb6SLionel Sambuc if (N > 0xFFFFFFFFFFFFFFC5ull)
1724684ddb6SLionel Sambuc throw overflow_error("__next_prime overflow");
1734684ddb6SLionel Sambuc #else
1744684ddb6SLionel Sambuc (void)N;
1754684ddb6SLionel Sambuc #endif
1764684ddb6SLionel Sambuc }
1774684ddb6SLionel Sambuc
1784684ddb6SLionel Sambuc size_t
__next_prime(size_t n)1794684ddb6SLionel Sambuc __next_prime(size_t n)
1804684ddb6SLionel Sambuc {
1814684ddb6SLionel Sambuc const size_t L = 210;
1824684ddb6SLionel Sambuc const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
1834684ddb6SLionel Sambuc // If n is small enough, search in small_primes
1844684ddb6SLionel Sambuc if (n <= small_primes[N-1])
1854684ddb6SLionel Sambuc return *std::lower_bound(small_primes, small_primes + N, n);
1864684ddb6SLionel Sambuc // Else n > largest small_primes
1874684ddb6SLionel Sambuc // Check for overflow
1884684ddb6SLionel Sambuc __check_for_overflow(n);
1894684ddb6SLionel Sambuc // Start searching list of potential primes: L * k0 + indices[in]
1904684ddb6SLionel Sambuc const size_t M = sizeof(indices) / sizeof(indices[0]);
1914684ddb6SLionel Sambuc // Select first potential prime >= n
1924684ddb6SLionel Sambuc // Known a-priori n >= L
1934684ddb6SLionel Sambuc size_t k0 = n / L;
1944684ddb6SLionel Sambuc size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
1954684ddb6SLionel Sambuc - indices);
1964684ddb6SLionel Sambuc n = L * k0 + indices[in];
1974684ddb6SLionel Sambuc while (true)
1984684ddb6SLionel Sambuc {
1994684ddb6SLionel Sambuc // Divide n by all primes or potential primes (i) until:
2004684ddb6SLionel Sambuc // 1. The division is even, so try next potential prime.
2014684ddb6SLionel Sambuc // 2. The i > sqrt(n), in which case n is prime.
2024684ddb6SLionel Sambuc // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
2034684ddb6SLionel Sambuc // so don't test those (j == 5 -> divide by 11 first). And the
2044684ddb6SLionel Sambuc // potential primes start with 211, so don't test against the last
2054684ddb6SLionel Sambuc // small prime.
2064684ddb6SLionel Sambuc for (size_t j = 5; j < N - 1; ++j)
2074684ddb6SLionel Sambuc {
2084684ddb6SLionel Sambuc const std::size_t p = small_primes[j];
2094684ddb6SLionel Sambuc const std::size_t q = n / p;
2104684ddb6SLionel Sambuc if (q < p)
2114684ddb6SLionel Sambuc return n;
2124684ddb6SLionel Sambuc if (n == q * p)
2134684ddb6SLionel Sambuc goto next;
2144684ddb6SLionel Sambuc }
2154684ddb6SLionel Sambuc // n wasn't divisible by small primes, try potential primes
2164684ddb6SLionel Sambuc {
2174684ddb6SLionel Sambuc size_t i = 211;
2184684ddb6SLionel Sambuc while (true)
2194684ddb6SLionel Sambuc {
2204684ddb6SLionel Sambuc std::size_t q = n / i;
2214684ddb6SLionel Sambuc if (q < i)
2224684ddb6SLionel Sambuc return n;
2234684ddb6SLionel Sambuc if (n == q * i)
2244684ddb6SLionel Sambuc break;
2254684ddb6SLionel Sambuc
2264684ddb6SLionel Sambuc i += 10;
2274684ddb6SLionel Sambuc q = n / i;
2284684ddb6SLionel Sambuc if (q < i)
2294684ddb6SLionel Sambuc return n;
2304684ddb6SLionel Sambuc if (n == q * i)
2314684ddb6SLionel Sambuc break;
2324684ddb6SLionel Sambuc
2334684ddb6SLionel Sambuc i += 2;
2344684ddb6SLionel Sambuc q = n / i;
2354684ddb6SLionel Sambuc if (q < i)
2364684ddb6SLionel Sambuc return n;
2374684ddb6SLionel Sambuc if (n == q * i)
2384684ddb6SLionel Sambuc break;
2394684ddb6SLionel Sambuc
2404684ddb6SLionel Sambuc i += 4;
2414684ddb6SLionel Sambuc q = n / i;
2424684ddb6SLionel Sambuc if (q < i)
2434684ddb6SLionel Sambuc return n;
2444684ddb6SLionel Sambuc if (n == q * i)
2454684ddb6SLionel Sambuc break;
2464684ddb6SLionel Sambuc
2474684ddb6SLionel Sambuc i += 2;
2484684ddb6SLionel Sambuc q = n / i;
2494684ddb6SLionel Sambuc if (q < i)
2504684ddb6SLionel Sambuc return n;
2514684ddb6SLionel Sambuc if (n == q * i)
2524684ddb6SLionel Sambuc break;
2534684ddb6SLionel Sambuc
2544684ddb6SLionel Sambuc i += 4;
2554684ddb6SLionel Sambuc q = n / i;
2564684ddb6SLionel Sambuc if (q < i)
2574684ddb6SLionel Sambuc return n;
2584684ddb6SLionel Sambuc if (n == q * i)
2594684ddb6SLionel Sambuc break;
2604684ddb6SLionel Sambuc
2614684ddb6SLionel Sambuc i += 6;
2624684ddb6SLionel Sambuc q = n / i;
2634684ddb6SLionel Sambuc if (q < i)
2644684ddb6SLionel Sambuc return n;
2654684ddb6SLionel Sambuc if (n == q * i)
2664684ddb6SLionel Sambuc break;
2674684ddb6SLionel Sambuc
2684684ddb6SLionel Sambuc i += 2;
2694684ddb6SLionel Sambuc q = n / i;
2704684ddb6SLionel Sambuc if (q < i)
2714684ddb6SLionel Sambuc return n;
2724684ddb6SLionel Sambuc if (n == q * i)
2734684ddb6SLionel Sambuc break;
2744684ddb6SLionel Sambuc
2754684ddb6SLionel Sambuc i += 6;
2764684ddb6SLionel Sambuc q = n / i;
2774684ddb6SLionel Sambuc if (q < i)
2784684ddb6SLionel Sambuc return n;
2794684ddb6SLionel Sambuc if (n == q * i)
2804684ddb6SLionel Sambuc break;
2814684ddb6SLionel Sambuc
2824684ddb6SLionel Sambuc i += 4;
2834684ddb6SLionel Sambuc q = n / i;
2844684ddb6SLionel Sambuc if (q < i)
2854684ddb6SLionel Sambuc return n;
2864684ddb6SLionel Sambuc if (n == q * i)
2874684ddb6SLionel Sambuc break;
2884684ddb6SLionel Sambuc
2894684ddb6SLionel Sambuc i += 2;
2904684ddb6SLionel Sambuc q = n / i;
2914684ddb6SLionel Sambuc if (q < i)
2924684ddb6SLionel Sambuc return n;
2934684ddb6SLionel Sambuc if (n == q * i)
2944684ddb6SLionel Sambuc break;
2954684ddb6SLionel Sambuc
2964684ddb6SLionel Sambuc i += 4;
2974684ddb6SLionel Sambuc q = n / i;
2984684ddb6SLionel Sambuc if (q < i)
2994684ddb6SLionel Sambuc return n;
3004684ddb6SLionel Sambuc if (n == q * i)
3014684ddb6SLionel Sambuc break;
3024684ddb6SLionel Sambuc
3034684ddb6SLionel Sambuc i += 6;
3044684ddb6SLionel Sambuc q = n / i;
3054684ddb6SLionel Sambuc if (q < i)
3064684ddb6SLionel Sambuc return n;
3074684ddb6SLionel Sambuc if (n == q * i)
3084684ddb6SLionel Sambuc break;
3094684ddb6SLionel Sambuc
3104684ddb6SLionel Sambuc i += 6;
3114684ddb6SLionel Sambuc q = n / i;
3124684ddb6SLionel Sambuc if (q < i)
3134684ddb6SLionel Sambuc return n;
3144684ddb6SLionel Sambuc if (n == q * i)
3154684ddb6SLionel Sambuc break;
3164684ddb6SLionel Sambuc
3174684ddb6SLionel Sambuc i += 2;
3184684ddb6SLionel Sambuc q = n / i;
3194684ddb6SLionel Sambuc if (q < i)
3204684ddb6SLionel Sambuc return n;
3214684ddb6SLionel Sambuc if (n == q * i)
3224684ddb6SLionel Sambuc break;
3234684ddb6SLionel Sambuc
3244684ddb6SLionel Sambuc i += 6;
3254684ddb6SLionel Sambuc q = n / i;
3264684ddb6SLionel Sambuc if (q < i)
3274684ddb6SLionel Sambuc return n;
3284684ddb6SLionel Sambuc if (n == q * i)
3294684ddb6SLionel Sambuc break;
3304684ddb6SLionel Sambuc
3314684ddb6SLionel Sambuc i += 4;
3324684ddb6SLionel Sambuc q = n / i;
3334684ddb6SLionel Sambuc if (q < i)
3344684ddb6SLionel Sambuc return n;
3354684ddb6SLionel Sambuc if (n == q * i)
3364684ddb6SLionel Sambuc break;
3374684ddb6SLionel Sambuc
3384684ddb6SLionel Sambuc i += 2;
3394684ddb6SLionel Sambuc q = n / i;
3404684ddb6SLionel Sambuc if (q < i)
3414684ddb6SLionel Sambuc return n;
3424684ddb6SLionel Sambuc if (n == q * i)
3434684ddb6SLionel Sambuc break;
3444684ddb6SLionel Sambuc
3454684ddb6SLionel Sambuc i += 6;
3464684ddb6SLionel Sambuc q = n / i;
3474684ddb6SLionel Sambuc if (q < i)
3484684ddb6SLionel Sambuc return n;
3494684ddb6SLionel Sambuc if (n == q * i)
3504684ddb6SLionel Sambuc break;
3514684ddb6SLionel Sambuc
3524684ddb6SLionel Sambuc i += 4;
3534684ddb6SLionel Sambuc q = n / i;
3544684ddb6SLionel Sambuc if (q < i)
3554684ddb6SLionel Sambuc return n;
3564684ddb6SLionel Sambuc if (n == q * i)
3574684ddb6SLionel Sambuc break;
3584684ddb6SLionel Sambuc
3594684ddb6SLionel Sambuc i += 6;
3604684ddb6SLionel Sambuc q = n / i;
3614684ddb6SLionel Sambuc if (q < i)
3624684ddb6SLionel Sambuc return n;
3634684ddb6SLionel Sambuc if (n == q * i)
3644684ddb6SLionel Sambuc break;
3654684ddb6SLionel Sambuc
3664684ddb6SLionel Sambuc i += 8;
3674684ddb6SLionel Sambuc q = n / i;
3684684ddb6SLionel Sambuc if (q < i)
3694684ddb6SLionel Sambuc return n;
3704684ddb6SLionel Sambuc if (n == q * i)
3714684ddb6SLionel Sambuc break;
3724684ddb6SLionel Sambuc
3734684ddb6SLionel Sambuc i += 4;
3744684ddb6SLionel Sambuc q = n / i;
3754684ddb6SLionel Sambuc if (q < i)
3764684ddb6SLionel Sambuc return n;
3774684ddb6SLionel Sambuc if (n == q * i)
3784684ddb6SLionel Sambuc break;
3794684ddb6SLionel Sambuc
3804684ddb6SLionel Sambuc i += 2;
3814684ddb6SLionel Sambuc q = n / i;
3824684ddb6SLionel Sambuc if (q < i)
3834684ddb6SLionel Sambuc return n;
3844684ddb6SLionel Sambuc if (n == q * i)
3854684ddb6SLionel Sambuc break;
3864684ddb6SLionel Sambuc
3874684ddb6SLionel Sambuc i += 4;
3884684ddb6SLionel Sambuc q = n / i;
3894684ddb6SLionel Sambuc if (q < i)
3904684ddb6SLionel Sambuc return n;
3914684ddb6SLionel Sambuc if (n == q * i)
3924684ddb6SLionel Sambuc break;
3934684ddb6SLionel Sambuc
3944684ddb6SLionel Sambuc i += 2;
3954684ddb6SLionel Sambuc q = n / i;
3964684ddb6SLionel Sambuc if (q < i)
3974684ddb6SLionel Sambuc return n;
3984684ddb6SLionel Sambuc if (n == q * i)
3994684ddb6SLionel Sambuc break;
4004684ddb6SLionel Sambuc
4014684ddb6SLionel Sambuc i += 4;
4024684ddb6SLionel Sambuc q = n / i;
4034684ddb6SLionel Sambuc if (q < i)
4044684ddb6SLionel Sambuc return n;
4054684ddb6SLionel Sambuc if (n == q * i)
4064684ddb6SLionel Sambuc break;
4074684ddb6SLionel Sambuc
4084684ddb6SLionel Sambuc i += 8;
4094684ddb6SLionel Sambuc q = n / i;
4104684ddb6SLionel Sambuc if (q < i)
4114684ddb6SLionel Sambuc return n;
4124684ddb6SLionel Sambuc if (n == q * i)
4134684ddb6SLionel Sambuc break;
4144684ddb6SLionel Sambuc
4154684ddb6SLionel Sambuc i += 6;
4164684ddb6SLionel Sambuc q = n / i;
4174684ddb6SLionel Sambuc if (q < i)
4184684ddb6SLionel Sambuc return n;
4194684ddb6SLionel Sambuc if (n == q * i)
4204684ddb6SLionel Sambuc break;
4214684ddb6SLionel Sambuc
4224684ddb6SLionel Sambuc i += 4;
4234684ddb6SLionel Sambuc q = n / i;
4244684ddb6SLionel Sambuc if (q < i)
4254684ddb6SLionel Sambuc return n;
4264684ddb6SLionel Sambuc if (n == q * i)
4274684ddb6SLionel Sambuc break;
4284684ddb6SLionel Sambuc
4294684ddb6SLionel Sambuc i += 6;
4304684ddb6SLionel Sambuc q = n / i;
4314684ddb6SLionel Sambuc if (q < i)
4324684ddb6SLionel Sambuc return n;
4334684ddb6SLionel Sambuc if (n == q * i)
4344684ddb6SLionel Sambuc break;
4354684ddb6SLionel Sambuc
4364684ddb6SLionel Sambuc i += 2;
4374684ddb6SLionel Sambuc q = n / i;
4384684ddb6SLionel Sambuc if (q < i)
4394684ddb6SLionel Sambuc return n;
4404684ddb6SLionel Sambuc if (n == q * i)
4414684ddb6SLionel Sambuc break;
4424684ddb6SLionel Sambuc
4434684ddb6SLionel Sambuc i += 4;
4444684ddb6SLionel Sambuc q = n / i;
4454684ddb6SLionel Sambuc if (q < i)
4464684ddb6SLionel Sambuc return n;
4474684ddb6SLionel Sambuc if (n == q * i)
4484684ddb6SLionel Sambuc break;
4494684ddb6SLionel Sambuc
4504684ddb6SLionel Sambuc i += 6;
4514684ddb6SLionel Sambuc q = n / i;
4524684ddb6SLionel Sambuc if (q < i)
4534684ddb6SLionel Sambuc return n;
4544684ddb6SLionel Sambuc if (n == q * i)
4554684ddb6SLionel Sambuc break;
4564684ddb6SLionel Sambuc
4574684ddb6SLionel Sambuc i += 2;
4584684ddb6SLionel Sambuc q = n / i;
4594684ddb6SLionel Sambuc if (q < i)
4604684ddb6SLionel Sambuc return n;
4614684ddb6SLionel Sambuc if (n == q * i)
4624684ddb6SLionel Sambuc break;
4634684ddb6SLionel Sambuc
4644684ddb6SLionel Sambuc i += 6;
4654684ddb6SLionel Sambuc q = n / i;
4664684ddb6SLionel Sambuc if (q < i)
4674684ddb6SLionel Sambuc return n;
4684684ddb6SLionel Sambuc if (n == q * i)
4694684ddb6SLionel Sambuc break;
4704684ddb6SLionel Sambuc
4714684ddb6SLionel Sambuc i += 6;
4724684ddb6SLionel Sambuc q = n / i;
4734684ddb6SLionel Sambuc if (q < i)
4744684ddb6SLionel Sambuc return n;
4754684ddb6SLionel Sambuc if (n == q * i)
4764684ddb6SLionel Sambuc break;
4774684ddb6SLionel Sambuc
4784684ddb6SLionel Sambuc i += 4;
4794684ddb6SLionel Sambuc q = n / i;
4804684ddb6SLionel Sambuc if (q < i)
4814684ddb6SLionel Sambuc return n;
4824684ddb6SLionel Sambuc if (n == q * i)
4834684ddb6SLionel Sambuc break;
4844684ddb6SLionel Sambuc
4854684ddb6SLionel Sambuc i += 2;
4864684ddb6SLionel Sambuc q = n / i;
4874684ddb6SLionel Sambuc if (q < i)
4884684ddb6SLionel Sambuc return n;
4894684ddb6SLionel Sambuc if (n == q * i)
4904684ddb6SLionel Sambuc break;
4914684ddb6SLionel Sambuc
4924684ddb6SLionel Sambuc i += 4;
4934684ddb6SLionel Sambuc q = n / i;
4944684ddb6SLionel Sambuc if (q < i)
4954684ddb6SLionel Sambuc return n;
4964684ddb6SLionel Sambuc if (n == q * i)
4974684ddb6SLionel Sambuc break;
4984684ddb6SLionel Sambuc
4994684ddb6SLionel Sambuc i += 6;
5004684ddb6SLionel Sambuc q = n / i;
5014684ddb6SLionel Sambuc if (q < i)
5024684ddb6SLionel Sambuc return n;
5034684ddb6SLionel Sambuc if (n == q * i)
5044684ddb6SLionel Sambuc break;
5054684ddb6SLionel Sambuc
5064684ddb6SLionel Sambuc i += 2;
5074684ddb6SLionel Sambuc q = n / i;
5084684ddb6SLionel Sambuc if (q < i)
5094684ddb6SLionel Sambuc return n;
5104684ddb6SLionel Sambuc if (n == q * i)
5114684ddb6SLionel Sambuc break;
5124684ddb6SLionel Sambuc
5134684ddb6SLionel Sambuc i += 6;
5144684ddb6SLionel Sambuc q = n / i;
5154684ddb6SLionel Sambuc if (q < i)
5164684ddb6SLionel Sambuc return n;
5174684ddb6SLionel Sambuc if (n == q * i)
5184684ddb6SLionel Sambuc break;
5194684ddb6SLionel Sambuc
5204684ddb6SLionel Sambuc i += 4;
5214684ddb6SLionel Sambuc q = n / i;
5224684ddb6SLionel Sambuc if (q < i)
5234684ddb6SLionel Sambuc return n;
5244684ddb6SLionel Sambuc if (n == q * i)
5254684ddb6SLionel Sambuc break;
5264684ddb6SLionel Sambuc
5274684ddb6SLionel Sambuc i += 2;
5284684ddb6SLionel Sambuc q = n / i;
5294684ddb6SLionel Sambuc if (q < i)
5304684ddb6SLionel Sambuc return n;
5314684ddb6SLionel Sambuc if (n == q * i)
5324684ddb6SLionel Sambuc break;
5334684ddb6SLionel Sambuc
5344684ddb6SLionel Sambuc i += 4;
5354684ddb6SLionel Sambuc q = n / i;
5364684ddb6SLionel Sambuc if (q < i)
5374684ddb6SLionel Sambuc return n;
5384684ddb6SLionel Sambuc if (n == q * i)
5394684ddb6SLionel Sambuc break;
5404684ddb6SLionel Sambuc
5414684ddb6SLionel Sambuc i += 2;
5424684ddb6SLionel Sambuc q = n / i;
5434684ddb6SLionel Sambuc if (q < i)
5444684ddb6SLionel Sambuc return n;
5454684ddb6SLionel Sambuc if (n == q * i)
5464684ddb6SLionel Sambuc break;
5474684ddb6SLionel Sambuc
5484684ddb6SLionel Sambuc i += 10;
5494684ddb6SLionel Sambuc q = n / i;
5504684ddb6SLionel Sambuc if (q < i)
5514684ddb6SLionel Sambuc return n;
5524684ddb6SLionel Sambuc if (n == q * i)
5534684ddb6SLionel Sambuc break;
5544684ddb6SLionel Sambuc
5554684ddb6SLionel Sambuc // This will loop i to the next "plane" of potential primes
5564684ddb6SLionel Sambuc i += 2;
5574684ddb6SLionel Sambuc }
5584684ddb6SLionel Sambuc }
5594684ddb6SLionel Sambuc next:
5604684ddb6SLionel Sambuc // n is not prime. Increment n to next potential prime.
5614684ddb6SLionel Sambuc if (++in == M)
5624684ddb6SLionel Sambuc {
5634684ddb6SLionel Sambuc ++k0;
5644684ddb6SLionel Sambuc in = 0;
5654684ddb6SLionel Sambuc }
5664684ddb6SLionel Sambuc n = L * k0 + indices[in];
5674684ddb6SLionel Sambuc }
5684684ddb6SLionel Sambuc }
5694684ddb6SLionel Sambuc
5704684ddb6SLionel Sambuc _LIBCPP_END_NAMESPACE_STD
571