diff --git a/Number Theory/segmented_sieve.cpp b/Number Theory/segmented_sieve.cpp new file mode 100644 index 0000000..0e8910a --- /dev/null +++ b/Number Theory/segmented_sieve.cpp @@ -0,0 +1,49 @@ +#define MAX_N 33000 +bool is_prime[MAX_N]; + +bool is_sieve_eval = false; + +void sieve_erathosis(){ + if( is_sieve_eval ) return; + is_sieve_eval = true; + memset(is_prime,false,sizeof(is_prime)); + is_prime[0] = true , is_prime[1] = true; + for(int num = 2 ; num*num < MAX_N ; num++ ){ + if( !is_prime[num] ){ + for(int val = num*num ; val < MAX_N ; val += num ){ + is_prime[val] = true; + } + } + } +} + +vector seg_prime; + +void segmented_sieve(int m,int n){ + + seg_prime.resize(n-m+1,false); + + if( m == 1 ){ + seg_prime[0] = true; + } + + int sz = ceil(sqrt(n)); + + int factor = 0; + for(int i = 2 ; i < sz ; i++ ){ + if( !is_prime[i]){ + factor = ceil((1.0*m)/i); + for(int num = (factor==1?2:factor) * i ; num < n + 1 ; num += i ){ + seg_prime[num-m] = true; + } + } + } + + for(int i = 0 ; i < n-m+1 ; i++ ){ + if( !seg_prime[i] ) + cout << i+m << '\n'; + } + cout << '\n'; + + seg_prime.clear(); +}