nevanlinna/Nevanlinna/logpos.lean

160 lines
3.4 KiB
Plaintext
Raw Permalink Normal View History

2024-12-20 15:27:06 +01:00
import Mathlib.Analysis.SpecialFunctions.Log.Basic
2024-12-19 16:10:51 +01:00
open Real
noncomputable def logpos : := fun r ↦ max 0 (log r)
2024-12-20 15:27:06 +01:00
notation "log⁺" => logpos
theorem loglogpos {r : } : log r = log⁺ r - log⁺ r⁻¹ := by
2024-12-19 16:10:51 +01:00
unfold logpos
rw [log_inv]
by_cases h : 0 ≤ log r
· simp [h]
· simp at h
have : 0 ≤ -log r := Left.nonneg_neg_iff.2 (le_of_lt h)
simp [h, this]
exact neg_nonneg.mp this
2024-12-20 15:27:06 +01:00
theorem logpos_norm {r : } : log⁺ r = 2⁻¹ * (log r + ‖log r‖) := by
2024-12-19 16:10:51 +01:00
by_cases hr : 0 ≤ log r
· rw [norm_of_nonneg hr]
have : logpos r = log r := by
unfold logpos
simp [hr]
rw [this]
ring
· rw [norm_of_nonpos (le_of_not_ge hr)]
have : logpos r = 0 := by
unfold logpos
simp
exact le_of_not_ge hr
rw [this]
ring
2024-12-20 15:27:06 +01:00
2025-01-03 14:07:53 +01:00
theorem logpos_nonneg
{x : } :
0 ≤ log⁺ x := by
unfold logpos
simp
2024-12-20 20:52:06 +01:00
theorem logpos_abs
{x : } :
log⁺ x = log⁺ |x| := by
unfold logpos
simp
-- Warning: This should be fixed in Mathlib
theorem log_pos_iff' (hx : 0 ≤ x) : 0 < log x ↔ 1 < x := by
by_cases h₁x : x = 0
· rw [h₁x]; simp
· exact log_pos_iff (lt_of_le_of_ne hx (Ne.symm h₁x))
theorem Real.monotoneOn_logpos :
MonotoneOn logpos (Set.Ici 0) := by
intro x hx y hy hxy
unfold logpos
simp
by_cases h : log x ≤ 0
· tauto
· simp [h]
simp at h
have : log x ≤ log y := by
apply log_le_log
--
rw [log_pos_iff' hx] at h
have : (0 : ) < 1 := by exact Real.zero_lt_one
exact lt_trans this h
assumption
constructor
· linarith
· linarith
theorem logpos_add_le_add_logpos_add_log2₀
{a b : }
(h : |a| ≤ |b|) :
log⁺ (a + b) ≤ log⁺ a + log⁺ b + log 2 := by
nth_rw 1 [logpos_abs]
nth_rw 2 [logpos_abs]
nth_rw 3 [logpos_abs]
calc log⁺ |a + b|
_ ≤ log⁺ (|a| + |b|) := by
apply Real.monotoneOn_logpos
simp [abs_nonneg]; simp [abs_nonneg]
apply add_nonneg
simp [abs_nonneg]; simp [abs_nonneg]
exact abs_add_le a b
_ ≤ log⁺ (|b| + |b|) := by
apply Real.monotoneOn_logpos
simp [abs_nonneg]
apply add_nonneg
simp [abs_nonneg]; simp [abs_nonneg]
simp [h]
linarith
_ = log⁺ (2 * |b|) := by
congr; ring
_ ≤ log⁺ |b| + log 2 := by
unfold logpos; simp
constructor
· apply add_nonneg
simp
exact log_nonneg one_le_two
· by_cases hb: b = 0
· rw [hb]; simp
exact log_nonneg one_le_two
· rw [log_mul, log_abs, add_comm]
simp
exact Ne.symm (NeZero.ne' 2)
exact abs_ne_zero.mpr hb
_ ≤ log⁺ |a| + log⁺ |b| + log 2 := by
unfold logpos; simp
theorem logpos_add_le_add_logpos_add_log2
{a b : } :
log⁺ (a + b) ≤ log⁺ a + log⁺ b + log 2 := by
by_cases h : |a| ≤ |b|
· exact logpos_add_le_add_logpos_add_log2₀ h
· rw [add_comm a b, add_comm (log⁺ a) (log⁺ b)]
apply logpos_add_le_add_logpos_add_log2₀
exact le_of_not_ge h
2025-01-03 14:07:53 +01:00
theorem monoOn_logpos :
MonotoneOn log⁺ (Set.Ici 0) := by
intro x hx y hy hxy
by_cases h₁x : x = 0
· rw [h₁x]
unfold logpos
simp
simp at hx hy
unfold logpos
simp
by_cases h₂x : log x ≤ 0
· tauto
· simp [h₂x]
simp at h₂x
have : log x ≤ log y := by
apply log_le_log
exact lt_of_le_of_ne hx fun a => h₁x (id (Eq.symm a))
assumption
simp [this]
calc 0
_ ≤ log x := by exact le_of_lt h₂x
_ ≤ log y := this