"""Lemma 22.4 (interleaving two chains): simulate the sequence of exchanges and check every hypothesis.""" import sys; import os; sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) from exchange_checker import State def run(r,d): b=r-d; N=r+b A=lambda i:i-1; B=lambda j:r+j-1 def rt(a,c): v=[0]*N; v[a]=1; v[c]=-1; return tuple(v) is_root=lambda v: sorted(v)==[-1]+[0]*(N-2)+[1] S=set(); chi=set() for i in range(1,r+1): for k in range(i+1,r+1): S.add(rt(A(i),A(k))) for j in range(1,b+1): for k in range(j+1,b+1): S.add(rt(B(j),B(k))) for i in range(1,r): for j in range(1,b+1): S.add(rt(A(i),B(j))) for i in range(1,r): chi.add(rt(A(i),A(i+1))) for j in range(1,b): chi.add(rt(B(j),B(j+1))) st=State(S,chi,is_root) for i in range(r-1,0,-1): for j in range(1,i-d+1): if j>b: st.log.append('j out of range') st.exchange(rt(A(i),B(j)),rt(B(j),A(i+1)),f'({i},{j})') cross=set(v for v in st.S if any(v[A(i)] for i in range(1,r+1)) and any(v[B(j)] for j in range(1,b+1))) exp=set() for i in range(1,r): for j in range(1,b+1): if j>i-d: exp.add(rt(A(i),B(j))) for i in range(2,r+1): for j in range(1,b+1): if j=1: run(r,d)