# How to get a solution from an ideal in a polynomial ring when it is nonzero codimensional?

Below is an ideal Id of codimension 3 (in normal-basis form). It is not 0-codim so we cannot do Id.variety(). Note that Id.dimension() provides the dimension of the ring modulo the ideal Id.

Question: How can we still get a solution?

sage: R.<s2,s3,a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15>=PolynomialRing(QQ)
sage: Id=Ideal(b9^2*b14^2*c0 - 1/9*b6*b11^3*c1, b8*b10^3*c1 - 9*b9^2*c0*c14^2, b10^4 + 9*b9^2*c14^2, b11^4 + 9*b9^2*b14^2, b14^2*c9^2 + 1/9*c10^4, c11^4 + 9*c9^2*c14^2, b8*b10*c1*c15 + 1/2*b9*c0*c14, b6*b11*c1*c15 - 1/2*b9*b14*c0, b14*c0*c1*c15 + 1/6*b4*c8*c10, b4*c8*c10*c15 - 1/6*b14*c0*c1, c3*c8*c10*c15 + 1/2*a14*b14*c4, b4*c6*c11*c15 + 1/6*c0*c1*c14, c3*c6*c11*c15 - 1/2*a14*c4*c14, c0*c1*c14*c15 - 1/6*b4*c6*c11, b8*b11^2 - 1/2*b6*b9, b8*b11*c1 + 1/2*b9*c0, b9*c0*c1 - 1/2*a14*b4, c0*c1*c9 - b3*c8*c11, b6*c1*c10 + 3*b14*c0*c15, c0*c1*c10 - 1/2*b3*c8, b4*c10^2 + 3*b3*b14*c15, b6*c10^2 - 3*b14*c8*c15, c3*c10^2 + 3*b14*c4*c15, b8*c1*c11 - 3*c0*c14*c15, c0*c1*c11 - 1/2*b3*c6, b4*c8*c11 + 1/6*c0*c1, c3*c8*c11 - 1/2*a14*c4, b4*c11^2 - 3*b3*c14*c15, b8*c11^2 + 3*c6*c14*c15, c3*c11^2 - 3*c4*c14*c15, c8*c11^2 - 1/2*c6*c9, b10^2*c15 - 1/2*b9*c14, b11^2*c15 + 1/2*b9*b14, a14*b14*c15 + 1/18*b6*c10, b9*b14*c15 - 1/18*b11^2, b14*c9*c15 - 1/18*c10^2, b6*c10*c15 - 1/2*a14*b14, c10^2*c15 + 1/2*b14*c9, b8*c11*c15 + 1/2*a14*c14, c11^2*c15 - 1/2*c9*c14, a14*c14*c15 - 1/18*b8*c11, b9*c14*c15 + 1/18*b10^2, c9*c14*c15 + 1/18*c11^2, s2^2 - 2, s3^2 - 3, a6^2 - 1/12, a6*a8 - 1/2*a14, a8^2 - 1/12, a6*a14 - 1/6*a8, a8*a14 - 1/6*a6, a14^2 - 1/36, a6*b0 - a8*b1, a8*b0 - a6*b1, a14*b0 - 1/6*b1, b0^2 + 1/2*c3, a14*b1 - 1/6*b0, b0*b1 + 3*a14*c3, b1^2 + 1/2*c3, a14*b3 + 1/3*c0*c1, b0*b3 + 1/3*c0, b1*b3 + 1/3*c1, b0*b4 - 2*b9*c0, b1*b4 - 2*b9*c1, a6*b6 + a8*b11, a8*b6 + a6*b11, a14*b6 + 1/6*b11, b0*b6 + b1*b11, b1*b6 + b0*b11, b3*b6 + b4*c8, b6^2 - b11^2, a6*b8 + a8*b10, a8*b8 + a6*b10, a14*b8 + 1/6*b10, b0*b8 + b1*b10, b1*b8 + b0*b10, b3*b8 + b4*c6, b6*b8 - 1/2*b9, b8^2 - b10^2, a14*b9 + 1/3*b8*b11, b3*b9 + 1/6*b4, a14*b10 + 1/6*b8, b3*b10 + b4*c11, b6*b10 - b8*b11, a14*b11 + 1/6*b6, b3*b11 + b4*c10, b10*b11 - 1/2*b9, b8*b14 + b6*c15, b10*b14 + b11*c15, a6*c0 - a8*c1, a8*c0 - a6*c1, a14*c0 - 1/6*c1, b0*c0 - 1/6, b1*c0 - a14, b6*c0 + b11*c1, b8*c0 + b10*c1, b10*c0 + b8*c1, b11*c0 + b6*c1, c0^2 + 1/2*b3, a14*c1 - 1/6*c0, b0*c1 - a14, b1*c1 - 1/6, c1^2 + 1/2*b3, b3*c3 - 1/9, b4*c3 + 2/3*b9, c0*c3 + 1/3*b0, c1*c3 + 1/3*b1, b3*c4 + 2/3*c9, b4*c4 - 1/9, b6*c4 + c3*c8, b8*c4 + c3*c6, b9*c4 + 1/6*c3, b10*c4 + c3*c11, b11*c4 + c3*c10, c0*c4 - 2*b0*c9, c1*c4 - 2*b1*c9, a6*c6 + a8*c11, a8*c6 + a6*c11, a14*c6 + 1/6*c11, b0*c6 + b1*c11, b1*c6 + b0*c11, b6*c6 - 1/12, b8*c6 + 3*c14*c15, b9*c6 - 1/6*b8, b10*c6 - b8*c11, b11*c6 + 1/2*a14, b14*c6 + c8*c15, c0*c6 + c1*c11, c1*c6 + c0*c11, c6^2 - c11^2, a6*c8 + a8*c10, a8*c8 + a6*c10, a14*c8 + 1/6*c10, b0*c8 + b1*c10, b1*c8 + b0*c10, b6*c8 - 3*b14*c15, b8*c8 - 1/12, b9*c8 - 1/6*b6, b10*c8 + 1/2*a14, b11*c8 - b6*c10, c0*c8 + c1*c10, c1*c8 + c0*c10, c6*c8 - 1/2*c9, c8^2 - c10^2, a14*c9 + 1/3*c8*c11, b4*c9 + 1/6*b3, b6*c9 - 1/6*c8, b8*c9 - 1/6*c6, b9*c9 - 1/36, b10*c9 - 1/6*c11, b11*c9 - 1/6*c10, c3*c9 + 1/6*c4, a14*c10 + 1/6*c8, b8*c10 + 1/2*a14, b9*c10 - 1/6*b11, b10*c10 - 1/12, b11*c10 - 3*b14*c15, c6*c10 - c8*c11, a14*c11 + 1/6*c6, b6*c11 + 1/2*a14, b9*c11 - 1/6*b10, b10*c11 + 3*c14*c15, b11*c11 - 1/12, b14*c11 + c10*c15, c10*c11 - 1/2*c9, b6*c14 - b8*c15, b11*c14 - b10*c15, b14*c14 - 1/36, c8*c14 - c6*c15, c10*c14 - c11*c15, c15^2 + 1/36, a0 - 1/2, a1 + 1/2, a2 + 2*a14, a3 - 1/3, a4, a5 + a6, a7 + a8, a9 + 2*a14, a10 - 1/3, a11 - 1/3, a12 + 1/6, a13 - a14, a15 + 1/6, b2 + 1/3, b5, b7 - 1/6, b12 + b14, b13 + c15, b15 + c15, c2 + 1/3, c5, c7 - 1/6, c12 + c14, c13 - c15)
sage: Id.dimension()
3

