teorth/PFR
Source indexedlemma · leanprover/lean4:v4.33.0-rc1
dist_diff_bound_1
PFR.ImprovedPFR · PFR/ImprovedPFR.lean:468 to 557
Mathematical statement
Exact Lean statement
lemma dist_diff_bound_1 :
(d[p.X₀₁ # U | ⟨V, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # U | ⟨W, S⟩] - d[p.X₀₁ # X₁])
+ (d[p.X₀₁ # V | ⟨U, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # V | ⟨W, S⟩] - d[p.X₀₁ # X₁])
+ (d[p.X₀₁ # W | ⟨U, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # W | ⟨V, S⟩] - d[p.X₀₁ # X₁])
≤ (16 * k + 6 * d[X₁ # X₁] + 2 * d[X₂ # X₂]) / 4 + (H[X₁ + X₁'] - H[X₂ + X₂']) / 4
+ (H[X₂ | X₂ + X₂'] - H[X₁ | X₁ + X₁']) / 4Complete declaration
Lean source
Full Lean sourceLean 4
lemma dist_diff_bound_1 : (d[p.X₀₁ # U | ⟨V, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # U | ⟨W, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # V | ⟨U, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # V | ⟨W, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # W | ⟨U, S⟩] - d[p.X₀₁ # X₁]) + (d[p.X₀₁ # W | ⟨V, S⟩] - d[p.X₀₁ # X₁]) ≤ (16 * k + 6 * d[X₁ # X₁] + 2 * d[X₂ # X₂]) / 4 + (H[X₁ + X₁'] - H[X₂ + X₂']) / 4 + (H[X₂ | X₂ + X₂'] - H[X₁ | X₁ + X₁']) / 4 := by have I1 := gen_ineq_01 p.X₀₁ p.hmeas1 X₁ X₂ X₂' X₁' hX₁ hX₂ hX₂' hX₁' h_indep.reindex_four_abcd have I2 := gen_ineq_00 p.X₀₁ p.hmeas1 X₁ X₂ X₁' X₂' hX₁ hX₂ hX₁' hX₂' h_indep.reindex_four_abdc have I3 := gen_ineq_10 p.X₀₁ p.hmeas1 X₁ X₂' X₂ X₁' hX₁ hX₂' hX₂ hX₁' h_indep.reindex_four_acbd have I4 := gen_ineq_10 p.X₀₁ p.hmeas1 X₁ X₂' X₁' X₂ hX₁ hX₂' hX₁' hX₂ h_indep.reindex_four_acdb have I5 := gen_ineq_00 p.X₀₁ p.hmeas1 X₁ X₁' X₂ X₂' hX₁ hX₁' hX₂ hX₂' h_indep.reindex_four_adbc have I6 := gen_ineq_01 p.X₀₁ p.hmeas1 X₁ X₁' X₂' X₂ hX₁ hX₁' hX₂' hX₂ h_indep.reindex_four_adcb have C1 : U + X₂' + X₁' = S := by abel have C2 : W + X₂ + X₂' = S := by abel have C3 : X₁ + X₂' + X₂ + X₁' = S := by abel have C4 : X₁ + X₂' + X₁' + X₂ = S := by abel have C5 : W + X₂' + X₂ = S := by abel have C7 : X₂ + X₁' = V := by abel have C8 : X₁ + X₁' = W := by abel have C9 : d[X₁ # X₂'] = d[X₁ # X₂] := h₂.symm.rdist_congr_right hX₁.aemeasurable have C10 : d[X₂ # X₁'] = d[X₁' # X₂] := rdist_symm have C11 : d[X₁ # X₁'] = d[X₁ # X₁] := h₁.symm.rdist_congr_right hX₁.aemeasurable have C12 : d[X₁' # X₂'] = d[X₁ # X₂] := h₁.symm.rdist_congr h₂.symm have C13 : d[X₂ # X₂'] = d[X₂ # X₂] := h₂.symm.rdist_congr_right hX₂.aemeasurable have C14 : d[X₁' # X₂] = d[X₁ # X₂] := h₁.symm.rdist_congr_left hX₂.aemeasurable have C15 : H[X₁' + X₂'] = H[U] := by apply ProbabilityTheory.IdentDistrib.entropy_congr have I : IdentDistrib (⟨X₁, X₂⟩) (⟨X₁', X₂'⟩) := h₁.prodMk h₂ (h_indep.indepFun zero_ne_one) (h_indep.indepFun (show 3 ≠ 2 by decide)) exact I.symm.comp measurable_add have C16 : H[X₂'] = H[X₂] := h₂.symm.entropy_congr have C17 : H[X₁'] = H[X₁] := h₁.symm.entropy_congr have C18 : d[X₂' # X₁'] = d[X₁' # X₂'] := rdist_symm have C19 : H[X₂' + X₁'] = H[U] := by rw [add_comm]; exact C15 have C20 : d[X₂' # X₂] = d[X₂ # X₂] := h₂.symm.rdist_congr_left hX₂.aemeasurable have C21 : H[V] = H[U] := by apply ProbabilityTheory.IdentDistrib.entropy_congr have I : IdentDistrib (⟨X₁', X₂⟩) (⟨X₁, X₂⟩) := by apply h₁.symm.prodMk (.refl hX₂.aemeasurable) (h_indep.indepFun (show 3 ≠ 1 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp measurable_add have C22 : H[X₁ + X₂'] = H[X₁ + X₂] := by apply ProbabilityTheory.IdentDistrib.entropy_congr have I : IdentDistrib (⟨X₁, X₂'⟩) (⟨X₁, X₂⟩) := by apply (IdentDistrib.refl hX₁.aemeasurable).prodMk h₂.symm (h_indep.indepFun (show 0 ≠ 2 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp measurable_add have C23 : X₂' + X₂ = X₂ + X₂' := by abel have C24 : H[X₁ | X₁ + X₂'] = H[X₁ | X₁ + X₂] := by apply IdentDistrib.condEntropy_eq hX₁ (hX₁.add hX₂') hX₁ (hX₁.add hX₂) have I : IdentDistrib (⟨X₁, X₂'⟩) (⟨X₁, X₂⟩) := by exact (IdentDistrib.refl hX₁.aemeasurable).prodMk h₂.symm (h_indep.indepFun (show 0 ≠ 2 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp (measurable_fst.prodMk measurable_add) have C25 : H[X₂ | V] = H[X₂ | X₁ + X₂] := by apply IdentDistrib.condEntropy_eq hX₂ (hX₁'.add hX₂) hX₂ (hX₁.add hX₂) have I : IdentDistrib (⟨X₁', X₂⟩) (⟨X₁, X₂⟩) := by exact h₁.symm.prodMk (IdentDistrib.refl hX₂.aemeasurable) (h_indep.indepFun (show 3 ≠ 1 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp (measurable_snd.prodMk measurable_add) have C26 : H[X₂' | X₂' + X₁'] = H[X₂ | X₁ + X₂] := by rw [add_comm] apply IdentDistrib.condEntropy_eq hX₂' (hX₁'.add hX₂') hX₂ (hX₁.add hX₂) have I : IdentDistrib (⟨X₁', X₂'⟩) (⟨X₁, X₂⟩) := h₁.symm.prodMk h₂.symm (h_indep.indepFun (show 3 ≠ 2 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp (measurable_snd.prodMk measurable_add) have C27 : H[X₂' | X₂ + X₂'] = H[X₂ | X₂ + X₂'] := by conv_lhs => rw [add_comm] apply IdentDistrib.condEntropy_eq hX₂' (hX₂'.add hX₂) hX₂ (hX₂.add hX₂') have I : IdentDistrib (⟨X₂', X₂⟩) (⟨X₂, X₂'⟩) := h₂.symm.prodMk h₂ (h_indep.indepFun (show 2 ≠ 1 by decide)) (h_indep.indepFun (show 1 ≠ 2 by decide)) exact I.comp (measurable_fst.prodMk measurable_add) have C28 : H[X₁' | X₁' + X₂'] = H[X₁ | X₁ + X₂] := by apply IdentDistrib.condEntropy_eq hX₁' (hX₁'.add hX₂') hX₁ (hX₁.add hX₂) have I : IdentDistrib (⟨X₁', X₂'⟩) (⟨X₁, X₂⟩) := h₁.symm.prodMk h₂.symm (h_indep.indepFun (show 3 ≠ 2 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp (measurable_fst.prodMk measurable_add) have C29 : H[X₁' | V] = H[X₁ | X₁ + X₂] := by apply IdentDistrib.condEntropy_eq hX₁' (hX₁'.add hX₂) hX₁ (hX₁.add hX₂) have I : IdentDistrib (⟨X₁', X₂⟩) (⟨X₁, X₂⟩) := h₁.symm.prodMk (IdentDistrib.refl hX₂.aemeasurable) (h_indep.indepFun (show 3 ≠ 1 by decide)) (h_indep.indepFun zero_ne_one) exact I.comp (measurable_fst.prodMk measurable_add) have C30 : H[X₂ | X₁ + X₂] = H[X₁ | X₁ + X₂] := by have := condEntropy_of_injective ℙ hX₁ (hX₁.add hX₂) _ (fun p ↦ add_right_injective p) convert! this with ω simp [add_comm (X₁ ω), add_assoc (X₂ ω), ZModModule.add_self] simp only [C1, C2, C3, C4, C5, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26, C27, C28, C29, C30] at I1 I2 I3 I4 I5 I6 ⊢ linarith only [I1, I2, I3, I4, I5, I6]