nevanlinna/Nevanlinna/complexHarmonic.lean

267 lines
8.2 KiB
Plaintext
Raw Normal View History

2024-04-30 08:20:57 +02:00
import Mathlib.Analysis.Complex.Basic
2024-05-02 09:48:26 +02:00
import Mathlib.Analysis.Complex.TaylorSeries
2024-04-30 08:20:57 +02:00
import Mathlib.Analysis.Calculus.LineDeriv.Basic
import Mathlib.Analysis.Calculus.ContDiff.Defs
import Mathlib.Analysis.Calculus.FDeriv.Basic
2024-05-02 21:09:38 +02:00
import Mathlib.Analysis.Calculus.FDeriv.Symmetric
2024-05-15 15:03:16 +02:00
import Mathlib.Analysis.SpecialFunctions.Complex.LogDeriv
2024-05-08 08:27:12 +02:00
import Mathlib.Data.Complex.Module
import Mathlib.Data.Complex.Order
import Mathlib.Data.Complex.Exponential
2024-05-15 15:03:16 +02:00
import Mathlib.Data.Fin.Tuple.Basic
2024-05-08 08:27:12 +02:00
import Mathlib.Analysis.RCLike.Basic
import Mathlib.Topology.Algebra.InfiniteSum.Module
import Mathlib.Topology.Instances.RealVectorSpace
2024-04-30 08:20:57 +02:00
import Nevanlinna.cauchyRiemann
2024-05-13 09:23:08 +02:00
import Nevanlinna.laplace
2024-05-07 09:49:56 +02:00
import Nevanlinna.partialDeriv
2024-05-07 07:08:23 +02:00
2024-05-13 09:23:08 +02:00
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace F]
2024-04-30 08:20:57 +02:00
2024-05-13 09:23:08 +02:00
def Harmonic (f : → F) : Prop :=
2024-04-30 08:20:57 +02:00
(ContDiff 2 f) ∧ (∀ z, Complex.laplace f z = 0)
2024-05-03 12:23:09 +02:00
2024-05-06 17:01:10 +02:00
theorem holomorphic_is_harmonic {f : } (h : Differentiable f) :
Harmonic f := by
-- f is real C²
have f_is_real_C2 : ContDiff 2 f :=
ContDiff.restrict_scalars (Differentiable.contDiff h)
2024-05-08 15:59:56 +02:00
have fI_is_real_differentiable : Differentiable (partialDeriv 1 f) := by
exact (partialDeriv_contDiff f_is_real_C2 1).differentiable (Submonoid.oneLE.proof_2 ℕ∞)
2024-04-30 08:20:57 +02:00
constructor
2024-05-06 09:01:43 +02:00
· -- f is two times real continuously differentiable
2024-05-06 17:01:10 +02:00
exact f_is_real_C2
2024-04-30 08:20:57 +02:00
· -- Laplace of f is zero
unfold Complex.laplace
2024-05-07 07:08:23 +02:00
rw [CauchyRiemann₄ h]
2024-05-08 07:15:34 +02:00
2024-05-08 08:32:06 +02:00
-- This lemma says that partial derivatives commute with complex scalar
-- multiplication. This is a consequence of partialDeriv_compContLin once we
-- note that complex scalar multiplication is continuous -linear.
2024-05-08 15:59:56 +02:00
have : ∀ v, ∀ s : , ∀ g : , Differentiable g → partialDeriv v (s • g) = s • (partialDeriv v g) := by
2024-05-08 08:27:12 +02:00
intro v s g hg
2024-05-08 08:32:06 +02:00
-- Present scalar multiplication as a continuous -linear map. This is
-- horrible, there must be better ways to do that.
2024-05-08 08:27:12 +02:00
let sMuls : →L[] :=
{
toFun := fun x ↦ s * x
map_add' := by
intro x y
ring
map_smul' := by
intro m x
simp
ring
}
2024-05-08 07:15:34 +02:00
2024-05-08 08:32:06 +02:00
-- Bring the goal into a form that is recognized by
-- partialDeriv_compContLin.
2024-05-08 08:27:12 +02:00
have : s • g = sMuls ∘ g := by rfl
rw [this]
2024-05-08 08:32:06 +02:00
2024-05-08 15:59:56 +02:00
rw [partialDeriv_compContLin hg]
2024-05-08 08:27:12 +02:00
rfl
2024-05-08 07:15:34 +02:00
2024-05-08 08:27:12 +02:00
rw [this]
2024-05-07 10:16:23 +02:00
rw [partialDeriv_comm f_is_real_C2 Complex.I 1]
rw [CauchyRiemann₄ h]
2024-05-08 08:27:12 +02:00
rw [this]
2024-05-07 10:16:23 +02:00
rw [← smul_assoc]
2024-05-02 21:09:38 +02:00
simp
2024-05-08 08:27:12 +02:00
-- Subgoals coming from the application of 'this'
-- Differentiable (Real.partialDeriv 1 f)
exact fI_is_real_differentiable
-- Differentiable (Real.partialDeriv 1 f)
exact fI_is_real_differentiable
2024-05-13 09:23:08 +02:00
theorem re_of_holomorphic_is_harmonic {f : } (h : Differentiable f) :
Harmonic (Complex.reCLM ∘ f) := by
2024-05-13 10:10:10 +02:00
constructor
· -- Continuous differentiability
apply ContDiff.comp
exact ContinuousLinearMap.contDiff Complex.reCLM
exact ContDiff.restrict_scalars (Differentiable.contDiff h)
· rw [laplace_compContLin]
simp
intro z
rw [(holomorphic_is_harmonic h).right z]
simp
exact ContDiff.restrict_scalars (Differentiable.contDiff h)
2024-05-13 09:23:08 +02:00
2024-05-13 10:10:10 +02:00
theorem im_of_holomorphic_is_harmonic {f : } (h : Differentiable f) :
Harmonic (Complex.imCLM ∘ f) := by
constructor
· -- Continuous differentiability
apply ContDiff.comp
exact ContinuousLinearMap.contDiff Complex.imCLM
exact ContDiff.restrict_scalars (Differentiable.contDiff h)
· rw [laplace_compContLin]
simp
intro z
rw [(holomorphic_is_harmonic h).right z]
simp
exact ContDiff.restrict_scalars (Differentiable.contDiff h)
2024-05-14 09:47:46 +02:00
theorem logabs_of_holomorphic_is_harmonic
{f : }
(h₁ : Differentiable f)
2024-05-15 10:09:22 +02:00
(h₂ : ∀ z, f z ≠ 0)
(h₃ : ∀ z, f z ∈ Complex.slitPlane) :
2024-05-14 09:47:46 +02:00
Harmonic (fun z ↦ Real.log ‖f z‖) := by
-- f is real C²
have f_is_real_C2 : ContDiff 2 f :=
ContDiff.restrict_scalars (Differentiable.contDiff h₁)
2024-05-15 10:09:22 +02:00
-- The norm square is z * z.conj
have normSq_conj : ∀ (z : ), (starRingEnd ) z * z = ↑‖z‖ ^ 2 := Complex.conj_mul'
2024-05-14 09:47:46 +02:00
-- The norm square is real C²
have normSq_is_real_C2 : ContDiff 2 Complex.normSq := by
unfold Complex.normSq
simp
2024-05-14 17:02:45 +02:00
conv =>
arg 3
intro x
rw [← Complex.reCLM_apply, ← Complex.imCLM_apply]
2024-05-14 09:47:46 +02:00
apply ContDiff.add
apply ContDiff.mul
2024-05-14 17:02:45 +02:00
apply ContinuousLinearMap.contDiff Complex.reCLM
apply ContinuousLinearMap.contDiff Complex.reCLM
apply ContDiff.mul
apply ContinuousLinearMap.contDiff Complex.imCLM
apply ContinuousLinearMap.contDiff Complex.imCLM
2024-05-14 09:47:46 +02:00
constructor
· -- logabs f is real C²
2024-05-14 17:24:34 +02:00
have : (fun z ↦ Real.log ‖f z‖) = (2 : )⁻¹ • (Real.log ∘ Complex.normSq ∘ f) := by
2024-05-14 09:47:46 +02:00
funext z
simp
unfold Complex.abs
simp
rw [Real.log_sqrt]
2024-05-14 17:24:34 +02:00
rw [div_eq_inv_mul (Real.log (Complex.normSq (f z))) 2]
2024-05-15 10:09:22 +02:00
exact Complex.normSq_nonneg (f z)
2024-05-14 09:47:46 +02:00
rw [this]
2024-05-14 17:24:34 +02:00
have : (2 : )⁻¹ • (Real.log ∘ Complex.normSq ∘ f) = (fun z ↦ (2 : )⁻¹ • ((Real.log ∘ ⇑Complex.normSq ∘ f) z)) := by
2024-05-14 17:02:45 +02:00
simp
2024-05-14 09:47:46 +02:00
rw [this]
apply contDiff_iff_contDiffAt.2
intro z
apply ContDiffAt.const_smul
apply ContDiffAt.comp
apply Real.contDiffAt_log.2
simp
exact h₂ z
apply ContDiffAt.comp
exact ContDiff.contDiffAt normSq_is_real_C2
exact ContDiff.contDiffAt f_is_real_C2
· -- Laplace vanishes
2024-05-15 10:09:22 +02:00
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]
rw [laplace_smul]
simp
2024-05-14 17:24:34 +02:00
2024-05-15 10:09:22 +02:00
have : ∀ (z : ), Complex.laplace (Real.log ∘ ⇑Complex.normSq ∘ f) z = 0 ↔ Complex.laplace (Complex.ofRealCLM ∘ Real.log ∘ ⇑Complex.normSq ∘ f) z = 0 := by
intro z
rw [laplace_compContLin]
simp
sorry
conv =>
intro z
rw [this z]
have : Complex.ofRealCLM ∘ Real.log ∘ Complex.normSq ∘ f = Complex.log ∘ Complex.ofRealCLM ∘ Complex.normSq ∘ f := by
unfold Function.comp
funext z
apply Complex.ofReal_log
exact Complex.normSq_nonneg (f z)
rw [this]
have : Complex.ofRealCLM ∘ ⇑Complex.normSq ∘ f = ((starRingEnd ) ∘ f) * f := by
funext z
simp
exact Complex.normSq_eq_conj_mul_self
rw [this]
have : Complex.log ∘ (⇑(starRingEnd ) ∘ f * f) = Complex.log ∘ ⇑(starRingEnd ) ∘ f + Complex.log ∘ f := by
unfold Function.comp
funext z
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)
simp
tauto
rw [this]
simp
constructor
· exact Real.pi_pos
· exact Real.pi_nonneg
exact (AddEquivClass.map_ne_zero_iff starRingAut).mpr (h₂ z)
exact h₂ z
rw [this]
2024-05-15 15:03:16 +02:00
rw [laplace_add]
have : Differentiable (Complex.log ∘ f) := by
intro z
apply DifferentiableAt.comp
exact Complex.differentiableAt_log (h₃ z)
exact h₁ z
have : Complex.laplace (Complex.log ∘ f) = 0 := by
let A := holomorphic_is_harmonic this
funext z
exact A.2 z
rw [this]
simp
have : Complex.log ∘ ⇑(starRingEnd ) ∘ f = ⇑(starRingEnd ) ∘ Complex.log ∘ f := by
funext z
unfold Function.comp
rw [Complex.log_conj]
exact Complex.slitPlane_arg_ne_pi (h₃ z)
rw [this]
have : ⇑(starRingEnd ) ∘ Complex.log ∘ f = Complex.conjCLE ∘ Complex.log ∘ f := by
rfl
rw [this]
have : ContDiff 2 (Complex.log ∘ f) := by sorry
have : Complex.laplace (⇑Complex.conjCLE ∘ f) = ⇑Complex.conjCLE ∘ Complex.laplace (f) := by
apply laplace_compContLin
sorry
rw [laplace_compContLin this]
sorry
2024-05-15 10:09:22 +02:00
sorry
2024-05-14 09:47:46 +02:00
sorry