edit retag close merge delete

Sort by » oldest newest most voted

If you change R to have the lex monomial ordering by PolynomialRing(QQ, order='lex'), and then compute a Groebner basis by list(Id.groebner_basis(algorithm='singular:slimgb')) (avoiding a Singular bug), you get a "triangular" system of equations for your variety. If it were 0-dimensional, then you could start with the last equation and get a finite number of solutions, then use those to solve the second-to-last equation and get finitely many solutions, etc., all the way down. Since the ideal is not 0-dimensional, you will instead reach some point where you have infinitely many solutions, e.g. here you get c12 + c14 where neither value has been fixed before, so you can fix one of them and continue, e.g. adding c14-1, c11-1, c4-1 makes it 0-dimensional. (To check this you have to change the monomial ordering back, to avoid the same Singular bug.) Normally one would then call .variety() at this point, but an alternative that happens to work here is to solve symbolically:

sage: I = Id + R.ideal(c14-1, c11-1, c4-1)
sage: solve(list(map(SR,list(I.groebner_basis(algorithm='singular:slimgb')))),list(map(SR,R.gens())))[0]
[a0 == (1/2),
a1 == (-1/2),
a10 == (1/3),
a11 == (1/3),
a12 == (-1/6),
a13 == (-1/6),
a14 == (-1/6),
a15 == (-1/6),
a2 == (1/3),
a3 == (1/3),
a4 == 0,
a5 == -1/6*sqrt(3),
a6 == 1/6*sqrt(3),
a7 == 1/6*sqrt(3),
a8 == -1/6*sqrt(3),
a9 == (1/3),
b0 == -1/2*(-1)^(1/4),
b1 == 1/2*(-1)^(1/4),
b10 == (1/2*I),
b11 == (1/12),
b12 == (-1/36),
b13 == (1/6*I),
b14 == (1/36),
b15 == (1/6*I),
b2 == (-1/3),
b3 == (2/9*I),
b4 == (1/9),
b5 == 0,
b6 == (1/12),
b7 == (1/6),
b8 == (1/2*I),
b9 == (1/12*I),
c0 == 1/3*I*(-1)^(1/4),
c1 == -1/3*I*(-1)^(1/4),
c10 == (-1/6*I),
c11 == 1,
c12 == -1,
c13 == (-1/6*I),
c14 == 1,
c15 == (-1/6*I),
c2 == (-1/3),
c3 == (-1/2*I),
c4 == 1,
c5 == 0,
c6 == 1,
c7 == (1/6),
c8 == (-1/6*I),
c9 == (-1/3*I),
s2 == -sqrt(2),
s3 == -sqrt(3)]

