The abstract Möbius transform over a commutative ring: clears to the
(a, b) window, homogenizes at degree n, and shifts back to the positive
axis. Built from Mathlib primitives so reflect_mul and the composition
lemmas apply directly.
Equations
- HexRealRootsMathlib.mobiusPoly n a b P = (Polynomial.reflect n ((P.comp (Polynomial.X + Polynomial.C b)).comp (Polynomial.C (a - b) * Polynomial.X))).comp (Polynomial.X + Polynomial.C 1)
Instances For
The inner (pre-reflection) polynomial of the Möbius transform.
Equations
- HexRealRootsMathlib.mobiusInner a b P = (P.comp (Polynomial.X + Polynomial.C b)).comp (Polynomial.C (a - b) * Polynomial.X)
Instances For
Ring-hom commutation. The Möbius transform commutes with mapping along a
ring homomorphism φ: every stage (X + C shift, C (a-b) * X dilation,
reflect, the final X + C 1 shift) is built from comp, reflect, C, X,
+, *, -, which all commute with Polynomial.map φ. This is the bridge from
the real transform to its complex-root picture (φ = algebraMap ℝ ℂ).
The inner Möbius polynomial has degree at most that of P: composing with
the degree-one shift X + C b preserves degree, and composing with the (at
most) degree-one dilation C (a-b) * X cannot raise it. Proved without
Nontrivial R (both linear factors are bounded by degree 1).
natDegree (reflect N f) ≤ N when f.natDegree ≤ N: reflection sends the
support into [0, N].
Reflect evaluation. Over a field, for f.natDegree ≤ N and z ≠ 0,
(reflect N f).eval z = z^N * f.eval z⁻¹: reflection is the x ↦ 1/x
homogenization at degree N.
Multiplicativity of the Möbius transform. With degrees split across the
two factors, mobiusPoly of a product is the product of the transforms. The
degree hypotheses feed reflect_mul.
Evaluation identity. Over a field, for P.natDegree ≤ n and 1 + z ≠ 0,
(mobiusPoly n a b P).eval z = (1+z)^n * P.eval ((a+b*z)/(1+z)). This is the
Möbius map t ↦ (a + b t)/(1 + t) cleared to a polynomial: positive real roots
t of mobiusPoly correspond to real roots of P at (a + b t)/(1 + t).
Value at -1. (mobiusPoly n a b P).eval (-1) = (P.comp (X + C b)).coeff n · (a-b)^n.
The homogenization sends the top coefficient to the constant term, read off at
-1 (which the final X + 1 shift sends to 0).
Shifting by X + C b preserves the top coefficient: at the natural degree,
(P.comp (X + C b)).coeff = P.leadingCoeff.
Value at -1, leading form. When n = natDegree P, the value at -1
is P.leadingCoeff · (a-b)^n.
Nonvanishing. For a ≠ b and P ≠ 0 at its own degree, the transform is
nonzero: its value at -1 is P.leadingCoeff · (a-b)^n ≠ 0.
Linear value (interior). For w ≠ b, the degree-one transform maps the
factor X - C w to C (b-w) · (X - C ((w-a)/(b-w))): the root w of X - C w
goes to (w-a)/(b-w).
Linear value (right endpoint). The factor X - C b (a root at the
excluded upper endpoint) collapses to the constant C (a - b): it has no
positive-root image.
mobiusPoly 0 fixes constants.
mobiusPoly 0 fixes 1.
Power form of multiplicativity: with a degree bound per factor,
mobiusPoly of a power is the power of the transform.
Nonvanishing, degree-free form. Over a field, for a ≠ b, the Möbius
transform of a nonzero polynomial is nonzero at every window degree k: each
pipeline stage (X + C shifts, the C (a-b) * X dilation, reflect) reflects
zeroness.
Root-multiplicity correspondence. Over a field, for a ≠ b and a target
w ≠ b, the multiplicity of (w-a)/(b-w) in the transform equals the
multiplicity of w in P.
Positive-root correspondence over ℝ. For a < b and natDegree P ≤ n,
the positive roots of the transform are exactly the images of the roots of P
in the open interval (a, b) under w ↦ (w-a)/(b-w).
Windowed root-count correspondence over ℝ. For a < b, P ≠ 0, and
natDegree P ≤ n, the number of positive roots of the transform (with
multiplicity) equals the number of roots of P in the open interval (a, b).
Complex root image. Over ℂ, for a ≠ b and P ≠ 0, the roots of the
Möbius transform at the exact degree n = natDegree P are the images of the
roots of P other than b under w ↦ (w-a)/(b-w): the b-roots escape to
infinity via the degree drop in the homogenization.
Sturm.signVariations is invariant under reversal (reading the coefficient
list forwards or backwards gives the same count).
Descending-list variation bridge. For any real polynomial, the abstract
Sturm.signVariations of the ascending coefficient list equals Mathlib's
Polynomial.signVariations (which reads the descending coeffList).
Descartes variation bridge. The executable Hex.descartesVar q equals
Mathlib's Polynomial.signVariations (toPolyℝ q). The executable count is on the
ascending sign list; the abstract count on the descending coeffList; the two
agree by reversal invariance and the destutter identity above.
Public mirror of the private Hex.dyadicNumExp: the
(numerator, denominator-exponent) pair of a dyadic value.
Equations
- HexRealRootsMathlib.numExp Dyadic.zero = (0, 0)
- HexRealRootsMathlib.numExp (Dyadic.ofOdd n k hn) = (n, k)
Instances For
Public mirror of the private Hex.mobiusEndpoints: the integer endpoint
numerators over the common power-of-two denominator 2^s.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Public mirror of the Hex.mobiusTransform pipeline past the endpoint
computation, parameterized by the integer data (α, β, s).
Equations
- One or more equations did not get rendered due to their size.
Instances For
The executable transform is the mirrored pipeline at the mirrored endpoint data: both sides reduce to the same term once the endpoint constructors are split.
The real cast intertwines the executable Horner composition with
Polynomial.comp.
The real cast turns the executable dilation into composition with
C c * X.
The executable Möbius bridge. For positive-degree p, the real cast of
Hex.mobiusTransform p I is 2^{s·n} times the abstract mobiusPoly at the
real endpoint values, with n the degree of p and s the common
denominator exponent of I's endpoints.
Positivity of the clearing factor: existential form of the bridge for
consumers that only need toPolyℝ (mobiusTransform p I) to be a positive
constant multiple of the abstract transform.
The Descartes count of the transform is the abstract sign-variation
count. The 2^{s·n} clearing factor is absorbed by
Polynomial.signVariations_C_mul; this is the form the engine proof cites.