The signs of the chain of the Sturm step #
The signs that the Sturm step computes, in the terms of Mathlib: the Horner value of
Ratpoints.Sturm.evalSign is 2 ^ (e deg) times the value of the polynomial of the row at
n / 2 ^ e (Ratpoints.Sturm.hornerValue_eq_eval), so that Ratpoints.Sturm.evalSign computes its
sign (Ratpoints.Sturm.run_evalSign_eq_sign_eval); the count of Ratpoints.Sturm.signsAt at a
point where f and f' do not both vanish is the number of sign variations
(List.signVariations) of the signs of the rows there
(Ratpoints.Sturm.run_signsAt_eq_signVariations); and the counts of
Ratpoints.Sturm.countsAtInfinity are the numbers of sign variations of the signs of the leading
coefficients, negated for odd degree at -∞
(Ratpoints.Sturm.run_countsAtInfinity_eq_signVariations).
The rows of a chain whose last row is constant are, over ℚ, positive multiples of the entries of
Mathlib's Polynomial.sturmSeq of f and f'
(Ratpoints.Sturm.IsChain.forall₂_posAssoc_sturmSeq, from Ratpoints.Sturm.IsChain.exists_mul_eq),
and so over ℝ
(Ratpoints.Sturm.IsChain.forall₂_posAssoc_sturmSeq_map); hence, for a polynomial of degree
d < 2 ^ 57 and the depths up to 55 of the Sturm step, Ratpoints.Sturm.signsAt computes the
signs of the real polynomial f and its derivative and the count V of Sturm's theorem
(Ratpoints.Sturm.IsChain.run_signsAt_eq), and Ratpoints.Sturm.countsAtInfinity the counts
V(+∞) and V(-∞) (Ratpoints.Sturm.IsChain.run_countsAtInfinity_eq).
Main definitions #
Ratpoints.Sturm.rowPolys: the polynomials overℚof the rows of a chain.Ratpoints.Sturm.chainPoly: the real polynomial of a chain.
Main statements #
Ratpoints.Sturm.hornerValue_eq_eval,Ratpoints.Sturm.run_evalSign_eq_sign_eval: the value and the sign of a row at a dyadic number.Ratpoints.Sturm.signCount_eq_signVariations,Ratpoints.Sturm.ite_add_signCount_eq_signVariations,Ratpoints.Sturm.run_signsAt_eq_signVariations: the count of the signs at a midpoint.Ratpoints.Sturm.run_countsAtInfinity_eq_signVariations: the counts at±∞.Ratpoints.Sturm.IsChain.forall₂_posAssoc_sturmSeq_map: the chain as the Sturm sequence overℝ.Ratpoints.Sturm.IsChain.run_signsAt_eq,Ratpoints.Sturm.IsChain.run_countsAtInfinity_eq: the signs and counts of the Sturm step are those of the real polynomial.
The Horner value of Ratpoints.Sturm.evalSign is 2 ^ (e deg) times the value of the
polynomial of the row at n / 2 ^ e.
The count of Ratpoints.Sturm.signsAt from the signs s0 and s1 of f and f', not both
zero, and the signs of the further rows: the sign variations of all of them.
The counts of Ratpoints.Sturm.countsAtInfinity for rows with nonzero leading coefficients:
the sign variations of the signs of the rows 0, …, k at +∞ and at -∞.
The count of Ratpoints.Sturm.signsAt at a point where f and f' do not both vanish is the
number of sign variations of the signs of the rows 0, …, k of the chain there.
The chain as a Sturm sequence #
In a chain, the row k + 2 is a positive multiple of the negated remainder of the row k by
the row k + 1, the entry of Polynomial.sturmSeq that follows them: by
Ratpoints.Sturm.IsChain.exists_mul_eq, -s_k = (g / A) s_(k+2) - (Q / A) s_(k+1), where
s_(k+2) has the smaller degree.
The polynomials over ℚ of the rows of a chain.
Equations
- Ratpoints.Sturm.rowPolys ch = List.map (fun (r : Array ℤ) => Ratpoints.poly r.toList) ch.toList
Instances For
The rows of a chain whose last row is constant are entrywise positive multiples of the entries
of the Sturm sequence of f and f', over ℚ.
The real polynomial of c that the chain of c and its degree d computes the remainder
chain of, the polynomial with the coefficients c₀, …, c_d over ℝ.
Equations
- Ratpoints.Sturm.chainPoly c d = Polynomial.map (Rat.castHom ℝ) (Ratpoints.poly (List.take (d + 1) c))
Instances For
The real polynomials of the rows of a chain whose last row is constant are entrywise positive
multiples of the entries of the Sturm sequence of f and f' over ℝ, the sequence of
Ratpoints.SturmTheorem.
Ratpoints.Sturm.evalSign computes the sign of the real polynomial of a row of a chain of a
polynomial of degree d < 2 ^ 57 at nm / 2 ^ dem for 0 ≤ dem ≤ 55, the depths of the Sturm
step, where the exponents stay within a long.
Integer signs of the values of a map g at the real polynomials of the rows of a chain have the
sign variations of those values.
The signs that Ratpoints.Sturm.evalSign computes for the rows of a chain whose last row is
constant, of a polynomial of degree d < 2 ^ 57, at nm / 2 ^ dem for 0 ≤ dem ≤ 55, have the
sign variations of the Sturm sequence of the real polynomial there.
At m = nm / 2 ^ dem, 0 ≤ dem ≤ 55, Ratpoints.Sturm.signsAt on a chain whose last row is
constant, of a polynomial of degree d < 2 ^ 57 that is squarefree over ℝ, computes the signs of
f(m) and f'(m) and the count V(m) of the Sturm sequence over ℝ.
The sign of the leading coefficient of the real polynomial of a row of a chain is the sign of
the row at +∞ of Ratpoints.Sturm.countsAtInfinity.
The sign at -∞ of the real polynomial of a row of a chain, (-1) ^ deg times the sign of its
leading coefficient, is the sign of the row at -∞ of Ratpoints.Sturm.countsAtInfinity.
For a chain whose last row is constant, the counts of Ratpoints.Sturm.countsAtInfinity are
the counts V(+∞) and V(-∞) of the Sturm sequence of the real polynomial.