# Compute determinant of matrix of Schur functions using Kronecker product

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

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


Then compare:

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

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

sage: f.kronecker_product(f)
s

edit retag close merge delete

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.

Sort by » oldest newest most voted

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

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

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

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

sage: kdet(a)
s


Compare:

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

sage: f.kronecker_product(f)
s


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.

more