Opened 5 years ago
Closed 4 years ago
#23446 closed enhancement (fixed)
Implement plethysm of tensors of symmetric functions
Reported by:  zabrocki  Owned by:  

Priority:  major  Milestone:  sage8.1 
Component:  combinatorics  Keywords:  sf, combinat 
Cc:  mantepse, tscrim, saliola  Merged in:  
Authors:  Mike Zabrocki  Reviewers:  Martin Rubey 
Report Upstream:  N/A  Work issues:  
Branch:  fd3082d (Commits, GitHub, GitLab)  Commit:  fd3082d2d565ca9992a1febb652cd1aa69086cd2 
Dependencies:  Stopgaps: 
Description
Currently plethsym of symmetric functions f(g)
where both f and g are symmetric functions is implemented. This ticket would add the feature to allow g
to be a tensor of symmetric functions.
If X = tensor([s[1],s[[]]])
and Y = tensor([s[[]], s[1]])
then f(X+Y)
and f(X*Y)
make sense and follow the notation found in mathematical papers that use plethystic notation.
Attachments (1)
Change History (28)
comment:1 Changed 5 years ago by
 Branch set to public/pleth_tensor/23446
 Commit set to 575c455b9eeab7d6afb8380212cbc2c5f2d98038
comment:2 Changed 5 years ago by
 Component changed from PLEASE CHANGE to combinatorics
Changed 5 years ago by
comment:3 Changed 5 years ago by
Hi Mike!
I attached some code for working with symmetric functions in several alphabets, including the plethysm of an ordinary and a multivariate symmetric function as well as the plethysm of a multivariate and an ordinary symmetric function. It is by no means polished, but maybe you can use it anyway.
comment:4 Changed 5 years ago by
 Cc mantepse added
comment:5 Changed 5 years ago by
 Cc tscrim added
comment:6 Changed 4 years ago by
 Commit changed from 575c455b9eeab7d6afb8380212cbc2c5f2d98038 to 2e652ee401c15ab3b79d4d225897ccfa59b6efd6
comment:7 Changed 4 years ago by
 Status changed from new to needs_review
It looks like my implementation is similar to Martin's. I think that adding features such as scalar product and change basis are for another ticket, but I agree that they would be useful.
comment:8 Changed 4 years ago by
 Cc saliola added
comment:9 Changed 4 years ago by
Do you think it would be possible to also support the following?
sage: s = SymmetricFunctions(QQ).s() sage: X = tensor([s([1]), s([])]) sage: Y = tensor([s([]), s([1])]); sage: X(s[2]) s[2] # s[] sage: Y(s[2]) 1/2*s[] # s[1, 1] + 1/2*s[] # s[2]  1/2*s[1, 1] # s[] + 1/2*s[2] # s[]
comment:10 followups: ↓ 11 ↓ 13 Changed 4 years ago by
Hi Martin, What is the definition of that notation? I understand what f(expression) means, but I am not sure if I know a meaning of the definition of (f \otimes g)(expression). Do you have a mathematical reference?
This is also not as easily introduced as you suggest since the parent of tensors of symmetric functions is not currently implemented.
comment:11 in reply to: ↑ 10 ; followup: ↓ 19 Changed 4 years ago by
Replying to zabrocki:
This is also not as easily introduced as you suggest since the parent of tensors of symmetric functions is not currently implemented.
Not quite. There is a parent for s # s
, but it is the generic CFM tensor product class. However, it would not be difficult to create such a parent (with perhaps a custom element class), and I think it would be straightforward to plug that into the current framework.
Some code comments:
This is a little cleaner:
tHA = TensorProductsCategory.category_of(HopfAlgebrasWithBasis(R)) +tHA = HopfAlgebrasWithBasis(R).TensorProducts()
Why not this:
 tparents = list(x.parent().__dict__['_sets']) + tparents = x.parent()._sets
For better readability (if it goes slightly over the 80 char/line, that's okay, it's worth it IMO):
return sum(d*prod(sum(raise_c(r)(c) * tensor([parent(p[r].plethysm(base(la))) for (base,la) in zip(tparents,trm)]) for (trm,c) in x) for r in mu) for (mu, d) in p(self))
comment:12 Changed 4 years ago by
 Commit changed from 2e652ee401c15ab3b79d4d225897ccfa59b6efd6 to a769527880d00aa0e1e99cccf808aa94def3a44e
