Skip to content
Browse chapters
Imports

Chapter 26 extension — parallel Strassen recurrences: monotonicity

This module proves successor monotonicity and the adjacent-power sandwiches used to lift the compatibility extension's exact solutions to every input.

namespace CLRSnamespace Chapter27

The parallel Strassen work recurrence does not decrease at a successor step.

private theorem strassenWork_le_succ : ∀ n, strassenWork n ≤ strassenWork (n + 1) := by intro n induction n using Nat.strong_induction_on with | h n ih => by_cases hn : n ≤ 1 · interval_cases n · rw [show strassenWork 0 = 0 by rw [strassenWork]; norm_num] exact Nat.zero_le _ · have hone : strassenWork 1 = 1 := by rw [strassenWork]; norm_num rw [hone, strassenWork_unfold (n := 2) (by norm_num)] norm_num [hone] · obtain ⟨m, rfl | rfl⟩ : ∃ m, n = 2 * m ∨ n = 2 * m + 1 := ⟨n / 2, by omega⟩ · have hdiv0 : 2 * m / 2 = m := by omega have hdiv1 : (2 * m + 1) / 2 = m := by omega rw [strassenWork_unfold (n := 2 * m) (by omega), strassenWork_unfold (n := 2 * m + 1) (by omega), hdiv0, hdiv1] have hsquare : (2 * m) * (2 * m) ≤ (2 * m + 1) * (2 * m + 1) := by nlinarith omega · have hdiv0 : (2 * m + 1) / 2 = m := by omega have hdiv1 : (2 * m + 1 + 1) / 2 = m + 1 := by omega rw [strassenWork_unfold (n := 2 * m + 1) (by omega), strassenWork_unfold (n := 2 * m + 1 + 1) (by omega), hdiv0, hdiv1] have ihm := ih m (by omega) have hsquare : (2 * m + 1) * (2 * m + 1) ≤ (2 * m + 1 + 1) * (2 * m + 1 + 1) := by nlinarith omega

Parallel Strassen work is monotone in the input size.

theorem strassenWork_monotone : Monotone strassenWork := monotone_nat_of_le_succ strassenWork_le_succ

Every positive parallel-Strassen work cost lies between its adjacent power-of-two costs.

theorem strassenWork_power_sandwich (n : ℕ) (hn : 0 < n) : strassenWork (2 ^ Nat.log 2 n) ≤ strassenWork n ∧ strassenWork n ≤ strassenWork (2 ^ (Nat.log 2 n + 1)) := Chapter04.monotone_power_sandwich strassenWork_monotone 2 n (by norm_num) hn.ne'

The parallel Strassen span recurrence does not decrease at a successor step.

private theorem strassenSpan_le_succ : ∀ n, strassenSpan n ≤ strassenSpan (n + 1) := by intro n induction n using Nat.strong_induction_on with | h n ih => by_cases hn : n ≤ 1 · interval_cases n · rw [show strassenSpan 0 = 0 by rw [strassenSpan]; norm_num] exact Nat.zero_le _ · have hone : strassenSpan 1 = 1 := by rw [strassenSpan]; norm_num rw [hone, strassenSpan_unfold (n := 2) (by norm_num)] norm_num [hone] · obtain ⟨m, rfl | rfl⟩ : ∃ m, n = 2 * m ∨ n = 2 * m + 1 := ⟨n / 2, by omega⟩ · have hdiv0 : 2 * m / 2 = m := by omega have hdiv1 : (2 * m + 1) / 2 = m := by omega rw [strassenSpan_unfold (n := 2 * m) (by omega), strassenSpan_unfold (n := 2 * m + 1) (by omega), hdiv0, hdiv1] · have hdiv0 : (2 * m + 1) / 2 = m := by omega have hdiv1 : (2 * m + 1 + 1) / 2 = m + 1 := by omega rw [strassenSpan_unfold (n := 2 * m + 1) (by omega), strassenSpan_unfold (n := 2 * m + 1 + 1) (by omega), hdiv0, hdiv1] exact Nat.add_le_add_right (ih m (by omega)) 1

Parallel Strassen span is monotone in the input size.

theorem strassenSpan_monotone : Monotone strassenSpan := monotone_nat_of_le_succ strassenSpan_le_succ

Every positive parallel-Strassen span cost lies between its adjacent power-of-two costs.

theorem strassenSpan_power_sandwich (n : ℕ) (hn : 0 < n) : strassenSpan (2 ^ Nat.log 2 n) ≤ strassenSpan n ∧ strassenSpan n ≤ strassenSpan (2 ^ (Nat.log 2 n + 1)) := Chapter04.monotone_power_sandwich strassenSpan_monotone 2 n (by norm_num) hn.ne'
end Chapter27end CLRS