From badea839f93c0b9c482982ac0a3e2772253beb7a Mon Sep 17 00:00:00 2001 From: Tommy Thorn Date: Sun, 17 Sep 2023 17:44:21 -0700 Subject: [PATCH] Fix sieve.c and make it faster --- examples/sieve.c | 50 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/examples/sieve.c b/examples/sieve.c index 15e001b..b251a7d 100644 --- a/examples/sieve.c +++ b/examples/sieve.c @@ -5,28 +5,40 @@ // for (..) #include +#include +#include int main(int argc, char **argv) { - int N, p, j; - char *excluded, *excluded_end, *cp; - - N = 10000; - excluded = malloc(N); - excluded_end = excluded + N; - memset(excluded, 0, N); - - p = 2; - while (p < N) { - if (!excluded[p]) { - printf(" %d", p); - j = p*2; - cp = excluded + j; - while (cp < excluded_end) { - *cp = 1; - cp = cp + j; - } + int N, j, p; + char *primes, *primes_end, *cp, *pi; + + N = 1000; + // 3 5 7 9 11 13 .. i*2+3 + // primes[N] is a sential 0; this enables us to scan without + // having to test against the array limit + primes = malloc(N+1); + primes_end = primes + N; + memset(primes, 1, N + 1); + + printf("2"); + + pi = primes; + while (pi < primes_end) { + p = 3 + 2*(pi - primes); + printf(" %d", p); + cp = pi + p; + while (cp < primes_end) { + *cp = 0; // Sieve out multiples of p + cp = cp + p; } - ++p; + + ++pi; + while (!*pi) + ++pi; } + + printf("\n"); + + return 0; }