# SCRIPT: BH_NONCOMMUTE_CHECK from fractions import Fraction as F W=[F(1,2),F(3,10),F(1,5)] T=[[F(2),F(1,5),F(0)],[F(1,5),F(1),F(0)],[F(0),F(0),F(13,10)]] def mm(a,b): return [[sum(a[i][k]*b[k][j] for k in range(3)) for j in range(3)] for i in range(3)] def tr(a): return sum(a[i][i] for i in range(3)) G=[[W[i] if i==j else F(0) for j in range(3)] for i in range(3)] def A(H): TH=mm(T,H); HT=mm(H,T); c=2*tr(TH) return [[TH[i][j]+HT[i][j]-c*G[i][j] for j in range(3)] for i in range(3)] def g(H,K): return F(1,2)*sum(H[i][j]*K[i][j]/(W[i]+W[j]) for i in range(3) for j in range(3)) H=[[F(1),0,0],[0,F(-1),0],[0,0,F(0)]] K=[[0,F(1),0],[F(1),0,0],[0,0,0]] print('g(AH,K)=',g(A(H),K),' g(H,AK)=',g(H,A(K))) # commuting control: diagonal T T=[[F(2),0,0],[0,F(1),0],[0,0,F(13,10)]] print('diag T control: g(AH,K)=',g(A(H),K),' g(H,AK)=',g(H,A(K)))