212 lines
6.8 KiB
Plaintext
212 lines
6.8 KiB
Plaintext
import Mathlib.Analysis.SpecialFunctions.Complex.LogDeriv
|
||
import Nevanlinna.complexHarmonic
|
||
import Nevanlinna.holomorphicAt
|
||
|
||
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace ℂ F] [CompleteSpace F]
|
||
|
||
|
||
theorem holomorphicAt_is_harmonicAt
|
||
{f : ℂ → F}
|
||
{z : ℂ}
|
||
(hf : HolomorphicAt f z) :
|
||
HarmonicAt f z := by
|
||
|
||
let t := {x | HolomorphicAt f x}
|
||
have ht : IsOpen t := HolomorphicAt_isOpen f
|
||
have hz : z ∈ t := by exact hf
|
||
|
||
constructor
|
||
· -- ContDiffAt ℝ 2 f z
|
||
exact hf.contDiffAt
|
||
|
||
· -- Δ f =ᶠ[nhds z] 0
|
||
apply Filter.eventuallyEq_iff_exists_mem.2
|
||
use t
|
||
constructor
|
||
· exact IsOpen.mem_nhds ht hz
|
||
· intro w hw
|
||
unfold Complex.laplace
|
||
simp
|
||
rw [partialDeriv_eventuallyEq ℝ hw.CauchyRiemannAt Complex.I]
|
||
rw [partialDeriv_smul'₂]
|
||
simp
|
||
|
||
rw [partialDeriv_commAt hw.contDiffAt Complex.I 1]
|
||
rw [partialDeriv_eventuallyEq ℝ hw.CauchyRiemannAt 1]
|
||
rw [partialDeriv_smul'₂]
|
||
simp
|
||
|
||
rw [← smul_assoc]
|
||
simp
|
||
|
||
|
||
theorem re_of_holomorphicAt_is_harmonicAr
|
||
{f : ℂ → ℂ}
|
||
{z : ℂ}
|
||
(h : HolomorphicAt f z) :
|
||
HarmonicAt (Complex.reCLM ∘ f) z := by
|
||
apply harmonicAt_comp_CLM_is_harmonicAt
|
||
exact holomorphicAt_is_harmonicAt h
|
||
|
||
|
||
theorem im_of_holomorphicAt_is_harmonicAt
|
||
{f : ℂ → ℂ}
|
||
{z : ℂ}
|
||
(h : HolomorphicAt f z) :
|
||
HarmonicAt (Complex.imCLM ∘ f) z := by
|
||
apply harmonicAt_comp_CLM_is_harmonicAt
|
||
exact holomorphicAt_is_harmonicAt h
|
||
|
||
|
||
theorem antiholomorphicAt_is_harmonicAt
|
||
{f : ℂ → ℂ}
|
||
{z : ℂ}
|
||
(h : HolomorphicAt f z) :
|
||
HarmonicAt (Complex.conjCLE ∘ f) z := by
|
||
apply harmonicAt_iff_comp_CLE_is_harmonicAt.1
|
||
exact holomorphicAt_is_harmonicAt h
|
||
|
||
|
||
theorem log_normSq_of_holomorphicAt_is_harmonicAt
|
||
{f : ℂ → ℂ}
|
||
{z : ℂ}
|
||
(h₁f : HolomorphicAt f z)
|
||
(h₂f : f z ≠ 0) :
|
||
HarmonicAt (Real.log ∘ Complex.normSq ∘ f) z := by
|
||
|
||
-- For later use
|
||
have slitPlaneLemma {z : ℂ} (hz : z ≠ 0) : z ∈ Complex.slitPlane ∨ -z ∈ Complex.slitPlane := by
|
||
rw [Complex.mem_slitPlane_iff, Complex.mem_slitPlane_iff]
|
||
simp at hz
|
||
rw [Complex.ext_iff] at hz
|
||
push_neg at hz
|
||
simp at hz
|
||
simp
|
||
by_contra contra
|
||
push_neg at contra
|
||
exact hz (le_antisymm contra.1.1 contra.2.1) contra.1.2
|
||
|
||
-- First prove the theorem for functions with image in the slitPlane
|
||
have lem₁ : ∀ g : ℂ → ℂ, (HolomorphicAt g z) → (g z ≠ 0) → (g z ∈ Complex.slitPlane) → HarmonicAt (Real.log ∘ Complex.normSq ∘ g) z := by
|
||
intro g h₁g h₂g h₃g
|
||
|
||
-- Rewrite the log |g|² as Complex.log (g * gc)
|
||
suffices hyp : HarmonicAt (Complex.log ∘ ((Complex.conjCLE ∘ g) * g)) z from by
|
||
have : Real.log ∘ Complex.normSq ∘ g = Complex.reCLM ∘ Complex.ofRealCLM ∘ Real.log ∘ Complex.normSq ∘ g := by
|
||
funext x
|
||
simp
|
||
rw [this]
|
||
|
||
have : Complex.ofRealCLM ∘ Real.log ∘ Complex.normSq ∘ g = Complex.log ∘ ((Complex.conjCLE ∘ g) * g) := by
|
||
funext x
|
||
simp
|
||
rw [Complex.ofReal_log]
|
||
rw [Complex.normSq_eq_conj_mul_self]
|
||
exact Complex.normSq_nonneg (g x)
|
||
rw [← this] at hyp
|
||
apply harmonicAt_comp_CLM_is_harmonicAt hyp
|
||
|
||
-- Locally around z, rewrite Complex.log (g * gc) as Complex.log g + Complex.log.gc
|
||
-- This uses the assumption that g z is in Complex.slitPlane
|
||
have : (Complex.log ∘ (Complex.conjCLE ∘ g * g)) =ᶠ[nhds z] (Complex.log ∘ Complex.conjCLE ∘ g + Complex.log ∘ g) := by
|
||
apply Filter.eventuallyEq_iff_exists_mem.2
|
||
use g⁻¹' (Complex.slitPlane ∩ {0}ᶜ)
|
||
constructor
|
||
· apply ContinuousAt.preimage_mem_nhds
|
||
· exact h₁g.differentiableAt.continuousAt
|
||
· apply IsOpen.mem_nhds
|
||
apply IsOpen.inter Complex.isOpen_slitPlane isOpen_ne
|
||
constructor
|
||
· exact h₃g
|
||
· exact h₂g
|
||
· intro x hx
|
||
simp
|
||
rw [Complex.log_mul_eq_add_log_iff _ hx.2]
|
||
rw [Complex.arg_conj]
|
||
simp [Complex.slitPlane_arg_ne_pi hx.1]
|
||
constructor
|
||
· exact Real.pi_pos
|
||
· exact Real.pi_nonneg
|
||
simp
|
||
apply hx.2
|
||
|
||
-- Locally around z, rewrite Complex.log (g * gc) as Complex.log g + Complex.log.gc
|
||
-- This uses the assumption that g z is in Complex.slitPlane
|
||
have : (Complex.log ∘ (Complex.conjCLE ∘ g * g)) =ᶠ[nhds z] (Complex.conjCLE ∘ Complex.log ∘ g + Complex.log ∘ g) := by
|
||
apply Filter.eventuallyEq_iff_exists_mem.2
|
||
use g⁻¹' (Complex.slitPlane ∩ {0}ᶜ)
|
||
constructor
|
||
· apply ContinuousAt.preimage_mem_nhds
|
||
· exact h₁g.differentiableAt.continuousAt
|
||
· apply IsOpen.mem_nhds
|
||
apply IsOpen.inter Complex.isOpen_slitPlane isOpen_ne
|
||
constructor
|
||
· exact h₃g
|
||
· exact h₂g
|
||
· intro x hx
|
||
simp
|
||
rw [← Complex.log_conj]
|
||
rw [Complex.log_mul_eq_add_log_iff _ hx.2]
|
||
rw [Complex.arg_conj]
|
||
simp [Complex.slitPlane_arg_ne_pi hx.1]
|
||
constructor
|
||
· exact Real.pi_pos
|
||
· exact Real.pi_nonneg
|
||
simp
|
||
apply hx.2
|
||
apply Complex.slitPlane_arg_ne_pi hx.1
|
||
|
||
rw [HarmonicAt_eventuallyEq this]
|
||
apply harmonicAt_add_harmonicAt_is_harmonicAt
|
||
· rw [← harmonicAt_iff_comp_CLE_is_harmonicAt]
|
||
apply holomorphicAt_is_harmonicAt
|
||
apply HolomorphicAt_comp
|
||
use Complex.slitPlane
|
||
constructor
|
||
· apply IsOpen.mem_nhds
|
||
exact Complex.isOpen_slitPlane
|
||
assumption
|
||
· exact fun z a => Complex.differentiableAt_log a
|
||
exact h₁g
|
||
· apply holomorphicAt_is_harmonicAt
|
||
apply HolomorphicAt_comp
|
||
use Complex.slitPlane
|
||
constructor
|
||
· apply IsOpen.mem_nhds
|
||
exact Complex.isOpen_slitPlane
|
||
assumption
|
||
· exact fun z a => Complex.differentiableAt_log a
|
||
exact h₁g
|
||
|
||
by_cases h₃f : f z ∈ Complex.slitPlane
|
||
· exact lem₁ f h₁f h₂f h₃f
|
||
· have : Complex.normSq ∘ f = Complex.normSq ∘ (-f) := by funext; simp
|
||
rw [this]
|
||
apply lem₁ (-f)
|
||
· exact HolomorphicAt_neg h₁f
|
||
· simpa
|
||
· exact (slitPlaneLemma h₂f).resolve_left h₃f
|
||
|
||
|
||
theorem logabs_of_holomorphicAt_is_harmonic
|
||
{f : ℂ → ℂ}
|
||
{z : ℂ}
|
||
(h₁f : HolomorphicAt f z)
|
||
(h₂f : f z ≠ 0) :
|
||
HarmonicAt (fun w ↦ Real.log ‖f w‖) z := by
|
||
|
||
-- Suffices: Harmonic (2⁻¹ • Real.log ∘ ⇑Complex.normSq ∘ f)
|
||
have : (fun z ↦ Real.log ‖f z‖) = (2 : ℝ)⁻¹ • (Real.log ∘ Complex.normSq ∘ f) := by
|
||
funext z
|
||
simp
|
||
unfold Complex.abs
|
||
simp
|
||
rw [Real.log_sqrt]
|
||
rw [div_eq_inv_mul (Real.log (Complex.normSq (f z))) 2]
|
||
exact Complex.normSq_nonneg (f z)
|
||
rw [this]
|
||
|
||
-- Suffices: Harmonic (Real.log ∘ ⇑Complex.normSq ∘ f)
|
||
apply (harmonicAt_iff_smul_const_is_harmonicAt (inv_ne_zero two_ne_zero)).1
|
||
exact log_normSq_of_holomorphicAt_is_harmonicAt h₁f h₂f
|