| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "__hash_table" |
| | #include "algorithm" |
| | #include "stdexcept" |
| | #include "type_traits" |
| |
|
| | #ifdef __clang__ |
| | #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare" |
| | #endif |
| |
|
| | _LIBCUDACXX_BEGIN_NAMESPACE_STD |
| |
|
| | namespace { |
| |
|
| | |
| | const unsigned small_primes[] = |
| | { |
| | 0, |
| | 2, |
| | 3, |
| | 5, |
| | 7, |
| | 11, |
| | 13, |
| | 17, |
| | 19, |
| | 23, |
| | 29, |
| | 31, |
| | 37, |
| | 41, |
| | 43, |
| | 47, |
| | 53, |
| | 59, |
| | 61, |
| | 67, |
| | 71, |
| | 73, |
| | 79, |
| | 83, |
| | 89, |
| | 97, |
| | 101, |
| | 103, |
| | 107, |
| | 109, |
| | 113, |
| | 127, |
| | 131, |
| | 137, |
| | 139, |
| | 149, |
| | 151, |
| | 157, |
| | 163, |
| | 167, |
| | 173, |
| | 179, |
| | 181, |
| | 191, |
| | 193, |
| | 197, |
| | 199, |
| | 211 |
| | }; |
| |
|
| | |
| | |
| | |
| | const unsigned indices[] = |
| | { |
| | 1, |
| | 11, |
| | 13, |
| | 17, |
| | 19, |
| | 23, |
| | 29, |
| | 31, |
| | 37, |
| | 41, |
| | 43, |
| | 47, |
| | 53, |
| | 59, |
| | 61, |
| | 67, |
| | 71, |
| | 73, |
| | 79, |
| | 83, |
| | 89, |
| | 97, |
| | 101, |
| | 103, |
| | 107, |
| | 109, |
| | 113, |
| | 121, |
| | 127, |
| | 131, |
| | 137, |
| | 139, |
| | 143, |
| | 149, |
| | 151, |
| | 157, |
| | 163, |
| | 167, |
| | 169, |
| | 173, |
| | 179, |
| | 181, |
| | 187, |
| | 191, |
| | 193, |
| | 197, |
| | 199, |
| | 209 |
| | }; |
| |
|
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | template <size_t _Sz = sizeof(size_t)> |
| | inline _LIBCUDACXX_INLINE_VISIBILITY |
| | typename enable_if<_Sz == 4, void>::type |
| | __check_for_overflow(size_t N) |
| | { |
| | if (N > 0xFFFFFFFB) |
| | __throw_overflow_error("__next_prime overflow"); |
| | } |
| |
|
| | template <size_t _Sz = sizeof(size_t)> |
| | inline _LIBCUDACXX_INLINE_VISIBILITY |
| | typename enable_if<_Sz == 8, void>::type |
| | __check_for_overflow(size_t N) |
| | { |
| | if (N > 0xFFFFFFFFFFFFFFC5ull) |
| | __throw_overflow_error("__next_prime overflow"); |
| | } |
| |
|
| | size_t |
| | __next_prime(size_t n) |
| | { |
| | const size_t L = 210; |
| | const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); |
| | |
| | if (n <= small_primes[N-1]) |
| | return *std::lower_bound(small_primes, small_primes + N, n); |
| | |
| | |
| | __check_for_overflow(n); |
| | |
| | const size_t M = sizeof(indices) / sizeof(indices[0]); |
| | |
| | |
| | size_t k0 = n / L; |
| | size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) |
| | - indices); |
| | n = L * k0 + indices[in]; |
| | while (true) |
| | { |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | for (size_t j = 5; j < N - 1; ++j) |
| | { |
| | const std::size_t p = small_primes[j]; |
| | const std::size_t q = n / p; |
| | if (q < p) |
| | return n; |
| | if (n == q * p) |
| | goto next; |
| | } |
| | |
| | { |
| | size_t i = 211; |
| | while (true) |
| | { |
| | std::size_t q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 10; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 8; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 8; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 6; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 4; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 2; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | i += 10; |
| | q = n / i; |
| | if (q < i) |
| | return n; |
| | if (n == q * i) |
| | break; |
| |
|
| | |
| | i += 2; |
| | } |
| | } |
| | next: |
| | |
| | if (++in == M) |
| | { |
| | ++k0; |
| | in = 0; |
| | } |
| | n = L * k0 + indices[in]; |
| | } |
| | } |
| |
|
| | _LIBCUDACXX_END_NAMESPACE_STD |
| |
|