File: Mathlib/Analysis/Complex/Hadamard.lean

full_name: Complex.HadamardThreeLines.verticalStrip
code: /-- The vertical strip in the complex plane containing all `z ∈ ℂ` such that `z.re ∈ Ioo a b`. -/
def verticalStrip (a : ℝ) (b : ℝ) : Set ℂ 
goal: Set ℂ

full_name: Complex.HadamardThreeLines.verticalClosedStrip
code: /-- The vertical strip in the complex plane containing all `z ∈ ℂ` such that `z.re ∈ Icc a b`. -/
def verticalClosedStrip (a : ℝ) (b : ℝ) : Set ℂ 
goal: Set ℂ

full_name: Complex.HadamardThreeLines.sSupNormIm
code: /-- The supremum of the norm of `f` on imaginary lines. (Fixed real part)
This is also known as the function `M` -/
noncomputable def sSupNormIm {E : Type*} [NormedAddCommGroup E]
    (f : ℂ → E) (x : ℝ) : ℝ 
goal: ℝ

full_name: Complex.HadamardThreeLines.invInterpStrip
code: /--
The inverse of the interpolation of `sSupNormIm` on the two boundaries.
In other words, this is the inverse of the right side of the target inequality:
`|f(z)| ≤ |M(0) ^ (1-z)| * |M(1) ^ z|`.

Shifting this by a positive epsilon allows us to prove the case when either of the boundaries
is zero.-/
noncomputable def invInterpStrip (ε : ℝ) : ℂ 
goal: ℂ

full_name: Complex.HadamardThreeLines.F
code: /-- A function useful for the proofs steps. We will aim to show that it is bounded by 1. -/
noncomputable def F (ε : ℝ) 
goal: E

full_name: Complex.HadamardThreeLines.sSupNormIm_nonneg
code: /-- `sSup` of `norm` is nonneg applied to the image of `f` on the vertical line `re z = x` -/
lemma sSupNormIm_nonneg (x : ℝ) : 0 ≤ sSupNormIm f x 
goal: 0 ≤ Complex.HadamardThreeLines.sSupNormIm f x

full_name: Complex.HadamardThreeLines.sSupNormIm_eps_pos
code: /-- `sSup` of `norm` translated by `ε > 0` is positive applied to the image of `f` on the
vertical line `re z = x` -/
lemma sSupNormIm_eps_pos {ε : ℝ} (hε : ε > 0) (x : ℝ) : 0 < ε + sSupNormIm f x 
goal: 0 < ε + Complex.HadamardThreeLines.sSupNormIm f x

full_name: Complex.HadamardThreeLines.abs_invInterpStrip
code: /-- Useful rewrite for the absolute value of `invInterpStrip`-/
lemma abs_invInterpStrip {ε : ℝ} (hε : ε > 0) :
    abs (invInterpStrip f z ε) =
    (ε + sSupNormIm f 0) ^ (z.re - 1) * (ε + sSupNormIm f 1) ^ (-z.re) 
goal: Complex.abs (Complex.HadamardThreeLines.invInterpStrip f z ε) =
  (ε + Complex.HadamardThreeLines.sSupNormIm f 0) ^ (z.re - 1) *
    (ε + Complex.HadamardThreeLines.sSupNormIm f 1) ^ (-z.re)

full_name: Complex.HadamardThreeLines.diffContOnCl_invInterpStrip
code: /-- The function `invInterpStrip` is `diffContOnCl`. -/
lemma diffContOnCl_invInterpStrip {ε : ℝ} (hε : ε > 0) :
    DiffContOnCl ℂ (fun z ↦ invInterpStrip f z ε) (verticalStrip 0 1) 
goal: DiffContOnCl ℂ (fun z => Complex.HadamardThreeLines.invInterpStrip f z ε) (Complex.HadamardThreeLines.verticalStrip 0 1)

full_name: Complex.HadamardThreeLines.norm_le_sSupNormIm
code: /-- If `f` is bounded on the unit vertical strip, then `f` is bounded by `sSupNormIm` there. -/
lemma norm_le_sSupNormIm (f : ℂ → E) (z : ℂ) (hD : z ∈ verticalClosedStrip 0 1)
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) :
    ‖f z‖ ≤ sSupNormIm f (z.re) 
goal: ‖f z‖ ≤ Complex.HadamardThreeLines.sSupNormIm f z.re

full_name: Complex.HadamardThreeLines.norm_lt_sSupNormIm_eps
code: /-- Alternative version of `norm_le_sSupNormIm` with a strict inequality and a positive `ε`. -/
lemma norm_lt_sSupNormIm_eps (f : ℂ → E) (ε : ℝ) (hε : ε > 0) (z : ℂ)
    (hD : z ∈ verticalClosedStrip 0 1) (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) :
    ‖f z‖ < ε + sSupNormIm f (z.re) 
