Skip to content

Commit c111a30

Browse files
int-y1j-loreaux
andcommitted
feat: port Analysis.Complex.UnitDisc.Basic (#4180)
Co-authored-by: Jireh Loreaux <loreaujy@gmail.com>
1 parent e425f61 commit c111a30

File tree

2 files changed

+256
-0
lines changed

2 files changed

+256
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ import Mathlib.Analysis.Complex.Conformal
417417
import Mathlib.Analysis.Complex.Isometry
418418
import Mathlib.Analysis.Complex.OperatorNorm
419419
import Mathlib.Analysis.Complex.ReImTopology
420+
import Mathlib.Analysis.Complex.UnitDisc.Basic
420421
import Mathlib.Analysis.Convex.Basic
421422
import Mathlib.Analysis.Convex.Between
422423
import Mathlib.Analysis.Convex.Body
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
/-
2+
Copyright (c) 2022 Yury Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury Kudryashov
5+
6+
! This file was ported from Lean 3 source module analysis.complex.unit_disc.basic
7+
! leanprover-community/mathlib commit 70fd9563a21e7b963887c9360bd29b2393e6225a
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.Analysis.Complex.Circle
12+
import Mathlib.Analysis.NormedSpace.BallAction
13+
14+
/-!
15+
# Poincaré disc
16+
17+
In this file we define `Complex.UnitDisc` to be the unit disc in the complex plane. We also
18+
introduce some basic operations on this disc.
19+
-/
20+
21+
22+
open Set Function Metric
23+
24+
open BigOperators
25+
26+
noncomputable section
27+
28+
local notation "conj'" => starRingEnd ℂ
29+
30+
namespace Complex
31+
32+
/-- Complex unit disc. -/
33+
def UnitDisc : Type :=
34+
ball (0 : ℂ) 1 deriving TopologicalSpace
35+
#align complex.unit_disc Complex.UnitDisc
36+
37+
instance : CommSemigroup UnitDisc := by unfold UnitDisc; infer_instance
38+
instance : HasDistribNeg UnitDisc := by unfold UnitDisc; infer_instance
39+
instance : Coe UnitDisc ℂ := ⟨Subtype.val⟩
40+
41+
scoped[UnitDisc] notation "𝔻" => Complex.UnitDisc
42+
open UnitDisc
43+
44+
namespace UnitDisc
45+
46+
theorem coe_injective : Injective ((↑) : 𝔻 → ℂ) :=
47+
Subtype.coe_injective
48+
#align complex.unit_disc.coe_injective Complex.UnitDisc.coe_injective
49+
50+
theorem abs_lt_one (z : 𝔻) : abs (z : ℂ) < 1 :=
51+
mem_ball_zero_iff.1 z.2
52+
#align complex.unit_disc.abs_lt_one Complex.UnitDisc.abs_lt_one
53+
54+
theorem abs_ne_one (z : 𝔻) : abs (z : ℂ) ≠ 1 :=
55+
z.abs_lt_one.ne
56+
#align complex.unit_disc.abs_ne_one Complex.UnitDisc.abs_ne_one
57+
58+
theorem normSq_lt_one (z : 𝔻) : normSq z < 1 := by
59+
convert (Real.sqrt_lt' one_pos).1 z.abs_lt_one
60+
exact (one_pow 2).symm
61+
#align complex.unit_disc.norm_sq_lt_one Complex.UnitDisc.normSq_lt_one
62+
63+
theorem coe_ne_one (z : 𝔻) : (z : ℂ) ≠ 1 :=
64+
ne_of_apply_ne abs <| (map_one abs).symm ▸ z.abs_ne_one
65+
#align complex.unit_disc.coe_ne_one Complex.UnitDisc.coe_ne_one
66+
67+
theorem coe_ne_neg_one (z : 𝔻) : (z : ℂ) ≠ -1 :=
68+
ne_of_apply_ne abs <| by
69+
rw [abs.map_neg, map_one]
70+
exact z.abs_ne_one
71+
#align complex.unit_disc.coe_ne_neg_one Complex.UnitDisc.coe_ne_neg_one
72+
73+
theorem one_add_coe_ne_zero (z : 𝔻) : (1 + z : ℂ) ≠ 0 :=
74+
mt neg_eq_iff_add_eq_zero.2 z.coe_ne_neg_one.symm
75+
#align complex.unit_disc.one_add_coe_ne_zero Complex.UnitDisc.one_add_coe_ne_zero
76+
77+
@[simp, norm_cast]
78+
theorem coe_mul (z w : 𝔻) : ↑(z * w) = (z * w : ℂ) :=
79+
rfl
80+
#align complex.unit_disc.coe_mul Complex.UnitDisc.coe_mul
81+
82+
/-- A constructor that assumes `abs z < 1` instead of `dist z 0 < 1` and returns an element
83+
of `𝔻` instead of `↥Metric.ball (0 : ℂ) 1`. -/
84+
def mk (z : ℂ) (hz : abs z < 1) : 𝔻 :=
85+
⟨z, mem_ball_zero_iff.2 hz⟩
86+
#align complex.unit_disc.mk Complex.UnitDisc.mk
87+
88+
@[simp]
89+
theorem coe_mk (z : ℂ) (hz : abs z < 1) : (mk z hz : ℂ) = z :=
90+
rfl
91+
#align complex.unit_disc.coe_mk Complex.UnitDisc.coe_mk
92+
93+
@[simp]
94+
theorem mk_coe (z : 𝔻) (hz : abs (z : ℂ) < 1 := z.abs_lt_one) : mk z hz = z :=
95+
Subtype.eta _ _
96+
#align complex.unit_disc.mk_coe Complex.UnitDisc.mk_coe
97+
98+
@[simp]
99+
theorem mk_neg (z : ℂ) (hz : abs (-z) < 1) : mk (-z) hz = -mk z (abs.map_neg z ▸ hz) :=
100+
rfl
101+
#align complex.unit_disc.mk_neg Complex.UnitDisc.mk_neg
102+
103+
instance : SemigroupWithZero 𝔻 :=
104+
{ instCommSemigroupUnitDisc with
105+
zero := mk 0 <| (map_zero _).trans_lt one_pos
106+
zero_mul := fun _ => coe_injective <| MulZeroClass.zero_mul _
107+
mul_zero := fun _ => coe_injective <| MulZeroClass.mul_zero _ }
108+
109+
@[simp]
110+
theorem coe_zero : ((0 : 𝔻) : ℂ) = 0 :=
111+
rfl
112+
#align complex.unit_disc.coe_zero Complex.UnitDisc.coe_zero
113+
114+
@[simp]
115+
theorem coe_eq_zero {z : 𝔻} : (z : ℂ) = 0 ↔ z = 0 :=
116+
coe_injective.eq_iff' coe_zero
117+
#align complex.unit_disc.coe_eq_zero Complex.UnitDisc.coe_eq_zero
118+
119+
instance : Inhabited 𝔻 :=
120+
0
121+
122+
instance circleAction : MulAction circle 𝔻 :=
123+
mulActionSphereBall
124+
#align complex.unit_disc.circle_action Complex.UnitDisc.circleAction
125+
126+
instance isScalarTower_circle_circle : IsScalarTower circle circle 𝔻 :=
127+
isScalarTower_sphere_sphere_ball
128+
#align complex.unit_disc.is_scalar_tower_circle_circle Complex.UnitDisc.isScalarTower_circle_circle
129+
130+
instance isScalarTower_circle : IsScalarTower circle 𝔻 𝔻 :=
131+
isScalarTower_sphere_ball_ball
132+
#align complex.unit_disc.is_scalar_tower_circle Complex.UnitDisc.isScalarTower_circle
133+
134+
instance sMulCommClass_circle : SMulCommClass circle 𝔻 𝔻 :=
135+
sMulCommClass_sphere_ball_ball
136+
#align complex.unit_disc.smul_comm_class_circle Complex.UnitDisc.sMulCommClass_circle
137+
138+
instance sMulCommClass_circle' : SMulCommClass 𝔻 circle 𝔻 :=
139+
SMulCommClass.symm _ _ _
140+
#align complex.unit_disc.smul_comm_class_circle' Complex.UnitDisc.sMulCommClass_circle'
141+
142+
@[simp, norm_cast]
143+
theorem coe_smul_circle (z : circle) (w : 𝔻) : ↑(z • w) = (z * w : ℂ) :=
144+
rfl
145+
#align complex.unit_disc.coe_smul_circle Complex.UnitDisc.coe_smul_circle
146+
147+
instance closedBallAction : MulAction (closedBall (0 : ℂ) 1) 𝔻 :=
148+
mulActionClosedBallBall
149+
#align complex.unit_disc.closed_ball_action Complex.UnitDisc.closedBallAction
150+
151+
instance isScalarTower_closedBall_closedBall :
152+
IsScalarTower (closedBall (0 : ℂ) 1) (closedBall (0 : ℂ) 1) 𝔻 :=
153+
isScalarTower_closedBall_closedBall_ball
154+
#align complex.unit_disc.is_scalar_tower_closed_ball_closed_ball Complex.UnitDisc.isScalarTower_closedBall_closedBall
155+
156+
instance isScalarTower_closedBall : IsScalarTower (closedBall (0 : ℂ) 1) 𝔻 𝔻 :=
157+
isScalarTower_closedBall_ball_ball
158+
#align complex.unit_disc.is_scalar_tower_closed_ball Complex.UnitDisc.isScalarTower_closedBall
159+
160+
instance sMulCommClass_closedBall : SMulCommClass (closedBall (0 : ℂ) 1) 𝔻 𝔻 :=
161+
fun _ _ _ => Subtype.ext <| mul_left_comm _ _ _⟩
162+
#align complex.unit_disc.smul_comm_class_closed_ball Complex.UnitDisc.sMulCommClass_closedBall
163+
164+
instance sMulCommClass_closed_ball' : SMulCommClass 𝔻 (closedBall (0 : ℂ) 1) 𝔻 :=
165+
SMulCommClass.symm _ _ _
166+
#align complex.unit_disc.smul_comm_class_closed_ball' Complex.UnitDisc.sMulCommClass_closed_ball'
167+
168+
instance sMulCommClass_circle_closedBall : SMulCommClass circle (closedBall (0 : ℂ) 1) 𝔻 :=
169+
sMulCommClass_sphere_closedBall_ball
170+
#align complex.unit_disc.smul_comm_class_circle_closed_ball Complex.UnitDisc.sMulCommClass_circle_closedBall
171+
172+
instance sMulCommClass_closedBall_circle : SMulCommClass (closedBall (0 : ℂ) 1) circle 𝔻 :=
173+
SMulCommClass.symm _ _ _
174+
#align complex.unit_disc.smul_comm_class_closed_ball_circle Complex.UnitDisc.sMulCommClass_closedBall_circle
175+
176+
@[simp, norm_cast]
177+
theorem coe_smul_closedBall (z : closedBall (0 : ℂ) 1) (w : 𝔻) : ↑(z • w) = (z * w : ℂ) :=
178+
rfl
179+
#align complex.unit_disc.coe_smul_closed_ball Complex.UnitDisc.coe_smul_closedBall
180+
181+
/-- Real part of a point of the unit disc. -/
182+
def re (z : 𝔻) : ℝ :=
183+
Complex.re z
184+
#align complex.unit_disc.re Complex.UnitDisc.re
185+
186+
/-- Imaginary part of a point of the unit disc. -/
187+
def im (z : 𝔻) : ℝ :=
188+
Complex.im z
189+
#align complex.unit_disc.im Complex.UnitDisc.im
190+
191+
@[simp, norm_cast]
192+
theorem re_coe (z : 𝔻) : (z : ℂ).re = z.re :=
193+
rfl
194+
#align complex.unit_disc.re_coe Complex.UnitDisc.re_coe
195+
196+
@[simp, norm_cast]
197+
theorem im_coe (z : 𝔻) : (z : ℂ).im = z.im :=
198+
rfl
199+
#align complex.unit_disc.im_coe Complex.UnitDisc.im_coe
200+
201+
@[simp]
202+
theorem re_neg (z : 𝔻) : (-z).re = -z.re :=
203+
rfl
204+
#align complex.unit_disc.re_neg Complex.UnitDisc.re_neg
205+
206+
@[simp]
207+
theorem im_neg (z : 𝔻) : (-z).im = -z.im :=
208+
rfl
209+
#align complex.unit_disc.im_neg Complex.UnitDisc.im_neg
210+
211+
/-- Conjugate point of the unit disc. -/
212+
def conj (z : 𝔻) : 𝔻 :=
213+
mk (conj' ↑z) <| (abs_conj z).symm ▸ z.abs_lt_one
214+
#align complex.unit_disc.conj Complex.UnitDisc.conj
215+
216+
-- porting note: removed `norm_cast` because this is a bad `norm_cast` lemma
217+
-- because both sides have a head coe
218+
@[simp]
219+
theorem coe_conj (z : 𝔻) : (z.conj : ℂ) = conj' ↑z :=
220+
rfl
221+
#align complex.unit_disc.coe_conj Complex.UnitDisc.coe_conj
222+
223+
@[simp]
224+
theorem conj_zero : conj 0 = 0 :=
225+
coe_injective (map_zero conj')
226+
#align complex.unit_disc.conj_zero Complex.UnitDisc.conj_zero
227+
228+
@[simp]
229+
theorem conj_conj (z : 𝔻) : conj (conj z) = z :=
230+
coe_injective <| Complex.conj_conj (z : ℂ)
231+
#align complex.unit_disc.conj_conj Complex.UnitDisc.conj_conj
232+
233+
@[simp]
234+
theorem conj_neg (z : 𝔻) : (-z).conj = -z.conj :=
235+
rfl
236+
#align complex.unit_disc.conj_neg Complex.UnitDisc.conj_neg
237+
238+
@[simp]
239+
theorem re_conj (z : 𝔻) : z.conj.re = z.re :=
240+
rfl
241+
#align complex.unit_disc.re_conj Complex.UnitDisc.re_conj
242+
243+
@[simp]
244+
theorem im_conj (z : 𝔻) : z.conj.im = -z.im :=
245+
rfl
246+
#align complex.unit_disc.im_conj Complex.UnitDisc.im_conj
247+
248+
@[simp]
249+
theorem conj_mul (z w : 𝔻) : (z * w).conj = z.conj * w.conj :=
250+
Subtype.ext <| map_mul _ _ _
251+
#align complex.unit_disc.conj_mul Complex.UnitDisc.conj_mul
252+
253+
end UnitDisc
254+
255+
end Complex

0 commit comments

Comments
 (0)