# Acess bracked elements in free lie algebra element?

I'm trying to access the left and right elements in a free lie algebra element, whose monomials are stored as binary trees. Thus I want a method (like exists in the source for lie_algebra_element) which would return something like

sage:  L = LieAlgebra(QQ, 3, 'x')
sage: x0,x1,x2 = L.gens()
sage: Lyn = FL.Lyndon()
[[x0, x1], x1]
sage: a._left
[x0,x1]
sage: a._right
x1


Of course the last 4 lines are fake. One way of seeing this is the following:

sage: isinstance(a, LyndonBracket)
False
sage: isinstance(a, LieBracket)
False


How do I fix this "the right way" ? My current solution is just to set

sage: a_tree = eval(repr(a)); a_tree
[[x0, x1], x1]


But this feels extremely wrong.

edit retag close merge delete

Sort by ยป oldest newest most voted

There seems to be room for improvement in the design here. Basis elements apparently have the same parent as ordinary elements, and a.monomials() returns them as such, which makes it hard to get at the underlying tree.

From the source code, accessed by a??, we find that we can access the actual monomial by e.g.:

sage: a_tree = a.list()[0][0]; a_tree
[[x0, x1], x1]
sage: isinstance(a_tree, sage.algebras.lie_algebras.lie_algebra_element.LyndonBracket)
True
sage: a_tree._left
[x0, x1]
sage: a_tree._right
x1


You may want to discuss this on sage-devel.

more

1

I went ahead and posted a topic on sage-devel here. Your code works but there is still some unfortunate behavior, namely

sage: a_tree._right == x1
False


which can be worked around via something like

sage: a_tree._right == x1.list()[0][0]
True


Just paying careful attention to which objects are Lyndon basis elements and which are the binary trees. This has worked for my code but it would be way nicer if there was a cleaner way.

( 2020-02-13 23:46:52 +0200 )edit