In the last few posts, we've been looking at combinatorial Hopf algebras, specifically:
- SSym, a Hopf algebra with a basis of (indexed by) permutations
- YSym, with a basis of binary trees
- QSym, with a basis of compositions
It turns out that these three Hopf algebras are quite closely related (and indeed, there are a few others in the same "family"). Let's start with SSym and YSym.
Given a permutation p of [1..n], we can construct a binary tree called the descending tree as follows:
- Split the permutation as p = ls ++ [n] ++ rs
- Place n at the root of the tree, and recursively place the descending trees of ls and rs as the left and right children of the root
- To bottom out the recursion, the descending tree of the empty permutation is of course the empty tree
For example, the following diagram shows the descending tree of [3,5,1,4,2].
Here's the Haskell code:
descendingTree  = E descendingTree [x] = T E x E descendingTree xs = T l x r where x = maximum xs (ls,_:rs) = L.break (== x) xs l = descendingTree ls r = descendingTree rs > :m Math.Algebras.Structures Math.Combinatorics.CombinatorialHopfAlgebra > descendingTree [3,5,1,4,2] T (T E 3 E) 5 (T (T E 1 E) 4 (T E 2 E))
Now you'll recall that for the Hopf algebra YSym, although we sometimes carry around the node labels to help us see what is going on, we're really only interested in the shapes of the trees. So here's a function to erase the labels:
shape :: PBT a -> PBT () shape t = fmap (\_ -> ()) t > shape $ T (T E 3 E) 5 (T (T E 1 E) 4 (T E 2 E)) T (T E () E) () (T (T E () E) () (T E () E))
(shape . descendingTree)is a function from permutations to unlabelled trees. We can consider this as a map between the fundamental bases of SSym and YSym, which therefore induces a linear map between the corresponding Hopf algebras:
descendingTreeMap :: (Eq k, Num k) => Vect k SSymF -> Vect k (YSymF ()) descendingTreeMap = nf . fmap (\(SSymF xs) -> (YSymF . shape . descendingTree) xs)
Now it turns out that this map is in fact a Hopf algebra morphism. What does that mean? Basically it means that descendingTreeMap plays nicely ("commutes") with the unit, mult, counit, comult, and antipode maps in the two Hopf algebras.
For example, for an algebra morphism, we require:
f (x1*x2) = f x1 * f x2
f . unit = unit
It's not immediately clear why descendingTreeMap should have these properties. The unit property is clear:
> descendingTreeMap 1 == 1
Trueor put another way
> descendingTreeMap (ssymF ) == ysymF E
But what about the mult property?
Recall that in SSymF, we multiply permutations by shifting the right operand, and then summing all possible shuffles of the two lists:
> ssymF [3,2,1] * ssymF [1,2] F [3,2,1,4,5]+F [3,2,4,1,5]+F [3,2,4,5,1]+F [3,4,2,1,5]+F [3,4,2,5,1]+F [3,4,5,2,1]+F [4,3,2,1,5]+F [4,3,2,5,1]+F [4,3,5,2,1]+F [4,5,3,2,1]
On the other hand, in YSymF, we multiply by multi-splitting the left operand, and then grafting the parts onto the leafs of the right operand, in all possible ways. The following diagram shows one possible multi-split-grafting, corresponding to one of the summands in [3,5,1,4,2] * [1,2]:
The numbers along the tops of the trees are the node labels generated by the descending tree construction. We can see from these that there is an exact correspondence between a shifted shuffle in SSymF and a multi-split grafting in YSymF. The asymmetry in the mult for YSymF, where we graft multi-splits of the left operand onto the right operand, corresponds to the asymmetry in the mult for SSymF, where we shift the right operand. This shifting in SSymF ensures that the nodes for the right operand end up at the root of the descending tree, as required by the grafting in YSymF. When we defined shuffling, we gave a recursive definition, but it's fairly clear that the grafting of the parts of the multi-split onto the right tree is accomplishing the same thing.
Similarly, a coalgebra morphism is a linear map which commutes with counit and comult:
In SSymF, counit is 1 on the empty permutation, 0 on anything else. In YSymF, counit is 1 on the empty tree, 0 on anything else. The descendingTreeMap sends the empty permutation to the empty tree, so it's clear that it commutes with counit in the required way.
What about comult? In SSymF, the comult of a permutation is the sum of its two-part deconcatenations (with each part flattened back to a permutation).
> comult $ ssymF [3,5,1,4,2] (F ,F [3,5,1,4,2])+(F ,F [4,1,3,2])+(F [1,2],F [1,3,2])+(F [2,3,1],F [2,1])+(F [2,4,1,3],F )+(F [3,5,1,4,2],F )
In YSymF, the comult of a tree is the sum of its two-part splits. Now it's clear that flattening makes no difference to the descending tree. Then, it's also clear that if you take descending trees of the two parts of a deconcatenation, this corresponds to a split of the descending tree of the whole.
Finally, a Hopf algebra morphism is a bialgebra morphism which in addition commutes with antipode.
In SSymF and YSymF, we didn't give an explicit expression for the antipode, but instead derived it from mult and comult using the fact that they are both graded connected bialgebras. So it's actually kind of obvious that descendingTreeMap will be a Hopf algebra morphism, but just to check:
prop_HopfAlgebraMorphism f x = (f . antipode) x == (antipode . f) x > quickCheck (prop_HopfAlgebraMorphism descendingTreeMap) +++ OK, passed 100 tests.
Given any tree, there are many ways to label the nodes so that the tree is descending (ie such that the label on each child node is less than the label on its parent). For example, we could first label all the leaf nodes [1..k], and then all their immediate parents [k+1..], and so on. (For our example tree, this would lead to the alternative labelling [1,5,2,4,3].)
This shows that the descending tree map is surjective, but not injective. Hence YSym is a quotient of SSym.