Elimination didn't find the correct ideal
Hi! I'm trying to compute the polynomial relations among matrix entries:
Here is the setup:
# the following codes are from python with sagemath a, b, c, d, e, f, g = var('a b c d e f g') N = Matrix(SR, [[a, e, f, g], [e, b, 0, 0], [f, 0, c, 0], [g, 0, 0, d]] ) M = N.inverse()
For the symmetric matrix N with the above zero patterns, we notice that the following relations should hold in its inverse, and indeed we verified them:
# below all passed assert M[0, 0] * M[1, 2] * M[1, 3] - M[0, 1] ** 2 * M[2, 3] == 0 assert M[0, 1] * M[0, 2] - M[0, 0] * M[1, 2] == 0 assert M[0, 1] * M[0, 3] - M[0, 0] * M[1, 3] == 0 assert M[0, 2] * M[0, 3] - M[0, 0] * M[2, 3] == 0 assert M[0, 3] * M[1, 2] - M[0, 1] * M[2, 3] == 0 assert M[0, 2] * M[1, 3] - M[0, 1] * M[2, 3] == 0
Then, I tried to see if these relations can be found automatically by elimination:
tag_variable_names = [f'M_{i}_{j}' for i in range(4) for j in range(i, 4)] R = PolynomialRing(QQ, tag_variable_names + ['a', 'b', 'c', 'd', 'e', 'f', 'g']) R_gens = R.gens_dict() param_symbolic_to_ring = {v: R_gens[str(v)] for v in [a, b, c, d, e, f, g]} equations = [] for i in range(4): for j in range(i, 4): true_expr = M[i, j].subs(param_symbolic_to_ring) # this true expression is fraction of polynomials w.r.t. parameters a, b, c, ..., and can be very complicated # we clear the denominator as follows: numerator, denominator = true_expr.numerator(), true_expr.denominator() equations.append(R_gens[f'M_{i}_{j}'] * denominator - R(numerator)) I = R.ideal(equations) # to get the relations among tag variables (entries of M), we eliminate the parameters J = I.elimination_ideal(list(param_symbolic_to_ring.values())) Ideal_M = J.change_ring(PolynomialRing(QQ, tag_variable_names))
I expect that the elimination ideal should contain the above relations. However, nothing was found:
> Ideal_M.gens() [0]
Why does this happen? Could it be related to handling fractions during the elimination? Any insights would be appreciated!
Btw, you don't need
param_symbolic_to_ring
, since instead ofM[i, j].subs(param_symbolic_to_ring)
you can simply useR.fraction_field()(M[i, j])
. Also,true_expr
(as you define it) is still a symbolic expression, as.subs()
does not perform conversion to another ring.