more

Very good, thanks!

( 2020-08-12 09:59:34 +0100 )edit

You can intersect with some hyperplanes to get a 0-dimensional variety, That means adding more polynomials to the ideal, say c1-4,c2-5,c3-6 (I haven't checked if this is 0-dimensional). You'll probably not find rational solutions that way, though, because the 0-dimensional variety that you do get probably doesn't have rational points.

In general, non-empty varieties can easily not have rational points. Take the variety defined by x^2+y^2-1 in Q[x,y]. Finding rational solutions on varieties is an unsolved problem.

Over an algebraically closed field, though, Hilbert's Nulstellensatz gives you that solutions exist and the hyperplane trick works. I'm not sure that .variety() is happy to return points in algebraically closed fields, though (in a way, the 0-dimensional ideal IS the algebraic point already, so there is not really a need to go further)

more

1

The hyperplane trick works, but .variety() runs into this Singular bug because there are more than 30-something variables, and unfortunately .variety() currently does not allow control over the Groebner basis algorithm that it uses internally.

( 2020-08-11 18:44:02 +0100 )edit

The addition of c1-4,c2-5,c3-6 makes the ideal (-1)-codimensional.

sage: Id.dimension()
-1


In other words, to find the appropriate hyperplanes to intersect with could be a problem.

( 2020-08-12 07:16:06 +0100 )edit

Ah, OK. That could very well be. If your variety is 3-dimensional, though, then intersecting with 3 randomly generated hyperplanes would give you something 0-dimensional (you need to pick very special hyperplanes for that to fail!). Glancing at the ideal, there are a lot of linear relations in there. You can greatly simplify the problem by projecting away variable involved in linear relations. By the looks of it (the linear equations are at the end, you could eliminate something like 21 variables this way. For instance, you see from those equations that any solution will have $c_2=-1/3,c_5=0$. You definitely want to do that before you start intersecting with hyperplanes.

( 2020-08-12 09:11:51 +0100 )edit