From this reference, it seems that a Groebner basis with respect to lexicographic order should yield a 'triangular system': www dot
scholarpedia.org/article/Groebner_basis. My system has three equations and three unknowns, which I want to transform into a series of three 1-D root finding problems.
R.<x0,x1,x2,x3,x4,x5,x6,x7,x8> = PolynomialRing(QQ)
F=R.fraction_field()
S.<x9,x10,x11> = PolynomialRing(F,order='lex');
I = S.ideal(
-x7*x10*x9 + x8*x2*x11**2 + x3*x0*x11 - x4*x10,
-x7*x10*x9 + x8*x2*x11**2 + 2*x5*x1*x11**2 - 2*x6*x9**2,
2*x7*x10*x9 - 2*x8*x2*x11**2 - x3*x0*x11 + x4*x10 - 2*x5*x1*x11**2 + 2*x6*x9**2
)
B = I.groebner_basis()
print('\n\n'.join(map(str,B)))
This yields four equations (rather than 3) which do not seem to exhibit this triangular property (first three equations mention all three variables x9,x10,x11, and the last one involves both x9 and x10).
x9^2 + ((-x4)/(2*x6))*x10 + ((-2*x1*x5)/(2*x6))*x11^2 + x0*x3/(2*x6)*x11
x9*x10 + x4/x7*x10 + ((-x2*x8)/x7)*x11^2 + ((-x0*x3)/x7)*x11
x9*x11^2 + 2*x0*x3/(2*x2*x8)*x9*x11 + ((-x4*x7)/(2*x2*x6*x8))*x10^2 + ((-2*x1*x5*x7)/(2*x2*x6*x8))*x10*x11^2 + x0*x3*x7/(2*x2*x6*x8)*x10*x11 + 2*x4^2/(2*x2*x7*x8)*x10 + ((-2*x4)/(2*x7))*x11^2 + ((-2*x0*x3*x4)/(2*x2*x7*x8))*x11
x10^3 + 2*x1*x5/x4*x10^2*x11^2 + ((-x0*x3)/x4)*x10^2*x11 + ((-2*x4*x6)/x7^2)*x10^2 + 4*x2*x6*x8/x7^2*x10*x11^2 + 4*x0*x3*x6/x7^2*x10*x11 + ((-2*x2^2*x6*x8^2)/(x4*x7^2))*x11^4 + ((-4*x0*x2*x3*x6*x8)/(x4*x7^2))*x11^3 + ((-2*x0^2*x3^2*x6)/(x4*x7^2))*x11^2
Do I have a misunderstanding about what to expect from Sage's output? Or is there a test to see if my system of equations is pathological in some way?
If I ignore the fact that variables x1...x8 are parameters, I am surprised to get a basis of three equations which is also not triangularizable with respect to x9,x10,x11.
S.<x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11> = PolynomialRing(QQ,order='lex');
I = S.ideal(
-x7*x10*x9 + x8*x2*x11**2 + x3*x0*x11 - x4*x10,
-x7*x10*x9 + x8*x2*x11**2 + 2*x5*x1*x11**2 - 2*x6*x9**2,
2*x7*x10*x9 - 2*x8*x2*x11**2 - x3*x0*x11 + x4*x10 - 2*x5*x1*x11**2 + 2*x6*x9**2
)
B = I.groebner_basis()
print('\n\n'.join(map(str,B)))
>>x0*x3*x6*x9^2 + 1/2*x0*x3*x7*x9*x10 - x1*x4*x5*x10*x11 - x1*x5*x7*x9*x10*x11 - 1/2*x2*x4*x8*x10*x11 + x2*x6*x8*x9^2*x11
x0*x3*x11 + x2*x8*x11^2 - x4*x10 - x7*x9*x10
x1*x5*x11^2 + 1/2*x2*x8*x11^2 - x6*x9^2 - 1/2*x7*x9*x10