goal: ‖f z‖ < ε + Complex.HadamardThreeLines.sSupNormIm f z.re

full_name: Complex.HadamardThreeLines.F_BddAbove
code: /-- When the function `f` is bounded above on a vertical strip, then so is `F`. -/
lemma F_BddAbove (f : ℂ → E) (ε : ℝ) (hε : ε > 0)
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) :
    BddAbove ((norm ∘ (F f ε)) '' (verticalClosedStrip 0 1)) 
goal: BddAbove (norm ∘ Complex.HadamardThreeLines.F f ε '' Complex.HadamardThreeLines.verticalClosedStrip 0 1)

full_name: Complex.HadamardThreeLines.F_edge_le_one
code: /-- Proof that `F` is bounded by one one the edges. -/
lemma F_edge_le_one (f : ℂ → E) (ε : ℝ) (hε : ε > 0) (z : ℂ)
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) (hz : z ∈ re ⁻¹' {0, 1}) :
    ‖F f ε z‖ ≤ 1 
goal: ‖Complex.HadamardThreeLines.F f ε z‖ ≤ 1

full_name: Complex.HadamardThreeLines.norm_mul_invInterpStrip_le_one_of_mem_verticalClosedStrip
code: theorem norm_mul_invInterpStrip_le_one_of_mem_verticalClosedStrip (f : ℂ → E) (ε : ℝ) (hε : 0 < ε)
    (z : ℂ) (hd : DiffContOnCl ℂ f (verticalStrip 0 1))
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) (hz : z ∈ verticalClosedStrip 0 1) :
    ‖F f ε z‖ ≤ 1 
goal: ‖Complex.HadamardThreeLines.F f ε z‖ ≤ 1

full_name: Complex.HadamardThreeLines.interpStrip
code: /--
The interpolation of `sSupNormIm` on the two boundaries.
In other words, this is the right side of the target inequality:
`|f(z)| ≤ |M(0) ^ (1-z)| * |M(1) ^ z|`.

Note that if `(sSupNormIm f 0) = 0 ∨ (sSupNormIm f 1) = 0` then the power is not continuous
since `0 ^ 0 = 1`. Hence the use of `ite`. -/
noncomputable def interpStrip (z : ℂ) : ℂ 
goal: ℂ

full_name: Complex.HadamardThreeLines.interpStrip_eq_of_pos
code: /-- Rewrite for `InterpStrip` when `0 < sSupNormIm f 0` and `0 < sSupNormIm f 1`. -/
lemma interpStrip_eq_of_pos (z : ℂ) (h0 : 0 < sSupNormIm f 0) (h1 : 0 < sSupNormIm f 1) :
    interpStrip f z = (sSupNormIm f 0) ^ (1 - z) * (sSupNormIm f 1) ^ z 
goal: Complex.HadamardThreeLines.interpStrip f z =
  ↑(Complex.HadamardThreeLines.sSupNormIm f 0) ^ (1 - z) * ↑(Complex.HadamardThreeLines.sSupNormIm f 1) ^ z

full_name: Complex.HadamardThreeLines.interpStrip_eq_of_zero
code: /-- Rewrite for `InterpStrip` when `0 = sSupNormIm f 0` or `0 = sSupNormIm f 1`. -/
lemma interpStrip_eq_of_zero (z : ℂ) (h : sSupNormIm f 0 = 0 ∨ sSupNormIm f 1 = 0) :
    interpStrip f z = 0 
goal: Complex.HadamardThreeLines.interpStrip f z = 0

full_name: Complex.HadamardThreeLines.interpStrip_eq_of_mem_verticalStrip
code: /-- Rewrite for `InterpStrip` on the open vertical strip. -/
lemma interpStrip_eq_of_mem_verticalStrip (z : ℂ) (hz : z ∈ verticalStrip 0 1) :
    interpStrip f z = (sSupNormIm f 0) ^ (1 - z) * (sSupNormIm f 1) ^ z 
goal: Complex.HadamardThreeLines.interpStrip f z =
  ↑(Complex.HadamardThreeLines.sSupNormIm f 0) ^ (1 - z) * ↑(Complex.HadamardThreeLines.sSupNormIm f 1) ^ z

full_name: Complex.HadamardThreeLines.diffContOnCl_interpStrip
code: lemma diffContOnCl_interpStrip :
    DiffContOnCl ℂ (interpStrip f) (verticalStrip 0 1) 
goal: DiffContOnCl ℂ (Complex.HadamardThreeLines.interpStrip f) (Complex.HadamardThreeLines.verticalStrip 0 1)

