Documentation

HexBerlekampZassenhausMathlib.Classical.CombinationIterator

theorem HexBerlekampZassenhausMathlib.subsetsOfSizeWithComplement_structure {α : Type} [DecidableEq α] (xs selected remaining : List α) (choose : ) :
xs.Nodup(selected, remaining) Hex.subsetsOfSizeWithComplement xs chooseselected.Nodup remaining.Nodup Disjoint selected.toFinset remaining.toFinset selected.toFinset remaining.toFinset = xs.toFinset selected.length = choose

Structural facts for a size-indexed selected/rejected partition.

Filtering a list by a predicate produces the corresponding member of the size-indexed selected/rejected enumerator.

theorem HexBerlekampZassenhausMathlib.scanDirectCombinations_found (coreLc : ) (target : Hex.ZPoly) (basis : Hex.LiftData) (lift : Hex.LiftSupport basis) (image : Hex.TargetImage target) (head : Hex.DirectLiftedIndex basis) (xs : List (Hex.DirectLiftedIndex basis)) (choose : ) (selectedRev rejectedRev : List (Hex.DirectLiftedIndex basis)) (selectedDegree : ) (selectedTrail : ) (split : Hex.DirectSplit basis) (tried : ) :
selectedDegree = Hex.directSelectedDegree basis (head :: selectedRev.reverse)selectedTrail = Hex.directSelectedTrail basis (head :: selectedRev.reverse)Hex.scanDirectCombinations coreLc target basis lift image head xs choose selectedRev rejectedRev selectedDegree selectedTrail = Hex.DirectLevelResult.found split tried∃ (selected : List (Hex.DirectLiftedIndex basis)) (remaining : List (Hex.DirectLiftedIndex basis)), (selected, remaining) Hex.subsetsOfSizeWithComplement xs choose split.selected = head :: (selectedRev.reverse ++ selected) split.remaining = rejectedRev.reverse ++ remaining Hex.tryDirectSplit coreLc target basis split.selected = some (split.candidate, split.quotient)

A successful leaf exposes its exact indexed split and candidate check.

theorem HexBerlekampZassenhausMathlib.scanDirectCombinations_finds (coreLc : ) (target : Hex.ZPoly) (basis : Hex.LiftData) (lift : Hex.LiftSupport basis) (image : Hex.TargetImage target) (head : Hex.DirectLiftedIndex basis) (xs : List (Hex.DirectLiftedIndex basis)) (choose : ) (selectedRev rejectedRev : List (Hex.DirectLiftedIndex basis)) (selectedDegree : ) (selectedTrail : ) (selected remaining : List (Hex.DirectLiftedIndex basis)) (candidate quotient : Hex.ZPoly) :
selectedDegree = Hex.directSelectedDegree basis (head :: selectedRev.reverse)selectedTrail = Hex.directSelectedTrail basis (head :: selectedRev.reverse)(selected, remaining) Hex.subsetsOfSizeWithComplement xs chooseHex.tryDirectSplit coreLc target basis (head :: (selectedRev.reverse ++ selected)) = some (candidate, quotient)∃ (split : Hex.DirectSplit basis) (tried : ), Hex.scanDirectCombinations coreLc target basis lift image head xs choose selectedRev rejectedRev selectedDegree selectedTrail = Hex.DirectLevelResult.found split tried

Every extensionally specified working split is reached by the streaming iterator (possibly after an earlier working split).

theorem HexBerlekampZassenhausMathlib.tryDirectSplit_some {coreLc : } {target : Hex.ZPoly} {basis : Hex.LiftData} {selected : List (Hex.DirectLiftedIndex basis)} {candidate quotient : Hex.ZPoly} (h : Hex.tryDirectSplit coreLc target basis selected = some (candidate, quotient)) :
candidate = Hex.directCandidate coreLc (Hex.liftModulus basis) (Hex.directSelectedFactors basis selected) quotient * candidate = target

Successful exact quotient and candidate identities at a checked leaf.