Dne pátek 2. března 2018 0:08:46 UTC+1 Travis Scrimshaw napsal(a):
>
>
>  
>>>
>>>> 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.
>>>  
>>>
>>
>> Thank you for clarification. I checked and they are different objects. 
>> They just have the same _repr_ string. Probably nothing to be done about 
>> that.
>>
>
> The reason for that is somewhere between being natural and being lazy. The 
> easiest way to implement the PBW basis was to pass the prefix to the 
> underlying basis indexing set and not do any string parsing and replacing 
> in the subclass of CombinatorialFreeModule. I also felt it was natural as I 
> outlined above.
>
>>  
>>
>>> 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. 
>>>
>>
>> OK. I don't really understand the wording of the ticket. I checked the 
>> example given there and it works and as far as I can tell it works as it 
>> should. In my opinion, Sage should give errors when the user tries to input 
>> something like 
>>
>> C.basis()[(1,0)]
>>
>
> Not if the basis is indexed by tuples or the indexing set that takes 
> tuples as input? You then put the burden on the user and double create the 
> indexing elements (or worse, you force a containment test). Also, there is 
> no reason why we should force the indexing set to be a subclass of Parent 
> or be a callable object.
>
>>
>> I don't know enough about implementation details to see why any 
>> performance hit there would matter. In case the speed is really needed 
>> perhaps we could have another (private) method without the checks that 
>> would be used in heavy calculations? Waiting few hours more for some 
>> extensive calculations is definitely better than risking a worng output 
>> because you somewhere made a transposition error (0, 1) -> (1, 0).
>>
>
> It is used in a tight loop (which this code can be), that can a few hours 
> can actually be double the time it used to take.
>  
>
>> 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.]
>>>
>>
>> And right there is the problem I have. Why do I, as a user, should know 
>> anything about the implementation details? Example of usage would bring me 
>> a long way. (Hence I propose to create a ticket for adding more examples 
>> into docstrings.)
>>
>
> +1 Go ahead and create it. I will be happy to review it.
>

I've created #24914. I will get around to it by the end of the week. I 
would appreciate pointers to where tensor() is defined and how would one 
actually define an arbitrary ordering for pbw_basis. 
 

>  
>
>> Perhaps even better would be to have a more descriptive docstring for  
>> SubsetsSorted that would explain that the objects are actually ordered 
>> tuples. Or at least that the objects are SortedSets.
>>
>
> Sometimes we need to make tradeoffs for ease of programming maintenance 
> and speed. Now we can check the user input to put it into correct form, but 
> IMO it is needless technical debt and wasted CPU cycles to use a more 
> complicated class than Python's tuple.
>
>>
>>> 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.
>>>
>>>
>> That's awesome! Great. It would be nicer if it worked even without the 
>> square brackets but that's just nitpicking. More importantly -- where are 
>> these features documented?
>>
>
> It is in CombinatorialFreeModule_tensor. I was thinking there was an 
> example in "tensor()", but there is not. We should add one to tensor().
>
>>  
>>
>>>
>>>>> 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.
>>>
>>
>> Perhaps a topic for SageDays94?
>>
>
> +1 <shameless plug>You should also apply for funding as a participant for 
> SageDays@ICERM too.</shameless plug>
>

Will do. Thanks!
 

>  
>>
>>>  
>>>
>>>> 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).
>>>
>>
>> There is a big conceptual difference between algebra and a basis of an 
>> algebra. For all practical purposes, pbw_basis() returns an object that 
>> behaves and is used, as far as I can see, as an algebra. I showed the 
>> current behavior to participants of SageDays93 and we all agreed that the 
>> current behavior of universal_enveloping_algebra() and pbw_basis() is 
>> confusing.
>>
>
> I do not know how you presented it, but I feel that it a bit unfair to say 
> because you yourself had said you are confused by it. Also, the pbw_basis() 
> is not an algebra in the abstract concept but a class modeling a chosen PBW 
> basis of the UEA. So there is a lot more structure (and limitations).
>

Sorry. I tried to be fair. I am attachign the notebook I used for 
demonstration.
 

