nevanlinna/Nevanlinna/holomorphic_examples.lean

253 lines
7.2 KiB
Plaintext
Raw Normal View History

2024-07-29 15:50:51 +02:00
import Nevanlinna.complexHarmonic
import Nevanlinna.holomorphicAt
2024-07-30 12:19:59 +02:00
import Nevanlinna.holomorphic_primitive
2024-07-31 09:40:35 +02:00
import Nevanlinna.mathlibAddOn
2024-07-29 15:50:51 +02:00
theorem CauchyRiemann₆
2024-07-31 09:40:35 +02:00
{E : Type*} [NormedAddCommGroup E] [NormedSpace E]
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
2024-07-29 15:50:51 +02:00
{f : E → F}
2024-07-31 09:40:35 +02:00
{z : E} :
2024-07-29 15:50:51 +02:00
(DifferentiableAt f z) ↔ (DifferentiableAt f z) ∧ ∀ e, partialDeriv (Complex.I • e) f z = Complex.I • partialDeriv e f z := by
constructor
2024-07-31 09:40:35 +02:00
· -- Direction "→"
2024-07-29 15:50:51 +02:00
intro h
constructor
· exact DifferentiableAt.restrictScalars h
· unfold partialDeriv
conv =>
intro e
left
rw [DifferentiableAt.fderiv_restrictScalars h]
simp
rw [← mul_one Complex.I]
rw [← smul_eq_mul]
conv =>
intro e
right
right
rw [DifferentiableAt.fderiv_restrictScalars h]
simp
2024-07-31 09:40:35 +02:00
· -- Direction "←"
2024-07-29 15:50:51 +02:00
intro ⟨h₁, h₂⟩
apply (differentiableAt_iff_restrictScalars h₁).2
use {
toFun := fderiv f z
map_add' := fun x y => ContinuousLinearMap.map_add (fderiv f z) x y
map_smul' := by
simp
intro m x
have : m = m.re + m.im • Complex.I := by simp
rw [this, add_smul, add_smul, ContinuousLinearMap.map_add]
congr
simp
rw [smul_assoc, smul_assoc, ContinuousLinearMap.map_smul (fderiv f z) m.2]
congr
exact h₂ x
}
rfl
theorem CauchyRiemann₇
2024-07-31 09:40:35 +02:00
{F : Type*} [NormedAddCommGroup F] [NormedSpace F]
2024-07-29 15:50:51 +02:00
{f : → F}
2024-07-31 09:40:35 +02:00
{z : } :
2024-07-29 15:50:51 +02:00
(DifferentiableAt f z) ↔ (DifferentiableAt f z) ∧ partialDeriv Complex.I f z = Complex.I • partialDeriv 1 f z := by
constructor
· intro hf
constructor
· exact (CauchyRiemann₆.1 hf).1
· let A := (CauchyRiemann₆.1 hf).2 1
simp at A
exact A
· intro ⟨h₁, h₂⟩
apply CauchyRiemann₆.2
constructor
· exact h₁
· intro e
2024-07-31 09:40:35 +02:00
have : Complex.I • e = e • Complex.I := by
2024-07-29 15:50:51 +02:00
rw [smul_eq_mul, smul_eq_mul]
exact CommMonoid.mul_comm Complex.I e
rw [this]
have : e = e.re + e.im • Complex.I := by simp
rw [this, add_smul, partialDeriv_add₁, partialDeriv_add₁]
simp
rw [← smul_eq_mul]
have : partialDeriv ((e.re : ) • Complex.I) f = partialDeriv ((e.re : ) • Complex.I) f := by rfl
rw [← this, partialDeriv_smul₁ ]
have : (e.re : ) = (e.re : ) • (1 : ) := by simp
rw [this, partialDeriv_smul₁ ]
have : partialDeriv ((e.im : ) * Complex.I) f = partialDeriv ((e.im : ) • Complex.I) f := by rfl
rw [this, partialDeriv_smul₁ ]
simp
rw [h₂]
rw [smul_comm]
congr
rw [mul_assoc]
simp
nth_rw 2 [smul_comm]
rw [← smul_assoc]
simp
have : - (e.im : ) = (-e.im : ) • (1 : ) := by simp
rw [this, partialDeriv_smul₁ ]
simp
2024-07-31 09:40:35 +02:00
2024-07-29 15:50:51 +02:00
/-
2024-07-31 09:40:35 +02:00
A harmonic, real-valued function on is the real part of a suitable holomorphic
function.
2024-07-29 15:50:51 +02:00
-/
theorem harmonic_is_realOfHolomorphic
{f : }
(hf : ∀ z, HarmonicAt f z) :
2024-07-30 14:11:39 +02:00
∃ F : , ∀ z, HolomorphicAt F z ∧ (Complex.reCLM ∘ F = f) := by
2024-07-29 15:50:51 +02:00
let f_1 : := Complex.ofRealCLM ∘ (partialDeriv 1 f)
let f_I : := Complex.ofRealCLM ∘ (partialDeriv Complex.I f)
let g : := f_1 - Complex.I • f_I
2024-07-30 10:52:12 +02:00
have reg₂f : ContDiff 2 f := by
2024-07-31 09:40:35 +02:00
apply contDiff_iff_contDiffAt.mpr
2024-07-30 10:52:12 +02:00
intro z
exact (hf z).1
2024-07-29 15:50:51 +02:00
2024-07-30 10:52:12 +02:00
have reg₁f_1 : ContDiff 1 f_1 := by
2024-07-31 09:40:35 +02:00
apply contDiff_iff_contDiffAt.mpr
2024-07-29 15:50:51 +02:00
intro z
2024-07-30 10:52:12 +02:00
dsimp [f_1]
apply ContDiffAt.continuousLinearMap_comp
exact partialDeriv_contDiffAt (hf z).1 1
2024-07-29 15:50:51 +02:00
2024-07-30 10:52:12 +02:00
have reg₁f_I : ContDiff 1 f_I := by
2024-07-31 09:40:35 +02:00
apply contDiff_iff_contDiffAt.mpr
2024-07-30 10:52:12 +02:00
intro z
dsimp [f_I]
apply ContDiffAt.continuousLinearMap_comp
exact partialDeriv_contDiffAt (hf z).1 Complex.I
2024-07-31 09:40:35 +02:00
have reg₁g : ContDiff 1 g := by
2024-07-30 10:52:12 +02:00
dsimp [g]
apply ContDiff.sub
exact reg₁f_1
2024-07-31 09:40:35 +02:00
apply ContDiff.const_smul'
2024-07-30 10:52:12 +02:00
exact reg₁f_I
2024-07-31 09:40:35 +02:00
have reg₁ : Differentiable g := by
2024-07-29 15:50:51 +02:00
intro z
apply CauchyRiemann₇.2
constructor
2024-07-30 10:52:12 +02:00
· apply Differentiable.differentiableAt
apply ContDiff.differentiable
exact reg₁g
rfl
2024-07-29 15:50:51 +02:00
· dsimp [g]
2024-07-30 10:52:12 +02:00
rw [partialDeriv_sub₂, partialDeriv_sub₂]
2024-07-29 15:50:51 +02:00
simp
dsimp [f_1, f_I]
2024-07-30 10:52:12 +02:00
rw [partialDeriv_smul'₂, partialDeriv_smul'₂]
rw [partialDeriv_compContLin, partialDeriv_compContLin, partialDeriv_compContLin, partialDeriv_compContLin]
rw [mul_sub]
simp
rw [← mul_assoc]
simp
rw [add_comm, sub_eq_add_neg]
congr 1
· rw [partialDeriv_comm reg₂f Complex.I 1]
· let A := Filter.EventuallyEq.eq_of_nhds (hf z).2
simp at A
unfold Complex.laplace at A
conv =>
right
right
rw [← sub_zero (partialDeriv 1 (partialDeriv 1 f) z)]
rw [← A]
simp
2024-07-29 15:50:51 +02:00
2024-07-30 10:52:12 +02:00
--Differentiable (partialDeriv _ f)
repeat
2024-07-31 09:40:35 +02:00
apply ContDiff.differentiable
apply contDiff_iff_contDiffAt.mpr
2024-07-30 10:52:12 +02:00
exact fun w ↦ partialDeriv_contDiffAt (hf w).1 _
apply le_rfl
-- Differentiable f_1
exact reg₁f_1.differentiable le_rfl
-- Differentiable (Complex.I • f_I)
2024-07-31 09:40:35 +02:00
apply Differentiable.const_smul'
2024-07-30 10:52:12 +02:00
exact reg₁f_I.differentiable le_rfl
-- Differentiable f_1
exact reg₁f_1.differentiable le_rfl
-- Differentiable (Complex.I • f_I)
2024-07-31 09:40:35 +02:00
apply Differentiable.const_smul'
2024-07-30 10:52:12 +02:00
exact reg₁f_I.differentiable le_rfl
2024-07-31 09:40:35 +02:00
2024-07-30 15:11:57 +02:00
let F := fun z ↦ (primitive 0 g) z + f 0
2024-07-30 16:45:26 +02:00
2024-07-31 09:40:35 +02:00
have regF : Differentiable F := by
2024-07-30 15:11:57 +02:00
apply Differentiable.add
2024-07-30 16:45:26 +02:00
apply primitive_differentiable reg₁
2024-07-30 15:11:57 +02:00
simp
2024-07-30 14:11:39 +02:00
2024-07-31 09:40:35 +02:00
have pF'' : ∀ x, (fderiv F x) = ContinuousLinearMap.lsmul (g x) := by
2024-07-30 15:11:57 +02:00
intro x
2024-07-30 16:45:26 +02:00
rw [DifferentiableAt.fderiv_restrictScalars (regF x)]
2024-07-30 15:11:57 +02:00
dsimp [F]
rw [fderiv_add_const]
2024-07-30 16:45:26 +02:00
rw [primitive_fderiv']
2024-07-30 15:11:57 +02:00
exact rfl
2024-07-30 16:45:26 +02:00
exact reg₁
2024-07-30 14:11:39 +02:00
2024-07-30 12:19:59 +02:00
use F
intro z
constructor
· -- HolomorphicAt F z
apply HolomorphicAt_iff.2
2024-07-30 15:11:57 +02:00
use Set.univ
2024-07-30 12:19:59 +02:00
constructor
· exact isOpen_const
· constructor
· simp
2024-07-30 15:11:57 +02:00
· intro w _
exact regF w
2024-07-30 12:19:59 +02:00
· -- (F z).re = f z
2024-07-30 14:11:39 +02:00
have A := reg₂f.differentiable one_le_two
2024-07-31 09:40:35 +02:00
have B : Differentiable (Complex.reCLM ∘ F) := by
2024-07-30 14:11:39 +02:00
apply Differentiable.comp
exact ContinuousLinearMap.differentiable Complex.reCLM
exact Differentiable.restrictScalars regF
2024-07-31 09:40:35 +02:00
have C : (F 0).re = f 0 := by
2024-07-30 15:11:57 +02:00
dsimp [F]
rw [primitive_zeroAtBasepoint]
simp
2024-07-30 14:11:39 +02:00
apply eq_of_fderiv_eq B A _ 0 C
2024-07-30 16:45:26 +02:00
2024-07-30 14:11:39 +02:00
intro x
rw [fderiv.comp]
simp
apply ContinuousLinearMap.ext
intro w
simp
2024-07-30 15:11:57 +02:00
rw [pF'']
2024-07-30 14:11:39 +02:00
dsimp [g, f_1, f_I, partialDeriv]
simp
have : w = w.re • 1 + w.im • Complex.I := by simp
nth_rw 3 [this]
rw [(fderiv f x).map_add]
rw [(fderiv f x).map_smul, (fderiv f x).map_smul]
rw [smul_eq_mul, smul_eq_mul]
ring
-- DifferentiableAt (⇑Complex.reCLM) (F x)
2024-07-30 16:45:26 +02:00
fun_prop
2024-07-31 09:40:35 +02:00
-- DifferentiableAt F x
2024-07-30 14:11:39 +02:00
exact regF.restrictScalars x