module Math.Sym.Class
(
av231, vee, wedge, gt, lt, vorb, separables
) where
import Math.Sym (Perm, empty, one, (\+\), (/-/), dsum, ssum, normalize)
import Math.Sym.D8 as D8
av231 :: Perm a => Int -> [a]
av231 0 = [empty]
av231 n = do
k <- [0..n1]
s <- streamAv231 !! k
t <- streamAv231 !! (nk1)
return $ s \+\ (one /-/ t)
streamAv231 :: Perm a => [[a]]
streamAv231 = map av231 [0..]
vee :: Perm a => Int -> [a]
vee = (streamVee !!)
streamVee :: Perm a => [[a]]
streamVee = [empty] : [one] : zipWith (++) vee_n n_vee
where
n_vee = (map.map) (one /-/) ws
vee_n = (map.map) (\+\ one) ws
ws = tail streamVee
wedge :: Perm a => Int -> [a]
wedge = map D8.complement . vee
gt :: Perm a => Int -> [a]
gt = map D8.rotate . vee
lt :: Perm a => Int -> [a]
lt = map D8.reverse . gt
union :: (Ord a, Perm a) => [Int -> [a]] -> Int -> [a]
union cs n = normalize $ concat [ c n | c <- cs ]
vorb :: (Ord a, Perm a) => Int -> [a]
vorb = union [vee, wedge, gt, lt]
compositions :: Int -> Int -> [[Int]]
compositions 0 0 = [[]]
compositions 0 _ = []
compositions _ 0 = []
compositions k n = [1..n] >>= \i -> map (i:) (compositions (k1) (ni))
separables :: Perm a => Int -> [a]
separables 0 = [empty]
separables 1 = [ one ]
separables n = pIndec n ++ mIndec n
where
pIndec 0 = []
pIndec 1 = [one]
pIndec m = comps m >>= map ssum . mapM (streamMIndec !!)
streamPIndec = map pIndec [0..]
mIndec 0 = []
mIndec 1 = [one]
mIndec m = comps m >>= map dsum . mapM (streamPIndec !!)
streamMIndec = map mIndec [0..]
comps m = [2..m] >>= \k -> compositions k m