Using a vector in implementing a basic prime sieve.
Using a vector in implementing a basic prime sieve.
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define SELF sieve_vec
#define T bool
if (n == 0 || n == 1) {
return n;
}
size_t left = 1, right = n, mid, result = 0;
while (left <= right) {
mid = left + (right - left) / 2;
size_t square = mid * mid;
if (square == n) {
return mid;
} else if (square < n) {
result = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
void display(sieve_vec
const* sieve) {
sieve_vec_iter_const iter = sieve_vec_get_iter_const(sieve);
sieve_vec_iter_const_next(&iter);
sieve_vec_iter_const_next(&iter);
if (!*is_not_prime) {
printf("%zu is prime\n", sieve_vec_iter_const_position(&iter) - 1);
}
}
}
size_t size = sieve_vec_size(sieve);
for (size_t factor = 2; factor < sqrt; factor++) {
for (
size_t index = factor * 2; index <
size; index += factor) {
*sieve_vec_write(sieve, index) = true;
}
}
}
size_t up_to = 23;
printf("Listing primes up to: %zu\n", up_to);
sieve_vec values = sieve_vec_new_with_defaults(up_to, false);
sieve_vec_delete(&values);
return 0;
}
static INDEX_TYPE size(SELF const *self)
#define ITER_ENUMERATE_LOOP(ITER_TYPE, ITER_NAME, VALUE_TYPE, VALUE_NAME, COUNTER_TYPE, COUNTER_NAME)
size_t sqrt_size_t(size_t n)
void display(sieve_vec const *sieve)
void compute(sieve_vec *sieve)