Line data Source code
1 : /* Determine prime number.
2 : Copyright (C) 2006 Red Hat, Inc.
3 : This file is part of elfutils.
4 : Written by Ulrich Drepper <drepper@redhat.com>, 2000.
5 :
6 : This file is free software; you can redistribute it and/or modify
7 : it under the terms of either
8 :
9 : * the GNU Lesser General Public License as published by the Free
10 : Software Foundation; either version 3 of the License, or (at
11 : your option) any later version
12 :
13 : or
14 :
15 : * the GNU General Public License as published by the Free
16 : Software Foundation; either version 2 of the License, or (at
17 : your option) any later version
18 :
19 : or both in parallel, as here.
20 :
21 : elfutils is distributed in the hope that it will be useful, but
22 : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : General Public License for more details.
25 :
26 : You should have received copies of the GNU General Public License and
27 : the GNU Lesser General Public License along with this program. If
28 : not, see <http://www.gnu.org/licenses/>. */
29 :
30 : #include <stddef.h>
31 :
32 :
33 : /* Test whether CANDIDATE is a prime. */
34 : static int
35 : is_prime (size_t candidate)
36 : {
37 : /* No even number and none less than 10 will be passed here. */
38 33886 : size_t divn = 3;
39 33886 : size_t sq = divn * divn;
40 :
41 120993 : while (sq < candidate && candidate % divn != 0)
42 : {
43 87107 : size_t old_sq = sq;
44 87107 : ++divn;
45 87107 : sq += 4 * divn;
46 87107 : if (sq < old_sq)
47 : return 1;
48 87107 : ++divn;
49 : }
50 :
51 33886 : return candidate % divn != 0;
52 : }
53 :
54 :
55 : /* We need primes for the table size. */
56 : size_t
57 33857 : next_prime (size_t seed)
58 : {
59 : /* Make it definitely odd. */
60 33857 : seed |= 1;
61 :
62 67743 : while (!is_prime (seed))
63 29 : seed += 2;
64 :
65 33857 : return seed;
66 : }
|