HaskellForMaths-0.3.2: Math/Algebras/Matrix.hs
-- Copyright (c) 2010, David Amos. All rights reserved.
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
module Math.Algebras.Matrix where
import Math.Algebra.Field.Base
import Math.Algebras.VectorSpace
import Math.Algebras.TensorProduct
import Math.Algebras.Structures
-- Mat2
delta i j | i == j = 1
| otherwise = 0
data Mat2 = E2 Int Int deriving (Eq,Ord,Show)
-- E i j represents the elementary matrix with a 1 at the (i,j) position, and 0s elsewhere
instance Num k => Algebra k Mat2 where
-- unit 0 = zero -- V []
unit x = x `smultL` V [(E2 i i, 1) | i <- [1..2] ]
-- mult ab = nf $ ab >>= mult' where
mult = linear mult' where
mult' (E2 i j, E2 k l) = delta j k `smultL` return (E2 i l)
-- In other words
-- unit x = x (1 0)
-- (0 1)
-- mult (a1 b1) `te` (a2 b2) = (a1 b1) * (a2 b2) = (a b)
-- (c1 d1) (c2 d2) (c1 d1) (c2 d2) (c d)
instance Num k => Module k Mat2 EBasis where
-- action ax = nf $ ax >>= action' where
action = linear action' where
action' (E2 i j, E k) = delta j k `smultL` return (E i)
-- In other words
-- action (a b) `te` (x) = (ax+by)
-- (c d) (y) (cx+dy)
toMat2 [[a,b],[c,d]] = sum $ zipWith (\x e -> unit x * return e) [a,b,c,d] [E2 1 1, E2 1 2, E2 2 1, E2 2 2]
-- fromMat2
toEB2 [x,y] = foldl add zero $ zipWith (\x e -> x `smultL` return e) [x,y] [E 1, E 2]
toEB xs = foldl add zero $ zipWith (\x e -> x `smultL` return e) xs (map E [1..])
data Mat2' = E2' Int Int deriving (Eq,Ord,Show)
-- E' i j represents the dual basis element corresponding to E i j
-- Kassel p42
instance Num k => Coalgebra k Mat2' where
counit (V ts) = sum [xij * delta i j | (E2' i j, xij) <- ts]
-- comult (V ts) = V $ concatMap (\(E2' i j,xij) -> [(T (E2' i k) (E2' k j), xij) | k <- [1..2]]) ts
comult = linear (\(E2' i j) -> foldl (<+>) zero [return (E2' i k, E2' k j) | k <- [1..2]])
-- In other words
-- counit (a b) = (1 0)
-- (c d) (0 1)
-- comult (a b) = (a1 b1) `te` (a2 b2)
-- (c d) (c1 d1) (c2 d2)
-- ??
-- ?? How does this act on Mat2?
-- ?? What is the relationship between this and SL2 ABCD, which it seems to resemble
-- !! Now do the quickchecks
data M3 = E3 Int Int deriving (Eq,Ord,Show)
-- E i j represents the elementary matrix with a 1 at the (i,j) position, and 0s elsewhere
instance Num k => Algebra k M3 where
unit 0 = zero -- V []
unit x = V [(E3 i i, x) | i <- [1..3] ]
mult (V ts) = nf $ V $ map (\((E3 i j, E3 k l), x) -> (E3 i l, delta j k * x)) ts
{-
-- Kassel p42
-- In this coalgebra instance, the E3 i j are to be interpreted as the dual basis, not the original basis
instance Num k => Coalgebra k M3 where
counit (V ts) = sum [xij * delta i j | (E3 i j, xij) <- ts]
comult (V ts) = V $ concatMap (\(E3 i j,xij) -> [((E3 i k, E3 k j), xij) | k <- [1..3]]) ts
-- (is this order preserving?)
-}