hashtab.c (higher_prime_number): Use a table, rather than a seive, to find the next prime.
* hashtab.c (higher_prime_number): Use a table, rather than a seive, to find the next prime. From-SVN: r37775
This commit is contained in:
parent
e9608fe6f0
commit
a4c9b97e26
@ -1,3 +1,8 @@
|
||||
2000-11-26 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* hashtab.c (higher_prime_number): Use a table, rather than a
|
||||
seive, to find the next prime.
|
||||
|
||||
2000-11-22 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* cplus-dem.c (main): Handle gnat_demangling.
|
||||
|
@ -71,35 +71,69 @@ static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
|
||||
htab_hash htab_hash_pointer = hash_pointer;
|
||||
htab_eq htab_eq_pointer = eq_pointer;
|
||||
|
||||
/* The following function returns the nearest prime number which is
|
||||
greater than a given source number, N. */
|
||||
/* The following function returns a nearest prime number which is
|
||||
greater than N, and near a power of two. */
|
||||
|
||||
static unsigned long
|
||||
higher_prime_number (n)
|
||||
unsigned long n;
|
||||
{
|
||||
unsigned long i;
|
||||
/* These are primes that are near, but slightly smaller than, a
|
||||
power of two. */
|
||||
static unsigned long primes[] = {
|
||||
2,
|
||||
7,
|
||||
13,
|
||||
31,
|
||||
61,
|
||||
127,
|
||||
251,
|
||||
509,
|
||||
1021,
|
||||
2039,
|
||||
4093,
|
||||
8191,
|
||||
16381,
|
||||
32749,
|
||||
65521,
|
||||
131071,
|
||||
262139,
|
||||
524287,
|
||||
1048573,
|
||||
2097143,
|
||||
4194301,
|
||||
8388593,
|
||||
16777213,
|
||||
33554393,
|
||||
67108859,
|
||||
134217689,
|
||||
268435399,
|
||||
536870909,
|
||||
1073741789,
|
||||
2147483647,
|
||||
4294967291
|
||||
};
|
||||
|
||||
/* Ensure we have a larger number and then force to odd. */
|
||||
n++;
|
||||
n |= 0x01;
|
||||
unsigned long* low = &primes[0];
|
||||
unsigned long* high = &primes[sizeof(primes) / sizeof(primes[0])];
|
||||
|
||||
/* All odd numbers < 9 are prime. */
|
||||
if (n < 9)
|
||||
return n;
|
||||
|
||||
/* Otherwise find the next prime using a sieve. */
|
||||
|
||||
next:
|
||||
|
||||
for (i = 3; i * i <= n; i += 2)
|
||||
if (n % i == 0)
|
||||
while (low != high)
|
||||
{
|
||||
n += 2;
|
||||
goto next;
|
||||
unsigned long* mid = low + (high - low) / 2;
|
||||
if (n > *mid)
|
||||
low = mid + 1;
|
||||
else
|
||||
high = mid;
|
||||
}
|
||||
|
||||
return n;
|
||||
/* If we've run out of primes, abort. */
|
||||
if (n > *low)
|
||||
{
|
||||
fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
|
||||
abort ();
|
||||
}
|
||||
|
||||
return *low;
|
||||
}
|
||||
|
||||
/* Returns a hash code for P. */
|
||||
|
Loading…
Reference in New Issue
Block a user