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: sage-8.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:

Status badges

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)

alphabets_sage.sage (8.5 KB) - added by mantepse 5 years ago.

Download all attachments as: .zip

Change History (28)

comment:1 Changed 5 years ago by zabrocki

  • Branch set to public/pleth_tensor/23446
  • Commit set to 575c455b9eeab7d6afb8380212cbc2c5f2d98038

Here is a first implementation


New commits:

575c455implement plethysm of tensor and example

comment:2 Changed 5 years ago by zabrocki

  • Component changed from PLEASE CHANGE to combinatorics

Changed 5 years ago by mantepse

comment:3 Changed 5 years ago by mantepse

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.

Last edited 5 years ago by mantepse (previous) (diff)

comment:4 Changed 5 years ago by mantepse

  • Cc mantepse added

comment:5 Changed 5 years ago by tscrim

  • Cc tscrim added

comment:6 Changed 4 years ago by git

  • Commit changed from 575c455b9eeab7d6afb8380212cbc2c5f2d98038 to 2e652ee401c15ab3b79d4d225897ccfa59b6efd6

Branch pushed to git repo; I updated commit sha1. New commits:

b545dcbMerge branch 'develop' into public/pleth_tensor/23446
2e652eemove functions within plethysm

comment:7 Changed 4 years ago by zabrocki

  • 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 zabrocki

  • Cc saliola added

comment:9 Changed 4 years ago by mantepse

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 follow-ups: Changed 4 years ago by zabrocki

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 ; follow-up: Changed 4 years ago by tscrim

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 git

  • Commit changed from 2e652ee401c15ab3b79d4d225897ccfa59b6efd6 to a769527880d00aa0e1e99cccf808aa94def3a44e

Branch pushed to git repo; I updated commit sha1. New commits:

a769527making code a little cleaner

comment:13 in reply to: ↑ 10 Changed 4 years ago by mantepse

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 mantepse

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 mantepse

  • Status changed from needs_review to needs_info

comment:16 Changed 4 years ago by git

  • Commit changed from a769527880d00aa0e1e99cccf808aa94def3a44e to fd3082d2d565ca9992a1febb652cd1aa69086cd2

Branch pushed to git repo; I updated commit sha1. New commits:

fd3082dchange order in which change of basis is done

comment:17 Changed 4 years ago by zabrocki

  • Status changed from needs_info to needs_review

Good call. It should compute in the p-basis 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 mantepse

  • Status changed from needs_review to positive_review

Many thanks, looks good!

comment:19 in reply to: ↑ 11 Changed 4 years ago by mantepse

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 write
    sage: ((X+Y)^2).restrict_degree([1,2])
    p[] # p[1, 1] + 2*p[1] # p[1]
    
  • similarly, for diagonal and scalar

comment:20 follow-up: Changed 4 years ago by tscrim

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 mantepse

Replying to tscrim:

I would just implement a TensorProducts category for the Sym bases with the appropriate methods in the ParentMethods.

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 vbraun

  • Status changed from positive_review to needs_work

Reviewer name missing

comment:23 Changed 4 years ago by mantepse

  • Authors changed from Mike Zabrocki to Martin Rubey
  • Reviewers set to Martin Rubey

comment:24 Changed 4 years ago by mantepse

  • Status changed from needs_work to positive_review

comment:25 Changed 4 years ago by zabrocki

  • Authors changed from Martin Rubey to Mike Zabrocki

comment:26 Changed 4 years ago by mantepse

Oh, I'm very sorry, that was autofill, probably! Thanks for correcting!

comment:27 Changed 4 years ago by vbraun

  • Branch changed from public/pleth_tensor/23446 to fd3082d2d565ca9992a1febb652cd1aa69086cd2
  • Resolution set to fixed
  • Status changed from positive_review to closed
Note: See TracTickets for help on using tickets.