Beispiel #1
0
	int operator++()
	{
		return find_next_prime();
	}
Beispiel #2
0
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;
}