[plt-scheme] Matrix Determinants
Dear Henk,
A somewhat obscure approach to the determinant that might give you the
sort of elegant code you desire involves the wedge product and
multi-vectors.
A vector v = (a1, ..., an) = a1*e1 + ... + an*en, where ei is the ith
basis vector.
A multi-vector m = a1*E1 + ... + an*En, where Ei is a wedge product of
basis vectors. ie E = ei1^...^eik, where E is in normal form if there are
no repetitions, and the subscripts are in ascending order. This product
has the following properties for products of basis vectors.
ei1^(ei2^E) = (ei1^ei2)^E = -(ei2^ei1)^E, so
(ei1^ei1)^E = 0
IE the wedge product is associative, and anticommutative.
The wedge product is distributive; hence to extend the product to
multi-vectors, it is only necessary to define what happens on scaled Es.
(a*Ei)^(b*Ej) = (a*b)*(Ei^Ej)
We can also extend the dot product to multi-vectors.
(a*Ei).(b*Ej) = a*b if Ei = Ej, otherwise 0
Now the determinant of a matrix M = [v1, ..., vn], where each vi is an
n-dimensional vector can be defined as follows.
Det M = Det [v1, ..., vn] = (v1^...^vn).(e1^...^en)
This formulation seems particularly simple to my eye.
Example:
Det [(1, 3), (2, 4)] =
((1*e1 + 3*e2)^(2*e1+4*e2)).(e1^e2)=
(e1^(2*e1+4*e2) + 3*e2^(2*e1+4*e2)).(e1^e2)=
(4*(e1^e2) + 6*(e2^e1)).(e1^e2)=
(4*(e1^e2) + -6*(e1^e2)).(e1^e2)=
(-2*(e1^e2)).(e1^e2)=
-2
-Arthur