Branch pushed to git repo; I updated commit sha1. New commits:
a769527  making code a little cleaner

comment:13 in reply to: ↑ 10 Changed 4 years ago by
In short, I think I should take back my suggestion.
Replying to zabrocki:
What is the definition of that notation?
It appears at the bottom of page 6 of https://arxiv.org/abs/math/0307383, Lambda(r)
is defined on top of page 5. Just as in Macdonald, the tensor positions correspond to the conjugacy classes of the cyclic group 1, zeta, zeta^2, ...
This is less artificial than it may look, it makes symmetric functions into a plethory, https://arxiv.org/abs/math/0407227v1.
On the other hand, it is more specialised than it looks, because it is the special case of the cyclic group of the more general definition on page 9 of https://arxiv.org/abs/math/0604126. Again, one needs to identify the conjugacy classes of a finite group with the tensor positions.
comment:14 Changed 4 years ago by
I don't now why, but my version is *much* faster:
sage: X = tensor([p([1]), p([])]); Y = tensor([p([]), p([1])]); sage: H = sum(h[n] for n in range(7)); sage: timeit("myplethysm(H, X*Y)") 5 loops, best of 3: 270 ms per loop sage: timeit("H(X*Y)") 5 loops, best of 3: 753 ms per loop sage: H = sum(h[n] for n in range(8)); sage: timeit("myplethysm(H, X*Y)") 5 loops, best of 3: 508 ms per loop sage: timeit("H(X*Y)") 5 loops, best of 3: 1.97 s per loop
comment:15 Changed 4 years ago by
 Status changed from needs_review to needs_info
comment:16 Changed 4 years ago by
 Commit changed from a769527880d00aa0e1e99cccf808aa94def3a44e to fd3082d2d565ca9992a1febb652cd1aa69086cd2
Branch pushed to git repo; I updated commit sha1. New commits:
fd3082d  change order in which change of basis is done

comment:17 Changed 4 years ago by
 Status changed from needs_info to needs_review
Good call. It should compute in the pbasis and then change to its target instead of changing to the target during the computation. The previous version computed target(p_r[expression_1]) \otimes ... \otimes target(p_r[expression_k]) and then took their product. This new version had comparable timings on my computer.
comment:18 Changed 4 years ago by
 Status changed from needs_review to positive_review
Many thanks, looks good!
comment:19 in reply to: ↑ 11 Changed 4 years ago by
Dear Travis,
do you have an idea how/where we should provide methods change_basis
, restrict_degree
, diagonal
and scalar
?
change_basis
would take a tensor product of symmetric functions and a tuple of as many bases as there are tensor positions. It's somehow like a "diagonally applied plethysm". Maybe we want to write:sage: tensor([s,h])(X*Y) s[1] # h[1]
 for
restrict_degree
, I'd like to writesage: ((X+Y)^2).restrict_degree([1,2]) p[] # p[1, 1] + 2*p[1] # p[1]
 similarly, for
diagonal
andscalar
comment:20 followup: ↓ 21 Changed 4 years ago by
I would just implement a TensorProducts
category for the Sym bases with the appropriate methods in the ParentMethods
.
comment:21 in reply to: ↑ 20 Changed 4 years ago by
Replying to tscrim:
I would just implement a
TensorProducts
category for the Sym bases with the appropriate methods in theParentMethods
.
Alas, I have absolutely no clue what I'd have to type into the editor to achieve this :(
Help appreciated, but I'm afraid I cannot contribute much besides what is in the attached file.
Best wishes,
Martin
comment:22 Changed 4 years ago by
 Status changed from positive_review to needs_work
Reviewer name missing
comment:23 Changed 4 years ago by
 Reviewers set to Martin Rubey
comment:24 Changed 4 years ago by
 Status changed from needs_work to positive_review
comment:25 Changed 4 years ago by
comment:26 Changed 4 years ago by
Oh, I'm very sorry, that was autofill, probably! Thanks for correcting!
comment:27 Changed 4 years ago by
 Branch changed from public/pleth_tensor/23446 to fd3082d2d565ca9992a1febb652cd1aa69086cd2
 Resolution set to fixed
 Status changed from positive_review to closed
Here is a first implementation
New commits:
implement plethysm of tensor and example