# Throwaway preliminary check (Stage B). Re-implemented properly in Stage C. def P(n,k): adj={} def add(a,b): adj.setdefault(a,set()).add(b); adj.setdefault(b,set()).add(a) for i in range(n): add(('u',i),('u',(i+1)%n)); add(('u',i),('v',i)); add(('v',i),('v',(i+k)%n)) return adj def closure(adj,S): B=set(S); changed=True while changed: changed=False for x in list(B): w=[y for y in adj[x] if y not in B] if len(w)==1: B.add(w[0]); changed=True return B def forces(adj,S): return len(closure(adj,S))==len(adj) def u(i,n): return ('u',(i-1)%n) # 1-indexed in Rashidi def v(i,n): return ('v',(i-1)%n) def thm21_set(n,k): r,s=divmod(n,k) if s==0: return None return {u(j+i*k,n) for i in range(r) for j in range(1,s+3)}, r*(s+2) def thm22_set(n,k): return {u(j,n) for j in range(1,2*k+3)} def alameda_set(n,k): return {v(j,n) for j in range(1,2*k+1)}|{u(k,n),u(k+1,n)} for k in (2,3,5): print("k=",k) for n in range(2*k+1, 41 if k==5 else 25): adj=P(n,k) t=thm21_set(n,k) a=None if t: A,b=t; a=(len(A),forces(adj,A)) print(f" n={n:2d} thm2.1:{a} thm2.2(2k+2):{forces(adj,thm22_set(n,k))} alameda-type({2*k+2}):{forces(adj,alameda_set(n,k))}")