>   
>>
>>>  
>>>
>>>> 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().
>>>
>>>
>> Sorry, I don't understand. What restrictions are you talking about here? 
>> PBW basis always  exists. Is it not true that all Lie algebras in Sage have 
>> one basis or another? 
>>
>
> Mathematical abstraction versus concrete computation. *Abstractly*, you 
> always have a PBW basis, so *abstractly* you always have an isomorphism 
> with any other class modeling a basis of the UEA. However, you may not know 
> what that isomorphism is *concretely*. Hence, it is impossible to define 
> a coercion between a PBW basis and a generic basis of the UEA. However, by 
> attaching a pbw_basis() to any UEA (which, as I said above, is wholly 
> impractical to do), you are tacitly saying there should be a way to go from 
> that UEA implementation to the object returned by the pbw_basis (I would 
> certainly object).
>
> Also, I believe it is possible to define a Lie algebra from an associative 
> algebra that does not have a (distinguished) basis, and so this Lie algebra 
> would not have a (distinguished) basis. At least, I do not believe there 
> are any technical limitations to this. You can also define an object in Lie 
> algebras as being a set of matrices satisfying certain conditions closed 
> under commutators and not know what an explicit basis is. While it does not 
> afford you much in the way of features currently, its not to say that there 
> might be enough structure there to do something useful with it. There is no 
> reason to limit the future.
>
>>  
>> In my opinion, the object coming from pbw_basis() is much more useful and 
>> will be used by more people than the one coming from 
>> universal_enveloping_algebra().
>>
>
> That is great for your applications. What if you want to look at certain 
> ideals of the UEA and, say, compute its syzygy module:
>
> sage: L = lie_algebras.sl(QQ,2)
> sage: UEA = L.universal_enveloping_algebra()
> sage: e,h,f = UEA.gens()
> sage: I = UEA.ideal(e^2-h, f^2-h, side='twosided')
> sage: I.syzygy_module()
>
> Being fair, I don't know if people actually look at such things, but I 
> know there are ways to compute Gröbner bases of NC ideals in Singular 
> (Plural?); this was the first hit on Google "noncommutative groebner basis, 
> singular"
>
>
> https://www.ricam.oeaw.ac.at/specsem/srs/groeb/download/Levandovskyy_ncgb.pdf
>
> So it might just be a matter of exposing Singular features in Sage to do 
> things like quotients in NC rings, whereas it do similar computations with 
> the PBW basis would require a significant amount of work currently.
>  
>

OK. Now I understand the need for abstract UAE. Thank you very much for 
clarification. 
 

> Somebody actually proposed the same thing as Sebastian. Since, as you say, 
>> there are implementation difficulties with that approach, what about: 
>> universal_enveloping_algebra -> abstract_universal_enveloping_algebra & 
>> pbw_basis -> universal_enveloping_algebra? Another suggestion was pbw_basis 
>> -> universal_enveloping_algebra_with_pbw_basis.
>>
>
> I believe that is completely unmanageable unless I am misunderstanding 
> something about your approach. You would require a (sub)class for each Lie 
> algebra that wanted to implement a different UEA that the PBW basis. Let me 
> say again that mathematics has a lot more freedom than computer 
> implementations; the canonical being the real numbers and formal power 
> series.
>
> Here is an idea based on one of your suggestions for how to have 
> universal_enveloping_algebra() be more, ahem, universal.
>
> def universal_enveloping_algebra(self, implementation=None, **kwds):
>     if implementation is None:
>         return self.lift.codomain()
>     elif implementation is "PBW":
>         return self.pbw_basis(**kwds)
>     else:
>         raise ValueError("invalid implementation")
>
> This way you can specify the implementation with having a default being 
> the (distinguished) one from _construct_UEA() and you get the PBW basis. 
> (Well, technically this would go in the LieAlgebrasWithBasis category and 
> the one in LieAlgebras would not have the extra PBW implementation elif.)
>
>
I believe this is pretty much what I suggested on 23.2. The latter 
suggestions are merely renames of the current methods. I think the absolute 
minimum we should do is to rename pbw_basis to something like 
universal_enveloping_algebra_pbw That way the naming is not confusing and 
the feature is easily discoverable by the user. Merging these two methods 
in the way you propose is IMHO nicer API.
 

> Best,
> Travis
>
>
Best regards,
                          Vit 

-- 
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.

Attachment: algebras.ipynb
Description: Binary data

Reply via email to