Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit d757996

Browse files
committed
feat(analysis/complex): prove that complex functions are conformal if and only if the functions are holomorphic/antiholomorphic with nonvanishing differential (#8424)
Complex functions are conformal if and only if the functions are holomorphic/antiholomorphic with nonvanishing differential. Co-authored-by: justadzr <66561890+justadzr@users.noreply.github.com>
1 parent b3c1de6 commit d757996

File tree

5 files changed

+227
-30
lines changed

5 files changed

+227
-30
lines changed

src/analysis/calculus/conformal.lean

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ begin
7373
{ exact ⟨(0 : X →L[ℝ] Y), has_fderiv_at_of_subsingleton f x,
7474
is_conformal_map_of_subsingleton 0⟩, },
7575
{ exfalso,
76-
rcases nontrivial_iff.mp w with ⟨a, b, hab⟩,
77-
rw [fderiv_zero_of_not_differentiable_at h] at H,
78-
exact hab (H.injective rfl), }, }, },
76+
exact H.ne_zero (fderiv_zero_of_not_differentiable_at h), }, }, },
7977
end
8078

8179
/-- A real differentiable map `f` is conformal at point `x` if and only if its
@@ -108,7 +106,7 @@ lemma comp {f : X → Y} {g : Y → Z} (x : X)
108106
begin
109107
rcases hf with ⟨f', hf₁, cf⟩,
110108
rcases hg with ⟨g', hg₁, cg⟩,
111-
exact ⟨g'.comp f', hg₁.comp x hf₁, cf.comp cg⟩,
109+
exact ⟨g'.comp f', hg₁.comp x hf₁, cg.comp cf⟩,
112110
end
113111

