2024-06-11 17:18:24 +02:00
import Mathlib.Analysis.Complex.TaylorSeries
2024-08-08 13:32:15 +02:00
import Mathlib.Data.ENNReal.Basic
2024-06-14 16:07:58 +02:00
noncomputable def primitive
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E] :
ℂ → (ℂ → E) → (ℂ → E) := by
intro z₀
intro f
exact fun z ↦ (∫ (x : ℝ ) in z₀.re..z.re, f ⟨x, z₀.im⟩) + Complex.I • ∫ (x : ℝ ) in z₀.im..z.im, f ⟨z.re, x⟩
theorem primitive_zeroAtBasepoint
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
(f : ℂ → E)
(z₀ : ℂ ) :
(primitive z₀ f) z₀ = 0 := by
unfold primitive
simp
2024-06-18 11:21:58 +02:00
theorem primitive_fderivAtBasepointZero
2024-06-14 16:07:58 +02:00
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
2024-08-08 13:32:15 +02:00
{f : ℂ → E}
{R : ℝ }
(hR : 0 < R)
(hf : ContinuousOn f (Metric.ball 0 R)) :
2024-06-14 16:07:58 +02:00
HasDerivAt (primitive 0 f) (f 0) 0 := by
unfold primitive
simp
2024-06-14 21:00:51 +02:00
apply hasDerivAt_iff_isLittleO.2
simp
2024-06-16 19:00:30 +02:00
rw [Asymptotics.isLittleO_iff]
intro c hc
2024-06-18 11:21:58 +02:00
have {z : ℂ } {e : E} : z • e = (∫ (_ : ℝ ) in (0)..(z.re), e) + Complex.I • ∫ (_ : ℝ ) in (0)..(z.im), e:= by
2024-06-16 19:00:30 +02:00
simp
rw [smul_comm]
rw [← smul_assoc]
simp
have : z.re • e = (z.re : ℂ ) • e := by exact rfl
rw [this, ← add_smul]
simp
conv =>
left
intro x
left
arg 1
arg 2
rw [this]
2024-06-18 11:21:58 +02:00
2024-08-08 13:32:15 +02:00
obtain ⟨s, h₁s, h₂s⟩ : ∃ s ⊆ f⁻¹' Metric.ball (f 0) (c / (4 : ℝ )), IsOpen s ∧ 0 ∈ s := by
apply eventually_nhds_iff.mp
apply continuousAt_def.1
apply Continuous.continuousAt
2024-06-18 11:21:58 +02:00
fun_prop
2024-06-16 19:15:19 +02:00
2024-08-08 13:32:15 +02:00
apply continuousAt_def.1
apply hf.continuousAt
exact Metric.ball_mem_nhds 0 hR
apply Metric.ball_mem_nhds (f 0)
simpa
obtain ⟨ε, h₁ε, h₂ε⟩ : ∃ ε > 0, (Metric.ball 0 ε) × ℂ (Metric.ball 0 ε) ⊆ s ∧ (Metric.ball 0 ε) × ℂ (Metric.ball 0 ε) ⊆ Metric.ball 0 R := by
obtain ⟨ε', h₁ε', h₂ε'⟩ : ∃ ε' > 0, Metric.ball 0 ε' ⊆ s ∩ Metric.ball 0 R := by
apply Metric.mem_nhds_iff.mp
apply IsOpen.mem_nhds
apply IsOpen.inter
exact h₂s.1
exact Metric.isOpen_ball
constructor
· exact h₂s.2
· simpa
use (2 : ℝ )⁻¹ * ε'
constructor
· simpa
· constructor
· intro x hx
apply (h₂ε' _).1
simp
calc Complex.abs x
_ ≤ |x.re| + |x.im| := Complex.abs_le_abs_re_add_abs_im x
_ < (2 : ℝ )⁻¹ * ε' + |x.im| := by
apply (add_lt_add_iff_right |x.im|).mpr
have : x.re ∈ Metric.ball 0 (2⁻¹ * ε') := (Complex.mem_reProdIm.1 hx).1
simp at this
exact this
_ < (2 : ℝ )⁻¹ * ε' + (2 : ℝ )⁻¹ * ε' := by
apply (add_lt_add_iff_left ((2 : ℝ )⁻¹ * ε')).mpr
have : x.im ∈ Metric.ball 0 (2⁻¹ * ε') := (Complex.mem_reProdIm.1 hx).2
simp at this
exact this
_ = ε' := by
rw [← add_mul]
abel_nf
simp
· intro x hx
apply (h₂ε' _).2
simp
calc Complex.abs x
_ ≤ |x.re| + |x.im| := Complex.abs_le_abs_re_add_abs_im x
_ < (2 : ℝ )⁻¹ * ε' + |x.im| := by
apply (add_lt_add_iff_right |x.im|).mpr
have : x.re ∈ Metric.ball 0 (2⁻¹ * ε') := (Complex.mem_reProdIm.1 hx).1
simp at this
exact this
_ < (2 : ℝ )⁻¹ * ε' + (2 : ℝ )⁻¹ * ε' := by
apply (add_lt_add_iff_left ((2 : ℝ )⁻¹ * ε')).mpr
have : x.im ∈ Metric.ball 0 (2⁻¹ * ε') := (Complex.mem_reProdIm.1 hx).2
simp at this
exact this
_ = ε' := by
rw [← add_mul]
abel_nf
simp
have h₃ε : ∀ y ∈ (Metric.ball 0 ε) × ℂ (Metric.ball 0 ε), ‖(f y) - (f 0)‖ < (c / (4 : ℝ )) := by
2024-06-17 10:11:39 +02:00
intro y hy
2024-08-08 13:32:15 +02:00
apply mem_ball_iff_norm.mp
apply h₁s
exact h₂ε.1 hy
have intervalComputation_uIcc {x' y' : ℝ } (h : x' ∈ Set.uIcc 0 y') : |x'| ≤ |y'| := by
let A := h.1
let B := h.2
rcases le_total 0 y' with hy | hy
· simp [hy] at A
simp [hy] at B
rwa [abs_of_nonneg A, abs_of_nonneg hy]
· simp [hy] at A
simp [hy] at B
rw [abs_of_nonpos hy]
rw [abs_of_nonpos]
linarith [h.1]
exact B
2024-06-17 10:11:39 +02:00
2024-08-08 13:32:15 +02:00
rw [Filter.eventually_iff_exists_mem]
2024-06-18 11:21:58 +02:00
use Metric.ball 0 (ε / (4 : ℝ ))
2024-08-08 13:32:15 +02:00
2024-06-16 19:00:30 +02:00
constructor
2024-06-18 11:21:58 +02:00
· apply Metric.ball_mem_nhds 0
linarith
2024-06-16 19:00:30 +02:00
· intro y hy
2024-08-08 13:32:15 +02:00
have {A B C D :E} : (A + B) - (C + D) = (A - C) + (B - D) := by
abel
rw [this]
rw [← smul_sub]
have t₀ : IntervalIntegrable (fun x => f { re := x, im := 0 }) MeasureTheory.volume 0 y.re := by
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf
have : (fun x => ({ re := x, im := 0 } : ℂ )) = Complex.ofRealLI := by rfl
rw [this]
apply Continuous.continuousOn
continuity
intro x hx
apply h₂ε.2
simp
constructor
· simp
calc |x|
_ ≤ |y.re| := by apply intervalComputation_uIcc hx
_ ≤ Complex.abs y := by exact Complex.abs_re_le_abs y
_ < ε / 4 := by simp at hy; assumption
_ < ε := by linarith
· simpa
have t₁ : IntervalIntegrable (fun _ => f 0) MeasureTheory.volume 0 y.re := by
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
apply hf
fun_prop
intro x _
simpa
rw [← intervalIntegral.integral_sub t₀ t₁]
have t₂ : IntervalIntegrable (fun x_1 => f { re := y.re, im := x_1 }) MeasureTheory.volume 0 y.im := by
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf
have : (Complex.mk y.re) = (fun x => Complex.I • Complex.ofRealCLM x + { re := y.re, im := 0 }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
simp
rw [this]
apply ContinuousOn.add
apply Continuous.continuousOn
continuity
fun_prop
intro x hx
apply h₂ε.2
constructor
· simp
calc |y.re|
_ ≤ Complex.abs y := by exact Complex.abs_re_le_abs y
_ < ε / 4 := by simp at hy; assumption
_ < ε := by linarith
· simp
calc |x|
_ ≤ |y.im| := by apply intervalComputation_uIcc hx
_ ≤ Complex.abs y := by exact Complex.abs_im_le_abs y
_ < ε / 4 := by simp at hy; assumption
_ < ε := by linarith
have t₃ : IntervalIntegrable (fun _ => f 0) MeasureTheory.volume 0 y.im := by
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf
fun_prop
intro x _
apply h₂ε.2
simp
constructor
· simpa
· simpa
rw [← intervalIntegral.integral_sub t₂ t₃]
2024-06-18 11:21:58 +02:00
have h₁y : |y.re| < ε / 4 := by
2024-06-17 17:22:17 +02:00
calc |y.re|
_ ≤ Complex.abs y := by apply Complex.abs_re_le_abs
2024-06-18 11:21:58 +02:00
_ < ε / 4 := by
2024-06-17 17:22:17 +02:00
let A := mem_ball_iff_norm.1 hy
simp at A
2024-06-18 11:21:58 +02:00
linarith
have h₂y : |y.im| < ε / 4 := by
2024-06-18 09:56:44 +02:00
calc |y.im|
_ ≤ Complex.abs y := by apply Complex.abs_im_le_abs
2024-06-18 11:21:58 +02:00
_ < ε / 4 := by
2024-06-18 09:56:44 +02:00
let A := mem_ball_iff_norm.1 hy
simp at A
2024-06-18 11:21:58 +02:00
linarith
2024-06-18 09:56:44 +02:00
have intervalComputation {x' y' : ℝ } (h : x' ∈ Ι 0 y') : |x'| ≤ |y'| := by
let A := h.1
let B := h.2
rcases le_total 0 y' with hy | hy
· simp [hy] at A
simp [hy] at B
rw [abs_of_nonneg hy]
rw [abs_of_nonneg (le_of_lt A)]
exact B
· simp [hy] at A
simp [hy] at B
rw [abs_of_nonpos hy]
rw [abs_of_nonpos]
linarith [h.1]
exact B
2024-06-17 17:22:17 +02:00
have t₁ : ‖(∫ (x : ℝ ) in (0)..(y.re), f { re := x, im := 0 } - f 0)‖ ≤ (c / (4 : ℝ )) * |y.re - 0| := by
2024-06-17 10:11:39 +02:00
apply intervalIntegral.norm_integral_le_of_norm_le_const
intro x hx
2024-06-17 17:22:17 +02:00
2024-06-18 11:21:58 +02:00
have h₁x : |x| < ε / 4 := by
2024-06-18 09:56:44 +02:00
calc |x|
_ ≤ |y.re| := intervalComputation hx
2024-06-18 11:21:58 +02:00
_ < ε / 4 := h₁y
2024-06-17 10:11:39 +02:00
apply le_of_lt
apply h₃ε { re := x, im := 0 }
2024-08-08 13:32:15 +02:00
constructor
· simp
linarith
· simp
exact h₁ε
2024-06-17 17:22:17 +02:00
have t₂ : ‖∫ (x : ℝ ) in (0)..(y.im), f { re := y.re, im := x } - f 0‖ ≤ (c / (4 : ℝ )) * |y.im - 0| := by
apply intervalIntegral.norm_integral_le_of_norm_le_const
intro x hx
2024-06-18 09:56:44 +02:00
2024-06-18 11:21:58 +02:00
have h₁x : |x| < ε / 4 := by
2024-06-18 09:56:44 +02:00
calc |x|
_ ≤ |y.im| := intervalComputation hx
2024-06-18 11:21:58 +02:00
_ < ε / 4 := h₂y
2024-06-18 09:56:44 +02:00
2024-06-17 17:22:17 +02:00
apply le_of_lt
apply h₃ε { re := y.re, im := x }
2024-08-08 13:32:15 +02:00
constructor
· simp
linarith
· simp
linarith
2024-06-17 17:22:17 +02:00
2024-06-16 19:00:30 +02:00
calc ‖(∫ (x : ℝ ) in (0)..(y.re), f { re := x, im := 0 } - f 0) + Complex.I • ∫ (x : ℝ ) in (0)..(y.im), f { re := y.re, im := x } - f 0‖
2024-06-17 17:22:17 +02:00
_ ≤ ‖(∫ (x : ℝ ) in (0)..(y.re), f { re := x, im := 0 } - f 0)‖ + ‖Complex.I • ∫ (x : ℝ ) in (0)..(y.im), f { re := y.re, im := x } - f 0‖ := by
apply norm_add_le
2024-06-17 10:11:39 +02:00
_ ≤ ‖(∫ (x : ℝ ) in (0)..(y.re), f { re := x, im := 0 } - f 0)‖ + ‖∫ (x : ℝ ) in (0)..(y.im), f { re := y.re, im := x } - f 0‖ := by
2024-06-16 19:00:30 +02:00
simp
rw [norm_smul]
simp
2024-06-18 09:56:44 +02:00
_ ≤ (c / (4 : ℝ )) * |y.re - 0| + (c / (4 : ℝ )) * |y.im - 0| := by
2024-06-16 19:00:30 +02:00
apply add_le_add
2024-06-17 17:22:17 +02:00
exact t₁
2024-06-18 09:56:44 +02:00
exact t₂
_ ≤ (c / (4 : ℝ )) * (|y.re| + |y.im|) := by
simp
rw [mul_add]
2024-06-18 11:21:58 +02:00
_ ≤ (c / (4 : ℝ )) * (4 * ‖y‖) := by
have : |y.re| + |y.im| ≤ 4 * ‖y‖ := by
calc |y.re| + |y.im|
_ ≤ ‖y‖ + ‖y‖ := by
apply add_le_add
apply Complex.abs_re_le_abs
apply Complex.abs_im_le_abs
_ ≤ 4 * ‖y‖ := by
rw [← two_mul]
apply mul_le_mul
linarith
rfl
exact norm_nonneg y
linarith
2024-06-18 09:56:44 +02:00
apply mul_le_mul
2024-06-18 11:21:58 +02:00
rfl
exact this
apply add_nonneg
apply abs_nonneg
apply abs_nonneg
linarith
_ ≤ c * ‖y‖ := by
2024-06-18 09:56:44 +02:00
linarith
2024-06-14 16:07:58 +02:00
2024-06-18 16:49:00 +02:00
theorem primitive_translation
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
(f : ℂ → E)
(z₀ t : ℂ ) :
primitive z₀ (f ∘ fun z ↦ (z - t)) = ((primitive (z₀ - t) f) ∘ fun z ↦ (z - t)) := by
funext z
unfold primitive
simp
let g : ℝ → E := fun x ↦ f ( {re := x, im := z₀.im - t.im} )
have {x : ℝ } : f ({ re := x, im := z₀.im } - t) = g (1*x - t.re) := by
congr 1
apply Complex.ext <;> simp
conv =>
left
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_mul_sub g one_ne_zero (t.re)]
simp
congr 1
let g : ℝ → E := fun x ↦ f ( {re := z.re - t.re, im := x} )
have {x : ℝ } : f ({ re := z.re, im := x} - t) = g (1*x - t.im) := by
congr 1
apply Complex.ext <;> simp
conv =>
left
arg 1
intro x
rw [this]
rw [intervalIntegral.integral_comp_mul_sub g one_ne_zero (t.im)]
simp
2024-07-30 16:45:26 +02:00
theorem primitive_hasDerivAtBasepoint
2024-06-18 16:49:00 +02:00
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
2024-07-30 16:45:26 +02:00
{f : ℂ → E}
2024-08-08 13:32:15 +02:00
{R : ℝ }
(z₀ : ℂ )
(hR : 0 < R)
(hf : ContinuousOn f (Metric.ball z₀ R)) :
2024-06-18 16:49:00 +02:00
HasDerivAt (primitive z₀ f) (f z₀) z₀ := by
let g := f ∘ fun z ↦ z + z₀
2024-08-08 13:32:15 +02:00
have hg : ContinuousOn g (Metric.ball 0 R) := by
apply ContinuousOn.comp
fun_prop
fun_prop
intro x hx
simp
simp at hx
assumption
2024-06-18 16:49:00 +02:00
let B := primitive_translation g z₀ z₀
simp at B
have : (g ∘ fun z ↦ (z - z₀)) = f := by
funext z
dsimp [g]
simp
rw [this] at B
rw [B]
2024-08-08 13:32:15 +02:00
have : f z₀ = (1 : ℂ ) • (f z₀) := (MulAction.one_smul (f z₀)).symm
2024-06-18 16:49:00 +02:00
conv =>
arg 2
rw [this]
apply HasDerivAt.scomp
simp
have : g 0 = f z₀ := by simp [g]
rw [← this]
2024-08-08 13:32:15 +02:00
exact primitive_fderivAtBasepointZero hR hg
2024-06-18 16:49:00 +02:00
apply HasDerivAt.sub_const
have : (fun (x : ℂ ) ↦ x) = id := by
funext x
simp
rw [this]
exact hasDerivAt_id z₀
2024-06-14 16:07:58 +02:00
theorem primitive_additivity
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
2024-08-08 13:32:15 +02:00
{f : ℂ → E}
{z₀ : ℂ }
{rx ry : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry))
(hry : 0 < ry)
{z₁ : ℂ }
(hz₁ : z₁ ∈ (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry))
:
∃ εx > 0, ∃ εy > 0, ∀ z ∈ (Metric.ball z₁.re εx × ℂ Metric.ball z₁.im εy), (primitive z₀ f z) - (primitive z₁ f z) - (primitive z₀ f z₁) = 0 := by
let εx := rx - dist z₀.re z₁.re
have hεx : εx > 0 := by
let A := hz₁.1
simp at A
dsimp [εx]
rw [dist_comm]
simpa
let εy := ry - dist z₀.im z₁.im
have hεy : εy > 0 := by
let A := hz₁.2
simp at A
dsimp [εy]
rw [dist_comm]
simpa
use εx
use hεx
use εy
use hεy
intro z hz
2024-06-18 16:49:00 +02:00
unfold primitive
have : (∫ (x : ℝ ) in z₀.re..z.re, f { re := x, im := z₀.im }) = (∫ (x : ℝ ) in z₀.re..z₁.re, f { re := x, im := z₀.im }) + (∫ (x : ℝ ) in z₁.re..z.re, f { re := x, im := z₀.im }) := by
2024-08-08 13:32:15 +02:00
rw [intervalIntegral.integral_add_adjacent_intervals]
-- IntervalIntegrable (fun x => f { re := x, im := z₀.im }) MeasureTheory.volume z₀.re z₁.re
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf.continuousOn
have {b : ℝ } : ((fun x => { re := x, im := b }) : ℝ → ℂ ) = (fun x => Complex.ofRealCLM x + { re := 0, im := b }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
rw [Complex.add_im]
simp
apply Continuous.continuousOn
rw [this]
continuity
-- Remains: Set.MapsTo (fun x => { re := x, im := z₀.im }) (Set.uIcc z₀.re z₁.re) (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry)
intro w hw
simp
apply Complex.mem_reProdIm.mpr
constructor
· simp
calc dist w z₀.re
_ ≤ dist z₁.re z₀.re := by apply Real.dist_right_le_of_mem_uIcc; rwa [Set.uIcc_comm] at hw
_ < rx := by apply Metric.mem_ball.mp (Complex.mem_reProdIm.1 hz₁).1
· simpa
-- IntervalIntegrable (fun x => f { re := x, im := z₀.im }) MeasureTheory.volume z₁.re z.re
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf.continuousOn
have {b : ℝ } : ((fun x => { re := x, im := b }) : ℝ → ℂ ) = (fun x => Complex.ofRealCLM x + { re := 0, im := b }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
rw [Complex.add_im]
simp
apply Continuous.continuousOn
rw [this]
continuity
-- Remains: Set.MapsTo (fun x => { re := x, im := z₀.im }) (Set.uIcc z₁.re z.re) (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry)
intro w hw
simp
constructor
· simp
calc dist w z₀.re
_ ≤ dist w z₁.re + dist z₁.re z₀.re := by exact dist_triangle w z₁.re z₀.re
_ ≤ dist z.re z₁.re + dist z₁.re z₀.re := by
apply (add_le_add_iff_right (dist z₁.re z₀.re)).mpr
rw [Set.uIcc_comm] at hw
exact Real.dist_right_le_of_mem_uIcc hw
_ < (rx - dist z₀.re z₁.re) + dist z₁.re z₀.re := by
apply (add_lt_add_iff_right (dist z₁.re z₀.re)).mpr
apply Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz).1
_ = rx := by
rw [dist_comm]
simp
· simpa
2024-06-18 16:49:00 +02:00
rw [this]
have : (∫ (x : ℝ ) in z₀.im..z.im, f { re := z.re, im := x }) = (∫ (x : ℝ ) in z₀.im..z₁.im, f { re := z.re, im := x }) + (∫ (x : ℝ ) in z₁.im..z.im, f { re := z.re, im := x }) := by
rw [intervalIntegral.integral_add_adjacent_intervals]
2024-08-08 13:32:15 +02:00
-- IntervalIntegrable (fun x => f { re := z.re, im := x }) MeasureTheory.volume z₀.im z₁.im
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf.continuousOn
apply Continuous.continuousOn
have {b : ℝ }: (Complex.mk b) = (fun x => Complex.I • Complex.ofRealCLM x + { re := b, im := 0 }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
simp
rw [this]
apply Continuous.add
fun_prop
fun_prop
-- Set.MapsTo (Complex.mk z.re) (Set.uIcc z₀.im z₁.im) (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry)
intro w hw
constructor
· simp
calc dist z.re z₀.re
_ ≤ dist z.re z₁.re + dist z₁.re z₀.re := by exact dist_triangle z.re z₁.re z₀.re
_ < (rx - dist z₀.re z₁.re) + dist z₁.re z₀.re := by
apply (add_lt_add_iff_right (dist z₁.re z₀.re)).mpr
apply Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz).1
_ = rx := by
rw [dist_comm]
simp
· simp
calc dist w z₀.im
_ ≤ dist z₁.im z₀.im := by rw [Set.uIcc_comm] at hw; exact Real.dist_right_le_of_mem_uIcc hw
_ < ry := by
rw [← Metric.mem_ball]
exact hz₁.2
-- IntervalIntegrable (fun x => f { re := z.re, im := x }) MeasureTheory.volume z₁.im z.im
apply ContinuousOn.intervalIntegrable
apply ContinuousOn.comp
exact hf.continuousOn
apply Continuous.continuousOn
have {b : ℝ }: (Complex.mk b) = (fun x => Complex.I • Complex.ofRealCLM x + { re := b, im := 0 }) := by
funext x
apply Complex.ext
rw [Complex.add_re]
simp
simp
rw [this]
apply Continuous.add
fun_prop
fun_prop
-- Set.MapsTo (Complex.mk z.re) (Set.uIcc z₁.im z.im) (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry)
intro w hw
constructor
· simp
calc dist z.re z₀.re
_ ≤ dist z.re z₁.re + dist z₁.re z₀.re := by exact dist_triangle z.re z₁.re z₀.re
_ < (rx - dist z₀.re z₁.re) + dist z₁.re z₀.re := by
apply (add_lt_add_iff_right (dist z₁.re z₀.re)).mpr
apply Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz).1
_ = rx := by
rw [dist_comm]
simp
· simp
calc dist w z₀.im
_ ≤ dist w z₁.im + dist z₁.im z₀.im := by exact dist_triangle w z₁.im z₀.im
_ ≤ dist z.im z₁.im + dist z₁.im z₀.im := by
apply (add_le_add_iff_right (dist z₁.im z₀.im)).mpr
rw [Set.uIcc_comm] at hw
exact Real.dist_right_le_of_mem_uIcc hw
_ < (ry - dist z₀.im z₁.im) + dist z₁.im z₀.im := by
apply (add_lt_add_iff_right (dist z₁.im z₀.im)).mpr
apply Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz).2
_ = ry := by
rw [dist_comm]
simp
2024-06-18 16:49:00 +02:00
rw [this]
2024-06-14 16:07:58 +02:00
2024-08-08 13:32:15 +02:00
simp
2024-06-14 16:07:58 +02:00
2024-08-08 13:32:15 +02:00
have {a b c d e f g h : E} : (a + b) + (c + d) - (e + f) - (g + h) = b + (a - g) - e - f + d - h + (c) := by
2024-06-18 16:49:00 +02:00
abel
rw [this]
2024-08-08 13:32:15 +02:00
have H' : DifferentiableOn ℂ f (Set.uIcc z₁.re z.re × ℂ Set.uIcc z₀.im z₁.im) := by
apply DifferentiableOn.mono hf
intro x hx
constructor
· simp
calc dist x.re z₀.re
_ ≤ dist x.re z₁.re + dist z₁.re z₀.re := by exact dist_triangle x.re z₁.re z₀.re
_ ≤ dist z.re z₁.re + dist z₁.re z₀.re := by
apply (add_le_add_iff_right (dist z₁.re z₀.re)).mpr
rw [Set.uIcc_comm] at hx
apply Real.dist_right_le_of_mem_uIcc (Complex.mem_reProdIm.1 hx).1
_ < (rx - dist z₀.re z₁.re) + dist z₁.re z₀.re := by
apply (add_lt_add_iff_right (dist z₁.re z₀.re)).mpr
apply Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz).1
_ = rx := by
rw [dist_comm]
simp
· simp
calc dist x.im z₀.im
_ ≤ dist z₀.im z₁.im := by rw [dist_comm]; exact Real.dist_left_le_of_mem_uIcc (Complex.mem_reProdIm.1 hx).2
_ < ry := by
rw [dist_comm]
exact Metric.mem_ball.1 (Complex.mem_reProdIm.1 hz₁).2
let A := Complex.integral_boundary_rect_eq_zero_of_differentiableOn f ⟨z₁.re, z₀.im⟩ ⟨z.re, z₁.im⟩ H'
have {x : ℝ } {w : ℂ } : ↑x + w.im * Complex.I = { re := x, im := w.im } := by
apply Complex.ext
· simp
· simp
simp_rw [this] at A
have {x : ℝ } {w : ℂ } : w.re + x * Complex.I = { re := w.re, im := x } := by
apply Complex.ext
· simp
· simp
simp_rw [this] at A
rw [← A]
2024-06-18 16:49:00 +02:00
abel
2024-06-18 19:24:18 +02:00
2024-08-08 13:32:15 +02:00
theorem primitive_additivity'
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
{f : ℂ → E}
{z₀ z₁ : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
(hz₁ : z₁ ∈ Metric.ball z₀ R)
:
primitive z₀ f =ᶠ[nhds z₁] fun z ↦ (primitive z₁ f z) + (primitive z₀ f z₁) := by
let d := fun ε ↦ √((dist z₁.re z₀.re + ε) ^ 2 + (dist z₁.im z₀.im + ε) ^ 2)
have h₀d : Continuous d := by continuity
have h₁d : ∀ ε, 0 ≤ d ε := fun ε ↦ Real.sqrt_nonneg ((dist z₁.re z₀.re + ε) ^ 2 + (dist z₁.im z₀.im + ε) ^ 2)
obtain ⟨ε, h₀ε, h₁ε⟩ : ∃ ε > 0, d ε < R := by
let Omega := d⁻¹' Metric.ball 0 R
have lem₀Ω : IsOpen Omega := IsOpen.preimage h₀d Metric.isOpen_ball
have lem₁Ω : 0 ∈ Omega := by
dsimp [Omega, d]; simp
have : dist z₁.re z₀.re = |z₁.re - z₀.re| := by exact rfl
rw [this]
have : dist z₁.im z₀.im = |z₁.im - z₀.im| := by exact rfl
rw [this]
simp
rw [← Complex.dist_eq_re_im]; simp
exact hz₁
obtain ⟨ε, h₁ε, h₂ε⟩ := Metric.isOpen_iff.1 lem₀Ω 0 lem₁Ω
let ε' := (2 : ℝ )⁻¹ * ε
have h₀ε' : ε' ∈ Omega := by
apply h₂ε
dsimp [ε']; simp
have : |ε| = ε := by apply abs_of_pos h₁ε
rw [this]
apply (inv_mul_lt_iff zero_lt_two).mpr
linarith
have h₁ε' : 0 < ε' := by
apply Real.mul_pos _ h₁ε
apply inv_pos.mpr
exact zero_lt_two
use ε'
constructor
· exact h₁ε'
· dsimp [Omega] at h₀ε'; simp at h₀ε'
rwa [abs_of_nonneg (h₁d ε')] at h₀ε'
let rx := dist z₁.re z₀.re + ε
let ry := dist z₁.im z₀.im + ε
have h'ry : 0 < ry := by
dsimp [ry]
apply add_pos_of_nonneg_of_pos
exact dist_nonneg
simpa
have h'f : DifferentiableOn ℂ f (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry) := by
apply hf.mono
intro x hx
simp
rw [Complex.dist_eq_re_im]
have t₀ : dist x.re z₀.re < rx := Metric.mem_ball.mp hx.1
have t₁ : dist x.im z₀.im < ry := Metric.mem_ball.mp hx.2
have t₂ : √((x.re - z₀.re) ^ 2 + (x.im - z₀.im) ^ 2) < √( rx ^ 2 + ry ^ 2) := by
rw [Real.sqrt_lt_sqrt_iff]
apply add_lt_add
· rw [sq_lt_sq]
dsimp [dist] at t₀
nth_rw 2 [abs_of_nonneg]
assumption
apply add_nonneg dist_nonneg (le_of_lt h₀ε)
· rw [sq_lt_sq]
dsimp [dist] at t₁
nth_rw 2 [abs_of_nonneg]
assumption
apply add_nonneg dist_nonneg (le_of_lt h₀ε)
apply add_nonneg
exact sq_nonneg (x.re - z₀.re)
exact sq_nonneg (x.im - z₀.im)
calc √((x.re - z₀.re) ^ 2 + (x.im - z₀.im) ^ 2)
_ < √( rx ^ 2 + ry ^ 2) := by
exact t₂
_ = d ε := by dsimp [d, rx, ry]
_ < R := by exact h₁ε
have h'z₁ : z₁ ∈ (Metric.ball z₀.re rx × ℂ Metric.ball z₀.im ry) := by
dsimp [rx, ry]
constructor
· simp; exact h₀ε
· simp; exact h₀ε
obtain ⟨εx, hεx, εy, hεy, hε⟩ := primitive_additivity h'f h'ry h'z₁
apply Filter.eventuallyEq_iff_exists_mem.2
use (Metric.ball z₁.re εx × ℂ Metric.ball z₁.im εy)
constructor
· apply IsOpen.mem_nhds
apply IsOpen.reProdIm
exact Metric.isOpen_ball
exact Metric.isOpen_ball
constructor
· simpa
· simpa
· intro x hx
simp
rw [← sub_zero (primitive z₀ f x), ← hε x hx]
abel
2024-07-30 16:45:26 +02:00
theorem primitive_hasDerivAt
2024-06-18 19:24:18 +02:00
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
2024-07-30 16:45:26 +02:00
{f : ℂ → E}
2024-08-08 13:32:15 +02:00
{z₀ z : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
(hz : z ∈ Metric.ball z₀ R) :
2024-06-18 19:24:18 +02:00
HasDerivAt (primitive z₀ f) (f z) z := by
2024-08-08 13:32:15 +02:00
let A := primitive_additivity' hf hz
rw [Filter.EventuallyEq.hasDerivAt_iff A]
2024-06-18 19:24:18 +02:00
rw [← add_zero (f z)]
apply HasDerivAt.add
2024-08-08 13:32:15 +02:00
let R' := R - dist z z₀
have h₀R' : 0 < R' := by
dsimp [R']
simp
exact hz
have h₁R' : Metric.ball z R' ⊆ Metric.ball z₀ R := by
intro x hx
simp
calc dist x z₀
_ ≤ dist x z + dist z z₀ := dist_triangle x z z₀
_ < R' + dist z z₀ := by
refine add_lt_add_right ?bc (dist z z₀)
exact hx
_ = R := by
dsimp [R']
simp
2024-07-30 16:45:26 +02:00
apply primitive_hasDerivAtBasepoint
2024-08-08 13:32:15 +02:00
exact h₀R'
apply ContinuousOn.mono hf.continuousOn h₁R'
2024-06-18 19:24:18 +02:00
apply hasDerivAt_const
2024-07-30 16:45:26 +02:00
2024-08-08 13:32:15 +02:00
theorem primitive_differentiableOn
2024-07-30 16:45:26 +02:00
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
{f : ℂ → E}
2024-08-08 13:32:15 +02:00
{z₀ : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
:
DifferentiableOn ℂ (primitive z₀ f) (Metric.ball z₀ R) := by
intro z hz
apply DifferentiableAt.differentiableWithinAt
exact (primitive_hasDerivAt hf hz).differentiableAt
2024-07-30 16:45:26 +02:00
theorem primitive_hasFderivAt
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
{f : ℂ → E}
2024-08-08 13:32:15 +02:00
(z₀ : ℂ )
(R : ℝ )
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
:
∀ z ∈ Metric.ball z₀ R, HasFDerivAt (primitive z₀ f) ((ContinuousLinearMap.lsmul ℂ ℂ ).flip (f z)) z := by
intro z hz
2024-07-30 16:45:26 +02:00
rw [hasFDerivAt_iff_hasDerivAt]
2024-08-08 13:32:15 +02:00
simp
apply primitive_hasDerivAt hf hz
2024-07-30 16:45:26 +02:00
theorem primitive_hasFderivAt'
{f : ℂ → ℂ }
2024-08-08 13:32:15 +02:00
{z₀ : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
:
∀ z ∈ Metric.ball z₀ R, HasFDerivAt (primitive z₀ f) (ContinuousLinearMap.lsmul ℂ ℂ (f z)) z := by
intro z hz
2024-07-30 16:45:26 +02:00
rw [hasFDerivAt_iff_hasDerivAt]
2024-08-08 13:32:15 +02:00
simp
exact primitive_hasDerivAt hf hz
2024-07-30 16:45:26 +02:00
theorem primitive_fderiv
{E : Type u} [NormedAddCommGroup E] [NormedSpace ℂ E] [CompleteSpace E]
{f : ℂ → E}
2024-08-08 13:32:15 +02:00
{z₀ : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
:
∀ z ∈ Metric.ball z₀ R, (fderiv ℂ (primitive z₀ f) z) = (ContinuousLinearMap.lsmul ℂ ℂ ).flip (f z) := by
intro z hz
2024-07-30 16:45:26 +02:00
apply HasFDerivAt.fderiv
2024-08-08 13:32:15 +02:00
exact primitive_hasFderivAt z₀ R hf z hz
2024-07-30 16:45:26 +02:00
theorem primitive_fderiv'
{f : ℂ → ℂ }
2024-08-08 13:32:15 +02:00
{z₀ : ℂ }
{R : ℝ }
(hf : DifferentiableOn ℂ f (Metric.ball z₀ R))
:
∀ z ∈ Metric.ball z₀ R, (fderiv ℂ (primitive z₀ f) z) = ContinuousLinearMap.lsmul ℂ ℂ (f z) := by
intro z hz
2024-07-30 16:45:26 +02:00
apply HasFDerivAt.fderiv
2024-08-08 13:32:15 +02:00
exact primitive_hasFderivAt' hf z hz