Imports
CLRS Chapter 26.3 — One P-MERGE Cost Step
These reader theorems unfold one nonempty executable P-MERGE call. They keep the actual normalized split visible so later strong-induction proofs can use the exact child sizes and the three-quarter shrink theorem.
namespace CLRSnamespace Chapter27Exact work of one nonempty P-MERGE step: sequential search, two recursive children, one parallel fork/join, and one pivot-placement operation.
theorem pMerge_work_step_eq [LinearOrder α] (xs ys : List α)
(hzero : xs.length + ys.length ≠ 0) :
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
(pMerge xs ys).work =
S.search.work +
(pMerge S.lowerPrimary S.lowerSecondary).work +
(pMerge S.upperPrimary S.upperSecondary).work + 2 := by
rw [pMerge]
simp only [hzero, ↓reduceDIte]
simp [Costed.seq_work, Costed.par_work, Costed.charge_work]
omegaExact span of one nonempty P-MERGE step. Binary search precedes the slower recursive child; fork/join and pivot placement contribute two more units.
theorem pMerge_span_step_eq [LinearOrder α] (xs ys : List α)
(hzero : xs.length + ys.length ≠ 0) :
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
(pMerge xs ys).span =
S.search.span +
max (pMerge S.lowerPrimary S.lowerSecondary).span
(pMerge S.upperPrimary S.upperSecondary).span + 2 := by
rw [pMerge]
simp only [hzero, ↓reduceDIte]
simp [Costed.seq_span, Costed.par_span, Costed.charge_span]
omega
private theorem split_search_work_le_total_log [LinearOrder α]
(S : MergeSplit α) :
S.search.work ≤ Nat.log 2 S.totalSize + 1 := by
have hsearch :
S.search.work ≤ Nat.log 2 S.secondary.length + 1 := by
rw [S.search_eq]
exact binaryLowerBound_work_le_log S.secondary S.pivot
have hsecondary : S.secondary.length ≤ S.totalSize := by
calc
S.secondary.length ≤ S.primary.length + S.secondary.length := Nat.le_add_left _ _
_ = S.totalSize := by
simpa [MergeSplit.totalSize] using S.normalized_total
have hlog : Nat.log 2 S.secondary.length ≤ Nat.log 2 S.totalSize :=
Nat.log_monotone hsecondary
omega
private theorem split_search_span_le_total_log [LinearOrder α]
(S : MergeSplit α) :
S.search.span ≤ Nat.log 2 S.totalSize + 1 := by
have hsearch :
S.search.span ≤ Nat.log 2 S.secondary.length + 1 := by
rw [S.search_eq]
exact binaryLowerBound_span_le_log S.secondary S.pivot
have hsecondary : S.secondary.length ≤ S.totalSize := by
calc
S.secondary.length ≤ S.primary.length + S.secondary.length := Nat.le_add_left _ _
_ = S.totalSize := by
simpa [MergeSplit.totalSize] using S.normalized_total
have hlog : Nat.log 2 S.secondary.length ≤ Nat.log 2 S.totalSize :=
Nat.log_monotone hsecondary
omegaOne-step work upper bound in a form suitable for strong induction.
theorem pMerge_work_step_le [LinearOrder α] (xs ys : List α)
(hzero : xs.length + ys.length ≠ 0) :
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
(pMerge xs ys).work ≤
(pMerge S.lowerPrimary S.lowerSecondary).work +
(pMerge S.upperPrimary S.upperSecondary).work +
Nat.log 2 S.totalSize + 3 := by
dsimp only
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
have heq := pMerge_work_step_eq xs ys hzero
have hsearch := split_search_work_le_total_log S
change (pMerge xs ys).work ≤
(pMerge S.lowerPrimary S.lowerSecondary).work +
(pMerge S.upperPrimary S.upperSecondary).work +
Nat.log 2 S.totalSize + 3
change (pMerge xs ys).work = S.search.work +
(pMerge S.lowerPrimary S.lowerSecondary).work +
(pMerge S.upperPrimary S.upperSecondary).work + 2 at heq
omegaOne-step span upper bound in a form suitable for strong induction.
theorem pMerge_span_step_le [LinearOrder α] (xs ys : List α)
(hzero : xs.length + ys.length ≠ 0) :
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
(pMerge xs ys).span ≤
max (pMerge S.lowerPrimary S.lowerSecondary).span
(pMerge S.upperPrimary S.upperSecondary).span +
Nat.log 2 S.totalSize + 3 := by
dsimp only
let S := mergeSplit xs ys (Nat.pos_of_ne_zero hzero)
have heq := pMerge_span_step_eq xs ys hzero
have hsearch := split_search_span_le_total_log S
change (pMerge xs ys).span ≤
max (pMerge S.lowerPrimary S.lowerSecondary).span
(pMerge S.upperPrimary S.upperSecondary).span +
Nat.log 2 S.totalSize + 3
change (pMerge xs ys).span = S.search.span +
max (pMerge S.lowerPrimary S.lowerSecondary).span
(pMerge S.upperPrimary S.upperSecondary).span + 2 at heq
omegaend Chapter27end CLRS