1 | initial version |

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.

2 | No.2 Revision |

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.

3 | No.3 Revision |

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.

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.