# Root-set bookkeeping in the section on even orthogonal descent in characteristic two (type B_m), checked for a range of m, r, n. from itertools import product def pos_roots(m): R=[] for i in range(m): v=[0]*m; v[i]=1; R.append(tuple(v)) # e_i for j in range(i+1,m): a=[0]*m; a[i]=1; a[j]=-1; R.append(tuple(a)) # e_i-e_j b=[0]*m; b[i]=1; b[j]=1; R.append(tuple(b)) # e_i+e_j return set(R) def all_roots(m): P=pos_roots(m); return P|{tuple(-x for x in r) for r in P} def e(m,*idx): v=[0]*m for s,i in idx: v[i-1]+=s return tuple(v) def closed(S,m): A=all_roots(m) for a in S: for b in S: c=tuple(x+y for x,y in zip(a,b)) if c in A and c not in S: return (a,b,c) return True # ---------- Lemma on row iteration (label fl:lem:char2-row-iteration), step 5 ---------- def chain(m,r): # roots of U_{chain,r}; r=m-1 means U_last^0 S=pos_roots(m)-{e(m,(1,m))} if re_i (ie_{i+1} (r<=i<=m-2), e_{m-1}->-e_m, e_m->e_r out=[0]*m for i in range(1,m+1): c=v[i-1] if c==0: continue if i0} delta=e(m,(1,Bj(1)),(-1,A(1))) if S!=Upos-{delta}: ok=False; details.append(('step 3 mismatch',n,sorted(S-Upos),sorted(Upos-S))) if min(weight(v) for v in Upos)<2: ok=False; details.append(('weight <2',n)) # cross roots as stated in step 2 cross_f={e(m,(1,A(i)),(-1,Bj(j))) for i in range(1,n) for j in range(1,n+1) if j>i+1} cross_r={e(m,(1,Bj(j)),(-1,A(i))) for i in range(2,n) for j in range(1,i+1)} allcross={v for v in S if sorted(abs(x) for x in v)[-2:]==[1,1] and sum(v)==0 and ((max(k for k,x in enumerate(v) if x)>=n-1) != (min(k for k,x in enumerate(v) if x)>=n-1)) and v[m-1]==0} if allcross!=cross_f|cross_r: ok=False; details.append(('cross roots',n,sorted(allcross^(cross_f|cross_r)))) print('direct generic descent, steps 1-3: exchanges, closure, kernel of delta in U_{>0}, 2<=n<=7 :',ok) for d in details[:12]: print(' ',d)