Skip to content

Instantly share code, notes, and snippets.

@andlima
Created October 1, 2011 21:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andlima/1256699 to your computer and use it in GitHub Desktop.
Save andlima/1256699 to your computer and use it in GitHub Desktop.
Sieve of Eratosthenes in C
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long long int t_item;
static t_item all_true = ~0LL;
#define BITS sizeof(t_item)
void init_with_true(t_item *bitset, int maximum) {
int p = maximum / BITS;
int i;
for (i = 0; i <= p; i++) {
bitset[i] = all_true;
}
}
t_item contains(t_item *bitset, int i) {
return !!(bitset[i / BITS] & (1LL << (i % BITS)));
}
void discard(t_item *bitset, int i) {
bitset[i / BITS] &= ~(1LL << (i % BITS));
}
void primes(t_item *primes_bitset, int maximum) {
int m, km;
init_with_true(primes_bitset, maximum);
discard(primes_bitset, 1);
for (km = 4; km <= maximum; km += 2) {
discard(primes_bitset, km);
}
for (m = 3; m <= maximum; m += 2) {
if (contains(primes_bitset, m)) {
for (km = 2 * m; km <= maximum; km += m) {
discard(primes_bitset, km);
}
}
}
}
int main(void) {
int maximum = 100;
t_item *primes_bitset = (t_item *)malloc(maximum + BITS);
primes(primes_bitset, maximum);
int n;
for (n = 1; n <= maximum; n++) {
if (contains(primes_bitset, n)) {
printf("%d\n", n);
}
}
free(primes_bitset);
return 0;
}
@mpereira
Copy link

mpereira commented Oct 1, 2011

Now we're talking. Bit twiddling and everything. Now you need to turn this into a node.js module.

@andlima
Copy link
Author

andlima commented Oct 1, 2011

I will leave this as an exercise for the reader.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment