Ejemplo n.º 1
0
int main(int args, char **argv) {
    size_t bitset_size = 1 << (30 - 5);
    uint64_t max_prime = bitset_size << 5;

    fprintf(stderr, "Upper limit: %d\n", max_prime);

    bitset bits;
    bits.size = bitset_size;
    bits.elements = calloc(sizeof(unsigned int), bits.size);

    // Set all multiples of two to be non-primes and the rest
    // to be primes
    memset(bits.elements, 2 + 8 + 32 + 128, bits.size * sizeof(unsigned int));

    bitset *primes = &bits;
    bitset_unset(primes, 1);
    bitset_set(primes, 2);

    uint64_t p = 3;

    while (p < max_prime) {
        // Filter out all multiples of p
        for (uint32_t i = p + p; i < max_prime; i += p) {
            bitset_unset(primes, i);
        }

        // Find next number to filter out
        do {
            p += 2;
        } while (p < max_prime && !bitset_isset(primes, p));
    }

    // Write to file
    /*
    FILE *fp = fopen("test2.raw", "w");

    for (p = 2; p < max_prime; p++) {
      if (bitset_isset(primes, p)) {
        writeVarint64(p, fp);
      }
    }

    fflush(fp);
    fclose(fp);
    fprintf(stderr, "wrote varints\n");
    */

    FILE *fp = fopen("primes.bin", "w");
    fwrite(bits.elements, sizeof(unsigned int), bits.size, fp);
    fflush(fp);
    fclose(fp);

    fprintf(stderr, "Largest prime: %d\n", p - 2);
    fprintf(stderr, "Wrote bitset: primes.bin\n");
    free(bits.elements);
}
Ejemplo n.º 2
0
Archivo: bitset.c Proyecto: o11c/nicate
void char_bitset_unset(CharBitSet *b, unsigned char i)
{
    bitset_unset((BitSet *)b, i);
}