int main(int argc, char *argv[]) { /* printf("Argument count: %d\n", argc); for (int i = 0; i < argc; i++) { printf("Argument vector values:%s at %p memory\n", argv[i], argv[i]); for (char *j=argv[i]; *j!='\0'; j++) { printf("Another way to print argument vector values: " "%c at %p memory\n", *j, j); } } */ bool flag[N]; memset(flag,1,N*sizeof(bool)); flag[0] = 0; flag[1] = 0; int prime = 2; while (prime < N) { crossOff(flag,prime); prime = nextPrime(flag,prime); } printPrimes(flag); return 0; }
void std::vector<bool> sieveOfEratosthenes(int max) { std::vector<bool> flags(max + 1); init(flags); int prime = 2; while (prime <= sqrt(max)) { crossOff(flags, prime); prime = getNextPrime(flags, prime); } return flags; }
/// Cross-off the multiples of big sieving primes /// from the sieve array. /// void EratBig::crossOff(byte_t* sieve) { // process the buckets in lists_[0] which hold the sieving primes // that have multiple(s) in the current segment while (lists_[0]->hasNext() || !lists_[0]->empty()) { Bucket* bucket = lists_[0]; lists_[0] = NULL; pushBucket(0); do { crossOff(sieve, bucket->begin(), bucket->end()); Bucket* processed = bucket; bucket = bucket->next(); processed->reset(); moveBucket(*processed, stock_); } while (bucket); } // move the list corresponding to the next segment // i.e. lists_[1] to lists_[0] ... std::rotate(lists_.begin(), lists_.begin() + 1, lists_.end()); }
/// Cross-off the multiples of small sieving /// primes from the sieve array. /// void EratSmall::crossOff(byte_t* sieve, byte_t* sieveLimit) { for (BucketIterator_t iter = buckets_.begin(); iter != buckets_.end(); ++iter) crossOff(sieve, sieveLimit, *iter); }
/// Cross-off the multiples of medium sieving /// primes from the sieve array. /// void EratMedium::crossOff(byte_t* sieve, uint_t sieveSize) { for (BucketIterator_t iter = buckets_.begin(); iter != buckets_.end(); ++iter) crossOff(sieve, sieveSize, *iter); }