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

Commit 1b2048d

Browse files
committed
feat(analysis/special_functions/pow): rpow is differentiable (#2930)
Differentiability of the real power function `x ↦ x^p`. Also register the lemmas about the composition with a function to make sure that the simplifier can handle automatically the differentiability of `x ↦ (f x)^p` and more complicated expressions involving powers.
1 parent 5c851bd commit 1b2048d

File tree

3 files changed

+296
-3
lines changed

3 files changed

+296
-3
lines changed

src/analysis/calculus/extend_deriv.lean

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ end
165165

166166
/-- If a function is differentiable on the left of a point `a : ℝ`, continuous at `a`, and
167167
its derivative also converges at `a`, then `f` is differentiable on the left at `a`. -/
168-
lemma has_fderiv_at_interval_right_endpoint_of_tendsto_deriv {s : set ℝ} {e : E} {a : ℝ} {f : ℝ → E}
168+
lemma has_deriv_at_interval_right_endpoint_of_tendsto_deriv {s : set ℝ} {e : E} {a : ℝ} {f : ℝ → E}
169169
(f_diff : differentiable_on ℝ f s) (f_lim : continuous_within_at f s a)
170170
(hs : s ∈ nhds_within a (Iio a))
171171
(f_lim' : tendsto (λx, deriv f x) (nhds_within a (Iio a)) (𝓝 e)) :
@@ -199,3 +199,35 @@ begin
199199
exact has_fderiv_at_boundary_of_tendsto_fderiv t_diff t_conv t_open t_cont t_diff' },
200200
exact this.nhds_within (mem_nhds_within_Iic_iff_exists_Icc_subset.2 ⟨b, ba, subset.refl _⟩)
201201
end
202+
203+
/-- If a real function `f` has a derivative `g` everywhere but at a point, and `f` and `g` are
204+
continuous at this point, then `g` is also the derivative of `f` at this point. -/
205+
lemma has_deriv_at_of_has_deriv_at_of_ne {f g : ℝ → E} {x : ℝ}
206+
(f_diff : ∀ y ≠ x, has_deriv_at f (g y) y)
207+
(hf : continuous_at f x) (hg : continuous_at g x) :
208+
has_deriv_at f (g x) x :=
209+
begin
210+
have A : has_deriv_within_at f (g x) (Ici x) x,
211+
{ have diff : differentiable_on ℝ f (Ioi x) :=
212+
λy hy, (f_diff y (ne_of_gt hy)).differentiable_at.differentiable_within_at,
213+
-- next line is the nontrivial bit of this proof, appealing to differentiability
214+
-- extension results.
215+
apply has_deriv_at_interval_left_endpoint_of_tendsto_deriv diff hf.continuous_within_at
216+
self_mem_nhds_within,
217+
have : tendsto g (nhds_within x (Ioi x)) (𝓝 (g x)) := tendsto_inf_left hg,
218+
apply this.congr' _,
219+
apply mem_sets_of_superset self_mem_nhds_within (λy hy, _),
220+
exact (f_diff y (ne_of_gt hy)).deriv.symm },
221+
have B : has_deriv_within_at f (g x) (Iic x) x,
222+
{ have diff : differentiable_on ℝ f (Iio x) :=
223+
λy hy, (f_diff y (ne_of_lt hy)).differentiable_at.differentiable_within_at,
224+
-- next line is the nontrivial bit of this proof, appealing to differentiability
225+
-- extension results.
226+
apply has_deriv_at_interval_right_endpoint_of_tendsto_deriv diff hf.continuous_within_at
227+
self_mem_nhds_within,
228+
have : tendsto g (nhds_within x (Iio x)) (𝓝 (g x)) := tendsto_inf_left hg,
229+
apply this.congr' _,
230+
apply mem_sets_of_superset self_mem_nhds_within (λy hy, _),
231+
exact (f_diff y (ne_of_lt hy)).deriv.symm },
232+
simpa using B.union A
233+
end

src/analysis/special_functions/exp_log.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ by { rw [log, dif_pos hx], exact classical.some_spec (exists_exp_eq_of_pos ((abs
207207
lemma exp_log (hx : 0 < x) : exp (log x) = x :=
208208
by { rw exp_log_eq_abs (ne_of_gt hx), exact abs_of_pos hx }
209209

210+
lemma exp_log_of_neg (hx : x < 0) : exp (log x) = -x :=
211+
by { rw exp_log_eq_abs (ne_of_lt hx), exact abs_of_neg hx }
212+
210213
@[simp] lemma log_exp (x : ℝ) : log (exp x) = x :=
211214
exp_injective $ exp_log (exp_pos x)
212215

src/analysis/special_functions/pow.lean

Lines changed: 260 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Chris Hughes, Abhimanyu Pallavi Sudhir, Jean Lo, Calle Sönne, Sébastien Gouëzel
55
-/
66
import analysis.special_functions.trigonometric
7+
import analysis.calculus.extend_deriv
78

89
/-!
910
# Power function on `ℂ`, `ℝ` and `ℝ⁺`
@@ -68,6 +69,9 @@ end
6869
lemma cpow_neg (x y : ℂ) : x ^ -y = (x ^ y)⁻¹ :=
6970
by simp [cpow_def]; split_ifs; simp [exp_neg]
7071

72+
lemma cpow_neg_one (x : ℂ) : x ^ (-1 : ℂ) = x⁻¹ :=
73+
by simpa using cpow_neg x 1
74+
7175
@[simp] lemma cpow_nat_cast (x : ℂ) : ∀ (n : ℕ), x ^ (n : ℂ) = x ^ n
7276
| 0 := by simp
7377
| (n + 1) := if hx : x = 0 then by simp only [hx, pow_succ,
@@ -217,13 +221,46 @@ by simp [rpow_def, *]
217221

218222
@[simp] lemma one_rpow (x : ℝ) : (1 : ℝ) ^ x = 1 := by simp [rpow_def]
219223

224+
lemma zero_rpow_le_one (x : ℝ) : (0 : ℝ) ^ x ≤ 1 :=
225+
by { by_cases h : x = 0; simp [h, zero_le_one] }
226+
227+
lemma zero_rpow_nonneg (x : ℝ) : 0 ≤ (0 : ℝ) ^ x :=
228+
by { by_cases h : x = 0; simp [h, zero_le_one] }
229+
220230
lemma rpow_nonneg_of_nonneg {x : ℝ} (hx : 0 ≤ x) (y : ℝ) : 0 ≤ x ^ y :=
221231
by rw [rpow_def_of_nonneg hx];
222232
split_ifs; simp only [zero_le_one, le_refl, le_of_lt (exp_pos _)]
223233

224-
lemma rpow_add {x : ℝ} (y z : ℝ) (hx : 0 < x) : x ^ (y + z) = x ^ y * x ^ z :=
234+
lemma rpow_add {x : ℝ} (hx : 0 < x) (y z : ℝ) : x ^ (y + z) = x ^ y * x ^ z :=
225235
by simp only [rpow_def_of_pos hx, mul_add, exp_add]
226236

237+
lemma rpow_add' {x : ℝ} (hx : 0 ≤ x) {y z : ℝ} (h : y + z ≠ 0) : x ^ (y + z) = x ^ y * x ^ z :=
238+
begin
239+
rcases le_iff_eq_or_lt.1 hx with H|pos,
240+
{ simp only [← H, h, rpow_eq_zero_iff_of_nonneg, true_and, zero_rpow, eq_self_iff_true, ne.def,
241+
not_false_iff, zero_eq_mul],
242+
by_contradiction F,
243+
push_neg at F,
244+
apply h,
245+
simp [F] },
246+
{ exact rpow_add pos _ _ }
247+
end
248+
249+
/-- For `0 ≤ x`, the only problematic case in the equality `x ^ y * x ^ z = x ^ (y + z)` is for
250+
`x = 0` and `y + z = 0`, where the right hand side is `1` while the left hand side can vanish.
251+
The inequality is always true, though, and given in this lemma. -/
252+
lemma le_rpow_add {x : ℝ} (hx : 0 ≤ x) (y z : ℝ) : x ^ y * x ^ z ≤ x ^ (y + z) :=
253+
begin
254+
rcases le_iff_eq_or_lt.1 hx with H|pos,
255+
{ by_cases h : y + z = 0,
256+
{ simp only [H.symm, h, rpow_zero],
257+
calc (0 : ℝ) ^ y * 0 ^ z ≤ 1 * 1 :
258+
mul_le_mul (zero_rpow_le_one y) (zero_rpow_le_one z) (zero_rpow_nonneg z) zero_le_one
259+
... = 1 : by simp },
260+
{ simp [rpow_add', ← H, h] } },
261+
{ simp [rpow_add pos] }
262+
end
263+
227264
lemma rpow_mul {x : ℝ} (hx : 0 ≤ x) (y z : ℝ) : x ^ (y * z) = (x ^ y) ^ z :=
228265
by rw [← complex.of_real_inj, complex.of_real_cpow (rpow_nonneg_of_nonneg hx _),
229266
complex.of_real_cpow hx, complex.of_real_mul, complex.cpow_mul, complex.of_real_cpow hx];
@@ -241,6 +278,12 @@ by simp only [rpow_def, (complex.of_real_pow _ _).symm, complex.cpow_nat_cast,
241278
by simp only [rpow_def, (complex.of_real_fpow _ _).symm, complex.cpow_int_cast,
242279
complex.of_real_int_cast, complex.of_real_re]
243280

281+
lemma rpow_neg_one (x : ℝ) : x ^ (-1 : ℝ) = x⁻¹ :=
282+
begin
283+
suffices H : x ^ ((-1 : ℤ) : ℝ) = x⁻¹, by exact_mod_cast H,
284+
simp only [rpow_int_cast, fpow_one, fpow_neg],
285+
end
286+
244287
lemma mul_rpow {x y z : ℝ} (h : 0 ≤ x) (h₁ : 0 ≤ y) : (x*y)^z = x^z * y^z :=
245288
begin
246289
iterate 3 { rw real.rpow_def_of_nonneg }, split_ifs; simp * at *,
@@ -437,6 +480,64 @@ lemma continuous_rpow_of_pos (h : ∀a, 0 < g a) (hf : continuous f) (hg : conti
437480

438481
end prove_rpow_is_continuous
439482

483+
section prove_rpow_is_differentiable
484+
485+
lemma has_deriv_at_rpow_of_pos {x : ℝ} (h : 0 < x) (p : ℝ) :
486+
has_deriv_at (λ x, x^p) (p * x^(p-1)) x :=
487+
begin
488+
have : has_deriv_at (λ x, exp (log x * p)) (p * x^(p-1)) x,
489+
{ convert (has_deriv_at_exp _).comp x ((has_deriv_at_log (ne_of_gt h)).mul_const p) using 1,
490+
field_simp [rpow_def_of_pos h, mul_sub, exp_sub, exp_log h, ne_of_gt h],
491+
ring },
492+
apply this.congr_of_mem_nhds,
493+
have : set.Ioi (0 : ℝ) ∈ 𝓝 x := mem_nhds_sets is_open_Ioi h,
494+
exact filter.eventually_of_mem this (λ y hy, rpow_def_of_pos hy _)
495+
end
496+
497+
lemma has_deriv_at_rpow_of_neg {x : ℝ} (h : x < 0) (p : ℝ) :
498+
has_deriv_at (λ x, x^p) (p * x^(p-1)) x :=
499+
begin
500+
have : has_deriv_at (λ x, exp (log x * p) * cos (p * π)) (p * x^(p-1)) x,
501+
{ convert ((has_deriv_at_exp _).comp x ((has_deriv_at_log (ne_of_lt h)).mul_const p)).mul_const _
502+
using 1,
503+
field_simp [rpow_def_of_neg h, mul_sub, exp_sub, sub_mul, cos_sub, exp_log_of_neg h, ne_of_lt h],
504+
ring },
505+
apply this.congr_of_mem_nhds,
506+
have : set.Iio (0 : ℝ) ∈ 𝓝 x := mem_nhds_sets is_open_Iio h,
507+
exact filter.eventually_of_mem this (λ y hy, rpow_def_of_neg hy _)
508+
end
509+
510+
lemma has_deriv_at_rpow {x : ℝ} (h : x ≠ 0) (p : ℝ) :
511+
has_deriv_at (λ x, x^p) (p * x^(p-1)) x :=
512+
begin
513+
rcases lt_trichotomy x 0 with H|H|H,
514+
{ exact has_deriv_at_rpow_of_neg H p },
515+
{ exact (h H).elim },
516+
{ exact has_deriv_at_rpow_of_pos H p },
517+
end
518+
519+
lemma has_deriv_at_rpow_zero_of_one_le {p : ℝ} (h : 1 ≤ p) :
520+
has_deriv_at (λ x, x^p) (p * (0 : ℝ)^(p-1)) 0 :=
521+
begin
522+
apply has_deriv_at_of_has_deriv_at_of_ne (λ x hx, has_deriv_at_rpow hx p),
523+
{ exact (continuous_rpow_of_pos (λ _, (lt_of_lt_of_le zero_lt_one h))
524+
continuous_id continuous_const).continuous_at },
525+
{ rcases le_iff_eq_or_lt.1 h with rfl|h,
526+
{ simp [continuous_const.continuous_at] },
527+
{ exact (continuous_const.mul (continuous_rpow_of_pos (λ _, sub_pos_of_lt h)
528+
continuous_id continuous_const)).continuous_at } }
529+
end
530+
531+
lemma has_deriv_at_rpow_of_one_le (x : ℝ) {p : ℝ} (h : 1 ≤ p) :
532+
has_deriv_at (λ x, x^p) (p * x^(p-1)) x :=
533+
begin
534+
by_cases hx : x = 0,
535+
{ rw hx, exact has_deriv_at_rpow_zero_of_one_le h },
536+
{ exact has_deriv_at_rpow hx p }
537+
end
538+
539+
end prove_rpow_is_differentiable
540+
440541
section sqrt
441542

442543
lemma sqrt_eq_rpow : sqrt = λx:ℝ, x ^ (1/(2:ℝ)) :=
@@ -456,6 +557,163 @@ end sqrt
456557

457558
end real
458559

560+
section differentiability
561+
open real
562+
563+
variables {f : ℝ → ℝ} {x f' : ℝ} {s : set ℝ} (p : ℝ)
564+
/- Differentiability statements for the power of a function, when the function does not vanish
565+
and the exponent is arbitrary-/
566+
567+
lemma has_deriv_within_at.rpow (hf : has_deriv_within_at f f' s x) (hx : f x ≠ 0) :
568+
has_deriv_within_at (λ y, (f y)^p) (f' * p * (f x)^(p-1)) s x :=
569+
begin
570+
convert (has_deriv_at_rpow hx p).comp_has_deriv_within_at x hf using 1,
571+
ring
572+
end
573+
574+
lemma has_deriv_at.rpow (hf : has_deriv_at f f' x) (hx : f x ≠ 0) :
575+
has_deriv_at (λ y, (f y)^p) (f' * p * (f x)^(p-1)) x :=
576+
begin
577+
rw ← has_deriv_within_at_univ at *,
578+
exact hf.rpow p hx
579+
end
580+
581+
lemma differentiable_within_at.rpow (hf : differentiable_within_at ℝ f s x) (hx : f x ≠ 0) :
582+
differentiable_within_at ℝ (λx, (f x)^p) s x :=
583+
(hf.has_deriv_within_at.rpow p hx).differentiable_within_at
584+
585+
@[simp] lemma differentiable_at.rpow (hf : differentiable_at ℝ f x) (hx : f x ≠ 0) :
586+
differentiable_at ℝ (λx, (f x)^p) x :=
587+
(hf.has_deriv_at.rpow p hx).differentiable_at
588+
589+
lemma differentiable_on.rpow (hf : differentiable_on ℝ f s) (hx : ∀ x ∈ s, f x ≠ 0) :
590+
differentiable_on ℝ (λx, (f x)^p) s :=
591+
λx h, (hf x h).rpow p (hx x h)
592+
593+
@[simp] lemma differentiable.rpow (hf : differentiable ℝ f) (hx : ∀ x, f x ≠ 0) :
594+
differentiable ℝ (λx, (f x)^p) :=
595+
λx, (hf x).rpow p (hx x)
596+
597+
lemma deriv_within_rpow (hf : differentiable_within_at ℝ f s x) (hx : f x ≠ 0)
598+
(hxs : unique_diff_within_at ℝ s x) :
599+
deriv_within (λx, (f x)^p) s x = (deriv_within f s x) * p * (f x)^(p-1) :=
600+
(hf.has_deriv_within_at.rpow p hx).deriv_within hxs
601+
602+
@[simp] lemma deriv_rpow (hf : differentiable_at ℝ f x) (hx : f x ≠ 0) :
603+
deriv (λx, (f x)^p) x = (deriv f x) * p * (f x)^(p-1) :=
604+
(hf.has_deriv_at.rpow p hx).deriv
605+
606+
/- Differentiability statements for the power of a function, when the function may vanish
607+
but the exponent is at least one. -/
608+
609+
variable {p}
610+
611+
lemma has_deriv_within_at.rpow_of_one_le (hf : has_deriv_within_at f f' s x) (hp : 1 ≤ p) :
612+
has_deriv_within_at (λ y, (f y)^p) (f' * p * (f x)^(p-1)) s x :=
613+
begin
614+
convert (has_deriv_at_rpow_of_one_le (f x) hp).comp_has_deriv_within_at x hf using 1,
615+
ring
616+
end
617+
618+
lemma has_deriv_at.rpow_of_one_le (hf : has_deriv_at f f' x) (hp : 1 ≤ p) :
619+
has_deriv_at (λ y, (f y)^p) (f' * p * (f x)^(p-1)) x :=
620+
begin
621+
rw ← has_deriv_within_at_univ at *,
622+
exact hf.rpow_of_one_le hp
623+
end
624+
625+
lemma differentiable_within_at.rpow_of_one_le (hf : differentiable_within_at ℝ f s x) (hp : 1 ≤ p) :
626+
differentiable_within_at ℝ (λx, (f x)^p) s x :=
627+
(hf.has_deriv_within_at.rpow_of_one_le hp).differentiable_within_at
628+
629+
@[simp] lemma differentiable_at.rpow_of_one_le (hf : differentiable_at ℝ f x) (hp : 1 ≤ p) :
630+
differentiable_at ℝ (λx, (f x)^p) x :=
631+
(hf.has_deriv_at.rpow_of_one_le hp).differentiable_at
632+
633+
lemma differentiable_on.rpow_of_one_le (hf : differentiable_on ℝ f s) (hp : 1 ≤ p) :
634+
differentiable_on ℝ (λx, (f x)^p) s :=
635+
λx h, (hf x h).rpow_of_one_le hp
636+
637+
@[simp] lemma differentiable.rpow_of_one_le (hf : differentiable ℝ f) (hp : 1 ≤ p) :
638+
differentiable ℝ (λx, (f x)^p) :=
639+
λx, (hf x).rpow_of_one_le hp
640+
641+
lemma deriv_within_rpow_of_one_le (hf : differentiable_within_at ℝ f s x) (hp : 1 ≤ p)
642+
(hxs : unique_diff_within_at ℝ s x) :
643+
deriv_within (λx, (f x)^p) s x = (deriv_within f s x) * p * (f x)^(p-1) :=
644+
(hf.has_deriv_within_at.rpow_of_one_le hp).deriv_within hxs
645+
646+
@[simp] lemma deriv_rpow_of_one_le (hf : differentiable_at ℝ f x) (hp : 1 ≤ p) :
647+
deriv (λx, (f x)^p) x = (deriv f x) * p * (f x)^(p-1) :=
648+
(hf.has_deriv_at.rpow_of_one_le hp).deriv
649+
650+
/- Differentiability statements for the square root of a function, when the function does not
651+
vanish -/
652+
653+
lemma has_deriv_within_at.sqrt (hf : has_deriv_within_at f f' s x) (hx : f x ≠ 0) :
654+
has_deriv_within_at (λ y, sqrt (f y)) (f' / (2 * sqrt (f x))) s x :=
655+
begin
656+
simp only [sqrt_eq_rpow],
657+
convert hf.rpow (1/2) hx,
658+
rcases lt_trichotomy (f x) 0 with H|H|H,
659+
{ have A : (f x)^((1:ℝ)/2) = 0,
660+
{ rw rpow_def_of_neg H,
661+
have : cos (1/2 * π) = 0, by { convert cos_pi_div_two using 2, ring },
662+
rw [this],
663+
simp },
664+
have B : f x ^ ((1:ℝ) / 2 - 1) = 0,
665+
{ rw rpow_def_of_neg H,
666+
have : cos (π/2 - π) = 0, by simp [cos_sub],
667+
have : cos (((1:ℝ)/2 - 1) * π) = 0, by { convert this using 2, ring },
668+
rw this,
669+
simp },
670+
rw [A, B],
671+
simp },
672+
{ exact (hx H).elim },
673+
{ have A : 0 < (f x)^((1:ℝ)/2) := rpow_pos_of_pos H _,
674+
have B : (f x) ^ (-(1:ℝ)) = (f x)^(-((1:ℝ)/2)) * (f x)^(-((1:ℝ)/2)),
675+
{ rw [← rpow_add H],
676+
congr,
677+
norm_num },
678+
rw [sub_eq_add_neg, rpow_add H, B, rpow_neg (le_of_lt H)],
679+
field_simp [hx, ne_of_gt A],
680+
ring }
681+
end
682+
683+
lemma has_deriv_at.sqrt (hf : has_deriv_at f f' x) (hx : f x ≠ 0) :
684+
has_deriv_at (λ y, sqrt (f y)) (f' / (2 * sqrt(f x))) x :=
685+
begin
686+
rw ← has_deriv_within_at_univ at *,
687+
exact hf.sqrt hx
688+
end
689+
690+
lemma differentiable_within_at.sqrt (hf : differentiable_within_at ℝ f s x) (hx : f x ≠ 0) :
691+
differentiable_within_at ℝ (λx, sqrt (f x)) s x :=
692+
(hf.has_deriv_within_at.sqrt hx).differentiable_within_at
693+
694+
@[simp] lemma differentiable_at.sqrt (hf : differentiable_at ℝ f x) (hx : f x ≠ 0) :
695+
differentiable_at ℝ (λx, sqrt (f x)) x :=
696+
(hf.has_deriv_at.sqrt hx).differentiable_at
697+
698+
lemma differentiable_on.sqrt (hf : differentiable_on ℝ f s) (hx : ∀ x ∈ s, f x ≠ 0) :
699+
differentiable_on ℝ (λx, sqrt (f x)) s :=
700+
λx h, (hf x h).sqrt (hx x h)
701+
702+
@[simp] lemma differentiable.sqrt (hf : differentiable ℝ f) (hx : ∀ x, f x ≠ 0) :
703+
differentiable ℝ (λx, sqrt (f x)) :=
704+
λx, (hf x).sqrt (hx x)
705+
706+
lemma deriv_within_sqrt (hf : differentiable_within_at ℝ f s x) (hx : f x ≠ 0)
707+
(hxs : unique_diff_within_at ℝ s x) :
708+
deriv_within (λx, sqrt (f x)) s x = (deriv_within f s x) / (2 * sqrt (f x)) :=
709+
(hf.has_deriv_within_at.sqrt hx).deriv_within hxs
710+
711+
@[simp] lemma deriv_sqrt (hf : differentiable_at ℝ f x) (hx : f x ≠ 0) :
712+
deriv (λx, sqrt (f x)) x = (deriv f x) / (2 * sqrt (f x)) :=
713+
(hf.has_deriv_at.sqrt hx).deriv
714+
715+
end differentiability
716+
459717
namespace nnreal
460718

461719
/-- The nonnegative real power function `x^y`, defined for `x : nnreal` and `y : ℝ ` as the
@@ -489,7 +747,7 @@ by { rw ← nnreal.coe_eq, exact real.rpow_one _ }
489747
by { rw ← nnreal.coe_eq, exact real.one_rpow _ }
490748

491749
lemma rpow_add {x : nnreal} (hx : 0 < x) (y z : ℝ) : x ^ (y + z) = x ^ y * x ^ z :=
492-
by { rw ← nnreal.coe_eq, exact real.rpow_add _ _ hx }
750+
by { rw ← nnreal.coe_eq, exact real.rpow_add hx _ _ }
493751

494752
lemma rpow_mul (x : nnreal) (y z : ℝ) : x ^ (y * z) = (x ^ y) ^ z :=
495753
by { rw ← nnreal.coe_eq, exact real.rpow_mul x.2 y z }

0 commit comments

Comments
 (0)