from research import *
s=begin(594,'Derive grid translation and carrier laws','Which operations commute, and why do companion rails converge?',{'rows':49,'carriers':[70,72],'civil_translation':110},['File68 Appendix C; C593'])
gap=[(49-j)*2 for j in range(50)];ok=[]
for g in [70,72]:
 for j in range(49):
  a=65-(49-j)*g-110;ok.append((a+110)+g==(a+g)+110)
finish(s,{'BC_carrier_gaps':gap,'commutation_instances':len(ok),'gap_law':'2(49−j)'},'Row progression and fixed civil translation commute. Carrier substitution preserves row incidence and common terminal while its metric displacement shrinks from98 to0 according to remaining count. The terminal convergence is generated, not an independent target.','Check how the fixed-coordinate Cainan attribution overlay changes names.',{'commutation':all(ok),'convergence':gap[0]==98 and gap[-1]==0,'step':all(a-b==2 for a,b in zip(gap,gap[1:]))})
