/-- Prove Gibbs' inequality. Hints: first show the termwise bound
`p x * log (q x / p x) ≤ q x - p x`, splitting into the cases `0 < p x` (use
`log_le_sub_one_of_pos`) and `p x = 0`; then sum with `sum_le_sum` and `sum_sub_distrib`. -/
theorem gibbs {p q : S → ℝ} (hp0 : ∀ x, 0 ≤ p x) (hp1 : ∑ x, p x = 1) (hq : ∀ x, 0 < q x)
(hq1 : ∑ x, q x ≤ 1) : ∑ x, p x * log (q x / p x) ≤ 0 := by
sorryShow the compiled solution
/-- **Gibbs' inequality.** If `p` is a distribution and `q > 0` with `∑ q ≤ 1`, then
`∑ p(x) log (q(x)/p(x)) ≤ 0`; equivalently the relative entropy
`D(p ‖ q) = ∑ p log (p/q)` is non-negative. Proof, as in the lesson: termwise
`p log (q/p) ≤ p (q/p − 1) = q − p` by `log t ≤ t − 1` (and `0 ≤ q` when `p = 0`); summing,
`∑ (q − p) = ∑ q − 1 ≤ 0`. -/
theorem gibbs {p q : S → ℝ} (hp0 : ∀ x, 0 ≤ p x) (hp1 : ∑ x, p x = 1) (hq : ∀ x, 0 < q x)
(hq1 : ∑ x, q x ≤ 1) : ∑ x, p x * log (q x / p x) ≤ 0 := by
have hterm : ∀ x, p x * log (q x / p x) ≤ q x - p x := by
intro x
rcases (hp0 x).lt_or_eq with hpos | hzero
· have := log_le_sub_one_of_pos (div_pos (hq x) hpos)
calc p x * log (q x / p x) ≤ p x * (q x / p x - 1) :=
mul_le_mul_of_nonneg_left this hpos.le
_ = q x - p x := by field_simp
· rw [← hzero]
simp [(hq x).le]
calc ∑ x, p x * log (q x / p x) ≤ ∑ x, (q x - p x) := sum_le_sum fun x _ => hterm x
_ = ∑ x, q x - ∑ x, p x := sum_sub_distrib _ _
_ ≤ 0 := by linarithAxioms used: propext, Classical.choice, Quot.soundformal/Lumenary/InformationTheory.leanTry it in the Lean web editor