sagemath / sage

Main repository of SageMath. Now open for Issues and Pull Requests.
https://www.sagemath.org
Other
1.08k stars 394 forks source link

Implement the ladder idempotents of the symmetric group algebra #37859

Closed tscrim closed 1 day ago

tscrim commented 2 weeks ago

We implement the so-called ladder idempotents of the symmetric group algebra $F[S_n]$, defined by Ryom-Hansen, which can be used to construct the projective covers of simple modules when the field $F$ has positive characteristic.

:memo: Checklist

:hourglass: Dependencies

tscrim commented 2 weeks ago

@AndrewMathas This is something I came across while trying to devise a method to construct the projective covers. Thought it might be worthwhile to add.

AndrewMathas commented 1 week ago

The e-ladders returned by ladder_tableau are e+1-ladders in the literature. This needs to be changed or it will confuse the people who are likely to use this. The reason ladders come up is that they give nodes of constant e-residue, which is why they have slope e-1. Secondly, ladder_sizes should be renamed as ladder_lengths because this is the term used in the literature.

Apart from these minor points, everything seems fine. I have forgotten the protocols when reviewing. In particular, I don't remember when it is permissible for me to make these changes or if I suggest you make them.

When I went to test your code I discovered that I have the following method that returns a dictionary of the e-ladders of a partition.

def ladders(self,e):
    """INPUT: ladders(``e``), for a non-negative integer ``e``.

    Returns a dictionary containing the ladders in the diagram of the partition.
    A node $(i,j)$ in a partition belongs to the $l$th $e$-ladder where
    $l=(e-1)r+c$.

    EXAMPLES::

        sage: Partition([3,2]).ladders(3)
        {0: [(0, 0)], 1: [(0, 1)], 2: [(0, 2), (1, 0)], 3: [(1, 1)]}
    """
    lads={}
    for row in range(len(self)):
        for col in range(self[row]):
            l=col+row*(e-1)
            if not l in lads: lads[l]=[]
            lads[l].append((row,col))
    return lads

I suggest that this method be added as part of this PR.

tscrim commented 1 week ago

Thank you. That's a good point. I think I lost track of what $e$ meant when writing the function. I also made the other change you suggested and added your code.

In the trac workflow, you would be allowed to push commits. However, with GH this has become very inconvenient for reviewers (or general collaborative code writing) to do... (The "standard" ways would be to either do a PR to the branch on my fork (not the main repo here); just do your own PR with the additional commit(s); or I pull commits from a specific branch of yours) Well, no matter what I am okay with you pushing changes in one form or another (we might even set up something so you can just generically push to my fork, but it might not be worth the trouble)

tscrim commented 1 week ago

What do you want ladders() to do when e = 0? Error out?

AndrewMathas commented 1 week ago

What do you want ladders() to do when e = 0? Error out?

Sincee=0 corresponds to characteristic zero, the 0-ladders are the ladders when e is large. Setting e to be the size plus one is large enough. Above I suggested replacing line 2982 with e = self.size() if e=0 else e-1 but I guess it really should be e = self.size()+1 if e=0 else e-1

Edit: actually, e = self.size() if e=0 else e-1 is sufficient as no two nodes in a diagram with n nodes can have the same n-residue. In this case the ladder tableau is just the initial tableau.

tscrim commented 1 week ago

For the ladder_tableau() method, I agree that this is clear. However, the behavior of ladders() depends on the size. While it isn't a major difference, it is not quite consistent as I add boxes to the bottom. Compare:

sage: Partition([3, 2]).ladders(0)
{0: [(0, 0)], 1: [(0, 1)], 2: [(0, 2)], 5: [(1, 0)], 6: [(1, 1)]}
sage: Partition([3, 2, 1]).ladders(0)
{0: [(0, 0)], 1: [(0, 1)], 2: [(0, 2)], 6: [(1, 0)], 7: [(1, 1)], 12: [(2, 0)]}
sage: Partition([3, 2, 1, 1]).ladders(0)
{0: [(0, 0)], 1: [(0, 1)], 2: [(0, 2)], 7: [(1, 0)], 8: [(1, 1)], 14: [(2, 0)], 21: [(3, 0)]}

In particular, see the ladder for the cell (1, 0) changing. It's just a matter of what the best behavior would be, but it is unlikely to be used in that setting I feel. So this might basically be bikeshedding...

AndrewMathas commented 1 week ago

Good catch: I evidently had not applied my comment to the ladders method. For e=0 the set of nodes in the different ladders are independent of n whenever it is large enough but the "ladder index" changes.

In particular, see the ladder for the cell (1, 0) changing. It's just a matter of what the best behavior would be, but it is unlikely to be used in that setting I feel. So this might basically be bikeshedding...

This is correct because the "ladder index" depends on e, or the partition size when e=0, because the ladder index counts the ladders in order starting from the ladder through (0, 0). The reason why the ladder index for (1, 0) changes when e=0 is that there are some ladders for partitions of n that do not intersect these partitions. The way it is set up, the first n cells in the first row of a partition will be in ladders of index 0, 1, ..., n-1, respectively, the first n cells in the second row will have ladder indices n, n+1, ..., 2n-1 etc. For e ≥ n, each ladder will contain a single node, but the ladder indices depend on n.

Btw, Steen's ladder idempotents still make sense when e=0: in this case, these idempotents pick out a Specht module, which is (irreducible and) projective in characteristic zero.

AndrewMathas commented 1 week ago

If you're happy, then I will set this to a positive review.

tscrim commented 1 week ago

Thank you. I added some more documentation and examples to illustrate these points about e = 0. If everything looks good to you, then please approve the PR and also set it to a positive review. (The former is more important as I cannot do that, but I can do the latter).

AndrewMathas commented 1 week ago

Thanks for your changes. Looks good to me!

tscrim commented 1 week ago

Thank you. Could you also please approve the PR by going to the "files changed" and do the "review changes" with selecting the "approve"?

tscrim commented 1 week ago

(The last force push was just to remove some trailing whitespace I accidentally added.)

tscrim commented 1 week ago

Thank you.

vbraun commented 1 week ago

Docs don't build (see CI)

tscrim commented 6 days ago

Sorry about that; fixed.

github-actions[bot] commented 5 days ago

Documentation preview for this PR (built with commit 57549762f2fc80c8ce518bb9ea00496251c1b070; changes) is ready! :tada: This preview will update shortly after each push to this PR.