Determinants of Matrices with Symmetric Functions
I'm interested in calculating the determinant of the matrix $ A = (a_{i+j})$ for $0\leq i,j\leq n$ in which $a_{k} = \frac{h_k}{e_k}$ where $h_k, e_k$ are the homogeneous (elementary, resp.) symmetric functions of degree $k$. I would like to express the numerator of $\det(A)$ in terms of monomial symmetric functions.
I have written some code that I think does the job, but it seems an incredibly hacky way of doing it in my opinion. Since I am quite new to sage I was wondering whether someone might be able to take a look at what I've done and suggest a more sage-like way to tackle this problem? My code is below.
I define a set of functions:
# set up two matrices containing symbolic functions hh(i+j), ee(i+j), which are later replaced with symmetric functions h and e
def heMatrices(N):
hh = function('hh')
ee = function('ee')
H = matrix(SR,N,N,lambda i,j:hh(i+j))
E = matrix(SR,N,N,lambda i,j:ee(i+j))
return H,E
# Pointwise divides two matrices (a bit like Hadamard division??)
def elementwiseDivision( M, N ):
assert( M.parent() == N.parent() )
nc, nr = M.ncols(), M.nrows()
A = copy( M.parent().zero() )
for r in range(nr):
for c in range(nc):
A[r,c] = M[r,c] / N[r,c]
return A
# extracts numerator of determinant
def extractNumerator(M):
return det(M).numerator()
# extracts denominator of determinant
def extractDenominator(M):
return det(M).denominator()
# This is dodgy - treates expression as a python string and replaces e(x) with e[x], h(x) with h[x]
def convertToSymmetricString(expr):
st = str(expr)
st = st.replace('(','[')
st = st.replace(')',']')
st = st.replace('ee','e')
st = st.replace('hh','h')
return st
# Puts together the above functions.
def evaluateDeterminant(N):
h,e = heMatrices(N)
A = elementwiseDivision(h,e)
srExpression = extractNumerator(A)
sageExpression = convertToSymmetricString(srExpression)
return sageExpression
Then I open sage in the command line and type the following:
sage: Sym = SymmetricFunctions(QQ)
sage: Sym.inject_shorthands(verbose=False)
sage: ee = evaluateDeterminant(2)
sage: ans = sage_eval(ee, locals=vars())
sage: ans = m(ans)
which returns
2*m[2, 1, 1] + 2*m[2, 2] + 2*m[3, 1] + m[4]
which I believe is what I'm after.