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