Derive-C
Loading...
Searching...
No Matches
prime_sieve.c File Reference
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <derive-c/allocs/staticbump/template.h>
#include <derive-c/structures/vector/template.h>
Include dependency graph for prime_sieve.c:

Go to the source code of this file.

Macros

#define MAX_UP_TO   100000
#define CAPACITY   300000
#define SELF   bump_alloc
#define SELF   sieve_vec
#define T   bool
#define ALLOC   bump_alloc

Functions

size_t sqrt_size_t (size_t n)
void display (sieve_vec const *sieve)
void compute (sieve_vec *sieve)
int main ()

Macro Definition Documentation

◆ ALLOC

#define ALLOC   bump_alloc

Definition at line 22 of file prime_sieve.c.

◆ CAPACITY

#define CAPACITY   300000

Definition at line 16 of file prime_sieve.c.

◆ MAX_UP_TO

#define MAX_UP_TO   100000
Examples
complex/prime_sieve.c.

Definition at line 13 of file prime_sieve.c.

◆ SELF [1/2]

#define SELF   bump_alloc

Definition at line 17 of file prime_sieve.c.

◆ SELF [2/2]

#define SELF   sieve_vec

Definition at line 17 of file prime_sieve.c.

◆ T

#define T   bool

Definition at line 21 of file prime_sieve.c.

Function Documentation

◆ compute()

void compute ( sieve_vec * sieve)
Examples
complex/prime_sieve.c.

Definition at line 68 of file prime_sieve.c.

68 {
69 size_t size = sieve_vec_size(sieve);
70 size_t sqrt = sqrt_size_t(size);
71 printf("Sieve size: %zu, sqrt: %zu\n", size, sqrt);
72 for (size_t factor = 2; factor <= sqrt; factor++) {
73 for (size_t index = factor * 2; index < size; index += factor) {
74 printf("Marking %zu as not prime (factor: %zu)\n", index, factor);
75 *sieve_vec_write(sieve, index) = true;
76 }
77 }
78}
size_t sqrt_size_t(size_t n)
Definition prime_sieve.c:25
static INDEX_TYPE size(SELF const *self)
Definition template.h:207
Here is the call graph for this function:
Here is the caller graph for this function:

◆ display()

void display ( sieve_vec const * sieve)
Examples
complex/prime_sieve.c.

Definition at line 52 of file prime_sieve.c.

52 {
53 sieve_vec_iter_const iter = sieve_vec_get_iter_const(sieve);
54
55 sieve_vec_iter_const_next(&iter); // skip 0
56 sieve_vec_iter_const_next(&iter); // skip 1
57 size_t index = 2;
58
59 bool const* is_not_prime;
60 while ((is_not_prime = sieve_vec_iter_const_next(&iter))) {
61 if (!*is_not_prime) {
62 printf("%zu is prime\n", index);
63 }
64 index++;
65 }
66}
Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 80 of file prime_sieve.c.

80 {
81 size_t up_to = 28;
82 assert(up_to < MAX_UP_TO);
83 printf("Listing primes up to: %zu\n", up_to);
84 bump_alloc alloc = bump_alloc_new();
85 sieve_vec values = sieve_vec_new_with_defaults(up_to, false, &alloc);
86 compute(&values);
87 display(&values);
88 sieve_vec_delete(&values);
89}
void display(sieve_vec const *sieve)
Definition prime_sieve.c:52
void compute(sieve_vec *sieve)
Definition prime_sieve.c:68
#define MAX_UP_TO
Definition prime_sieve.c:13
Here is the call graph for this function:

◆ sqrt_size_t()

size_t sqrt_size_t ( size_t n)
Examples
complex/prime_sieve.c.

Definition at line 25 of file prime_sieve.c.

25 {
26 if (n == 0 || n == 1) {
27 return n;
28 }
29 size_t left = 1;
30 size_t right = n;
31 size_t mid;
32 size_t result = 0;
33 while (left <= right) {
34 mid = left + (right - left) / 2;
35 size_t square = mid * mid;
36
37 if (square == n) {
38 return mid;
39 }
40
41 if (square < n) {
42 result = mid; // Store the last valid result
43 left = mid + 1;
44 } else {
45 right = mid - 1;
46 }
47 }
48
49 return result;
50}
Here is the caller graph for this function: