An isolation refined at least to separation precision. At this precision the
disc radius is below sep(p)/4, so two refined isolations isolate the same
root exactly when their discs intersect.
Equations
- Hex.RefinedIsolation p = { iso : Hex.DyadicRootIsolation p // ↑(Hex.mahlerPrec p) ≤ iso.square.prec }
Instances For
The circumscribed discs intersect. A single exact dyadic comparison (squared centre distance against squared radius sum).
Instances For
The identity of a simple root, independent of which isolation witnessed it.
(Quot of a bare relation; the companion proves Intersects is an
equivalence on RefinedIsolation whose classes are the simple roots.)
Equations
Instances For
The simple root witnessed by a refined isolation.
Equations
- Hex.SimpleRoot.mk iso = Quot.mk Hex.Intersects iso
Instances For
The simple root of p isolated by the square s. Both side conditions are
decidable checks on printable data, so a caller who has only a square --
a Repr output, a fixture, a literal -- rebuilds the certificate with
decide and recovers the root. The companion's ofSquare_mk identifies
the result with the root that any isolation on that square witnesses.
Equations
- Hex.SimpleRoot.ofSquare p s hw hp = Hex.SimpleRoot.mk ⟨{ square := s, witness := Hex.AtomCertificate.ofWitness hw }, hp⟩
Instances For
Boolean form of Intersects, used for equality tests on data containing
roots (see hex-number-field).
Instances For
Every structural atom certificate belongs to a polynomial with at least two stored coefficients. Exact reflection preserves that count.
A certified atom needs at least two stored coefficients.
A certified atom can only exist for a positive-degree polynomial.
Every represented simple root belongs to a positive-degree polynomial.
Wrap an isolation as a RefinedIsolation when it meets the separation
precision, deciding the subtype bound. ZPoly.isolateComplexRoots?'s output always
qualifies (its target has a separationDepth ≥ mahlerPrec floor); this
is the constructor consumers use to record that fact.
Equations
- iso.toRefined? = if h : ↑(Hex.mahlerPrec p) ≤ iso.square.prec then some ⟨iso, h⟩ else none