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

Commit 796efae

Browse files
committed
feat(data/real/sqrt): nnreal.coe_sqrt and nnreal.sqrt_eq_rpow (#9025)
Also rename a few lemmas: * `nnreal.mul_sqrt_self` -> `nnreal.mul_self_sqrt` to follow `real.mul_self_sqrt` * `real.sqrt_le` -> `real.sqrt_le_sqrt_iff` * `real.sqrt_lt` -> `real.sqrt_lt_sqrt_iff` and provide a few more for commodity: * `nnreal.sqrt_sq` * `nnreal.sq_sqrt` * `real.sqrt_lt_sqrt` * `real.sqrt_lt_sqrt_iff_of_pos` * `nnreal.sqrt_le_sqrt_iff` * `nnreal.sqrt_lt_sqrt_iff` Closes #8016
1 parent 15b6c56 commit 796efae

File tree

5 files changed

+54
-28
lines changed

5 files changed

+54
-28
lines changed

archive/imo/imo2008_q3.lean

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,15 @@ begin
7777

7878
have hreal₅ : k₀ > 4,
7979
{ calc k₀ ≥ sqrt(p₀ - 4) : hreal₄
80-
... > sqrt(4 ^ 2) : (sqrt_lt (by linarith)).mpr (by linarith [hreal₂])
81-
... = 4 : sqrt_sq (by linarith) },
80+
... > sqrt(4 ^ 2) : sqrt_lt_sqrt (by norm_num) (by linarith [hreal₂])
81+
... = 4 : sqrt_sq zero_lt_four.le },
8282

8383
have hreal₆ : p₀ > 2 * n₀ + sqrt(2 * n),
8484
{ calc p₀ = 2 * n₀ + k₀ : hreal₁
85-
... ≥ 2 * n₀ + sqrt(p₀ - 4) : by linarith [hreal₄]
85+
... ≥ 2 * n₀ + sqrt(p₀ - 4) : add_le_add_left hreal₄ _
8686
... = 2 * n₀ + sqrt(2 * n₀ + k₀ - 4) : by rw hreal₁
87-
... > 2 * n₀ + sqrt(2 * n₀) : by { refine add_lt_add_left _ (2 * n₀),
88-
refine (sqrt_lt _).mpr _,
89-
refine mul_nonneg zero_le_two (nat.cast_nonneg n),
90-
linarith [hreal₅] } },
87+
... > 2 * n₀ + sqrt(2 * n₀) : add_lt_add_left
88+
(sqrt_lt_sqrt (mul_nonneg zero_le_two n.cast_nonneg) $ by linarith [hreal₅]) (2 * n₀) },
9189

9290
exact ⟨n, hnat₁, hreal₆⟩,
9391
end

src/analysis/special_functions/arsinh.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ end
4242

4343
private lemma b_lt_sqrt_b_one_add_sq (b : ℝ) : b < sqrt (1 + b ^ 2) :=
4444
calc b
45-
≤ sqrt (b ^ 2) : le_sqrt_of_sq_le $ le_refl _
46-
... < sqrt (1 + b ^ 2) : (sqrt_lt (sq_nonneg _)).2 (lt_one_add _)
45+
≤ sqrt (b ^ 2) : le_sqrt_of_sq_le le_rfl
46+
... < sqrt (1 + b ^ 2) : sqrt_lt_sqrt (sq_nonneg _) (lt_one_add _)
4747

