diff --git a/Nevanlinna/complexHarmonic.examples.lean b/Nevanlinna/complexHarmonic.examples.lean index 8e61646..d5165d8 100644 --- a/Nevanlinna/complexHarmonic.examples.lean +++ b/Nevanlinna/complexHarmonic.examples.lean @@ -60,7 +60,7 @@ theorem holomorphicAt_is_harmonicAt theorem re_of_holomorphicAt_is_harmonicAr - {f : ℂ → ℂ} + {f : ℂ → ℂ} {z : ℂ} (h : HolomorphicAt f z) : HarmonicAt (Complex.reCLM ∘ f) z := by @@ -86,6 +86,123 @@ theorem antiholomorphicAt_is_harmonicAt 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 + + /- First prove the theorem under the additional assumption that + + -/ + 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 (HolomorphicAt_differentiableAt h₁g).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 + + sorry + + + + -- Suffices to show Harmonic (Complex.log ∘ ⇑(starRingEnd ℂ) ∘ f + Complex.log ∘ f) + -- THIS IS WHERE WE USE h₃ + have : (Complex.log ∘ (Complex.conjCLE ∘ f * f)) z = (Complex.log ∘ Complex.conjCLE ∘ f + Complex.log ∘ f) z := by + unfold Function.comp + simp + rw [Complex.log_mul_eq_add_log_iff] + + have : Complex.arg ((starRingEnd ℂ) (f z)) = - Complex.arg (f z) := by + rw [Complex.arg_conj] + have : ¬ Complex.arg (f z) = Real.pi := by + exact Complex.slitPlane_arg_ne_pi (h₃ z hz) + simp + tauto + rw [this] + simp + constructor + · exact Real.pi_pos + · exact Real.pi_nonneg + exact (AddEquivClass.map_ne_zero_iff starRingAut).mpr (h₂ z hz) + exact h₂ z hz + + rw [HarmonicOn_congr hs this] + simp + + apply harmonicOn_add_harmonicOn_is_harmonicOn hs + + have : (fun x => Complex.log ((starRingEnd ℂ) (f x))) = (Complex.log ∘ ⇑(starRingEnd ℂ) ∘ f) := by + rfl + rw [this] + + -- HarmonicOn (Complex.log ∘ ⇑(starRingEnd ℂ) ∘ f) s + have : ∀ z ∈ s, (Complex.log ∘ ⇑(starRingEnd ℂ) ∘ f) z = (Complex.conjCLE ∘ Complex.log ∘ f) z := by + intro z hz + unfold Function.comp + rw [Complex.log_conj] + rfl + exact Complex.slitPlane_arg_ne_pi (h₃ z hz) + rw [HarmonicOn_congr hs this] + + rw [← harmonicOn_iff_comp_CLE_is_harmonicOn] + + apply holomorphicOn_is_harmonicOn + exact hs + + intro z hz + apply DifferentiableAt.differentiableWithinAt + apply DifferentiableAt.comp + + + + exact Complex.differentiableAt_log (h₃ z hz) + apply DifferentiableOn.differentiableAt h₁ -- (h₁ z hz) + exact IsOpen.mem_nhds hs hz + exact hs + + -- HarmonicOn (Complex.log ∘ ⇑(starRingEnd ℂ) ∘ f) s + apply holomorphicOn_is_harmonicOn hs + exact DifferentiableOn.clog h₁ h₃ + + theorem holomorphic_is_harmonic {f : ℂ → F₁} (h : Differentiable ℂ f) : Harmonic f := by diff --git a/Nevanlinna/complexHarmonic.lean b/Nevanlinna/complexHarmonic.lean index 7887293..4ea6643 100644 --- a/Nevanlinna/complexHarmonic.lean +++ b/Nevanlinna/complexHarmonic.lean @@ -243,8 +243,8 @@ theorem harmonic_iff_comp_CLE_is_harmonic {f : ℂ → F₁} {l : F₁ ≃L[ℝ] exact harmonic_comp_CLM_is_harmonic -theorem harmonicAt_iff_comp_CLE_is_harmonicAt - {f : ℂ → F₁} +theorem harmonicAt_iff_comp_CLE_is_harmonicAt + {f : ℂ → F₁} {z : ℂ} {l : F₁ ≃L[ℝ] G₁} : HarmonicAt f z ↔ HarmonicAt (l ∘ f) z := by