Derive-C
Loading...
Searching...
No Matches
prime_sieve.c
Go to the documentation of this file.
1
6
7#include <limits.h>
8#include <stdbool.h>
9#include <stdio.h>
10#include <stdlib.h>
11
13
14#define MAX_UP_TO 100000
15
16// to store values, plus room for realloc
17#define CAPACITY 300000
18#define NAME bump_alloc
20
21#define ITEM bool
22#define ALLOC bump_alloc
23#define NAME sieve_vec
25
26size_t sqrt_size_t(size_t n) {
27 if (n == 0 || n == 1) {
28 return n;
29 }
30 size_t left = 1;
31 size_t right = n;
32 size_t mid;
33 size_t result = 0;
34 while (left <= right) {
35 mid = left + (right - left) / 2;
36 size_t square = mid * mid;
37
38 if (square == n) {
39 return mid;
40 }
41
42 if (square < n) {
43 result = mid; // Store the last valid result
44 left = mid + 1;
45 } else {
46 right = mid - 1;
47 }
48 }
49
50 return result;
51}
52
53void display(sieve_vec const* sieve) {
54 sieve_vec_iter_const iter = sieve_vec_get_iter_const(sieve);
55
56 sieve_vec_iter_const_next(&iter); // skip 0
57 sieve_vec_iter_const_next(&iter); // skip 1
58 size_t index = 2;
59
60 bool const* is_not_prime;
61 while ((is_not_prime = sieve_vec_iter_const_next(&iter))) {
62 if (!*is_not_prime) {
63 printf("%zu is prime\n", index);
64 }
65 index++;
66 }
67}
68
69void compute(sieve_vec* sieve) {
70 size_t size = sieve_vec_size(sieve);
71 size_t sqrt = sqrt_size_t(size);
72 printf("Sieve size: %zu, sqrt: %zu\n", size, sqrt);
73 for (size_t factor = 2; factor <= sqrt; factor++) {
74 for (size_t index = factor * 2; index < size; index += factor) {
75 printf("Marking %zu as not prime (factor: %zu)\n", index, factor);
76 *sieve_vec_write(sieve, index) = true;
77 }
78 }
79}
80
81int main() {
82 size_t up_to = 28;
83 ASSERT(up_to < MAX_UP_TO);
84 printf("Listing primes up to: %zu\n", up_to);
85 bump_alloc_buffer buf;
86 bump_alloc alloc = bump_alloc_new(&buf);
87 sieve_vec values = sieve_vec_new_with_defaults(up_to, false, &alloc);
88 compute(&values);
89 display(&values);
90 sieve_vec_delete(&values);
91}
static INDEX_TYPE size(SELF const *self)
Definition template.h:275
#define ASSERT(expr,...)
Definition macros.h:42
size_t sqrt_size_t(size_t n)
Definition prime_sieve.c:26
void display(sieve_vec const *sieve)
Definition prime_sieve.c:53
void compute(sieve_vec *sieve)
Definition prime_sieve.c:69
#define MAX_UP_TO
Definition prime_sieve.c:14
int main()
Definition prime_sieve.c:81