4848
private lemma add_sqrt_one_add_sq_pos (b : ℝ) : 0 < b + sqrt (1 + b ^ 2) :=
4949
by { rw [← neg_neg b, ← sub_eq_neg_add, sub_pos, sq, neg_mul_neg, ← sq],

src/analysis/special_functions/pow.lean

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -923,14 +923,14 @@ times_cont_diff_at.has_strict_deriv_at'
923923

924924
section sqrt
925925

926-
lemma sqrt_eq_rpow : sqrt = λx:ℝ, x ^ (1/(2:ℝ)) :=
926+
lemma sqrt_eq_rpow (x : ℝ) : sqrt x = x ^ (1/(2:ℝ)) :=
927927
begin
928-
funext, by_cases h : 0 x,
929-
{ rw [← mul_self_inj_of_nonneg, mul_self_sqrt h, ← sq, ← rpow_nat_cast, ← rpow_mul h],
930-
norm_num, exact sqrt_nonneg _, exact rpow_nonneg_of_nonneg h _ },
931-
{ replace h : x < 0 := lt_of_not_ge h,
932-
have : 1 / (2:ℝ) * π = π / (2:ℝ), ring,
933-
rw [sqrt_eq_zero_of_nonpos (le_of_lt h), rpow_def_of_neg h, this, cos_pi_div_two, mul_zero] }
928+
obtain h | h := le_or_lt 0 x,
929+
{ rw [← mul_self_inj_of_nonneg (sqrt_nonneg _) (rpow_nonneg_of_nonneg h _), mul_self_sqrt h,
930+
← sq, ← rpow_nat_cast, ← rpow_mul h],
931+
norm_num },
932+
{ have : 1 / (2:ℝ) * π = π / (2:ℝ), ring,
933+
rw [sqrt_eq_zero_of_nonpos h.le, rpow_def_of_neg h, this, cos_pi_div_two, mul_zero] }
934934
end
935935

936936
end sqrt
@@ -1251,6 +1251,13 @@ nnreal.eq $ real.inv_rpow x.2 y
12511251
lemma div_rpow (x y : ℝ≥0) (z : ℝ) : (x / y) ^ z = x ^ z / y ^ z :=
12521252
nnreal.eq $ real.div_rpow x.2 y.2 z
12531253

1254+
lemma sqrt_eq_rpow (x : ℝ≥0) : sqrt x = x ^ (1/(2:ℝ)) :=
1255+
begin
1256+
refine nnreal.eq _,
1257+
push_cast,
1258+
exact real.sqrt_eq_rpow x.1,
1259+
end
1260+
12541261
@[simp, norm_cast] lemma rpow_nat_cast (x : ℝ≥0) (n : ℕ) : x ^ (n : ℝ) = x ^ n :=
12551262
nnreal.eq $ by simpa only [coe_rpow, coe_pow] using real.rpow_nat_cast x n
12561263

src/analysis/special_functions/trigonometric.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,8 +1393,8 @@ lemma sqrt_two_add_series_lt_two : ∀(n : ℕ), sqrt_two_add_series 0 n < 2
13931393
| 0 := by norm_num
13941394
| (n+1) :=
13951395
begin
1396-
refine lt_of_lt_of_le _ (le_of_eq $ sqrt_sq $ le_of_lt zero_lt_two),
1397-
rw [sqrt_two_add_series, sqrt_lt, ← lt_sub_iff_add_lt'],
1396+
refine lt_of_lt_of_le _ (sqrt_sq zero_lt_two.le).le,
1397+
rw [sqrt_two_add_series, sqrt_lt_sqrt_iff, ← lt_sub_iff_add_lt'],
13981398
{ refine (sqrt_two_add_series_lt_two n).trans_le _, norm_num },
13991399
{ exact add_nonneg zero_le_two (sqrt_two_add_series_zero_nonneg n) }
14001400
end

src/data/real/sqrt.lean

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ order_iso.symm $ strict_mono.order_iso_of_surjective (λ x, x * x)
4545
(continuous_id.mul continuous_id).surjective tendsto_mul_self_at_top $
4646
by simp [order_bot.at_bot_eq]
4747

48+
lemma sqrt_le_sqrt_iff : sqrt x ≤ sqrt y ↔ x ≤ y :=
49+
sqrt.le_iff_le
50+
51+
lemma sqrt_lt_sqrt_iff : sqrt x < sqrt y ↔ x < y :=
52+
sqrt.lt_iff_lt
53+
4854
lemma sqrt_eq_iff_sq_eq : sqrt x = y ↔ y * y = x :=
4955
sqrt.to_equiv.apply_eq_iff_eq_symm_apply.trans eq_comm
5056

@@ -61,13 +67,19 @@ sqrt_eq_iff_sq_eq.trans $ by rw [eq_comm, zero_mul]
6167

6268
@[simp] lemma sqrt_one : sqrt 1 = 1 := sqrt_eq_iff_sq_eq.2 $ mul_one 1
6369

64-
@[simp] lemma mul_sqrt_self (x : ℝ≥0) : sqrt x * sqrt x = x :=
70+
@[simp] lemma mul_self_sqrt (x : ℝ≥0) : sqrt x * sqrt x = x :=
6571
sqrt.symm_apply_apply x
6672

6773
@[simp] lemma sqrt_mul_self (x : ℝ≥0) : sqrt (x * x) = x := sqrt.apply_symm_apply x
6874

75+
@[simp] lemma sq_sqrt (x : ℝ≥0) : (sqrt x)^2 = x :=
76+
by rw [sq, mul_self_sqrt x]
77+
78+
@[simp] lemma sqrt_sq (x : ℝ≥0) : sqrt (x^2) = x :=
79+
by rw [sq, sqrt_mul_self x]
80+
6981
lemma sqrt_mul (x y : ℝ≥0) : sqrt (x * y) = sqrt x * sqrt y :=
70-
by rw [sqrt_eq_iff_sq_eq, mul_mul_mul_comm, mul_sqrt_self, mul_sqrt_self]
82+
by rw [sqrt_eq_iff_sq_eq, mul_mul_mul_comm, mul_self_sqrt, mul_self_sqrt]
7183

7284
/-- `nnreal.sqrt` as a `monoid_with_zero_hom`. -/
7385
noncomputable def sqrt_hom : monoid_with_zero_hom ℝ≥0 ℝ≥0 := ⟨sqrt, sqrt_zero, sqrt_one, sqrt_mul⟩
@@ -122,6 +134,9 @@ nnreal.sqrt (real.to_nnreal x)
122134

123135
variables {x y : ℝ}
124136

137+
@[simp, norm_cast] lemma coe_sqrt {x : ℝ≥0} : (nnreal.sqrt x : ℝ) = real.sqrt x :=
138+
by rw [real.sqrt, real.to_nnreal_coe]
139+
125140
@[continuity]
126141
lemma continuous_sqrt : continuous sqrt :=
127142
nnreal.continuous_coe.comp $ nnreal.sqrt.continuous.comp nnreal.continuous_of_real
@@ -132,7 +147,7 @@ by simp [sqrt, real.to_nnreal_eq_zero.2 h]
132147
theorem sqrt_nonneg (x : ℝ) : 0 ≤ sqrt x := nnreal.coe_nonneg _
133148

134149
@[simp] theorem mul_self_sqrt (h : 0 ≤ x) : sqrt x * sqrt x = x :=
135-
by simp [sqrt, ← nnreal.coe_mul, real.coe_to_nnreal _ h]
150+
by rw [sqrt, ← nnreal.coe_mul, nnreal.mul_self_sqrt, real.coe_to_nnreal _ h]
136151

137152
@[simp] theorem sqrt_mul_self (h : 0 ≤ x) : sqrt (x * x) = x :=
138153
(mul_self_inj_of_nonneg (sqrt_nonneg _) h).1 (mul_self_sqrt (mul_self_nonneg _))
@@ -141,7 +156,7 @@ theorem sqrt_eq_iff_mul_self_eq (hx : 0 ≤ x) (hy : 0 ≤ y) :
141156
sqrt x = y ↔ y * y = x :=
142157
⟨λ h, by rw [← h, mul_self_sqrt hx], λ h, by rw [← h, sqrt_mul_self hy]⟩
143158

144-
@[simp] theorem sq_sqrt (h : 0 ≤ x) : sqrt x ^ 2 = x :=
159+
@[simp] theorem sq_sqrt (h : 0 ≤ x) : (sqrt x)^2 = x :=
145160
by rw [sq, mul_self_sqrt h]
146161

147162
@[simp] theorem sqrt_sq (h : 0 ≤ x) : sqrt (x ^ 2) = x :=
@@ -161,14 +176,20 @@ by rw [sq, sqrt_mul_self_eq_abs]
161176

162177
@[simp] theorem sqrt_one : sqrt 1 = 1 := by simp [sqrt]
163178

164-
@[simp] theorem sqrt_le (hy : 0 ≤ y) : sqrt x ≤ sqrt y ↔ x ≤ y :=
165-
by simp [sqrt, real.to_nnreal_le_to_nnreal_iff, *]
179+
@[simp] theorem sqrt_le_sqrt_iff (hy : 0 ≤ y) : sqrt x ≤ sqrt y ↔ x ≤ y :=
180+
by rw [sqrt, sqrt, nnreal.coe_le_coe, nnreal.sqrt_le_sqrt_iff, real.to_nnreal_le_to_nnreal_iff hy]
181+
182+
@[simp] theorem sqrt_lt_sqrt_iff (hx : 0 ≤ x) : sqrt x < sqrt y ↔ x < y :=
183+
lt_iff_lt_of_le_iff_le (sqrt_le_sqrt_iff hx)
166184

167-
@[simp] theorem sqrt_lt (hx : 0 ≤ x) : sqrt x < sqrt y ↔ x < y :=
168-
lt_iff_lt_of_le_iff_le (sqrt_le hx)
185+
theorem sqrt_lt_sqrt_iff_of_pos (hy : 0 < y) : sqrt x < sqrt y ↔ x < y :=
186+
by rw [sqrt, sqrt, nnreal.coe_lt_coe, nnreal.sqrt_lt_sqrt_iff, to_nnreal_lt_to_nnreal_iff hy]
169187

170188
theorem sqrt_le_sqrt (h : x ≤ y) : sqrt x ≤ sqrt y :=
171-
by simp [sqrt, real.to_nnreal_le_to_nnreal h]
189+
by { rw [sqrt, sqrt, nnreal.coe_le_coe, nnreal.sqrt_le_sqrt_iff], exact to_nnreal_le_to_nnreal h }
190+
191+
theorem sqrt_lt_sqrt (hx : 0 ≤ x) (h : x < y) : sqrt x < sqrt y :=
192+
(sqrt_lt_sqrt_iff hx).2 h
172193

173194
theorem sqrt_le_left (hy : 0 ≤ y) : sqrt x ≤ y ↔ x ≤ y ^ 2 :=
174195
by rw [sqrt, ← real.le_to_nnreal_iff_coe_le hy, nnreal.sqrt_le_iff, ← real.to_nnreal_mul hy,
@@ -250,7 +271,7 @@ by rw [mul_self_lt_mul_self_iff hx (sqrt_nonneg y), sq, mul_self_sqrt hy]
250271
theorem sq_lt : x^2 < y ↔ -sqrt y < x ∧ x < sqrt y :=
251272
begin
252273
split,
253-
{ simpa only [← sqrt_lt (sq_nonneg x), sqrt_sq_eq_abs] using abs_lt.mp },
274+
{ simpa only [← sqrt_lt_sqrt_iff (sq_nonneg x), sqrt_sq_eq_abs] using abs_lt.mp },
254275
{ rw [← abs_lt, ← sq_abs],
255276
exact λ h, (lt_sqrt (abs_nonneg x) (sqrt_pos.mp (lt_of_le_of_lt (abs_nonneg x) h)).le).mp h },
256277
end

0 commit comments

Comments
 (0)