Derive-C
Loading...
Searching...
No Matches
prime_sieve.c File Reference
#include <errno.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <derive-c/macros/iterators.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 SELF   sieve_vec
 
#define T   bool
 

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

◆ SELF

#define SELF   sieve_vec

Definition at line 14 of file prime_sieve.c.

◆ T

#define T   bool

Definition at line 15 of file prime_sieve.c.

Function Documentation

◆ compute()

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

Definition at line 52 of file prime_sieve.c.

52 {
53 size_t size = sieve_vec_size(sieve);
54 size_t sqrt = sqrt_size_t(size);
55
56 for (size_t factor = 2; factor < sqrt; factor++) {
57 for (size_t index = factor * 2; index < size; index += factor) {
58 *sieve_vec_write(sieve, index) = true;
59 }
60 }
61}
static INDEX_TYPE size(SELF const *self)
Definition template.h:194
size_t sqrt_size_t(size_t n)
Definition prime_sieve.c:18
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 40 of file prime_sieve.c.

40 {
41 sieve_vec_iter_const iter = sieve_vec_get_iter_const(sieve);
42 sieve_vec_iter_const_next(&iter); // skip 0
43 sieve_vec_iter_const_next(&iter); // skip 1
44
45 ITER_ENUMERATE_LOOP(sieve_vec_iter_const, iter, bool const*, is_not_prime, size_t, index) {
46 if (!*is_not_prime) {
47 printf("%zu is prime\n", sieve_vec_iter_const_position(&iter) - 1);
48 }
49 }
50}
#define ITER_ENUMERATE_LOOP(ITER_TYPE, ITER_NAME, VALUE_TYPE, VALUE_NAME, COUNTER_TYPE, COUNTER_NAME)
Definition iterators.h:7
Here is the caller graph for this function:

◆ main()

int main ( )

Definition at line 63 of file prime_sieve.c.

63 {
64 size_t up_to = 23;
65 printf("Listing primes up to: %zu\n", up_to);
66
67 sieve_vec values = sieve_vec_new_with_defaults(up_to, false);
68 compute(&values);
69 display(&values);
70 sieve_vec_delete(&values);
71
72 return 0;
73}
void display(sieve_vec const *sieve)
Definition prime_sieve.c:40
void compute(sieve_vec *sieve)
Definition prime_sieve.c:52
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 18 of file prime_sieve.c.

18 {
19 if (n == 0 || n == 1) {
20 return n;
21 }
22 size_t left = 1, right = n, mid, result = 0;
23 while (left <= right) {
24 mid = left + (right - left) / 2;
25 size_t square = mid * mid;
26
27 if (square == n) {
28 return mid;
29 } else if (square < n) {
30 result = mid; // Store the last valid result
31 left = mid + 1;
32 } else {
33 right = mid - 1;
34 }
35 }
36
37 return result;
38}
Here is the caller graph for this function: