The exact Budan–Fourier count for virtual roots #
The number of virtual roots of a nonzero real polynomial p in (a, b] equals the Budan–Fourier
drop V(a) - V(b) of the derivative tower. This turns the inequality of
BudanFourier.budan_fourier into an equality.
The proof shows V(x) = #{virtual roots of p greater than x} by induction down the derivative
tower; the step VirtualRoots.count_step compares the leading sign variation of the tower of p
with the virtual root that the interlacing places above x.
Main definitions #
VirtualRoots.Brackets lo hi p: every root of every member of the derivative tower ofplies in(lo, hi).
Main results #
VirtualRoots.fourierVar_eq_card_vroots_gt:fourierVar p xis the number of virtual roots ofpgreater thanx, forx ∈ [lo, hi).VirtualRoots.card_vroots_Ioc_eq_fourierVar: the number of virtual roots in(a, b]isfourierVar p a - fourierVar p b.
References #
- M. Coste, T. Lajous-Loaeza, H. Lombardi, M.-F. Roy, Generalized Budan–Fourier theorem and virtual roots, J. Complexity 21 (2005) 479–486.
Bracketing hypothesis. [lo,hi] strictly contains every root of every member of the
derivative tower of p. Then (as the count needs) all virtual roots lie in (lo,hi), V(lo) is the
degree, and V(hi) = 0.
Equations
- VirtualRoots.Brackets lo hi p = ∀ q ∈ BudanFourier.fourierSeq p, ∀ (z : ℝ), Polynomial.eval z q = 0 → z ∈ Set.Ioo lo hi
Instances For
The derivative tower of p is p followed by the tower of p' (for deg p ≥ 1). The structural
recursion that lets fourierVar and vroots be compared one degree at a time.
fourierVar recursion, root case. Where p vanishes, its sign-variation count equals that of
p': the leading zero is invisible.
fourierVar recursion, non-root case. Where p(x) ≠ 0, prepending its sign to the p'-tower
adds one variation iff that sign disagrees with the first surviving sign d of the p'-tower.
Count-above is monotone under a pointwise ≤. If L[i] ≤ M[i] entrywise, then at most as many
of L exceed x as of M. The signless engine of the vroots-side recursion.
Bridge: the Multiset-card form of N(x) equals the List.countP form the engine uses.
The derivative drops the degree by exactly one (characteristic zero), even at degree 0.
Lower bound of the vroots-side recursion. N_{p'}(x) ≤ N_p(x): each virtual root of p' above
x is matched by one of p above x (the right half of the interlacing).
Upper bound of the vroots-side recursion. N_p(x) ≤ N_{p'}(x) + 1: dropping the top virtual
root of p, the rest are dominated by those of p' (the left half of the interlacing).
Prepending a sign can only add variations: signChanges is monotone under cons
(a leading nonzero sign adds 0 or 1; a leading zero adds nothing).
The derivative's Fourier count never exceeds p's: the extra leading derivative p contributes
at most one new sign variation. The monotonicity that makes the count recursion telescope.
Toward count_step: foundational lemmas #
The key step needs that p is strictly monotone on each p'-cell, which needs p' to be sign-constant
there, which needs Coste's Prop. 2.2: every actual root of a polynomial is one of its virtual
roots. These lemmas build toward it: brackets_ne_zero, brackets_derivative (the bracket hypothesis
descends the tower), and exists_deriv_root_between (Rolle: a root of q' between any two roots of
q).
A bracketed polynomial is nonzero (0 would force the right endpoint hi into the open interval
(lo,hi)).
The bracket hypothesis descends to the derivative (its Fourier sequence is a tail of q's, for
deg q ≥ 1).
Rolle for the derivative tower. Between any two roots of q there is a root of q'.
A sorted list has no member strictly between two consecutive entries. The combinatorial fact
that pins each q'-root (which Coste 2.2 places among the breakpoints) to a breakpoint, never strictly
inside a cell.
Cell location. In a sorted list of length ≥ 2 spanning z (head ≤ z ≤ last), some
consecutive pair brackets z. Locates the cell of the breakpoint partition that contains a root.
Coste's Proposition 2.2. Every actual root of q (under the bracket hypothesis) is one of its
virtual roots. The keystone: it makes the breakpoints capture all of q''s roots, so q' is
sign-constant on each cell and q is monotone there. Proved by strong induction down the tower:
locate the root's cell (exists_bracket), capture it with ℛ_d (R_eval_eq_zero_of_exists), and rule
out a second root by Rolle (exists_deriv_root_between gives a q'-root in the open cell, which the
inductive hypothesis places among the breakpoints — impossible by not_mem_between).
(a)+(b): p is strictly monotone on each p'-cell #
Coste 2.2 makes p' root-free on each open cell; with the IVT that forces p' to keep a constant
sign there, hence (by the mean-value bedrock) p is strictly monotone across the closed cell — even
though p' may vanish at the breakpoint endpoints.
IVT sign-change. A continuous polynomial with opposite signs at the ends of an interval has a root strictly inside.
(a)+(b): monotone on a root-free cell. If p' has no root on the open interval (a,b), then
p is strictly monotone (one way or the other) on the closed [a,b].
(c): the count increment is the cell indicator #
With the breakpoints sorted, the virtual roots above x are a tail: every cell strictly above x
contributes its root, every cell strictly below contributes nothing, and only the cell containing x
is in question. So N_p(x) − N_{p'}(x) is exactly whether the virtual root of p in x's cell lies
above x.
Half-open cell location. In a sorted list of length ≥ 2 with head ≤ z < last, some
consecutive pair half-open-brackets z (L[i] ≤ z < L[i+1]).
Threshold count. If a list splits at index k into a ≤ x prefix and a > x suffix, then
the number of entries exceeding x is length − k.
The j-th virtual root of p' is the (j+1)-th breakpoint of the partition
bps = lo :: vroots(p') ++ [hi].
(c) The count increment is the cell indicator. With x located in the cell
[bps[i], bps[i+1]] of the p'-breakpoint partition (bps = lo :: vroots(p') ++ [hi]), the number of
virtual roots of p strictly above x exceeds that of p' by exactly whether the virtual root of p
sitting in that cell lies above x. Purely combinatorial: the interlacing forces every cell above x
to contribute a root, every cell below to contribute none, and only x's own cell to be in question.
(d) lemmas: the cell is p'-root-free and pins v_i to the sign of p(x) #
(d) p' is root-free on the open cell. Any root of p' strictly inside a cell would (Coste 2.2)
be a virtual root of p', i.e. a breakpoint — impossible strictly between two consecutive breakpoints.
(d) On an increasing cell, v_i sits above x iff p(x) < 0. The |p|-minimiser ℛ_d of a
strictly increasing p lies right of x exactly when p is still negative at x.
(d) On a decreasing cell, v_i sits above x iff p(x) > 0. The mirror of lt_R_iff_eval_neg
for a strictly decreasing p.
(d) The right-gap: a point z just above x avoiding all tower roots #
signs_right_eq_Rseq needs a point z > x at which no member of the derivative tower vanishes on
(x, z]. Such a z exists because each (nonzero) tower member has finitely many roots.
A single nonzero polynomial has a root-free half-open interval (x, z] for some z ≤ B.
The right-gap for a tower. For a finite list of nonzero polynomials and x < B, some
z ∈ (x, B] has every member root-free on (x, z].
p' keeps a constant sign across a root-free cell. Two interior points of a p'-root-free
cell give p' the same sign (IVT).
(d) The Fourier head d is the sign of p' just right of x. The first surviving sign of the
p'-tower at x equals sign (p'(z)) for any z just above x at which no tower member vanishes on
(x,z] — by signs_right_eq_Rseq (the pattern at z is Rseq of the pattern at x, whose head is
the first surviving sign).
THE key step (the one remaining analytic fact). The increment in the count of virtual roots above
x going from p' to p equals the Fourier increment V_p − V_{p'}. Geometrically: the interlacing
inserts a virtual root of p above x iff the virtual root of p in x's own p'-cell lies
above x, and that happens exactly when the leading sign of p at x produces a new Fourier
variation. Both recursions are pinned to {0,1} (the Fourier side by fourierVar_deriv_le, the count
side by N_deriv_le_N/N_le_N_deriv_succ); this lemma says the two bits agree.
Core reformulation. The Budan–Fourier count at x equals the number of virtual roots of p
strictly above x, by induction down the derivative tower with step count_step.
The exact virtual-root count. The number of virtual roots in (a,b] equals the
Budan–Fourier drop V(a) − V(b), turning the inequality of BudanFourier.budan_fourier into an
equality.