|
| 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