From: Bruno Haible Date: Tue, 29 Apr 2025 23:52:17 +0000 (+0200) Subject: New module next-prime. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=0b953ba82830f51ce9b939700705d238f9b0c0ba;p=gnulib.git New module next-prime. * lib/next-prime.h: New file, based on lib/hash.c. * lib/next-prime.c: New file, based on lib/hash.c. * modules/next-prime: New file. * lib/hash.c: Include next-prime.h. (is_prime, next_prime): Remove functions. * modules/hash (Depends-on): Add next-prime. --- diff --git a/ChangeLog b/ChangeLog index 6314db2094..60fbb0c0d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2025-04-29 Bruno Haible + + New module next-prime. + * lib/next-prime.h: New file, based on lib/hash.c. + * lib/next-prime.c: New file, based on lib/hash.c. + * modules/next-prime: New file. + * lib/hash.c: Include next-prime.h. + (is_prime, next_prime): Remove functions. + * modules/hash (Depends-on): Add next-prime. + 2025-04-29 Bruno Haible New module hashkey-string. diff --git a/lib/hash.c b/lib/hash.c index 556c82d5b8..74d016fde3 100644 --- a/lib/hash.c +++ b/lib/hash.c @@ -27,6 +27,7 @@ #include "hash.h" #include "bitrotate.h" +#include "next-prime.h" #include "xalloc-oversized.h" #include @@ -390,44 +391,6 @@ hash_string (const char *string, size_t n_buckets) #endif /* not USE_DIFF_HASH */ -/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd - number at least equal to 11. */ - -static bool _GL_ATTRIBUTE_CONST -is_prime (size_t candidate) -{ - size_t divisor = 3; - size_t square = divisor * divisor; - - while (square < candidate && (candidate % divisor)) - { - divisor++; - square += 4 * divisor; - divisor++; - } - - return (candidate % divisor ? true : false); -} - -/* Round a given CANDIDATE number up to the nearest prime, and return that - prime. Primes lower than 10 are merely skipped. */ - -static size_t _GL_ATTRIBUTE_CONST -next_prime (size_t candidate) -{ - /* Skip small primes. */ - if (candidate < 10) - candidate = 10; - - /* Make it definitely odd. */ - candidate |= 1; - - while (SIZE_MAX != candidate && !is_prime (candidate)) - candidate += 2; - - return candidate; -} - void hash_reset_tuning (Hash_tuning *tuning) { diff --git a/lib/next-prime.c b/lib/next-prime.c new file mode 100644 index 0000000000..52cebc48d1 --- /dev/null +++ b/lib/next-prime.c @@ -0,0 +1,56 @@ +/* Finding the next prime >= a given small integer. + Copyright (C) 1995-2025 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#include + +/* Specification. */ +#include "next-prime.h" + +#include /* for SIZE_MAX */ + +/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd + number at least equal to 11. */ +static bool _GL_ATTRIBUTE_CONST +is_prime (size_t candidate) +{ + size_t divisor = 3; + size_t square = divisor * divisor; + + while (square < candidate && (candidate % divisor)) + { + divisor++; + square += 4 * divisor; + divisor++; + } + + return (candidate % divisor ? true : false); +} + +size_t _GL_ATTRIBUTE_CONST +next_prime (size_t candidate) +{ + /* Skip small primes. */ + if (candidate < 10) + candidate = 10; + + /* Make it definitely odd. */ + candidate |= 1; + + while (SIZE_MAX != candidate && !is_prime (candidate)) + candidate += 2; + + return candidate; +} diff --git a/lib/next-prime.h b/lib/next-prime.h new file mode 100644 index 0000000000..c5ab78e318 --- /dev/null +++ b/lib/next-prime.h @@ -0,0 +1,41 @@ +/* Finding the next prime >= a given small integer. + Copyright (C) 1995-2025 Free Software Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ + +#ifndef _GL_NEXT_PRIME_H +#define _GL_NEXT_PRIME_H + +/* This file uses _GL_ATTRIBUTE_CONST. */ +#if !_GL_CONFIG_H_INCLUDED + #error "Please include config.h first." +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Round a given CANDIDATE number up to the nearest prime, and return that + prime. Primes lower than 10 are merely skipped. */ +extern size_t _GL_ATTRIBUTE_CONST next_prime (size_t candidate); + + +#ifdef __cplusplus +} +#endif + +#endif /* _GL_NEXT_PRIME_H */ diff --git a/modules/hash b/modules/hash index da477d8887..fa1b9852a5 100644 --- a/modules/hash +++ b/modules/hash @@ -10,6 +10,7 @@ bitrotate calloc-posix free-posix malloc-posix +next-prime bool stdint-h xalloc-oversized diff --git a/modules/next-prime b/modules/next-prime new file mode 100644 index 0000000000..259db8846e --- /dev/null +++ b/modules/next-prime @@ -0,0 +1,24 @@ +Description: +Finding the next prime >= a given small integer. + +Files: +lib/next-prime.h +lib/next-prime.c + +Depends-on: +bool +stdint-h + +configure.ac: + +Makefile.am: +lib_SOURCES += next-prime.h next-prime.c + +Include: +"next-prime.h" + +License: +LGPLv2+ + +Maintainer: +all