A nice analogy
Posted in Links, Robin on January 6th, 2010 by Robin – Be the first to commentThe Anatomy of Integers and Permutations.
The best part is – they even made it into a screen play.
Matrices in Haskell II
Posted in Robin on December 14th, 2009 by Robin – Be the first to commentWhat’s the use of a matrix if you can’t find its characteristic polynomial? So, a very primitive haskell type for polynomials:
import MyPermutations
import MyMatrices
type Polynomial = [Int]
polySum :: Polynomial -> Polynomial -> Polynomial
polySum p q = if (length p >= length q)
then zipWith (+) p (q ++ [0,0..])
else zipWith (+) q (p ++ [0,0..])
polyProduct :: Polynomial -> Polynomial -> Polynomial
polyProduct p q = map (polyProduct' p q) [0..((length p) + (length q) - 2)]
polyProduct' :: Polynomial -> Polynomial -> Int -> Int
polyProduct' p q k = sum [ ((p++[0,0..])!!i) * ((q++[0,0..])!!(k-i)) |
i <- [0..k] ]
.Its not too much effort to generalize matrices with integer entries to matrices with polynomial entries:
type MatrixPoly = [[Polynomial]]
polyMatTranspose :: MatrixPoly -> MatrixPoly
polyMatTranspose ([]:xs) = []
polyMatTranspose xs = (map head xs):(polyMatTranspose (map tail xs))
polyMatProduct :: MatrixPoly -> MatrixPoly -> MatrixPoly
polyMatProduct m1 m2 = polyMatProduct' m1 (polyMatTranspose m2)
polyMatProduct' :: MatrixPoly -> MatrixPoly -> MatrixPoly
polyMatProduct' [] m = []
polyMatProduct' (r:rs) m = (polyFindRow' r m):(polyMatProduct' rs m)
polyFindRow' :: [Polynomial] -> MatrixPoly -> [Polynomial]
polyFindRow' r m = map (foldr (polySum) [0]) (map (zipWith (polyProduct) r) m)
polyDeterminant :: MatrixPoly -> Polynomial
polyDeterminant m = foldr (polySum) [0] (map (polyDetTerm m)
(allPermutedLists (length m)))
polyDetTerm :: MatrixPoly -> PermutedList -> Polynomial
polyDetTerm m p = map (\x -> (-1)^(sign p) * x) (polyDetTerm' m p)
polyDetTerm' :: MatrixPoly -> PermutedList -> Polynomial
polyDetTerm' _ [] = [1]
polyDetTerm' (m:ms) (p:ps) = polyProduct (m!!(p-1)) (polyDetTerm' ms ps)
polyMinor :: MatrixPoly -> [Int] -> [Int] -> MatrixPoly
polyMinor m rows cols = [ [ (m!!(i-1))!!(j-1) | j <- cols ] | i <- rows ]
almostPolyMatInverse :: MatrixPoly -> MatrixPoly
almostPolyMatInverse m = [ [ polyDeterminant $ polyMinor m (foo n i) (foo n j)
| i <- [1..n] ] | j <- [1..n]]
where n = length m
.Finally:
charpoly :: Matrix -> Polynomial
charpoly m = polyDeterminant $ matPolyAdd (matToPolyMat m)
(diagonalPolyMat (take (length m) (repeat [0,-1])))
matToPolyMat :: Matrix -> MatrixPoly
matToPolyMat = map (map (\x -> [x]))
matPolyAdd :: MatrixPoly -> MatrixPoly -> MatrixPoly
matPolyAdd = zipWith (zipWith (polySum))
diagonalPolyMat :: [Polynomial] -> MatrixPoly
diagonalPolyMat xs = diagonalPolyMat' (length xs) 1 xs
diagonalPolyMat' :: Int -> Int -> [Polynomial] -> MatrixPoly
diagonalPolyMat' _ _ [] = []
diagonalPolyMat' n k (x:xs) = ((take (k-1) (repeat [0])) ++ [x]
++ (take (n-k) (repeat [0]))):(diagonalPolyMat' n (k+1) xs)
.Matrices in Haskell I
Posted in Robin on December 14th, 2009 by Robin – Be the first to commentFirst thoughts on how to implement basic matrix funcitonality in haskell:
import MyPermutations
import Data.List
type Matrix = [[Int]]
matTranspose :: Matrix -> Matrix
matTranspose ([]:xs) = []
matTranspose xs = (map head xs):(matTranspose (map tail xs))
matProduct :: Matrix -> Matrix -> Matrix
matProduct m1 m2 = matProduct' m1 (matTranspose m2)
matProduct' :: Matrix -> Matrix -> Matrix
matProduct' [] m = []
matProduct' (r:rs) m = (findRow' r m):(matProduct' rs m)
findRow' :: [Int] -> Matrix -> [Int]
findRow' r m = map (foldr (+) 0) (map (zipWith (*) r) m)
determinant :: Matrix -> Int
determinant m = foldr (+) 0 (map (detTerm m) (allPermutedLists (length m)))
sign :: PermutedList -> Int
sign [] = 0
sign (x:xs) = (inversions' x xs) + (sign xs)
inversions' :: Int -> [Int] -> Int
inversions' k xs = length $ filter (\x -> (x < k)) xs
detTerm :: Matrix -> PermutedList -> Int
detTerm m p = (-1)^(sign p) * (detTerm' m p)
detTerm' :: Matrix -> PermutedList -> Int
detTerm' _ [] = 1
detTerm' (m:ms) (p:ps) = m!!(p-1) * (detTerm' ms ps)
minor :: Matrix -> [Int] -> [Int] -> Matrix
minor m rows cols = [ [ (m!!(i-1))!!(j-1) | j <- cols ] | i <- rows ]
almostMatInverse :: Matrix -> Matrix
almostMatInverse m = [ [ determinant $ minor m (foo n i) (foo n j) |
i <- [1..n] ] | j <- [1..n]]
where n = length m
foo :: Int -> Int -> [Int]
foo n k = delete k [1..n]
.Coloured Permutations in GAP II
Posted in Robin on December 13th, 2009 by Robin – Be the first to commentLets introduce a third internal representation of a coloured permutation as a pair:
[sigma, colourvector] .
where sigma is a vanilla permutation, and colourvector is a list of colours.
Coloured permutation matrices are always monomial matrices
gap> A := ColouredMatrix((1,2,3,4),[E(3),1,E(3)^2,E(3)]); [ [ 0, 1, 0, 0 ], [ 0, 0, E(3)^2, 0 ], [ 0, 0, 0, E(3) ], [ E(3), 0, 0, 0 ] ] gap> IsMonomialMatrix(A); true .
We need a function that translates a permutation matrix into a permutation.
pointToVector := function( n, k ) local i, vect; vect := []; for i in [1..n] do vect[i] := 0; od; vect[k] := 1; return vect; end; vectorToPoint := function( vect ) local k; k := 1; while (vect[k] = 0) do k := k + 1; od; return k; end; matToPerm := function( mat ) local listperm; listperm := List( mat, row -> vectorToPoint( row )); return PermList(listperm); end; .
For example:
gap> sigma := PermutationMat((1,2,3),3); [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] gap> matToPerm(sigma); (1,2,3) .
Its not much harder now to write a function which translates a coloured permutation matrix into our new internal representation for coloured permutations:
vectorToColour := function( vect ) local k; k := 1; while (vect[k] = 0) do k := k + 1; od; return vect[k]; end; colMatToColPerm := function( mat ) local mat2, listperm, colours; mat2 := TransposedMat( mat ); colours := List( mat2, row -> vectorToColour( row )); listperm := List( mat, row -> vectorToPoint( row )); return [PermList(listperm), colours]; end; .
For example:
gap> colMatToColPerm( A ); [ (1,2,3,4), [ E(3), 1, E(3)^2, E(3) ] ] .
Going the other way is slightly more tricky. Starting with GAP’s representation of a coloured permutation with
colours on
points as a permutation in
which stabilizes:

we want to translate it into a pair:
[sigma, colourvect]. .
So, here goes:
extractColPerm := function( colperm, k,n ) local i, points, images, sigma, colours; points := Filtered([1..n*k], i -> (i mod k) = 1); images := List(points, p -> p^colperm); sigma := PermList(List(images, i -> Int((i-1)/k + 1))); colours := List(images, i -> E(k)^((i mod k) - 1)); return [sigma,colours]; end; .
Now lets test it:
gap> gapPerms := Elements(ColouredPerms(3,2)); [ (), (4,5,6), (4,6,5), (1,2,3), (1,2,3)(4,5,6), (1,2,3)(4,6,5), (1,3,2), (1,3,2)(4,5,6), (1,3,2)(4,6,5), (1,4)(2,5)(3,6), (1,4,2,5,3,6), (1,4,3,6,2,5), (1,5,2,6,3,4), (1,5,3,4,2,6), (1,5)(2,6)(3,4), (1,6,3,5,2,4), (1,6)(2,4)(3,5), (1,6,2,4,3,5) ] gap> test := List(gapPerms, sigma -> extractColPerm(sigma,3,2)); [ [ (), [ 1, 1 ] ], [ (), [ 1, E(3) ] ], [ (), [ 1, E(3)^2 ] ], [ (), [ E(3), 1 ] ], [ (), [ E(3), E(3) ] ], [ (), [ E(3), E(3)^2 ] ], [ (), [ E(3)^2, 1 ] ], [ (), [ E(3)^2, E(3) ] ], [ (), [ E(3)^2, E(3)^2 ] ], [ (1,2), [ 1, 1 ] ], [ (1,2), [ 1, E(3) ] ], [ (1,2), [ 1, E(3)^2 ] ], [ (1,2), [ E(3), 1 ] ], [ (1,2), [ E(3), E(3) ] ], [ (1,2), [ E(3), E(3)^2 ] ], [ (1,2), [ E(3)^2, 1 ] ], [ (1,2), [ E(3)^2, E(3) ] ], [ (1,2), [ E(3)^2, E(3)^2 ] ] ] .
Finally we need to be able to go from our internal representation of a coloured permutation, to GAP’s representation.
foo := function( rootofunity, k)
local power;
power := 0;
while not (rootofunity = E(k)^power) do
power := power + 1;
od;
return power;
end;
gapPerm := function( sigma, colourvect, k, n )
local i, images, oldcolours, newcolours;
oldcolours := List([1..n*k], i -> ((i-1) mod k));
newcolours := [];
for i in [1..n*k] do
newcolours[i] := (oldcolours[i]
+ foo(colourvect[Int( (i-1)/k ) + 1],k)) mod k;
od;
images := [];
for i in [1..n*k] do
images[i] := k*( (Int( (i-1)/k ) + 1)^sigma - 1)
+ 1 + newcolours[i];
od;
return PermList(images);
end;
.Final test:
gap> List(test, c-> gapPerm(c[1],c[2],3,2)); [ (), (4,5,6), (4,6,5), (1,2,3), (1,2,3)(4,5,6), (1,2,3)(4,6,5), (1,3,2), (1,3,2)(4,5,6), (1,3,2)(4,6,5), (1,4)(2,5)(3,6), (1,4,2,5,3,6), (1,4,3,6,2,5), (1,5,2,6,3,4), (1,5,3,4,2,6), (1,5)(2,6)(3,4), (1,6,3,5,2,4), (1,6)(2,4)(3,5), (1,6,2,4,3,5) ] .
Yes, this code is ugly.
Coloured Permutations in GAP I
Posted in Robin on December 12th, 2009 by Robin – Be the first to commentHere is a function to produce a coloured permutation matrix in GAP:
ColouredMatrix := function( sigma, colours ) local p,d; p := PermutationMat(sigma, Length(colours), Rationals); d := DiagonalMat(colours); return p * d; end; .
For example:
gap> A := ColouredMatrix((1,2,3,4),[E(3),1,E(3)^2,E(3)]); [ [ 0, 1, 0, 0 ], [ 0, 0, E(3)^2, 0 ], [ 0, 0, 0, E(3) ], [ E(3), 0, 0, 0 ] ] .
Remember that in GAP, the symbol E(3) denotes the primitive cube root of unity. Now we can diagonalize this matrix and find its eigenvectors:
gap> Eigenvalues(CF(12), A); [ E(3), -E(3), E(12)^7, -E(12)^7 ] gap> Eigenvectors(CF(12),A); [ [ 1, E(3)^2, 1, 1 ], [ 1, -E(3)^2, 1, -1 ], [ 1, -E(12)^11, -1, E(4) ], [ 1, E(12)^11, -1, -E(4) ] ] .
Remember that in GAP CF(12) is the cyclotomic field extension containing all the twelth roots of unity.
To generate all the coloured permutation matrices of given dimensions we could do something like:
AllCombinations := function( k, n );
if n = 1 then
return List([1..k], i -> [i]);
else return Concatenation(List([1..k],
i -> List( (AllCombinations( k, (n-1)) ),
ys -> Concatenation([i],ys) )
));
fi;
end;
fish := function( xs, ys )
local k, new;
new := [];
for k in [1..Length(xs)] do
new[k] := ys[xs[k]];
od;
return new;
end;
AllColouredMatrices := function( k, n )
local perms, colours, colourvectors, tori;
perms := Elements(SymmetricGroup(n));
colours := List([1..k],i -> E(k)^i);
colourvectors := List(AllCombinations(k,n), xs -> fish(xs,colours));
return Concatenation(List(perms,
sigma -> List(colourvectors,
c -> ColouredMatrix(sigma,c)
)));
end;
.Check it out:
gap> AllColouredMatrices(2,2); [ [ [ -1, 0 ], [ 0, -1 ] ], [ [ -1, 0 ], [ 0, 1 ] ], [ [ 1, 0 ], [ 0, -1 ] ], [ [ 1, 0 ], [ 0, 1 ] ], [ [ 0, -1 ], [ -1, 0 ] ], [ [ 0, 1 ], [ -1, 0 ] ], [ [ 0, -1 ], [ 1, 0 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ] gap> AllColouredMatrices(3,2); [ [ [ E(3), 0 ], [ 0, E(3) ] ], [ [ E(3), 0 ], [ 0, E(3)^2 ] ], [ [ E(3), 0 ], [ 0, 1 ] ], [ [ E(3)^2, 0 ], [ 0, E(3) ] ], [ [ E(3)^2, 0 ], [ 0, E(3)^2 ] ], [ [ E(3)^2, 0 ], [ 0, 1 ] ], [ [ 1, 0 ], [ 0, E(3) ] ], [ [ 1, 0 ], [ 0, E(3)^2 ] ], [ [ 1, 0 ], [ 0, 1 ] ], [ [ 0, E(3) ], [ E(3), 0 ] ], [ [ 0, E(3)^2 ], [ E(3), 0 ] ], [ [ 0, 1 ], [ E(3), 0 ] ], [ [ 0, E(3) ], [ E(3)^2, 0 ] ], [ [ 0, E(3)^2 ], [ E(3)^2, 0 ] ], [ [ 0, 1 ], [ E(3)^2, 0 ] ], [ [ 0, E(3) ], [ 1, 0 ] ], [ [ 0, E(3)^2 ], [ 1, 0 ] ], [ [ 0, 1 ], [ 1, 0 ] ] ] .
Of course there’s always more than one way of doing exactly the same thing, so:
ColouredPerms := function( k,n ) local ck, sn; ck := CyclicGroup(IsPermGroup,k); sn := SymmetricGroup(n); return WreathProduct(ck,sn); end; .
For example:
gap> hyp2 := ColouredPerms(2,2); Group([ (1,2), (3,4), (1,3)(2,4) ]) gap> Elements(hyp2); [ (), (3,4), (1,2), (1,2)(3,4), (1,3)(2,4), (1,3,2,4), (1,4,2,3), (1,4)(2,3) ] .
Here GAP is thinking of a signed permutation on
symbols as regular permutations on
symbols whose action by conjugation stabilizes the permutation:

A slightly larger example:
gap> hyp3 := ColouredPerms(2,3); Group([ (1,2), (3,4), (5,6), (1,3,5)(2,4,6), (1,3)(2,4) ]) gap> Elements(hyp3); [ (), (5,6), (3,4), (3,4)(5,6), (3,5)(4,6), (3,5,4,6), (3,6,4,5), (3,6)(4,5), (1,2), (1,2)(5,6), (1,2)(3,4), (1,2)(3,4)(5,6), (1,2)(3,5)(4,6), (1,2)(3,5,4,6), (1,2)(3,6,4,5), (1,2)(3,6)(4,5), (1,3)(2,4), (1,3)(2,4)(5,6), (1,3,2,4), (1,3,2,4)(5,6), (1,3,5)(2,4,6), (1,3,5,2,4,6), (1,3,6,2,4,5), (1,3,6)(2,4,5), (1,4,2,3), (1,4,2,3)(5,6), (1,4)(2,3), (1,4)(2,3)(5,6), (1,4,6,2,3,5), (1,4,6)(2,3,5), (1,4,5)(2,3,6), (1,4,5,2,3,6), (1,5,3)(2,6,4), (1,5,4,2,6,3), (1,5,3,2,6,4), (1,5,4)(2,6,3), (1,5)(2,6), (1,5,2,6), (1,5)(2,6)(3,4), (1,5,2,6)(3,4), (1,6,4,2,5,3), (1,6,3)(2,5,4), (1,6,4)(2,5,3), (1,6,3,2,5,4), (1,6,2,5), (1,6)(2,5), (1,6,2,5)(3,4), (1,6)(2,5)(3,4) ] .
To confirm my claim about commuting with the permutation 
gap> Elements(Centralizer(SymmetricGroup(6), (1,2)(3,4)(5,6))); [ (), (5,6), (3,4), (3,4)(5,6), (3,5)(4,6), (3,5,4,6), (3,6,4,5), (3,6)(4,5), (1,2), (1,2)(5,6), (1,2)(3,4), (1,2)(3,4)(5,6), (1,2)(3,5)(4,6), (1,2)(3,5,4,6), (1,2)(3,6,4,5), (1,2)(3,6)(4,5), (1,3)(2,4), (1,3)(2,4)(5,6), (1,3,2,4), (1,3,2,4)(5,6), (1,3,5)(2,4,6), (1,3,5,2,4,6), (1,3,6,2,4,5), (1,3,6)(2,4,5), (1,4,2,3), (1,4,2,3)(5,6), (1,4)(2,3), (1,4)(2,3)(5,6), (1,4,6,2,3,5), (1,4,6)(2,3,5), (1,4,5)(2,3,6), (1,4,5,2,3,6), (1,5,3)(2,6,4), (1,5,4,2,6,3), (1,5,3,2,6,4), (1,5,4)(2,6,3), (1,5)(2,6), (1,5,2,6), (1,5)(2,6)(3,4), (1,5,2,6)(3,4), (1,6,4,2,5,3), (1,6,3)(2,5,4), (1,6,4)(2,5,3), (1,6,3,2,5,4), (1,6,2,5), (1,6)(2,5), (1,6,2,5)(3,4), (1,6)(2,5)(3,4) ] .
What we need now is a way to translate between these two different representations of the same mathematical object.
Commutants of various matrices
Posted in Robin on December 12th, 2009 by Robin – Be the first to commentIt is a saddening fact about the universe in which we inhabit that not every linear operator is diagonalizable over
. Meet the irritating matrix:

This matrix is guaranteed to haunt your nightmares and shatter whatever cozy and comforting illusions you may have about linear algebra. Some people refer to it as the Jordan block, but I would like to reserve the letter J for the matrix:

So that the irritating matrix is equal to
.
The characteristic polynomial of the
by
irritating matrix is:

This is also the minimum polynomial. The only matrices which commute with the irritating matrix are those of the form:

In other words, a basis for the commutant of the irritating matrix is given by
. Equivalently, a basis for the commutant of the irritating matrix is given by the first
powers of the irritating matrix (starting from zero).
Luckily for us, the irritating matrix is as bad as things ever get. Over the complex numbers, any linear operator can be put into block diagonal form with irritating matrices corresponding to various
along the diagonal. The operator is diagonalizable if the irritating blocks are all of size one.
The “best” kind of matrices are those which are not only diagonalizable, but also have distinct eigenvalues. For example:

For these matrices the characteristic polynomial is equal to the minimum polynomial and contains no repeated roots. In this case:

The only matrices which commute with such a matrix are other diagonal matrices. Equivalently, a basis for the space of linear operators
commuting with the original operator
is given by 
To see the equivalence, note that to expand the diagonal matrix with eigehvalues
in powers of the original matrix
with eigenvalues
you are looking for a polynomial

such that
. Solving this linear system of equations involves inverting a vandermonde matrix, which is only possible if the eigenvalues are distinct.
If your operator is diagonalizable, but contains repeated eigenvalues, then the minimum polynomial still contains no repeated roots, but the characteristic polynomial does. For example:

Here the characteristic polynomial is:
while the minimum polynomial is:
.
The commutant of such a matrix is much larger than one with distinct eigenvalues. The commutant of our example matrix is:

where the stars denote possible nonzero entries.
Note finally, that both the irritating matrix and matrices with distinct eigenvalues have the property that we can find a vector
such that the first
powers of the matrix of
form a basis. In the case of the irritating matrix take the vector:

In the case of the diagonal matrix with distinct eigenvalues take the vector:

This property can be used to characterize those matrices
such that if
commutes with
then
must be a polynomial in
.
Group Rings
Posted in Robin on December 11th, 2009 by Robin – Be the first to commentFor any finite group
the group ring
of
is the group of formal linear combinations of elements of
, with coefficients in
and multiplication defined on the basis elements and then extended linearly:

Even though it is called a group ring this important object actually has the structure of a
-algebra. That is it is both a ring, and a finite dimensional vector space over
. In reading what follows it is important to keep clear in your mind when we are treating
as a ring, and when we are treating it as a vector space over
.
A representation of of a a
-algebra
on a finite dimensional vector space
is an algebra homomorphism:

Here
is the space of endomorphisms of
. If
is of dimension
then once a basis has been chosen
may be thought of as the algebra of
by
matrices.
Every representation
of a group
on a vector space
lifts naturally to a representation
of the algebra
on the same vector space.

Since these two things are really “the same” in a certain category theoretical sense which I don’t really want to go into just now (I’m starting to sound like a physicist, aren’t I?), we usually drop the hat and swap back and forth freely between the representation of the group, and the representation of the associated group ring.
Now, there are two natural representations of
on the group ring thought of as a vector space. Firstly, right multiplication:

given by:

and secondly left multiplication by the inverse:

given by:

The linear map:

is an intertwiner between these two representations. In other words, upto conjugation they are really the same representation

On the dual space
of linear functions on
we have:

given by:
![<br />
\begin{align*}<br />
R^*(x).f [g] & = f[gx^{-1}] \\<br />
L^*(x).f [g] & = f[x g]<br />
\end{align*}<br />](http://analogical-engine.com/wordpress/wp-content/cache/tex_c8a4b65a5689dde14df395ea5cd07558.png)
One can check that:
![<br />
\begin{align*}<br />
R^*(x).f[R(x).g] & = f[g] \\<br />
L^*(x).f[L(x).g] & = f[g]<br />
\end{align*}<br />](http://analogical-engine.com/wordpress/wp-content/cache/tex_6263c1095af290d95999f6605b3c3d7e.png)
Since the left and right actions clearly commute, we actually have a representation:

given by:

Similarly we have:

given by:
![(L^* \otimes R^*)(x,y) f[z] = f[ x z y^{-1}]](http://analogical-engine.com/wordpress/wp-content/cache/tex_516b79e9ed84ed80abe62e1aaf868086.png)
The linear map:

is an intertwiner between these two representations of
.
![<br />
\begin{align*}<br />
\psi((L\otimes R)(x,y).g)[z] & = \psi(x^{-1}g y)[z] \\<br />
& = \delta_{x^{-1}g y} [z] \\<br />
& = \delta_g [x z y^{-1} ] \\<br />
& = (L^* \otimes R^*)(x,y).(\psi(g)[z])<br />
\end{align*}<br />](http://analogical-engine.com/wordpress/wp-content/cache/tex_29debb76287e207909365cde4caec917.png)
The inverse map is given by:

We have all the ingredients now to prove the Artin-Wedderburn theorem for semisimple rings.
Semisimplicity and Schur’s Lemma
Posted in Robin on December 8th, 2009 by Robin – Be the first to commentA representation
of a finite group is said to be irreducible if there is no nontrivial vector subspace
of
which is left stable under the action of
.
If there is an inner-product lurking in the background, and
is a unitary representation, then for every
there exists a unique
such that
. If
is such that:

Then it follows that
is such that:

But since the representation is unitary,
, thus every unitary representation of
decomposes into an orthogonal direct sum of irreducible ones. This is the definition of semisimplicity.
Now fix some representation
. If
is irreducible, then the only maps
with the property that for all
the following diagram commutes:
![<br />
\tikzstyle{labelled}=[circle,inner sep = 2pt]<br />
\begin{tikzpicture}[line width=0.5pt]<br />
\node (1a1) at ( 1,0) [labelled] {$V$};<br />
\node (2a1) at ( 4,0) [labelled] {$V$};<br />
\node (1b1) at ( 1,3) [labelled] {$V$};<br />
\node (2b1) at ( 4,3) [labelled] {$V$};<br />
\draw [->](1b1) -- (1a1);<br />
\draw [->](2b1) -- (2a1);<br />
\draw [->](1b1) -- (2b1);<br />
\draw [->](1a1) -- (2a1);<br />
\node (h1) at (2.5,3.25) {$\rho(g)$};<br />
\node (h2) at (2.5,-0.25) {$\rho(g)$};<br />
\node (v1) at (.75,1.5) {$\psi$};<br />
\node (v2) at (4.25,1.5) {$\psi$};<br />
\end{tikzpicture}<br />](http://analogical-engine.com/wordpress/wp-content/cache/tex_cc7945a0a6d9dfa11e75dab2136e872c.png)
are the scalar multiples of the identity.
To see this not that if
is an eigenvalue of
then the eigenspace of
corresponding to
is stable under all of
and must thus be the whole space. Over
every linear operator has at least one eigenvalue.
More generally, suppose that
decomposes as:

with each of
and
irreducible. If the representation of
restricted to
is not isomorphic to the representation of
on
, then the the only
which commutes with the action of
are those of the form:
where
denotes the identity on
and
denotes the identity of
.
If they are isomorphic, then we can write:

where
is a multiplicity space of dimension
. In this basis the representation looks like:
where
is the restriction of
to
and
is the identity matrix on
.
The
which commute with the action of
are now of the form:

where
denotes the identity matrix acting on
, and
is any matrix acting on
.
Finally if
is an arbitrary representation, and the underlying vector space decomposes as

with the
denoting pairwise non-isomorphic irreducible representations, and the
their multiplicity spaces, then the representation looks like:
and the
which commute with the action of
are those of the form:
This is more or less Schur’s lemma.
Categorical Logic I
Posted in Cale on December 8th, 2009 by Cale – 2 CommentsSuppose we have almost any deduction system whatsoever. (I’m going to refine things and ask for more structure as we go along, but for now it will do.)
Our deduction system consists of a bunch of statements, and some rules for determining when some statements follow from others. It’s not much of a stretch to demand that given any statement
, we will be able to prove
from it, that is, that we have some trivial deduction
. Also, in order to keep things interesting, if we have a deduction
, and a deduction
, we ought to have some way to join them into a deduction
. This will be some sort of “concatenation of proofs”, but we’re not going to care how it’s implemented, just so long as it is associative, and the “identity deduction” above is an identity for it.
So, anyone who knows me well enough should know what’s coming now. We form a category whose objects are statements, and where the set of arrows
are exactly the deductions
. That is, the proofs of
given
. The identity arrows are given by trivial deductions, and the composition is our concatenation of proofs.
Let’s rediscover basic logical operations in terms of category theoretic constructions.
Starting simple, what would an initial object
correspond to? Well, the property of an initial object is that for any
we have a (unique) arrow
This seems to suggest that
ought to be a statement which is trivially false, as anything can be deduced from it.
How about a terminal object
? There we have for any
, a unique arrow
So this is behaving like something trivially true.
You might recall that in an arbitrary category with a terminal object, we often define an element of an object
to be an arrow
What would that be here? Well, it’s a proof of
starting from something which is trivially true, or just a proof of
Dually, a coelement of
which is an arrow
will be a proof of falsity from
or a refutation of 
How about the product of statements
and
? Well,
should be a statement which, according to the projection maps, implies both
and
and moreover, if any other statement
implies both
and
then there must be a (unique) proof that
implies
making the following diagram commute:
![\xymatrix{<br />
\quad& & Z\ar[ddll]_{f}\ar[ddrr]^{g}\ar[dd]^{(f,g)} & & \\<br />
\quad\\<br />
X & & X \times Y\ar[ll]^{\pi_X}\ar[rr]_{\pi_Y} & & Y<br />
}](http://analogical-engine.com/wordpress/wp-content/cache/tex_ab1660c223c23663ca44e41f2d679adf.png)
These are the usual properties attributed to logical AND, so the existence of (finite) products is, modulo perhaps some squabbling about uniqueness of proofs, equivalent to the notion that we have statements representing the conjunctions of other statements.
In a similar fashion, the coproduct
has essentially all the properties we’d expect from logical disjunction (OR) of statements.
How about exponential objects? Recall that if
and
are objects in some category
, then an exponential object
is an object of
together with an arrow

so that whenever there is an arrow

we have that there is a unique arrow

such that the following diagram commutes:
![\xymatrix{<br />
Z \times X \ar[dd]_{(\hat{f},\mathrm{id}_X)} \ar[ddrr]^{f} \\<br />
\\<br />
Y^X \times X \ar[rr]_{\mathrm{apply}} & & Y<br />
}](http://analogical-engine.com/wordpress/wp-content/cache/tex_1cbea54bf0c6cebb2de4eda74c1774a0.png)
In order to better follow this, we can try setting
to be
, in which case
becomes simply an arrow
and
becomes an arrow
which we can think of as an element of the exponential.
That is, every proof of
should correspond to a proof that 
So exponential objects correspond directly with implication.
What about logical negation? Well, we said earlier that an arrow
would act like a refutation of
so a natural thing to do would be to define
to be 
Okay, so if our deduction system is in fact a Cartesian closed category with coproducts, it means we have encodings of the usual logical operations. What about the usual properties of logical operations with respect to each other?
Firstly, can we prove the distributive laws? In classical logic, we have that


Secondly, do we get De Morgan’s laws for free, or do we need to add something more to this formulation?
I’ll leave those questions to be answered next time.