What Sturm's theorem says about an interval #
The consequences of Sturm's theorem (Ratpoints.SturmTheorem) for an interval with ends that may be
infinite, which the bisection of the Sturm step relies on: the counts of the Sturm sequence at the
ends (Ratpoints.vLeft, Ratpoints.vRight: V(l) at the lower end, V(r) plus 1 at a root r
at the upper end, V(∓∞) at the ends at infinity) agree exactly when the squarefree polynomial F
has no root strictly between them (Ratpoints.vLeft_eq_vRight_iff); then, when F is negative just
inside the lower end, it is negative between the ends and just inside the upper end
(Ratpoints.eval_neg_of_vLeft_eq_vRight); when the counts differ, or F is positive just inside
the lower end, F is positive somewhere between the ends (Ratpoints.exists_inside_eval_pos); and
equal counts at ∓∞ leave no root at all, so that F is negative everywhere when it is negative at
0 (Ratpoints.eval_neg_of_vBot_eq_vTop). Infinite ends are replaced by points far out, where the
counts and the signs are those at infinity (Ratpoints.eventually_atBot_sturm,
Ratpoints.eventually_atTop_sturm).
Main definitions #
Ratpoints.sturmV,Ratpoints.vBot,Ratpoints.vTop: the counts of the Sturm sequence at a point and at∓∞.Ratpoints.vLeft,Ratpoints.vRight,Ratpoints.sgnLeftEnd,Ratpoints.sgnRightEnd: the counts at the ends of an interval and, for a squarefreeF, the signs ofFjust inside them.Ratpoints.Inside: a point strictly between the ends.
Main statements #
Ratpoints.sturmV_eq_iff: the counts at finite ends agree exactly when no root lies between.Ratpoints.vLeft_eq_vRight_iff: the same for ends that may be infinite.Ratpoints.eval_neg_of_vLeft_eq_vRight: an interval that the bisection drops holds noxwithF(x) ≥ 0.Ratpoints.exists_inside_eval_pos: an interval that the bisection keeps holds anxwithF(x) > 0.Ratpoints.eval_neg_of_vBot_eq_vTop: a polynomial with equal counts at∓∞, negative at0, is negative everywhere.
The number of sign variations of the Sturm sequence of F and F' at x, the count of
Ratpoints.SturmTheorem.
Equations
- Ratpoints.sturmV F x = (List.map (Polynomial.eval x) (F.sturmSeq (Polynomial.derivative F))).signVariations
Instances For
The count of the Sturm sequence of F and F' at -∞: the number of sign variations of the
leading coefficients of its entries, each times (-1) ^ deg.
Equations
- Ratpoints.vBot F = (List.map (fun (p : Polynomial ℝ) => (-1) ^ p.natDegree * p.leadingCoeff) (F.sturmSeq (Polynomial.derivative F))).signVariations
Instances For
The count of the Sturm sequence of F and F' at +∞: the number of sign variations of the
leading coefficients of its entries.
Equations
Instances For
The count at the lower end l of an interval, none for -∞: V(l), or V(-∞).
Equations
- Ratpoints.vLeft F none = Ratpoints.vBot F
- Ratpoints.vLeft F (some a) = Ratpoints.sturmV F a
Instances For
The count at the upper end r of an interval, none for +∞: V(r), plus 1 at a root of
F, or V(+∞).
Equations
- Ratpoints.vRight F none = Ratpoints.vTop F
- Ratpoints.vRight F (some a) = Ratpoints.sturmV F a + if F.IsRoot a then 1 else 0
Instances For
At the lower end l of an interval, none for -∞: the sign of (-1) ^ deg F times the
leading coefficient of F at -∞, and at a finite end a that of F(a), or of F'(a) when
F(a) = 0. This is the sign of F just inside the end when F(a) and F'(a) do not both vanish,
as for a squarefree F, where it is not zero (Ratpoints.sgnLeftEnd_ne_zero).
Equations
- Ratpoints.sgnLeftEnd F none = SignType.sign ((-1) ^ F.natDegree * F.leadingCoeff)
- Ratpoints.sgnLeftEnd F (some a) = if Polynomial.eval a F = 0 then SignType.sign (Polynomial.eval a (Polynomial.derivative F)) else SignType.sign (Polynomial.eval a F)
Instances For
At the upper end r of an interval, none for +∞: the sign of the leading coefficient of
F at +∞, and at a finite end b that of F(b), or of -F'(b) when F(b) = 0. This is the
sign of F just inside the end when F(b) and F'(b) do not both vanish, as for a squarefree
F.
Equations
- Ratpoints.sgnRightEnd F none = SignType.sign F.leadingCoeff
- Ratpoints.sgnRightEnd F (some a) = if Polynomial.eval a F = 0 then -SignType.sign (Polynomial.eval a (Polynomial.derivative F)) else SignType.sign (Polynomial.eval a F)
Instances For
By Sturm's theorem, the counts V(l) and V(r), plus 1 at a root r, agree exactly when
F has no root in (l, r), for l < r.
Far left, the count is V(-∞), F has no root, and the sign of F is that at -∞.
Far right, the count is V(+∞), F has no root, and the sign of F is that of its leading
coefficient.
A finite point l' < x standing for the lower end l left of x: l itself, or a point far
left, with the count and the sign just right of it of the end.
A finite point r' > x standing for the upper end r right of x: r itself, or a point far
right, with the count and the sign just left of it of the end.
By Sturm's theorem, the counts at the ends of an interval agree exactly when F has no root
strictly between them.
The sign of a squarefree F just inside a lower end is not zero.
By Sturm's theorem, when the counts at the ends of an interval agree and F is negative just
inside its lower end, F is negative between the ends and just inside the upper end: the interval
holds no x with F(x) ≥ 0.
By Sturm's theorem, a squarefree real polynomial with equal counts at ∓∞ has no real root,
so that it is negative everywhere when it is negative at 0.
Next to a root of a squarefree F between the ends of an interval, F is positive at some
point between them: it changes its sign at the root.
By Sturm's theorem, F is positive at some point between the ends of an interval when the
counts at its ends differ, so that a root lies between them, or when F is positive just inside
its lower end.