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