full_name: Complex.HadamardThreeLines.norm_le_interpStrip_of_mem_verticalClosedStrip_eps
code: lemma norm_le_interpStrip_of_mem_verticalClosedStrip_eps (ε : ℝ) (hε : ε > 0) (z : ℂ)
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1)))
    (hd : DiffContOnCl ℂ f (verticalStrip 0 1)) (hz : z ∈ verticalClosedStrip 0 1) :
    ‖f z‖ ≤  ‖((ε + sSupNormIm f 0) ^ (1-z) * (ε + sSupNormIm f 1) ^ z : ℂ)‖ 
goal: ‖f z‖ ≤
  ‖(↑ε + ↑(Complex.HadamardThreeLines.sSupNormIm f 0)) ^ (1 - z) *
      (↑ε + ↑(Complex.HadamardThreeLines.sSupNormIm f 1)) ^ z‖

full_name: Complex.HadamardThreeLines.eventuallyle
code: lemma eventuallyle (z : ℂ) (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1)))
    (hd : DiffContOnCl ℂ f (verticalStrip 0 1)) (hz : z ∈ verticalStrip 0 1) :
    (fun _ : ℝ ↦ ‖f z‖) ≤ᶠ[𝓝[>] 0]
    (fun ε ↦ ‖((ε + sSupNormIm f 0) ^ (1 - z) * (ε + sSupNormIm f 1) ^ z : ℂ)‖) 
goal: (fun x => ‖f z‖) ≤ᶠ[𝓝[>] 0] fun ε =>
  ‖(↑ε + ↑(Complex.HadamardThreeLines.sSupNormIm f 0)) ^ (1 - z) *
      (↑ε + ↑(Complex.HadamardThreeLines.sSupNormIm f 1)) ^ z‖

full_name: Complex.HadamardThreeLines.norm_le_interpStrip_of_mem_verticalStrip_zero
code: lemma norm_le_interpStrip_of_mem_verticalStrip_zero (z : ℂ)
    (hd : DiffContOnCl ℂ f (verticalStrip 0 1))
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) (hz : z ∈ verticalStrip 0 1) :
    ‖f z‖ ≤ ‖interpStrip f z‖ 
goal: ‖f z‖ ≤ ‖Complex.HadamardThreeLines.interpStrip f z‖

full_name: Complex.HadamardThreeLines.norm_le_interpStrip_of_mem_verticalClosedStrip
code: /--
**Hadamard three-line theorem** on `re ⁻¹' [0,1]`: If `f` is a bounded function, continuous on the
closed strip `re ⁻¹' [0,1]` and differentiable on open strip `re ⁻¹' (0,1)`, then for
`M(x) := sup ((norm ∘ f) '' (re ⁻¹' {x}))` we have that for all `z` in the closed strip
`re ⁻¹' [0,1]` the inequality `‖f(z)‖ ≤ M(0) ^ (1 - z.re) * M(1) ^ z.re` holds. -/
lemma norm_le_interpStrip_of_mem_verticalClosedStrip (f : ℂ → E) {z : ℂ}
    (hz : z ∈ verticalClosedStrip 0 1) (hd : DiffContOnCl ℂ f (verticalStrip 0 1))
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1))) :
    ‖f z‖ ≤ ‖interpStrip f z‖ 
goal: ‖f z‖ ≤ ‖Complex.HadamardThreeLines.interpStrip f z‖

full_name: Complex.HadamardThreeLines.norm_le_interp_of_mem_verticalClosedStrip'
code: /-- **Hadamard three-line theorem** on `re ⁻¹' [0,1]` (Variant in simpler terms): Let `f` be a
bounded function, continuous on the closed strip `re ⁻¹' [0,1]` and differentiable on open strip
`re ⁻¹' (0,1)`. If, for all `z.re = 0`, `‖f z‖ ≤ a` for some `a ∈ ℝ` and, similarly, for all
`z.re = 1`, `‖f z‖ ≤ b` for some `b ∈ ℝ` then for all `z` in the closed strip
`re ⁻¹' [0,1]` the inequality `‖f(z)‖ ≤ a ^ (1 - z.re) * b ^ z.re` holds. -/
lemma norm_le_interp_of_mem_verticalClosedStrip' (f : ℂ → E) {z : ℂ} {a b : ℝ}
    (hz : z ∈ verticalClosedStrip 0 1) (hd : DiffContOnCl ℂ f (verticalStrip 0 1))
    (hB : BddAbove ((norm ∘ f) '' (verticalClosedStrip 0 1)))
    (ha : ∀ z ∈ re ⁻¹' {0}, ‖f z‖ ≤ a) (hb : ∀ z ∈ re ⁻¹' {1}, ‖f z‖ ≤ b) :
    ‖f z‖ ≤ a ^ (1 - z.re) * b ^ z.re 
goal: ‖f z‖ ≤ a ^ (1 - z.re) * b ^ z.re