114112
lemma const_smul {f : X → Y} {x : X} {c : ℝ} (hc : c ≠ 0) (hf : conformal_at f x) :
@@ -134,13 +132,6 @@ lemma conformal_factor_at_inner_eq_mul_inner {f : E → F} {x : E} {f' : E →L[
134132
⟪f' u, f' v⟫ = (conformal_factor_at H : ℝ) * ⟪u, v⟫ :=
135133
(H.differentiable_at.has_fderiv_at.unique h) ▸ conformal_factor_at_inner_eq_mul_inner' H u v
136134

137-
/-- If a real differentiable map `f` is conformal at a point `x`,
138-
then it preserves the angles at that point. -/
139-
lemma preserves_angle {f : E → F} {x : E} {f' : E →L[ℝ] F}
140-
(h : has_fderiv_at f f' x) (H : conformal_at f x) (u v : E) :
141-
inner_product_geometry.angle (f' u) (f' v) = inner_product_geometry.angle u v :=
142-
let ⟨f₁, h₁, c⟩ := H in h₁.unique h ▸ c.preserves_angle u v
143-
144135
end conformal_at
145136

146137
end loc_conformality
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/-
2+
Copyright (c) 2021 Yourong Zang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yourong Zang
5+
-/
6+
import analysis.complex.isometry
7+
import analysis.normed_space.conformal_linear_map
8+
9+
/-!
10+
# Conformal maps between complex vector spaces
11+
12+
We prove the sufficient and necessary conditions for a real-linear map between complex vector spaces
13+
to be conformal.
14+
15+
## Main results
16+
17+
* `is_conformal_map_complex_linear`: a nonzero complex linear map into an arbitrary complex
18+
normed space is conformal.
19+
* `is_conformal_map_complex_linear_conj`: the composition of a nonzero complex linear map with
20+
`conj` is complex linear.
21+
* `is_conformal_map_iff_is_complex_or_conj_linear`: a real linear map between the complex
22+
plane is conformal iff it's complex
23+
linear or the composition of
24+
some complex linear map and `conj`.
25+
26+
## Warning
27+
28+
Antiholomorphic functions such as the complex conjugate are considered as conformal functions in
29+
this file.
30+
-/
31+
32+
noncomputable theory
33+
34+
open complex continuous_linear_map
35+
36+
lemma is_conformal_map_conj : is_conformal_map (conj_lie : ℂ →L[ℝ] ℂ) :=
37+
conj_lie.to_linear_isometry.is_conformal_map
38+
39+
section conformal_into_complex_normed
40+
41+
variables {E : Type*} [normed_group E] [normed_space ℝ E] [normed_space ℂ E]
42+
[is_scalar_tower ℝ ℂ E] {z : ℂ} {g : ℂ →L[ℝ] E} {f : ℂ → E}
43+
44+
lemma is_conformal_map_complex_linear
45+
{map : ℂ →L[ℂ] E} (nonzero : map ≠ 0) : is_conformal_map (map.restrict_scalars ℝ) :=
46+
begin
47+
have minor₁ : ∥map 1∥ ≠ 0,
48+
{ simpa [ext_ring_iff] using nonzero },
49+
refine ⟨∥map 1∥, minor₁, ⟨∥map 1∥⁻¹ • map, _⟩, _⟩,
50+
{ intros x,
51+
simp only [linear_map.smul_apply],
52+
have : x = x • 1 := by rw [smul_eq_mul, mul_one],
53+
nth_rewrite 0 [this],
54+
rw [_root_.coe_coe map, linear_map.coe_coe_is_scalar_tower],
55+
simp only [map.coe_coe, map.map_smul, norm_smul, normed_field.norm_inv, norm_norm],
56+
field_simp [minor₁], },
57+
{ ext1,
58+
rw [← linear_isometry.coe_to_linear_map],
59+
simp [minor₁], },
60+
end
61+
62+
lemma is_conformal_map_complex_linear_conj
63+
{map : ℂ →L[ℂ] E} (nonzero : map ≠ 0) :
64+
is_conformal_map ((map.restrict_scalars ℝ).comp (conj_cle : ℂ →L[ℝ] ℂ)) :=
65+
(is_conformal_map_complex_linear nonzero).comp is_conformal_map_conj
66+
67+
end conformal_into_complex_normed
68+
69+
section conformal_into_complex_plane
70+
71+
open continuous_linear_map
72+
73+
variables {f : ℂ → ℂ} {z : ℂ} {g : ℂ →L[ℝ] ℂ}
74+
75+
lemma is_conformal_map.is_complex_or_conj_linear (h : is_conformal_map g) :
76+
(∃ (map : ℂ →L[ℂ] ℂ), map.restrict_scalars ℝ = g) ∨
77+
(∃ (map : ℂ →L[ℂ] ℂ), map.restrict_scalars ℝ = g.comp ↑conj_cle) :=
78+
begin
79+
rcases h with ⟨c, hc, li, hg⟩,
80+
rcases linear_isometry_complex (li.to_linear_isometry_equiv rfl) with ⟨a, ha⟩,
81+
let rot := c • (a : ℂ) • continuous_linear_map.id ℂ ℂ,
82+
cases ha,
83+
{ refine or.intro_left _ ⟨rot, _⟩,
84+
ext1,
85+
simp only [coe_restrict_scalars', hg, ← li.coe_to_linear_isometry_equiv, ha,
86+
pi.smul_apply, continuous_linear_map.smul_apply, rotation_apply,
87+
continuous_linear_map.id_apply, smul_eq_mul], },
88+
{ refine or.intro_right _ ⟨rot, _⟩,
89+
ext1,
90+
rw [continuous_linear_map.coe_comp', hg, ← li.coe_to_linear_isometry_equiv, ha],
91+
simp only [coe_restrict_scalars', function.comp_app, pi.smul_apply,
92+
linear_isometry_equiv.coe_trans, conj_lie_apply,
93+
rotation_apply, continuous_linear_equiv.coe_apply, conj_cle_apply],
94+
simp only [continuous_linear_map.smul_apply, continuous_linear_map.id_apply,
95+
smul_eq_mul, conj_conj], },
96+
end
97+
98+
/-- A real continuous linear map on the complex plane is conformal if and only if the map or its
99+
conjugate is complex linear, and the map is nonvanishing. -/
100+
lemma is_conformal_map_iff_is_complex_or_conj_linear:
101+
is_conformal_map g ↔
102+
((∃ (map : ℂ →L[ℂ] ℂ), map.restrict_scalars ℝ = g) ∨
103+
(∃ (map : ℂ →L[ℂ] ℂ), map.restrict_scalars ℝ = g.comp ↑conj_cle)) ∧ g ≠ 0 :=
104+
begin
105+
split,
106+
{ exact λ h, ⟨h.is_complex_or_conj_linear, h.ne_zero⟩, },
107+
{ rintros ⟨⟨map, rfl⟩ | ⟨map, hmap⟩, h₂⟩,
108+
{ refine is_conformal_map_complex_linear _,
109+
contrapose! h₂ with w,
110+
simp [w] },
111+
{ have minor₁ : g = (map.restrict_scalars ℝ).comp ↑conj_cle,
112+
{ ext1,
113+
simp [hmap] },
114+
rw minor₁ at ⊢ h₂,
115+
refine is_conformal_map_complex_linear_conj _,
116+
contrapose! h₂ with w,
117+
simp [w] } }
118+
end
119+
120+
end conformal_into_complex_plane

src/analysis/complex/real_deriv.lean

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
11
/-
22
Copyright (c) Sébastien Gouëzel. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Sébastien Gouëzel
4+
Authors: Sébastien Gouëzel, Yourong Zang
55
-/
66
import analysis.calculus.times_cont_diff
7-
import analysis.complex.basic
7+
import analysis.complex.conformal
8+
import analysis.calculus.conformal
89

910
/-! # Real differentiability of complex-differentiable functions
1011
1112
`has_deriv_at.real_of_complex` expresses that, if a function on `ℂ` is differentiable (over `ℂ`),
1213
then its restriction to `ℝ` is differentiable over `ℝ`, with derivative the real part of the
1314
complex derivative.
14-
-/
1515
16+
`differentiable_at.conformal_at` states that a real-differentiable function with a nonvanishing
17+
differential from the complex plane into an arbitrary complex-normed space is conformal at a point
18+
if it's holomorphic at that point. This is a version of Cauchy-Riemann equations.
19+
20+
`conformal_at_iff_differentiable_at_or_differentiable_at_comp_conj` proves that a real-differential
21+
function with a nonvanishing differential between the complex plane is conformal at a point if and
22+
only if it's holomorphic or antiholomorphic at that point.
23+
24+
## TODO
25+
26+
* The classical form of Cauchy-Riemann equations
27+
* On a connected open set `u`, a function which is `conformal_at` each point is either holomorphic
28+
throughout or antiholomorphic throughout.
29+
30+
## Warning
31+
32+
We do NOT require conformal functions to be orientation-preserving in this file.
33+
-/
1634

1735
section real_deriv_of_complex
1836
/-! ### Differentiability of the restriction to `ℝ` of complex functions -/
@@ -62,3 +80,47 @@ times_cont_diff_iff_times_cont_diff_at.2 $ λ x,
6280
h.times_cont_diff_at.real_of_complex
6381

6482
end real_deriv_of_complex
83+
84+
section conformality
85+
/-! ### Conformality of real-differentiable complex maps -/
86+
open complex continuous_linear_map
87+
88+
variables
89+
90+
/-- A real differentiable function of the complex plane into some complex normed space `E` is
91+
conformal at a point `z` if it is holomorphic at that point with a nonvanishing differential.
92+
This is a version of the Cauchy-Riemann equations. -/
93+
lemma differentiable_at.conformal_at {E : Type*}
94+
[normed_group E] [normed_space ℝ E] [normed_space ℂ E]
95+
[is_scalar_tower ℝ ℂ E] {z : ℂ} {f : ℂ → E}
96+
(hf' : fderiv ℝ f z ≠ 0) (h : differentiable_at ℂ f z) :
97+
conformal_at f z :=
98+
begin
99+
rw conformal_at_iff_is_conformal_map_fderiv,
100+
rw (h.has_fderiv_at.restrict_scalars ℝ).fderiv at ⊢ hf',
101+
apply is_conformal_map_complex_linear,
102+
contrapose! hf' with w,
103+
simp [w]
104+
end
105+
106+
/-- A complex function is conformal if and only if the function is holomorphic or antiholomorphic
107+
with a nonvanishing differential. -/
108+
lemma conformal_at_iff_differentiable_at_or_differentiable_at_comp_conj {f : ℂ → ℂ} {z : ℂ} :
109+
conformal_at f z ↔
110+
(differentiable_at ℂ f z ∨ differentiable_at ℂ (f ∘ conj) (conj z)) ∧ fderiv ℝ f z ≠ 0 :=
111+
begin
112+
rw conformal_at_iff_is_conformal_map_fderiv,
113+
rw is_conformal_map_iff_is_complex_or_conj_linear,
114+
apply and_congr_left,
115+
intros h,
116+
have h_diff := h.imp_symm fderiv_zero_of_not_differentiable_at,
117+
apply or_congr,
118+
{ rw differentiable_at_iff_restrict_scalars ℝ h_diff },
119+
rw ← conj_conj z at h_diff,
120+
rw differentiable_at_iff_restrict_scalars ℝ (h_diff.comp _ conj_cle.differentiable_at),
121+
refine exists_congr (λ g, rfl.congr _),
122+
have : fderiv ℝ conj (conj z) = _ := conj_cle.fderiv,
123+
simp [fderiv.comp _ h_diff conj_cle.differentiable_at, this, conj_conj],
124+
end
125+
126+
end conformality

src/analysis/normed_space/conformal_linear_map.lean

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ Copyright (c) 2021 Yourong Zang. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Yourong Zang
55
-/
6-
import geometry.euclidean.basic
76
import analysis.normed_space.inner_product
87

98
/-!
@@ -59,6 +58,10 @@ lemma is_conformal_map_id : is_conformal_map (id R M) :=
5958
lemma is_conformal_map_const_smul {c : R} (hc : c ≠ 0) : is_conformal_map (c • (id R M)) :=
6059
⟨c, hc, id, by ext; simp⟩
6160

61+
lemma linear_isometry.is_conformal_map (f' : E →ₗᵢ[ℝ] F) :
62+
is_conformal_map f'.to_continuous_linear_map :=
63+
1, one_ne_zero, f', by ext; simp⟩
64+
6265
lemma is_conformal_map_iff (f' : E →L[ℝ] F) :
6366
is_conformal_map f' ↔ ∃ (c : ℝ), 0 < c ∧
6467
∀ (u v : E), ⟪f' u, f' v⟫ = (c : ℝ) * ⟪u, v⟫ :=
@@ -98,7 +101,7 @@ end
98101
namespace is_conformal_map
99102

100103
lemma comp {f' : M →L[R] N} {g' : N →L[R] G}
101-
(hf' : is_conformal_map f') (hg' : is_conformal_map g') :
104+
(hg' : is_conformal_map g') (hf' : is_conformal_map f') :
102105
is_conformal_map (g'.comp f') :=
103106
begin
104107
rcases hf' with ⟨cf, hcf, lif, hlif⟩,
@@ -112,20 +115,14 @@ lemma injective {f' : M →L[R] N} (h : is_conformal_map f') : function.injectiv
112115
let ⟨c, hc, li, hf'⟩ := h in by simp only [hf', pi.smul_def];
113116
exact (smul_left_injective _ hc).comp li.injective
114117

115-
lemma preserves_angle {f' : E →L[ℝ] F} (h : is_conformal_map f') (u v : E) :
116-
inner_product_geometry.angle (f' u) (f' v) = inner_product_geometry.angle u v :=
118+
lemma ne_zero [nontrivial M] {f' : M →L[R] N} (hf' : is_conformal_map f') :
119+
f' 0 :=
117120
begin
118-
obtain ⟨c, hc, li, hcf⟩ := h,
119-
suffices : c * (c * inner u v) / (∥c∥ * ∥u∥ * (∥c∥ * ∥v∥)) = inner u v / (∥u∥ * ∥v∥),
120-
{ simp [this, inner_product_geometry.angle, hcf, norm_smul, inner_smul_left, inner_smul_right] },
121-
by_cases hu : ∥u∥ = 0,
122-
{ simp [norm_eq_zero.mp hu] },
123-
by_cases hv : ∥v∥ = 0,
124-
{ simp [norm_eq_zero.mp hv] },
125-
have hc : ∥c∥ ≠ 0 := λ w, hc (norm_eq_zero.mp w),
126-
field_simp,
127-
have : c * c = ∥c∥ * ∥c∥ := by simp [real.norm_eq_abs, abs_mul_abs_self],
128-
convert congr_arg (λ x, x * ⟪u, v⟫ * ∥u∥ * ∥v∥) this using 1; ring,
121+
intros w,
122+
rcases exists_ne (0 : M) with ⟨a, ha⟩,
123+
have : f' a = f' 0,
124+
{ simp_rw [w, continuous_linear_map.zero_apply], },
125+
exact ha (hf'.injective this),
129126
end
130127

131128
end is_conformal_map

src/geometry/euclidean/basic.lean

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ Copyright (c) 2020 Joseph Myers. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Joseph Myers, Manuel Candales
55
-/
6-
import analysis.normed_space.inner_product
76
import analysis.special_functions.trigonometric
87
import algebra.quadratic_discriminant
98
import analysis.normed_space.add_torsor
109
import data.matrix.notation
1110
import linear_algebra.affine_space.finite_dimensional
1211
import tactic.fin_cases
12+
import analysis.calculus.conformal
1313

1414
/-!
1515
# Euclidean spaces
@@ -75,6 +75,33 @@ variables {V : Type*} [inner_product_space ℝ V]
7575
this is π/2. -/
7676
def angle (x y : V) : ℝ := real.arccos (inner x y / (∥x∥ * ∥y∥))
7777

78+
lemma is_conformal_map.preserves_angle {E F : Type*}
79+
[inner_product_space ℝ E] [inner_product_space ℝ F]
80+
{f' : E →L[ℝ] F} (h : is_conformal_map f') (u v : E) :
81+
angle (f' u) (f' v) = angle u v :=
82+
begin
83+
obtain ⟨c, hc, li, hcf⟩ := h,
84+
suffices : c * (c * inner u v) / (∥c∥ * ∥u∥ * (∥c∥ * ∥v∥)) = inner u v / (∥u∥ * ∥v∥),
85+
{ simp [this, angle, hcf, norm_smul, inner_smul_left, inner_smul_right] },
86+
by_cases hu : ∥u∥ = 0,
87+
{ simp [norm_eq_zero.mp hu] },
88+
by_cases hv : ∥v∥ = 0,
89+
{ simp [norm_eq_zero.mp hv] },
90+
have hc : ∥c∥ ≠ 0 := λ w, hc (norm_eq_zero.mp w),
91+
field_simp,
92+
have : c * c = ∥c∥ * ∥c∥ := by simp [real.norm_eq_abs, abs_mul_abs_self],
93+
convert congr_arg (λ x, x * ⟪u, v⟫ * ∥u∥ * ∥v∥) this using 1; ring,
94+
end
95+
96+
/-- If a real differentiable map `f` is conformal at a point `x`,
97+
then it preserves the angles at that point. -/
98+
lemma conformal_at.preserves_angle {E F : Type*}
99+
[inner_product_space ℝ E] [inner_product_space ℝ F]
100+
{f : E → F} {x : E} {f' : E →L[ℝ] F}
101+
(h : has_fderiv_at f f' x) (H : conformal_at f x) (u v : E) :
102+
angle (f' u) (f' v) = angle u v :=
103+
let ⟨f₁, h₁, c⟩ := H in h₁.unique h ▸ is_conformal_map.preserves_angle c u v
104+
78105
/-- The cosine of the angle between two vectors. -/
79106
lemma cos_angle (x y : V) : real.cos (angle x y) = inner x y / (∥x∥ * ∥y∥) :=
80107
real.cos_arccos (abs_le.mp (abs_real_inner_div_norm_mul_norm_le_one x y)).1

0 commit comments

Comments
 (0)