if (flag_count)
printf ("Pi(interval) = %lu\n", total_primes);
if (flag_maxgap)
printf ("max gap: %lu\n", maxgap);
return0;
}
/* Find primes in region [fr,fr+rsize). Requires that fr is odd and that rsizeiseven.Thesievingarraysshouldbealignedfor"longint"and
have rsize/2 entries, rounded up to the nearest multiple of "long int". */ void
sieve_region (unsignedchar *s, mpz_t fr, unsignedlong rsize)
{ unsignedlong ssize = rsize / 2; unsignedlong start, start2, prime; unsignedlong i;
mpz_t tmp;
mpz_init (tmp);
#if0 /* initialize sieving array */ for (ii = 0; ii < (ssize + sizeof (long) - 1) / sizeof (long); ii++)
((long *) s) [ii] = ~0L; #else
{ long k; long *se = (long *) (s + ((ssize + sizeof (long) - 1) & -sizeof (long))); for (k = -((ssize + sizeof (long) - 1) / sizeof (long)); k < 0; k++)
se[k] = ~0L;
} #endif
for (i = 0; i < n_primes; i++)
{
prime = primes[i].prime;
if (primes[i].rem >= 0)
{
start2 = primes[i].rem;
} else
{
mpz_set_ui (tmp, prime);
mpz_mul_ui (tmp, tmp, prime); if (mpz_cmp (fr, tmp) <= 0)
{
mpz_sub (tmp, tmp, fr); if (mpz_cmp_ui (tmp, 2 * ssize) > 0) break; /* avoid overflow at next line, also speedup */
start = mpz_get_ui (tmp);
} else
{
start = (prime - mpz_tdiv_ui (fr, prime)) % prime; if (start % 2 != 0)
start += prime; /* adjust if even divisible */
}
start2 = start / 2;
}
#if0 for (ii = start2; ii < ssize; ii += prime)
s[ii] = 0;
primes[i].rem = ii - ssize; #else
{ long k; unsignedchar *se = s + ssize; /* point just beyond sieving range */ for (k = start2 - ssize; k < 0; k += prime)
se[k] = 0;
primes[i].rem = k;
} #endif
}
mpz_clear (tmp);
}
/* Find primes in region [fr,fr+rsize), using the previously sieved s[]. */ void
find_primes (unsignedchar *s, mpz_t fr, unsignedlong ssize,
mpz_t siev_sqr_lim)
{ unsignedlong j, ij;
mpz_t tmp;
/* Generate a list of primes and store in the global array primes[]. */ void
make_primelist (unsignedlong maxprime)
{ #if1 unsignedchar *s; unsignedlong ssize = maxprime / 2; unsignedlong i, ii, j;
s = malloc (ssize);
memset (s, ~0, ssize); for (i = 3; ; i += 2)
{ unsignedlong isqr = i * i; if (isqr >= maxprime) break; if (s[i * i / 2 - 1] == 0) continue; /* only sieve with primes */ for (ii = i * i / 2 - 1; ii < ssize; ii += i)
s[ii] = 0;
}
n_primes = 0; for (j = 0; j < ssize; j++)
{ if (s[j] != 0)
{
primes[n_primes].prime = j * 2 + 3;
primes[n_primes].rem = -1;
n_primes++;
}
} /* FIXME: This should not be needed if fencepost errors were fixed... */ if (primes[n_primes - 1].prime > maxprime)
n_primes--;
free (s); #else unsignedlong i;
n_primes = 0; for (i = 3; i <= maxprime; i += 2)
{ if (i < 7 || (i % 3 != 0 && i % 5 != 0 && i % 7 != 0))
{
primes[n_primes].prime = i;
primes[n_primes].rem = -1;
n_primes++;
}
} #endif
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.