algebrite
Version:
Computer Algebra System in Coffeescript
218 lines (149 loc) • 3.65 kB
text/coffeescript
test_inner = ->
run_test [
# since we don't know anything about
# a and b, we have to leave this unevaluated
# turning this into a normal multiplication (which is
# commutative) would not be OK
"inner(a,b)",
"inner(a,b)",
# this shouldn't ever go wrong
# but one never knows
"inner(b,a)",
"inner(b,a)",
"inner(2,a)",
"2*a",
"inner(a,2)",
"2*a",
"inner(a,[b1,b2])",
"inner(a,[b1,b2])",
"inner([a1,a2],b)",
"inner([a1,a2],b)",
"inner(2,[b1,b2])",
"[2*b1,2*b2]",
"inner([b1,b2],2)",
"[2*b1,2*b2]",
"inner([[a11,a12],[a21,a22]],[x1,x2])",
"[a11*x1+a12*x2,a21*x1+a22*x2]",
"inner([1,2],[3,4])",
"11",
# non-invertible matrix
"inner([[2,2],[2,2]],[[0],[1]])",
"[[2],[2]]",
"inner(inner([1,2],[[3,4],[5,6]]),[7,8])",
"219",
"inner([1,2],inner([[3,4],[5,6]],[7,8]))",
"219",
"inner([1,2],[[3,4],[5,6]],[7,8])",
"219",
"inner(c,a1+b1)",
"inner(c,a1)+inner(c,b1)",
"inner(b1+c1,a)",
"inner(b1,a)+inner(c1,a)",
"inner(inner(a,b),c)",
"inner(a,inner(b,c))",
"inner(inner(a,b),c) - inner(a,inner(b,c))",
"0",
"inner(inner(a,b),c,d) - inner(a,b,inner(c,d))",
"0",
# trying some associativity and distributivity together
"inner(inner(a,b),c,d+f) - ( (inner(a,inner(b,c),d)) + inner(inner(a,b),c,f) )",
"0",
# bring it to a canonical form
# using associativity
"inner(a,b,c)",
"inner(a,inner(b,c))",
"inner(a,b+c,d)",
"inner(a,inner(b,d))+inner(a,inner(c,d))",
"inner(inner(a,b),inner(c,d))",
"inner(a,inner(b,inner(c,d)))",
# scalar product of vectors:
"inner([a, b, c], [x, y, z])",
"a*x+b*y+c*z",
# products of matrices and vectors:
"inner([[a, b], [c,d]], [x, y])",
"[a*x+b*y,c*x+d*y]",
"inner([x, y], [[a, b], [c,d]])",
"[a*x+c*y,b*x+d*y]",
"inner([x, y], [[a, b], [c,d]], [r, s])",
"a*r*x+b*s*x+c*r*y+d*s*y",
# matrix product:
"inner([[a,b],[c,d]],[[r,s],[t,u]])",
"[[a*r+b*t,a*s+b*u],[c*r+d*t,c*s+d*u]]",
# ---------------------------------------
# using the dot
# ---------------------------------------
"a·b",
"inner(a,b)",
"a·b·c",
"inner(a,inner(b,c))",
"a·b*c",
"c*inner(a,b)",
# note how we use associativity to bring it all
# to a canonical form
"((a·b)·c)·d",
"inner(a,inner(b,inner(c,d)))",
"a*b·c",
"a*inner(b,c)",
"2*a·b",
"2*inner(a,b)",
"inv(a)·a",
"I",
"a·inv(a)",
"I",
"b·a·inv(a)·c",
"inner(b,c)",
"b·aᵀ·inv(aᵀ)·c",
"inner(b,c)",
"b·inv(aᵀ)·aᵀ·c",
"inner(b,c)",
"b·inv((a+b)ᵀ)·(b+a)ᵀ·c",
"inner(b,c)",
"(-a)·(-b)",
"inner(a,b)",
"I·I",
"I",
"I·Iᵀ",
"I",
"(-I)·(-I)",
"I",
"(-Iᵀ)·(-I)",
"I",
"c·(b+a)ᵀ·inv((a+b)ᵀ)·d",
"inner(c,d)",
"c·inv((b+a)ᵀ)·(a+b)ᵀ·d",
"inner(c,d)",
"c·(b+a)ᵀ·inv((a+b)ᵀ)·inv(c)",
"I",
"c·inv((b+a)ᵀ)·(a+b)ᵀ·inv(c)",
"I",
"inv(c)·(b+a)ᵀ·inv((a+b)ᵀ)·c",
"I",
"inv(c)·inv((b+a)ᵀ)·(a+b)ᵀ·c",
"I",
"c·d·(b+a)ᵀ·inv((a+b)ᵀ)",
"inner(c,d)",
"d·(b+a)ᵀ·inv((a+b)ᵀ)",
"d",
"(b+a)ᵀ·inv((a+b)ᵀ)",
"I",
"c·d·(b+a)ᵀ·inv((a+b)ᵀ)·inv(d)",
"c",
"c·d·(b+a)ᵀ·inv((a+b)ᵀ)·inv(d)·inv(c)",
"I",
"c·d·(b+a)ᵀ·inv((a+b)ᵀ)·inv(c·d)",
"I",
"c·d·(a+b)ᵀ·inv(c·d·(b+a)ᵀ)",
"I",
"inv(c)·c",
"I",
"inv(c·a)·c·a",
"I",
"inv(c·b·a)·c·b·a",
"I",
"inv(c)·d·(a+b)ᵀ·inv(inv(c)·d·(b+a)ᵀ)",
"I",
"inv(c+f)·d·(a+b)ᵀ·inv(inv(f+c)·d·(b+a)ᵀ)",
"I",
"c·d·inv(a)·inv(c·d·inv(a))",
"I",
]