hex

9.4. What the certificate proves🔗

A successful Hex.isolate run is not just a list of squares; the companion reads a complete root enumeration out of it. Each atom names a genuine complex root, distinct atoms name distinct roots, and together they exhaust the root set:

🔗theorem
HexRootsMathlib.isolate_sound (p : Hex.ZPoly) (h : Hex.HasOnlySimpleRoots p) (atomPrec : ) (strategy : Hex.AtomStrategy) {atoms : Array (Hex.DyadicRootIsolation p)} (hrun : Hex.isolate p h atomPrec strategy = some atoms) : (List.map HexRootsMathlib.DyadicRootIsolation.root atoms.toList).toFinset = (HexRootsMathlib.toPolyℂ p).roots.toFinset iso atoms.toList, atomPrec iso.square.prec
HexRootsMathlib.isolate_sound (p : Hex.ZPoly) (h : Hex.HasOnlySimpleRoots p) (atomPrec : ) (strategy : Hex.AtomStrategy) {atoms : Array (Hex.DyadicRootIsolation p)} (hrun : Hex.isolate p h atomPrec strategy = some atoms) : (List.map HexRootsMathlib.DyadicRootIsolation.root atoms.toList).toFinset = (HexRootsMathlib.toPolyℂ p).roots.toFinset iso atoms.toList, atomPrec iso.square.prec

Successful isolation enumerates exactly the distinct complex roots and meets the requested precision, for every strategy and every executable edge case.

The root an atom names is a semantic value, not part of the executable data. The companion selects it from the atom's certificate:

🔗def

The unique complex root selected by an atom certificate.

Because the semantic roots of the returned atoms are exactly (toPolyℂ p).roots.toFinset, listing the atoms is a complete case analysis of the complex roots, the same way real-root isolation gives a complete analysis of the real roots. The Pisot example above is one instance: its three atoms account for every root, so bounding each atom bounds every root.