1 (load("matrixexp.lisp"),0);
7 (xequal(a,b) := block([gcd : 'spmod, algebraic : true],
9 is(fullratsimp(a) = fullratsimp(b)) or
10 is(fullratsimp(rectform(a)) = fullratsimp(rectform(b)))),0);
13 scalarmatrixp : false;
16 (check(mat,n) := block([s, okay, z : gensym(), i : 0, m],
18 s : spectral_rep(mat),
19 okay : xequal(mat - s[1] . s[2] - s[3] , zeromatrix(n,n)),
20 print(i : i + 1, okay),
22 okay : okay and xequal(mat . s[3], s[3] . mat),
23 print(i : i + 1, okay),
25 okay : okay and xequal(s[3]^^n, zeromatrix(n,n)),
26 print(i : i + 1, okay),
28 okay : okay and xequal(matrixfun(lambda([x],1), mat), ident(n)),
29 print(i : i + 1, okay),
31 okay : okay and xequal(matrixfun(lambda([x], 1+x+x^2), mat), ident(n) + mat + mat . mat),
32 print(i : i + 1, okay),
34 okay : okay and xequal(matrixfun(lambda([x], x^2/5), mat), mat . mat / 5),
35 print(i : i + 1, okay),
37 okay : okay and xequal(matrixfun(lambda([x],x^8),mat), mat^^8),
38 print(i : i + 1, okay),
40 m : errcatch(matrixfun(lambda([z],sqrt(z)), mat)),
41 okay : okay and if m = [ ] then member(0, s[1]) else xequal(m[1] . m[1], mat),
42 print(i : i + 1, okay),
44 m : errcatch(matrixfun(lambda([mat], 1/mat^2), mat)),
45 okay : okay and if m = [ ] then member(0, s[1]) else xequal(m[1], mat^^-2),
46 print(i : i + 1, okay),
48 m : fullratsimp(matrixexp(mat,z) . matrixexp(mat, -z)),
49 okay : okay and xequal(m, ident(n)),
50 print(i : i + 1, okay),
53 okay : okay and xequal(diff(m,z) - m . mat, zeromatrix(n,n)),
54 print(i : i + 1, okay),
65 check(matrix([1,0],[0,1]),2);
68 check(matrix([1,0],[0,0]),2);
71 check(matrix([0,0],[0,1]),2);
74 check(matrix([0,1],[1,0]),2);
77 check(matrix([0,1],[-1,0]),2);
80 check(matrix([0,%i],[-%i,0]),2);
83 check(matrix([0,a],[0,b]),2);
86 check(matrix([1,2],[2,1]),2);
89 check(matrix([1,%i],[-%i,1]),2);
92 check(matrix([1,2],[3,1]),2);
95 check(matrix([1,6],[0,1]),2);
98 check(matrix([x,1],[1,1]), 2);
101 check(matrix([sqrt(3), sqrt(2)],[sqrt(2), 9]),2);
104 check(matrix([sqrt(6),1],[1, -9]),2);
107 check(matrix([sqrt(3), sqrt(2)],[sqrt(2), 9]),2);
110 check(matrix([a,b],[c,d]),2);
113 check(matrix([1,0,0],[0,1,0],[0,0,1]),3);
116 check(matrix([1,0,0],[0,1,0],[0,0,-1]),3);
119 check(matrix([1,1,0],[1,1,1],[0,1,1]),3);
122 check(matrix([1,%i,0],[-%i,1,%i],[0,-%i,1]),3);
125 check(matrix([1,2,3],[4,5,6],[7,8,9]),3);
128 check(matrix([1,a,b],[0,1,c],[0,0,2]),3);
131 check(matrix([1,a,b],[0,1,c],[0,0,1]),3);
134 check(matrix([1,a,b],[0,2,c],[0,0,1]),3);
137 check(matrix([2,a,b],[0,2,c],[0,0,1]),3);
140 check(matrix([1,a,b],[0,1,c],[0,0,2]),3);
143 check(matrix([1,0,0],[a,1,0],[b,c,1]),3);
146 check(matrix([1,0,0],[a,%i,0],[b,c,%i]),3);
149 check(matrix([1,0,0],[a,%i,0],[b,c,1]),3);
152 check(matrix([1,0,0],[a,%i,0],[b,c,sqrt(7)]),3);
155 check(matrix([1,0,0],[a,%i,0],[b,c,%i]),3);
158 /* spectral_rep checks its results--so this really does testing.*/
160 (spectral_rep(matrix([x,1,0],[1,1,1],[0,1,1])),0);
164 check(matrix([1,1,0],[1,1,1],[0,1,1]),3);
167 (s : matrix([1,2],[2,3]), 0);
170 (m : s . matrix([1,0],[0,-1]) . s^^-1, 0);
173 xequal(s . matrix([exp(1),0],[0,exp(-1)]) . s^^-1, matrixexp(m));
177 /* Matrices from Gosei Furuya's Jordan form code. */
179 (m : matrix([2,0,0,0,0,0,0,0],
185 [-34,7,1,-2,-1,1,2,0],
186 [145,-17,-16,3,9,-2,0,3]), 0)$
189 xequal(matrixfun(lambda([x],x^2), m), m.m);
193 (m : matrix([2,1,0,0,0,0],
201 xequal(matrixfun(lambda([x],x^2), m), m.m);
209 xequal(matrixfun(lambda([x],1+x^5), m), ident(3)+m^^5);
217 xequal(matrixfun(lambda([x],1+x^5), m), ident(3)+m^^5);
220 (m : matrix([3,1,0,0],
226 xequal(matrixfun(lambda([x],1+x^2), m), ident(4)+m^^2);
229 (m : matrix([2,1,2,0],
235 xequal(matrixfun(lambda([x],1+x^2), m), ident(4)+m^^2);
238 (m : matrix([0,0,1,1,1],
245 xequal(matrixfun(lambda([x],1+x^2), m), ident(5)+m^^2);
253 xequal(matrixfun(lambda([x],1+x^5), m), ident(3)+m^^5);