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