The Sturm isolation engine.
ZPoly.isolateSturm? classifies its input explicitly:
p = 0(degree? = none):none.pa nonzero constant (degree? = some 0):somewith an empty isolation array, matchingZPoly.rootCount p = 0.assemble?certifies completeness (the chain is empty, sosturmVarNegInf − sturmVarPosInf = 0).pof positive degree that is notSquareFreeRat:none. Callers useHex.ZPoly.squareFreeCoreto obtain a square-free representative first.pof positive degree and square-free: build the chain once, runsturmVisitover(−rootBound p, rootBound p]with the depth budgetisolationDepth pand the two initial memoised endpoint counts, then hand the ordered emissions toassemble?.
A none from this engine on square-free positive-degree input has one precise
meaning: an interval at separation depth still reported two or more roots, or
the emitted total disagreed with ZPoly.rootCount p. The companion proves both
impossible for square-free input (isolateSturm?_isSome), so on that input
the engine is total in the sense that matters.
Equations
- One or more equations did not get rendered due to their size.