Hi Travis,

I had that confusion about the pbw_basis method, as well. From my (non 
expert) point of view I would have expected the following:

What is now your L.pbw_basis() I expected to be 
L.universal_enveloping_algebra(). This would match what the representation 
string is telling you:

sage: L.pbw_basis()
Universal enveloping algebra of Lie algebra of ['A', 2] in the Chevalley 
basis in the Poincare-Birkhoff-Witt basis



What is now your L.universal_enveloping_algebra() is just another 
(isomorphic) realization. Therefore it could be accessed in this way:

L.universal_enveloping_algebra().as_nc_polynomial_ring()

matching what the representation string is telling you:

sage: L.universal_enveloping_algebra()
Noncommutative
 Multivariate Polynomial Ring in b0, b1, b2, b3, b4, b5, b6, b7 over 
Rational Field, nc-relations: {b5*b0: b0*b5 - b4, b6*b3: b3*b6 + 2*b6, 
.................

Furthermore, conversion maps between these two realization (in both 
directions) are desirable. The access to the PBW-basis would be

L.universal_enveloping_algebra().basis()

for which a shorthand L.pbw_basis() maybe be implemented (or not).

Best,
Sebastian


Am Freitag, 23. Februar 2018 23:28:21 UTC+1 schrieb Travis Scrimshaw:
>
>
> No, it is not. The keys for the basis of the PBW are different than those 
>>> for the algebra generators. See the output:
>>>
>>> sage: PBW.basis()
>>> Lazy family (Term map from Free abelian monoid indexed by {alpha[1], 
>>> alphacheck[1], -alpha[1]} to Universal enveloping algebra of Lie 
>>> algebra of ['A', 1] in the Chevalley basis in the Poincare-Birkhoff-Witt 
>>> basis(i))_{i in Free abelian monoid indexed by {alpha[1], alphacheck[1], 
>>> -alpha[1]}}
>>> sage: PBW.algebra_generators()
>>> Finite family {-alpha[1]: PBW[-alpha[1]], alpha[1]: PBW[alpha[1]], 
>>> alphacheck[1]: PBW[alphacheck[1]]}
>>>
>>> It clearly indicates that the basis keys should be an element of a free 
>>> abelian monoid. LBYL. Now in this case, if we did try to convert the input 
>>> into the keys, it should work. See 
>>> https://trac.sagemath.org/ticket/18750. Actually, it is not as bad as I 
>>> remembered in terms of outright timings, but there are some other technical 
>>> issues.
>>>
>>>
>> Oh. Sorry. I admit that I have trouble parsing the Lazy family 
>> description.
>>
>
> Yea, I agree it is a bit heavy. There are some ways it could be simplified 
> by saying the function is something like "the monomial map".
>  
>
>> Free abelian monoid... Hmmm... What free abelian monoid?
>>
>> sage: PBW.basis().keys().an_element()
>>
>> PBW[alpha[1]]^2*PBW[alphacheck[1]]^2*PBW[-alpha[1]]^3
>>
>>
>> So PBW.basis() is _indexed_ by elements of the basis of PBW? I am sorry 
>> for all these stupid questions but (as you can clearly see) I am confused 
>> as hell.
>>
>
> No, they are just have the same names. A good parallel would be the 
> polynomial ring R = ZZ[x,y] in the natural basis. Here, R is the ZZ-algebra 
> of the abelian monoid A = <x,y>, and subsequently, the basis elements are 
> indexed by elements in A. We can call the elements in the monoid <c,d>, but 
> that induces undue overhead on the programmer. For the PBW case, granted it 
> is not a monoid algebra, so we cannot simply *coerce* in things from the 
> indexing monoid (but of course, conversion is allowed), but the design is 
> there. I would just be taking products of the algebra generators anyways 
> and not worrying about constructing elements via the basis.
>  
>
>> I looked at the ticket and I have no idea what it is about. 
>>
>
> Right now, if we are trying to construct a monomial, we do not convert it 
> into the indexing set of the basis and instead trust the user to do it. The 
> ticket #18750 is about changing that. 
>
>>  
>>
>  
>>
>>>
>>>>  
>>>>
>>>>> sage: C.basis()
>>>>> Lazy family (Term map from Subsets of {0, 1} to The Clifford algebra 
>>>>> of the Quadratic form in 2 variables over Rational Field with 
>>>>> coefficients: 
>>>>> [ 1 0 ]
>>>>> [ * 1 ](i))_{i in Subsets of {0, 1}}
>>>>>
>>>>> So it is expecting subsets and that the user will not input bad data. 
>>>>> There is no reason for it to simplify and not a bug. Granted, we could 
>>>>> put 
>>>>> a check on the user input here, but there is a speed penalty as this can 
>>>>> be 
>>>>> a well-used code path internally. Moreover, ducktyping can also be 
>>>>> useful. 
>>>>> So we are fairly permissive here, but not without due cause IMO.
>>>>>
>>>>>
>>>> Pardon my ignorance, but If there is no simplification then what is all 
>>>> this good for? It does simplify for universal enveloping algebra and so it 
>>>> should do it for Clifford algebras as well. Also I have a big issue with 
>>>> naming convention here. The method basis() does not produce a basis!
>>>>
>>>
>>> it is *bad input*. It does produce a basis, one indexed by *subsets*, 
>>> not words/multisets. In math terms, if you have a sequence (x_i)_{i \in I}, 
>>> then want x_j, where j \notin I, then you have an error. With #18750, this 
>>> input might instead raise an error. If you want to do that, then you can do 
>>> this:
>>>
>>> sage: Q = QuadraticForm(QQ, 2, [1,0,1])
>>> sage: C = CliffordAlgebra(Q)
>>> sage: g = list(C.algebra_generators()); g
>>> [e0, e1]
>>> sage: prod(g[i] for i in [0,0,1,0,1,1,0,0])
>>> -e0*e1
>>>
>>> If you took your input and wrapped it with set:
>>>
>>> sage: set((1,1,0,1))
>>> {0, 1}
>>>
>>> which would be the other possible outcome with #18750.
>>>
>>
>> But sets are unhashable so how do I actually input the correct keys to cb 
>> = C.basis()?
>>
>
> Here we get into implementation details, and given your previous complaint 
> about index sets, you are not going to like it. The object used to model 
> the subsets are tuples.
>
> sage: C.basis().keys()
> Subsets of {0, 1}
> sage: list(_)
> [(), (0,), (1,), (0, 1)]
>
> However, we do require an explicit total order on the generators to have a 
> well-defined representative of a monomial.
>  
>
>> Another way to solve my original problem (which is to construct certain 
>> element of U \otimes C) would be to take tensor product of elements of U 
>> and C. Something like UC.tensor_elements(E*F+F*E, e*f - f*e).
>>
>
> You can always do tensor([x,y]), and you do not need to explicitly create 
> the parent that way as well.
>
>
>>> Remember that we are bound by the facilities of computer science and 
>>> programming within Sage as well, which are usually much stronger 
>>> constraints than mathematics (e.g., consider the set of real numbers). For 
>>> the current implementation of tensor products, we require the algebra to be 
>>> in AlgebrasWithBasis. I would not say limitations of the current framework 
>>> to be a bug. Also, NC poly rings are in the category of algebras, so it 
>>> does produce an algebra.
>>>
>>>
>> I understand. I just object to naming conventions. I mean the object that 
>> results from calling universal_algebra() presents itself as a ring. How can 
>> I know that it is actually also in category of algebras without digging 
>> through the code? 
>>
>
> foo.category()
>
>  
>>
>>> C.basis() does produce a basis.
>>>
>>> sage: list(C.basis())
>>> [1, e0, e1, e0*e1]
>>>
>>> Now pbw_basis() does return an algebra in a particular basis, so in some 
>>> ways, it is returning a basis, just not for the Lie algebra. So now I see 
>>> why you feel it is not completely natural. However, do you have a proposal 
>>> for how to have convenient access to the PBW basis of U(*g*)? IMO, it 
>>> cannot be connected with universal_enveloping_algebra() because that only 
>>> has to return a class modeling the UEA, which should not be required to 
>>> have a PBW basis method. Also, I feel that a PBW basis is really more 
>>> closely connected to the Lie algebra and it is clear to someone working in 
>>> this field what pbw_basis would return.
>>>
>>
>> But that nonocmmutative ring that one gets from 
>> universal_enveloping_algebra() also has some implicit basis. What is this 
>> ring actually good for? I would think that most people would want to work 
>> with some PBW basis anyway.
>>
>
> Perfect bases (the q=1 version of a crystal basis) are equally good. Just 
> having the existence of the UEA can allow you to do a fair bit of the 
> representation theory. Also, there is no reason why we should limit someone 
> doing a Lie algebra implementation to having the UEA be in the PBW basis. 
> Also, for the free Lie algebra, its UEA is the free algebra, which has a 
> natural basis you can work with.
>
> I agree that the (NC) poly rings should be in the category of 
> AlgebrasWithBasis as they are given with a distinguished basis, but there 
> are methods that need to be implemented and some inconsistencies to resolve 
> IIRC.
>  
>
>> My objection is not only that pbw_basis() doesn't return a basis of L, 
>> but also that it returns algebra (with a preffered chosen basis).
>>
>
> I agree that it is not the best that it does not return a basis *of L*, 
> but there is fundamentally no difference between a basis of the UEA and the 
> UEA in a distinguished basis (other than possibly the interface).
>  
>
>> I propose to get rid of pbw_basis method and introduce optional argument 
>> pbw_basis_ordering to universal_enveloping_algebra method.
>>
>
> Very strong -1. I do not believe the UEA should be forced to be in the PBW 
> basis, which is what you are effectively making it do. Either that or you 
> do cannot impose the behavior of a PBW basis. It also imposes much stronger 
> restrictions on universal_enveloping_algebra(). In your proposal as well, 
> the code is suggesting that it should be two separate methods and there is 
> no easy way to construct the UEA in some PBW basis. I am open to changing 
> the name of the method pbw_basis(), but I oppose merging it with 
> universal_enveloping_algebra().
>
> Best,
> Travis
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to