# Revision history [back]

If you work over the fraction field of the parameters, you implicitly assume that all the parameters are nonzero.

Better just work in a big polynomial ring:

sage: R.<c2, s2, c1, s1, a1, a2, a3, l2, l3> = PolynomialRing(QQ, order='lex')
sage: I = R.ideal(l3*s1*s2 + l2*c1 - a1, l3*s1*c2 - l2*s1 - a2, l3*c2 - a3, c1^2 + s1^2 - 1, c2^2 + s2^2 - 1)
sage: list(I.groebner_basis())


You get a big "triangular" system of equations that you can try to solve from the bottom up.

The last equation involves only the parameters, so it is a consistency condition (if it is not satisfied, there is no solution). The second-to-last equation is $s_1a_3 - s_1l_2 - a_2=0$. If $a_3\neq l_2$ then you can solve it for $s_1$. If $a_3=l_2$ then $a_2=0$ and the remaining equation for $s_1$ is (at most) a quartic depending on the parameters, and so on.

If you work over the fraction field of the parameters, you implicitly assume that all the parameters are nonzero.nonzero, and even more: that all polynomial expressions in the parameters are nonzero (because they all may appear as denominators). Concretely: R.one().lift(I) gives a list of coefficients of generators of I such that the linear combination equals 1. (In particular, it shows that the Groebner basis is correct.) Of course these coefficients are (formal) fractions. But the non-vanishing of the denominator of these fractions is in fact inconsistent with the original system of equations.

Better just work in a big polynomial ring:

sage: R.<c2, s2, c1, s1, a1, a2, a3, l2, l3> = PolynomialRing(QQ, order='lex')
sage: I = R.ideal(l3*s1*s2 + l2*c1 - a1, l3*s1*c2 - l2*s1 - a2, l3*c2 - a3, c1^2 + s1^2 - 1, c2^2 + s2^2 - 1)
sage: list(I.groebner_basis())


You get a big "triangular" system of equations that you can try to solve from the bottom up.

The last equation involves only the parameters, so it is a consistency condition (if it is not satisfied, there is no solution). The second-to-last equation is $s_1a_3 - s_1l_2 - a_2=0$. If $a_3\neq l_2$ then you can solve it for $s_1$. If $a_3=l_2$ then $a_2=0$ and the remaining equation for $s_1$ is (at most) a quartic depending on the parameters, and so on.

If you work over the fraction field of the parameters, you implicitly assume that all the parameters are nonzero, and even more: that all nontrivial polynomial expressions in the parameters are nonzero (because they all may appear as denominators). Concretely: R.one().lift(I) gives a list of coefficients of generators of I such that the linear combination equals 1. (In particular, it shows that the Groebner basis is correct.) Of course these coefficients are (formal) fractions. But the non-vanishing of the denominator of these fractions is in fact inconsistent with the original system of equations.equations. Put another way: the parameters can not all be chosen arbitrarily; they must satisfy some consistency condition that follows from the system of equations (see below).

Better just work in a big polynomial ring:

sage: R.<c2, s2, c1, s1, a1, a2, a3, l2, l3> = PolynomialRing(QQ, order='lex')
sage: I = R.ideal(l3*s1*s2 + l2*c1 - a1, l3*s1*c2 - l2*s1 - a2, l3*c2 - a3, c1^2 + s1^2 - 1, c2^2 + s2^2 - 1)
sage: list(I.groebner_basis())


You get a big "triangular" system of equations that you can try to solve from the bottom up.

The last equation involves only the parameters, so it is a consistency condition (if it is not satisfied, then there is no solution). The second-to-last equation is $s_1a_3 - s_1l_2 - a_2=0$. If $a_3\neq l_2$ then you can solve it for $s_1$. If $a_3=l_2$ then $a_2=0$ and the remaining equation for $s_1$ is (at most) a quartic depending on the parameters, and so on.