]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/libcxx/src/hash.cpp
MFC r355940:
[FreeBSD/FreeBSD.git] / contrib / llvm-project / libcxx / src / hash.cpp
1 //===-------------------------- hash.cpp ----------------------------------===//
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 #ifdef __clang__
15 #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
16 #endif
17
18 _LIBCPP_BEGIN_NAMESPACE_STD
19
20 namespace {
21
22 // handle all next_prime(i) for i in [1, 210), special case 0
23 const unsigned small_primes[] =
24 {
25     0,
26     2,
27     3,
28     5,
29     7,
30     11,
31     13,
32     17,
33     19,
34     23,
35     29,
36     31,
37     37,
38     41,
39     43,
40     47,
41     53,
42     59,
43     61,
44     67,
45     71,
46     73,
47     79,
48     83,
49     89,
50     97,
51     101,
52     103,
53     107,
54     109,
55     113,
56     127,
57     131,
58     137,
59     139,
60     149,
61     151,
62     157,
63     163,
64     167,
65     173,
66     179,
67     181,
68     191,
69     193,
70     197,
71     199,
72     211
73 };
74
75 // potential primes = 210*k + indices[i], k >= 1
76 //   these numbers are not divisible by 2, 3, 5 or 7
77 //   (or any integer 2 <= j <= 10 for that matter).
78 const unsigned indices[] =
79 {
80     1,
81     11,
82     13,
83     17,
84     19,
85     23,
86     29,
87     31,
88     37,
89     41,
90     43,
91     47,
92     53,
93     59,
94     61,
95     67,
96     71,
97     73,
98     79,
99     83,
100     89,
101     97,
102     101,
103     103,
104     107,
105     109,
106     113,
107     121,
108     127,
109     131,
110     137,
111     139,
112     143,
113     149,
114     151,
115     157,
116     163,
117     167,
118     169,
119     173,
120     179,
121     181,
122     187,
123     191,
124     193,
125     197,
126     199,
127     209
128 };
129
130 }
131
132 // Returns:  If n == 0, returns 0.  Else returns the lowest prime number that
133 // is greater than or equal to n.
134 //
135 // The algorithm creates a list of small primes, plus an open-ended list of
136 // potential primes.  All prime numbers are potential prime numbers.  However
137 // some potential prime numbers are not prime.  In an ideal world, all potential
138 // prime numbers would be prime.  Candidate prime numbers are chosen as the next
139 // highest potential prime.  Then this number is tested for prime by dividing it
140 // by all potential prime numbers less than the sqrt of the candidate.
141 //
142 // This implementation defines potential primes as those numbers not divisible
143 // by 2, 3, 5, and 7.  Other (common) implementations define potential primes
144 // as those not divisible by 2.  A few other implementations define potential
145 // primes as those not divisible by 2 or 3.  By raising the number of small
146 // primes which the potential prime is not divisible by, the set of potential
147 // primes more closely approximates the set of prime numbers.  And thus there
148 // are fewer potential primes to search, and fewer potential primes to divide
149 // against.
150
151 template <size_t _Sz = sizeof(size_t)>
152 inline _LIBCPP_INLINE_VISIBILITY
153 typename enable_if<_Sz == 4, void>::type
154 __check_for_overflow(size_t N)
155 {
156     if (N > 0xFFFFFFFB)
157         __throw_overflow_error("__next_prime overflow");
158 }
159
160 template <size_t _Sz = sizeof(size_t)>
161 inline _LIBCPP_INLINE_VISIBILITY
162 typename enable_if<_Sz == 8, void>::type
163 __check_for_overflow(size_t N)
164 {
165     if (N > 0xFFFFFFFFFFFFFFC5ull)
166         __throw_overflow_error("__next_prime overflow");
167 }
168
169 size_t
170 __next_prime(size_t n)
171 {
172     const size_t L = 210;
173     const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
174     // If n is small enough, search in small_primes
175     if (n <= small_primes[N-1])
176         return *std::lower_bound(small_primes, small_primes + N, n);
177     // Else n > largest small_primes
178     // Check for overflow
179     __check_for_overflow(n);
180     // Start searching list of potential primes: L * k0 + indices[in]
181     const size_t M = sizeof(indices) / sizeof(indices[0]);
182     // Select first potential prime >= n
183     //   Known a-priori n >= L
184     size_t k0 = n / L;
185     size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
186                                     - indices);
187     n = L * k0 + indices[in];
188     while (true)
189     {
190         // Divide n by all primes or potential primes (i) until:
191         //    1.  The division is even, so try next potential prime.
192         //    2.  The i > sqrt(n), in which case n is prime.
193         // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
194         //    so don't test those (j == 5 ->  divide by 11 first).  And the
195         //    potential primes start with 211, so don't test against the last
196         //    small prime.
197         for (size_t j = 5; j < N - 1; ++j)
198         {
199             const std::size_t p = small_primes[j];
200             const std::size_t q = n / p;
201             if (q < p)
202                 return n;
203             if (n == q * p)
204                 goto next;
205         }
206         // n wasn't divisible by small primes, try potential primes
207         {
208             size_t i = 211;
209             while (true)
210             {
211                 std::size_t q = n / i;
212                 if (q < i)
213                     return n;
214                 if (n == q * i)
215                     break;
216
217                 i += 10;
218                 q = n / i;
219                 if (q < i)
220                     return n;
221                 if (n == q * i)
222                     break;
223
224                 i += 2;
225                 q = n / i;
226                 if (q < i)
227                     return n;
228                 if (n == q * i)
229                     break;
230
231                 i += 4;
232                 q = n / i;
233                 if (q < i)
234                     return n;
235                 if (n == q * i)
236                     break;
237
238                 i += 2;
239                 q = n / i;
240                 if (q < i)
241                     return n;
242                 if (n == q * i)
243                     break;
244
245                 i += 4;
246                 q = n / i;
247                 if (q < i)
248                     return n;
249                 if (n == q * i)
250                     break;
251
252                 i += 6;
253                 q = n / i;
254                 if (q < i)
255                     return n;
256                 if (n == q * i)
257                     break;
258
259                 i += 2;
260                 q = n / i;
261                 if (q < i)
262                     return n;
263                 if (n == q * i)
264                     break;
265
266                 i += 6;
267                 q = n / i;
268                 if (q < i)
269                     return n;
270                 if (n == q * i)
271                     break;
272
273                 i += 4;
274                 q = n / i;
275                 if (q < i)
276                     return n;
277                 if (n == q * i)
278                     break;
279
280                 i += 2;
281                 q = n / i;
282                 if (q < i)
283                     return n;
284                 if (n == q * i)
285                     break;
286
287                 i += 4;
288                 q = n / i;
289                 if (q < i)
290                     return n;
291                 if (n == q * i)
292                     break;
293
294                 i += 6;
295                 q = n / i;
296                 if (q < i)
297                     return n;
298                 if (n == q * i)
299                     break;
300
301                 i += 6;
302                 q = n / i;
303                 if (q < i)
304                     return n;
305                 if (n == q * i)
306                     break;
307
308                 i += 2;
309                 q = n / i;
310                 if (q < i)
311                     return n;
312                 if (n == q * i)
313                     break;
314
315                 i += 6;
316                 q = n / i;
317                 if (q < i)
318                     return n;
319                 if (n == q * i)
320                     break;
321
322                 i += 4;
323                 q = n / i;
324                 if (q < i)
325                     return n;
326                 if (n == q * i)
327                     break;
328
329                 i += 2;
330                 q = n / i;
331                 if (q < i)
332                     return n;
333                 if (n == q * i)
334                     break;
335
336                 i += 6;
337                 q = n / i;
338                 if (q < i)
339                     return n;
340                 if (n == q * i)
341                     break;
342
343                 i += 4;
344                 q = n / i;
345                 if (q < i)
346                     return n;
347                 if (n == q * i)
348                     break;
349
350                 i += 6;
351                 q = n / i;
352                 if (q < i)
353                     return n;
354                 if (n == q * i)
355                     break;
356
357                 i += 8;
358                 q = n / i;
359                 if (q < i)
360                     return n;
361                 if (n == q * i)
362                     break;
363
364                 i += 4;
365                 q = n / i;
366                 if (q < i)
367                     return n;
368                 if (n == q * i)
369                     break;
370
371                 i += 2;
372                 q = n / i;
373                 if (q < i)
374                     return n;
375                 if (n == q * i)
376                     break;
377
378                 i += 4;
379                 q = n / i;
380                 if (q < i)
381                     return n;
382                 if (n == q * i)
383                     break;
384
385                 i += 2;
386                 q = n / i;
387                 if (q < i)
388                     return n;
389                 if (n == q * i)
390                     break;
391
392                 i += 4;
393                 q = n / i;
394                 if (q < i)
395                     return n;
396                 if (n == q * i)
397                     break;
398
399                 i += 8;
400                 q = n / i;
401                 if (q < i)
402                     return n;
403                 if (n == q * i)
404                     break;
405
406                 i += 6;
407                 q = n / i;
408                 if (q < i)
409                     return n;
410                 if (n == q * i)
411                     break;
412
413                 i += 4;
414                 q = n / i;
415                 if (q < i)
416                     return n;
417                 if (n == q * i)
418                     break;
419
420                 i += 6;
421                 q = n / i;
422                 if (q < i)
423                     return n;
424                 if (n == q * i)
425                     break;
426
427                 i += 2;
428                 q = n / i;
429                 if (q < i)
430                     return n;
431                 if (n == q * i)
432                     break;
433
434                 i += 4;
435                 q = n / i;
436                 if (q < i)
437                     return n;
438                 if (n == q * i)
439                     break;
440
441                 i += 6;
442                 q = n / i;
443                 if (q < i)
444                     return n;
445                 if (n == q * i)
446                     break;
447
448                 i += 2;
449                 q = n / i;
450                 if (q < i)
451                     return n;
452                 if (n == q * i)
453                     break;
454
455                 i += 6;
456                 q = n / i;
457                 if (q < i)
458                     return n;
459                 if (n == q * i)
460                     break;
461
462                 i += 6;
463                 q = n / i;
464                 if (q < i)
465                     return n;
466                 if (n == q * i)
467                     break;
468
469                 i += 4;
470                 q = n / i;
471                 if (q < i)
472                     return n;
473                 if (n == q * i)
474                     break;
475
476                 i += 2;
477                 q = n / i;
478                 if (q < i)
479                     return n;
480                 if (n == q * i)
481                     break;
482
483                 i += 4;
484                 q = n / i;
485                 if (q < i)
486                     return n;
487                 if (n == q * i)
488                     break;
489
490                 i += 6;
491                 q = n / i;
492                 if (q < i)
493                     return n;
494                 if (n == q * i)
495                     break;
496
497                 i += 2;
498                 q = n / i;
499                 if (q < i)
500                     return n;
501                 if (n == q * i)
502                     break;
503
504                 i += 6;
505                 q = n / i;
506                 if (q < i)
507                     return n;
508                 if (n == q * i)
509                     break;
510
511                 i += 4;
512                 q = n / i;
513                 if (q < i)
514                     return n;
515                 if (n == q * i)
516                     break;
517
518                 i += 2;
519                 q = n / i;
520                 if (q < i)
521                     return n;
522                 if (n == q * i)
523                     break;
524
525                 i += 4;
526                 q = n / i;
527                 if (q < i)
528                     return n;
529                 if (n == q * i)
530                     break;
531
532                 i += 2;
533                 q = n / i;
534                 if (q < i)
535                     return n;
536                 if (n == q * i)
537                     break;
538
539                 i += 10;
540                 q = n / i;
541                 if (q < i)
542                     return n;
543                 if (n == q * i)
544                     break;
545
546                 // This will loop i to the next "plane" of potential primes
547                 i += 2;
548             }
549         }
550 next:
551         // n is not prime.  Increment n to next potential prime.
552         if (++in == M)
553         {
554             ++k0;
555             in = 0;
556         }
557         n = L * k0 + indices[in];
558     }
559 }
560
561 _LIBCPP_END_NAMESPACE_STD