-
-
Notifications
You must be signed in to change notification settings - Fork 504
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
unitary DFT for symmetric group algebra #38455
base: develop
Are you sure you want to change the base?
unitary DFT for symmetric group algebra #38455
Conversation
Documentation preview for this PR (built with commit 772980a; changes) is ready! 🎉 |
a8cd73c
to
27b5180
Compare
To handle extensions of \Q, we can work over a number field containing all necessary square roots. Currently there is some redundancy. I compute the diagonalizations to know which roots to take, then compute them again when computing Fourier coefficients. |
9b2e77f
to
392a6b9
Compare
getting environment error "pytest is not installed in the venv, skip checking tests that rely on it |
relevant MSE questions: |
dc43776
to
32c6924
Compare
I checked that this builds if merged over the latest beta. Could you fix "This branch is out-of-date with the base branch" ? |
That isn’t necessary until it is fully reviewed and only as a final check with the most recent changes. |
These rebases unbreak the CI - so that's the main reason to do it. |
It looks to me like the CI tests are passing (one skipped) so far. |
Work in issue 38456 is sufficient to construct this DFT. We compute |
So the However, I am thinking we should just reproduce their algorithm directly to take advantage of Sage's linear algebra packages. The only function really used is the What do you think? |
That's unfortunate that it's not included by default. I don't know what the barriers are to getting it incorporated, or how long that would take. It would certainly make things easy. I agree. We'd been talking about doing this anyways, and I'm happy to go ahead and just rewrite it in Sage. I'll try to get a basic version working tomorrow. Then there will probably be ways to optimize it. |
I believe it should just be getting the echelon form of the appropriately augmented Gram matrix of the initial sesquilinear form and then taking the appropriate submatrix (possibly transposed). So it should just be a few lines of code (at most). |
I agree it should a lot simpler than what is written in GAP. However, a straightforward augmentation and row reduction doesn't yield the correct matrix. For example, when
which is correct. However,
which is just
which suggests at some point we should be factoring scalars as |
Okay, a little bit more care is needed here since it does the RREF. We only want to operate on the strictly lower (or upper) triangle of the matrix as the other part is taken care of by the symmetry. So a short version is to use the inverse of the upper part of the LU decomposition:
Of course, this is not very efficient since it is computing far more things than necessary. However, it is easy to code... |
Mathematically it's not echelon form, and not even Gram-Schmid, as you have a twist by the Galois automorphism in the factorisation. |
For what it's worth, here is a direct translation of the GAP code into Sage which appears to be working now. Perhaps we can reduce it, but I agree with Dima that the twist makes it something slightly different.
|
a9ad203
to
e5de2bb
Compare
unitary DFT of symmetric group for number fields and finite fields - perform the unitary DFT of the symmetric group over finite fields and number fields - compute unitary representations of the symmetric group over finite fields - use real orthogonal representations as unitary representations for symmetric group Co-Authored-By: Travis Scrimshaw <[email protected]> Co-Authored-By: Dima Pasechnik <[email protected]>
we now have a standalone method to compute the Hermitian decomposition of a matrix, so we should use it when computing the change-of-basis matrix for a unitary representation
…sonwalters/sage into unitary_dft_symmetric_group
since U = A*A.H, we need to adjust the unitary representation to be A.H\rho(g)A.H.inverse(). also need to update the doctests
The doctests are currently failing. I'm using output from my laptop, but it doesn't match what's in Sage. For example,
is a factorization of the matrix
when it should be factorization of the matrix associated to the invariant symmetric bilinear form
I don't see any major differences between the code. EDIT: Confirmed, the Sage code is producing Note that |
@tscrim The only real difference is how the Specht modules are initiated. In the Sage code, we don't use SGA. It's a little concerning that setting that base_ring doesn't seem to change it:
It won't even run if you swap this with
Setting |
That is a bit concerning, but since it is defined over Z, then conputationally it should be the same. So that shouldnt matter. The invariance of the bilinear form needs to checked against the corresponding representation (and basis). It should work for whichever set of representation matrices you use (which usually give different matrices). The existence of the unitary form is definitely an isomorphism invariant. |
It should be the same, but it's the only difference between what I have in the notebook version. The Sage version is definitely computing a different I checked the two different forms, and only
If different matrices give a different form, that's fine, but isn't the space usually one dim'l? So whatever set of matrices is used to generate the linear system, the result should be the linear span of one matrix. In the above examples, they're not scalar multiples of each other. UPDATE: It appears that using |
appears to be working now with the change to using the symmetric group algebra to get the representation
That's not how linear algebra works. I just need to change my basis for the rerpreaentation vector space. This changes all of the matrices for the The way the two implementations construct the representations might be slightly different (i.e., have different matrices). However, I think the problem comes from what you noted, the matrix's base ring is wrong, which makes the |
using self._specht causes tests to fail
The problem I was seeing was that In any case, you're probably right that it's the conjugation. It's definitely to do with the line
which I am going to try replacing with
temporarily just to see if I can get tests passing, and match what's happening with the code in my notebook. |
when using the SGA version of specht, we don't have access to the yang_baxter_graph
Okay, so all tests (other than one of the flaky Meson / Conda ones) are passing. I would like to do a separate PR addressing the base_ring issues for |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Moving the conjugate-transpose part into the cached portion.
A = self._unitary_change_basis_matrix | ||
return A.H * rho(permutation) * A.H.inverse() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A = self._unitary_change_basis_matrix | |
return A.H * rho(permutation) * A.H.inverse() | |
A = self._unitary_change_basis_matrix | |
return A * rho(permutation) * A.inverse() |
total_system = sum((augmented_matrix(g) for g in G), []) | ||
null_space = matrix(F, total_system).right_kernel() | ||
U = matrix(F, d_rho, d_rho, null_space.basis()[0]) | ||
return U.hermitian_decomposition() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return U.hermitian_decomposition() | |
return U.hermitian_decomposition().H |
📝 Checklist
⌛ Dependencies