int operator++() { return find_next_prime(); }
unsigned long get_nearest_prime(unsigned long near) { PRIME_CTX ctx; unsigned long x, y, div, prime; int is_prime; if(init_primes(&ctx)) return 0; prime = 0; if(near < ctx.base_primes[ctx.prime_count -1]) { x=0; while(ctx.base_primes[x] < near) { x++; } if(x==0) { prime = ctx.base_primes[x]; } else if(abs(near - ctx.base_primes[x]) > abs(near - ctx.base_primes[x-1])) { prime = ctx.base_primes[x-1]; } else { prime = ctx.base_primes[x]; } } if(prime) { free_primes(&ctx); return prime; } div=0; if(!(near % 2)) { near++; } /* dealing w/ upper limit of unsinged longs. */ if(near==0xffffffff) { near-=2; } if(sqr(ctx.base_primes[ctx.prime_count -1]) < near) { while(sqr(ctx.base_primes[ctx.prime_count -1]) < near && ctx.base_primes[ctx.prime_count -1] != 65521) { if(find_next_prime(&ctx)) { free_primes(&ctx); return 0; } } div = ctx.prime_count -1; } else { x=0; while(sqr(ctx.base_primes[x]) < near) { x++; } div=x; } for(x=0, is_prime=1; x< div && is_prime; x++) { if(near % ctx.base_primes[x]==0) { is_prime=0; } } if(is_prime) { return near; } y=0; prime=0; while(prime==0) { is_prime=1; y+=2; /*again, dealing w/ upper limit of unsigned longs. */ if(near < 0xffffffff -y) { for(x=0; x <= div && is_prime; x++) { if((near +y) % ctx.base_primes[x]==0) { is_prime=0; } } if(is_prime) { prime = near +y; } } if(prime==0) { is_prime=1; for(x=0; x <= div && is_prime; x++) { if((near -y) % ctx.base_primes[x]==0) { is_prime=0; } } if(is_prime) { prime = near -y; } } } free_primes(&ctx); return prime; }