Skip to content

Instantly share code, notes, and snippets.

@larsbratholm
Created March 14, 2017 14:05
Show Gist options
  • Save larsbratholm/55ac05a2f1b4409938cc8e777ee887ed to your computer and use it in GitHub Desktop.
Save larsbratholm/55ac05a2f1b4409938cc8e777ee887ed to your computer and use it in GitHub Desktop.
Bruteforce matrix function relationships
from sympy import *
import itertools
def M(a, f1, f2, f3, f4):
a1, a2, a3, a4 = a.values()
M1 = f1 * Matrix([[0,-a3, a2,0],[a3, 0, -a1,0],[-a2, a1, 0,0],[0,0,0,0]])
M2 = f2 * Matrix([[0,0, 0,0],[0, 0, 0,0],[0, 0, 0,0],[a1,a2,a3,0]])
M3 = f3 * Matrix([[0,0, 0,a1],[0, 0, 0,a2],[0, 0, 0,a3],[0,0,0,0]])
M4 = f4 * a4 * eye(4)
return f1*M1 + f2*M2 + f3*M3 + f4*M4
def W(a):
return M(a, -1,-1,1,1)
def Q(a):
return M(a, 1,-1,1,1)
def U(a):
return M(a, -1,1,1,-1)
def get_properties(expr,a,b):
Z = zeros(4)
it = list(itertools.product([-1,1],repeat=4))
Ma = [M(a,i,j,k,l) for i,j,k,l in it]
Mb = [M(b,i,j,k,l) for i,j,k,l in it]
for f, F in enumerate(Ma):
for g, G in enumerate(Mb):
diff1 = expr - F*G
diff2 = expr - F*G.T
diff3 = expr - F.T*G
diff4 = expr - F.T*G.T
if diff1.equals(Z) or diff2.equals(Z) or diff3.equals(Z) or diff4.equals(Z):
i,j,k,l = it[f]
I,J,K,L = it[g]
if (i,j,k,l) == (-1,-1,1,1):
print "W",
elif (i,j,k,l) == (1,-1,1,1):
print "Q",
elif (i,j,k,l) == (-1,1,1,-1):
print "U",
else:
print (i,j,k,l),
if (I,J,K,L) == (-1,-1,1,1):
print "W",
elif (I,J,K,L) == (1,-1,1,1):
print "Q",
elif (I,J,K,L) == (-1,1,1,-1):
print "U",
else:
print (I,J,K,L)
if diff1.equals(Z):
print 1
if diff2.equals(Z):
print 2
if diff3.equals(Z):
print 3
if diff4.equals(Z):
print 4
a1, a2, a3, a4, b1, b2, b3, b4 = symbols('a1 a2 a3 a4 b1 b2 b3 b4')
a = Matrix([[a1,a2,a3,a4]]).T
b = Matrix([[b1,b2,b3,b4]]).T
for f1 in "Q","W","U":
if f1 == "Q":
A1 = Q
elif f1 == "W":
A1 = W
else:
A1 = U
for f2 in "Q","W","U":
if f2 == "Q":
B1 = Q
elif f2 == "W":
B1 = W
else:
B1 = U
for t1 in True,False:
for t2 in True,False:
for e1, e2 in ["aa","ab","ba"]:
if e1 == "a":
A2 = A1(a)
else:
A2 = A1(b)
if e2 == "a":
B2 = B1(a)
else:
B2 = B1(b)
if t1:
A3 = A2.T
else:
A3 = A2
if t2:
B3 = B2.T
else:
B3 = B2
print f1, f2, t1, t2, e1, e2
get_properties(A3*B3, a, b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment