Photolog

Through the Looking-Glass
2010-10-12: Through the Looking-Glass
My radio speaks is binary!
2010-10-10: My radio speaks is binary!
Gigaminx: (present for my birthday)
2010-09-16: Gigaminx: (present for my birthday)
Trini on bike
2010-09-05: Trini on bike
Valporquero
2010-08-28: Valporquero
My new bike!
2010-08-22: My new bike!
Mario and Ana's wedding
2010-08-13: Mario and Ana's wedding
Canyoning in Guara
2010-08-07: Canyoning in Guara
Trini and Mari in Marbella
2010-08-05: Trini and Mari in Marbella
Trini and Chelo in Tabarca
2010-08-03: Trini and Chelo in Tabarca
Valid XHTML 1.1
Log in
Back to list of problems

Goldbach's Conjecture (II)

686.c

/* Goldbach's Conjecture */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int num_primes=0;
int * list_primes=NULL;

int primes_to_n(int n)
{
	int *t, i,j,k;

	if (n<2) {
		return 0;
	}
	if (num_primes) if (n<=list_primes[num_primes-1]) {
		for(i=0; i<num_primes; i++) {
			if (list_primes[i]>n) {
				return i;
			}
		}
		return i;
	}
	t = list_primes = realloc(list_primes, n*sizeof(int));
	if (num_primes==0) {
		t[0]=2;
		num_primes=1;
	}

	i = num_primes-1;
	k = (t[i]+1) | 1;
	while(k<=n) {
		for(j=1; j<i; j++) {
			div_t d = div(k,t[j]);
			if (d.rem==0) {
				break;
			} else if (d.quot < t[j]) {
				j=i;
				break;
			}
		}
		if (j>=i) {
			t[++i] = k;
		}
		k += 2;
	}
	return (num_primes = i+1);
}

int trial_division(int n, int B)
{
	int i,k = primes_to_n(B);

	for(i=0; i<k; i++) {
		if (n%list_primes[i] == 0) {
			return 0;
		}
	}
	return 1;
}

int is_prime(int n)
{
	return trial_division(n, sqrt(n));
}

int main(void)
{
	int i,num;
	int N;

	while(1) {
		scanf("%d", &num);
		if (num==0) {
			exit(0);
		}
		if (num==4) {
			printf("1\n");
			continue;
		}
		N=0;
		for(i=3; i<=num/2; i++) {
			if (is_prime(i) && is_prime(num-i)) {
				N++;
			}
		}
		printf("%d\n", N);
	}
	exit(0);
}