From a3f4a025d4a736c57caa934467a5938beeda753a Mon Sep 17 00:00:00 2001 From: kkytola Date: Wed, 27 Oct 2021 15:13:50 +0000 Subject: [PATCH] chore(analysis/normed_space/is_R_or_C + data/complex/is_R_or_C): make some proof steps standalone lemmas (#9933) Separate some proof steps from `linear_map.bound_of_sphere_bound` as standalone lemmas to golf them a little bit. Co-authored-by: kkytola <39528102+kkytola@users.noreply.github.com> --- src/analysis/normed_space/is_R_or_C.lean | 21 ++++++++------------- src/data/complex/is_R_or_C.lean | 3 +++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/analysis/normed_space/is_R_or_C.lean b/src/analysis/normed_space/is_R_or_C.lean index 5c2b62a7e3d79..8bb5398339dde 100644 --- a/src/analysis/normed_space/is_R_or_C.lean +++ b/src/analysis/normed_space/is_R_or_C.lean @@ -27,27 +27,24 @@ This file exists mainly to avoid importing `is_R_or_C` in the main normed space open metric +@[simp] lemma is_R_or_C.norm_coe_norm {๐•œ : Type*} [is_R_or_C ๐•œ] + {E : Type*} [normed_group E] {z : E} : โˆฅ(โˆฅ z โˆฅ : ๐•œ)โˆฅ = โˆฅ z โˆฅ := +by { unfold_coes, simp only [norm_algebra_map_eq, ring_hom.to_fun_eq_coe, norm_norm], } + variables {๐•œ : Type*} [is_R_or_C ๐•œ] {E : Type*} [normed_group E] [normed_space ๐•œ E] lemma linear_map.bound_of_sphere_bound - {๐•œ : Type*} [is_R_or_C ๐•œ] {E : Type*} [normed_group E] [normed_space ๐•œ E] {r : โ„} (r_pos : 0 < r) (c : โ„) (f : E โ†’โ‚—[๐•œ] ๐•œ) (h : โˆ€ z โˆˆ sphere (0 : E) r, โˆฅ f z โˆฅ โ‰ค c) (z : E) : โˆฅ f z โˆฅ โ‰ค c / r * โˆฅ z โˆฅ := begin by_cases z_zero : z = 0, { rw z_zero, simp only [linear_map.map_zero, norm_zero, mul_zero], }, - have norm_z_eq : โˆฅ(โˆฅ z โˆฅ : ๐•œ)โˆฅ = โˆฅ z โˆฅ, - { unfold_coes, - simp only [norm_algebra_map_eq, ring_hom.to_fun_eq_coe, norm_norm], }, - have norm_r_eq : โˆฅ(r : ๐•œ)โˆฅ = r, - { rw [is_R_or_C.norm_eq_abs, is_R_or_C.abs_of_real], - exact abs_of_pos r_pos, }, set zโ‚ := (r * โˆฅ z โˆฅโปยน : ๐•œ) โ€ข z with hzโ‚, have norm_f_zโ‚ : โˆฅ f zโ‚ โˆฅ โ‰ค c, { apply h zโ‚, rw [mem_sphere_zero_iff_norm, hzโ‚, norm_smul, normed_field.norm_mul], - simp only [normed_field.norm_inv], - rw [norm_z_eq, mul_assoc, inv_mul_cancel (norm_pos_iff.mpr z_zero).ne.symm, mul_one], + simp only [normed_field.norm_inv, is_R_or_C.norm_coe_norm], + rw [mul_assoc, inv_mul_cancel (norm_pos_iff.mpr z_zero).ne.symm, mul_one], unfold_coes, simp only [norm_algebra_map_eq, ring_hom.to_fun_eq_coe], exact abs_of_pos r_pos, }, @@ -56,15 +53,14 @@ begin { rw [hzโ‚, linear_map.map_smul, smul_eq_mul], rw [โ† mul_assoc, โ† mul_assoc, div_mul_cancel _ r_ne_zero, mul_inv_cancel, one_mul], simp only [z_zero, is_R_or_C.of_real_eq_zero, norm_eq_zero, ne.def, not_false_iff], }, - rw [eq, normed_field.norm_mul, normed_field.norm_div, norm_z_eq, norm_r_eq, - div_mul_eq_mul_div, div_mul_eq_mul_div, mul_comm], + rw [eq, normed_field.norm_mul, normed_field.norm_div, is_R_or_C.norm_coe_norm, + is_R_or_C.norm_of_nonneg r_pos.le, div_mul_eq_mul_div, div_mul_eq_mul_div, mul_comm], apply div_le_div _ _ r_pos rfl.ge, { exact mul_nonneg ((norm_nonneg _).trans norm_f_zโ‚) (norm_nonneg z), }, apply mul_le_mul norm_f_zโ‚ rfl.le (norm_nonneg z) ((norm_nonneg _).trans norm_f_zโ‚), end lemma linear_map.bound_of_ball_bound - {๐•œ : Type*} [is_R_or_C ๐•œ] {E : Type*} [normed_group E] [normed_space ๐•œ E] {r : โ„} (r_pos : 0 < r) (c : โ„) (f : E โ†’โ‚—[๐•œ] ๐•œ) (h : โˆ€ z โˆˆ closed_ball (0 : E) r, โˆฅ f z โˆฅ โ‰ค c) : โˆ€ (z : E), โˆฅ f z โˆฅ โ‰ค c / r * โˆฅ z โˆฅ := @@ -74,7 +70,6 @@ begin end lemma continuous_linear_map.op_norm_bound_of_ball_bound - {๐•œ : Type*} [is_R_or_C ๐•œ] {E : Type*} [normed_group E] [normed_space ๐•œ E] {r : โ„} (r_pos : 0 < r) (c : โ„) (f : E โ†’L[๐•œ] ๐•œ) (h : โˆ€ z โˆˆ closed_ball (0 : E) r, โˆฅ f z โˆฅ โ‰ค c) : โˆฅ f โˆฅ โ‰ค c / r := begin diff --git a/src/data/complex/is_R_or_C.lean b/src/data/complex/is_R_or_C.lean index 462281fa82034..62ae83db7c497 100644 --- a/src/data/complex/is_R_or_C.lean +++ b/src/data/complex/is_R_or_C.lean @@ -429,6 +429,9 @@ by { rw [is_R_or_C.norm_eq_abs, is_R_or_C.abs_of_real, real.norm_eq_abs] } lemma abs_of_nonneg {r : โ„} (h : 0 โ‰ค r) : absK r = r := (abs_of_real _).trans (abs_of_nonneg h) +lemma norm_of_nonneg {r : โ„} (r_nn : 0 โ‰ค r) : โˆฅ(r : K)โˆฅ = r := +by { rw norm_of_real, exact abs_eq_self.mpr r_nn, } + lemma abs_of_nat (n : โ„•) : absK n = n := by { rw [โ† of_real_nat_cast], exact abs_of_nonneg (nat.cast_nonneg n) }