1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
2
3 #include "lib.h"
4 #include "primes.h"
5
6 static const unsigned int primes[] = {
7 #define PRIME_SKIP_COUNT 3
8 17,
9 37,
10 67,
11 131,
12 257, /* next from 2^8 */
13 521,
14 1031,
15 2053,
16 4099,
17 8209,
18 16411,
19 32771,
20 65537, /* next from 2^16 */
21 131101,
22 262147,
23 524309,
24 1048583,
25 2097169,
26 4194319,
27 8388617,
28 16777259, /* next from 2^24 */
29 33554467,
30 67108879,
31 134217757,
32 268435459,
33 536870923,
34 1073741827,
35 2147483659U,
36 4294967291U /* previous from 2^32 */
37 };
38
primes_closest(unsigned int num)39 unsigned int primes_closest(unsigned int num)
40 {
41 unsigned int i;
42
43 for (i = 31; i > PRIME_SKIP_COUNT; i--) {
44 if ((num & (1U << i)) != 0)
45 return primes[i - PRIME_SKIP_COUNT];
46 }
47 return primes[0];
48 }
49