Ask Your Question
1

Compute determinant of matrix of Schur functions using Kronecker product

asked 2020-08-02 07:43:12 +0100

Xie gravatar image

updated 2020-08-02 20:43:18 +0100

slelievre gravatar image

Given a matrix $m=(a_{i,j})$, where each $a_{i,j}$ is a Schur function, by default, m.det() will give the determinant using the original multiplication.

But I want it to use the Kronecker product for Schur functions.

I did not find any options to set the Kronecker product as default multiplication operator in the ring of Schur functions or in the matrix class.

To give an example, let us define such a matrix:

sage: Sym = SymmetricFunctions(QQ)
sage: s = Sym.schur()
sage: f = s[2]

sage: m = matrix([[f, 0], [0, f]])
sage: m
[s[2]    0]
[   0 s[2]]

Then compare:

sage: m.det()
s[2, 2] + s[3, 1] + s[4]

sage: f * f
s[2, 2] + s[3, 1] + s[4]

sage: f.kronecker_product(f)
s[2]
edit retag flag offensive close merge delete

Comments

Welcome to Ask Sage! Thank you for your question!

slelievre gravatar imageslelievre ( 2020-08-02 12:51:22 +0100 )edit

I edited your question to add a simple example of such a matrix, of size two by two.

This way others can copy and paste in a fresh Sage session to explore the question.

This increases the chances and the speed of an answer.

slelievre gravatar imageslelievre ( 2020-08-02 20:45:02 +0100 )edit

Does the example I added adequately illustrate the question? Otherwise please edit.

slelievre gravatar imageslelievre ( 2020-08-03 15:06:34 +0100 )edit

Yeah, you are right.

Xie gravatar imageXie ( 2020-08-11 04:40:20 +0100 )edit

1 Answer

Sort by ยป oldest newest most voted
0

answered 2020-08-02 21:51:28 +0100

slelievre gravatar image

updated 2020-08-03 01:01:41 +0100

Here is a function kdet that will compute the determinant as desired.

It works by creating a copy of the matrix, redefining the _mul_ method of its elements as kronecker_product, and computing the determinant of that matrix.

This does not completely answer the question, since the "Kronecker product determinant" of a matrix a has to be computed as kdet(a) rather than a.det().

Here is the proposed function kdet:

def kdet(a):
    r"""
    Return the "Kronecker product determinant" of the matrix `a`.

    That is, compute the determinant of `a` as usual except
    multiplying entries using the Kronecker product.
    """
    nr = a.nrows()
    nc = a.ncols()
    R = a.base_ring()
    z = R.zero()
    aa = a.list()
    mci = lambda e: e.monomial_coefficients().items()
    new = lambda e: sum((c * R(m) for m, c in mci(e)), z)
    bb = [new(e) for e in aa]
    for e in bb:
        e._mul_ = e.kronecker_product
    b = matrix(R, nr, nc, bb)
    return b.det()

Usage:

sage: S = SymmetricFunctions(QQ)
sage: s = S.schur()

sage: f = s[2]

sage: a = matrix([[f, 0], [0, f]])
sage: a
[s[2]    0]
[   0 s[2]]

sage: a.det()
s[2, 2] + s[3, 1] + s[4]

sage: det(a)
s[2, 2] + s[3, 1] + s[4]

sage: kdet(a)
s[2]

Compare:

sage: f * f
s[2, 2] + s[3, 1] + s[4]

sage: f.kronecker_product(f)
s[2]

To go further and enable using a.det, one is tempted to define a method _matrix_determinant for the ring s using kdet, but since kdet uses det, this leads to a recursion error.

sage: s._matrix_determinant = kdet
sage: a = matrix([[f, 0], [0, f]])
sage: a.det()
Traceback (most recent call last)
...
RecursionError: maximum recursion depth exceeded while calling a Python object

Hopefully the workaround provided by the function kdet is still useful.

edit flag offensive delete link more

Comments

This answer is wonderful. Thank you!

Xie gravatar imageXie ( 2020-08-11 04:42:26 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2020-08-02 07:43:12 +0100

Seen: 674 times

Last updated: Aug 03 '20