Skip to content

Instantly share code, notes, and snippets.

@andlima
Created October 1, 2011 21:46
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/1256694 to your computer and use it in GitHub Desktop.
Save andlima/1256694 to your computer and use it in GitHub Desktop.
Inverse Sieve of Eratosthenes in C
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long long int t_item;
#define BITS sizeof(t_item)
void init(t_item *bitset, int maximum) {
int p = maximum / BITS;
int i;
for (i = 0; i <= p; i++) {
bitset[i] = 0;
}
}
t_item does_not_contain(t_item *bitset, int i) {
return !(bitset[i / BITS] & (1LL << (i % BITS)));
}
void add(t_item *bitset, int i) {
bitset[i / BITS] |= (1LL << (i % BITS));
}
void primes(t_item *non_primes_bitset, int maximum) {
int m, km;
init(non_primes_bitset, maximum);
add(non_primes_bitset, 1);
for (km = 4; km <= maximum; km += 2) {
add(non_primes_bitset, km);
}
for (m = 3; m <= maximum; m += 2) {
if (does_not_contain(non_primes_bitset, m)) {
for (km = 2 * m; km <= maximum; km += m) {
add(non_primes_bitset, km);
}
}
}
}
int main(void) {
int maximum = 100;
t_item *non_primes_bitset = (t_item *)malloc(maximum + BITS);
primes(non_primes_bitset, maximum);
int n;
for (n = 1; n <= maximum; n++) {
if (does_not_contain(non_primes_bitset, n)) {
printf("%d\n", n);
}
}
free(non_primes_bitset);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment