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