/-
Copyright 2025 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
module
public import Mathlib.Analysis.SpecialFunctions.Pow.Real@[expose] public sectionnth root operations
This file provides Real.nthRoot n to compute ⁿ√,
which operates as expected on negative values when n is odd.
The trap this avoids is that using rpow, (-8 : ℝ) ^ (1/3 : ℝ) = 1.
This is being upstreamed to Mathlib in leanprover-community/mathlib4#26935.
namespace Realnoncomputable def nthRoot (n : ℕ) (r : ℝ) : ℝ :=
if Even n then r ^ (n⁻¹ : ℝ) else SignType.sign r ^ n * abs r ^ (n⁻¹ : ℝ)theorem nthRoot_of_even {n : ℕ} (hn : Even n) (r : ℝ) : nthRoot n r = r ^ (n⁻¹ : ℝ) :=
if_pos hntheorem nthRoot_of_odd {n : ℕ} (hn : Odd n) (r : ℝ) :
nthRoot n r = SignType.sign r ^ n * abs r ^ (n⁻¹ : ℝ) :=
if_neg <| Nat.not_even_iff_odd.mpr hninr n:ℕhn:Odd nr:ℝhr✝:r ≤ 0hr:r < 0⊢ ↑(-1) ^ n * (-r) ^ (↑n)⁻¹ = (-1) ^ n * (-r) ^ (↑n)⁻¹
simp All goals completed! 🐙
theorem nthRoot_of_nonneg {n : ℕ} {r : ℝ} (hr : 0 ≤ r) :
nthRoot n r = r ^ (n⁻¹ : ℝ) := by n:ℕr:ℝhr:0 ≤ r⊢ nthRoot n r = r ^ (↑n)⁻¹
cases Nat.even_or_odd n with
| inl he => inl n:ℕr:ℝhr:0 ≤ rhe:Even n⊢ nthRoot n r = r ^ (↑n)⁻¹
rw [nthRoot_of_even he inl n:ℕr:ℝhr:0 ≤ rhe:Even n⊢ r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹ All goals completed! 🐙] All goals completed! 🐙
| inr ho => inr n:ℕr:ℝhr:0 ≤ rho:Odd n⊢ nthRoot n r = r ^ (↑n)⁻¹
have hn0 : n ≠ 0 := Nat.ne_of_odd_add ho inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ nthRoot n r = r ^ (↑n)⁻¹
rw [nthRoot_of_odd ho, inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ ↑(SignType.sign r) ^ n * |r| ^ (↑n)⁻¹ = r ^ (↑n)⁻¹ inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ ↑(SignType.sign r) ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹ abs_of_nonneg hr inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ ↑(SignType.sign r) ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ ↑(SignType.sign r) ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹]inr n:ℕr:ℝhr:0 ≤ rho:Odd nhn0:n ≠ 0⊢ ↑(SignType.sign r) ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹
obtain rfl | hr := hr.eq_or_lt inr.inl n:ℕho:Odd nhn0:n ≠ 0hr:0 ≤ 0⊢ ↑(SignType.sign 0) ^ n * 0 ^ (↑n)⁻¹ = 0 ^ (↑n)⁻¹inr.inr n:ℕr:ℝhr✝:0 ≤ rho:Odd nhn0:n ≠ 0hr:0 < r⊢ ↑(SignType.sign r) ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹
· inr.inl n:ℕho:Odd nhn0:n ≠ 0hr:0 ≤ 0⊢ ↑(SignType.sign 0) ^ n * 0 ^ (↑n)⁻¹ = 0 ^ (↑n)⁻¹ simp [hn0] All goals completed! 🐙
rw [_root_.sign_pos hr inr.inr n:ℕr:ℝhr✝:0 ≤ rho:Odd nhn0:n ≠ 0hr:0 < r⊢ ↑1 ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹ inr.inr n:ℕr:ℝhr✝:0 ≤ rho:Odd nhn0:n ≠ 0hr:0 < r⊢ ↑1 ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹]inr.inr n:ℕr:ℝhr✝:0 ≤ rho:Odd nhn0:n ≠ 0hr:0 < r⊢ ↑1 ^ n * r ^ (↑n)⁻¹ = r ^ (↑n)⁻¹
simp All goals completed! 🐙
@[simp]
theorem nthRoot_neg_of_odd {n : ℕ} (hn : Odd n) {r : ℝ} :
nthRoot n (-r) = -nthRoot n r := by n:ℕhn:Odd nr:ℝ⊢ nthRoot n (-r) = -nthRoot n r
obtain hr | hr := le_total r 0 inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = -nthRoot n rinr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ nthRoot n (-r) = -nthRoot n r
· inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = -nthRoot n r rw [nthRoot_of_odd_of_nonpos hn hr, inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = -((-1) ^ n * (-r) ^ (↑n)⁻¹) All goals completed! 🐙 hn.neg_one_pow, inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = -(-1 * (-r) ^ (↑n)⁻¹) All goals completed! 🐙 neg_one_mul, inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = - -(-r) ^ (↑n)⁻¹ All goals completed! 🐙 neg_neg, inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ nthRoot n (-r) = (-r) ^ (↑n)⁻¹ All goals completed! 🐙
nthRoot_of_nonneg (neg_nonneg.mpr hr) inl n:ℕhn:Odd nr:ℝhr:r ≤ 0⊢ (-r) ^ (↑n)⁻¹ = (-r) ^ (↑n)⁻¹ All goals completed! 🐙] All goals completed! 🐙
· inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ nthRoot n (-r) = -nthRoot n r rw [nthRoot_of_odd_of_nonpos hn (neg_nonpos.mpr hr), inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ (-1) ^ n * (- -r) ^ (↑n)⁻¹ = -nthRoot n r All goals completed! 🐙 hn.neg_one_pow, inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ -1 * (- -r) ^ (↑n)⁻¹ = -nthRoot n r All goals completed! 🐙 neg_one_mul, inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ -(- -r) ^ (↑n)⁻¹ = -nthRoot n r All goals completed! 🐙 neg_neg, inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ -r ^ (↑n)⁻¹ = -nthRoot n r All goals completed! 🐙
nthRoot_of_nonneg hr inr n:ℕhn:Odd nr:ℝhr:0 ≤ r⊢ -r ^ (↑n)⁻¹ = -r ^ (↑n)⁻¹ All goals completed! 🐙] All goals completed! 🐙
theorem pow_nthRoot {n : ℕ} (r : ℝ) (h : (n ≠ 0 ∧ 0 ≤ r) ∨ Odd n) : nthRoot n r ^ n = r := by n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd n⊢ nthRoot n r ^ n = r
cases Nat.even_or_odd n with
| inl he => inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even n⊢ nthRoot n r ^ n = r
obtain ⟨hn, hr⟩ := h.resolve_right (Nat.not_odd_iff_even.mpr he) inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ nthRoot n r ^ n = r
rw [nthRoot_of_even he, inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ (r ^ (↑n)⁻¹) ^ n = r All goals completed! 🐙 rpow_inv_natCast_pow hr hn inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ r = r All goals completed! 🐙] All goals completed! 🐙
| inr ho => inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd n⊢ nthRoot n r ^ n = r
have hn : n ≠ 0 := by exact Nat.ne_of_odd_add ho inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ nthRoot n r ^ n = rinr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ nthRoot n r ^ n = r
rw [nthRoot_of_odd ho, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ (↑(SignType.sign r) ^ n * |r| ^ (↑n)⁻¹) ^ n = r inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) mul_pow, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ (↑(SignType.sign r) ^ n) ^ n * (|r| ^ (↑n)⁻¹) ^ n = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) ←pow_mul, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r) ^ (n * n) * (|r| ^ (↑n)⁻¹) ^ n = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) rpow_inv_natCast_pow (abs_nonneg _) hn, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r) ^ (n * n) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)
←SignType.coe_pow, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r ^ (n * n)) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) SignType.pow_odd, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) sign_mul_abs inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ r = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)]inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)
exact ho.mul ho All goals completed! 🐙
theorem nthRoot_pow {n : ℕ} (r : ℝ) (h : (n ≠ 0 ∧ 0 ≤ r) ∨ Odd n) : nthRoot n (r ^ n) = r := by n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd n⊢ nthRoot n (r ^ n) = r
cases Nat.even_or_odd n with
| inl he => inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even n⊢ nthRoot n (r ^ n) = r
obtain ⟨hn, hr⟩ := h.resolve_right (Nat.not_odd_iff_even.mpr he) inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ nthRoot n (r ^ n) = r
rw [nthRoot_of_even he, inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ (r ^ n) ^ (↑n)⁻¹ = r All goals completed! 🐙 pow_rpow_inv_natCast hr hn inl n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nhe:Even nhn:n ≠ 0hr:0 ≤ r⊢ r = r All goals completed! 🐙] All goals completed! 🐙
| inr ho => inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd n⊢ nthRoot n (r ^ n) = r
have hn : n ≠ 0 := Nat.ne_of_odd_add ho inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ nthRoot n (r ^ n) = r
rw [nthRoot_of_odd ho, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign (r ^ n)) ^ n * |r ^ n| ^ (↑n)⁻¹ = r inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) abs_pow, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign (r ^ n)) ^ n * (|r| ^ n) ^ (↑n)⁻¹ = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) pow_rpow_inv_natCast (abs_nonneg _) hn, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign (r ^ n)) ^ n * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)
←SignType.coe_pow, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign (r ^ n) ^ n) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) sign_pow, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑((SignType.sign r ^ n) ^ n) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) ← pow_mul, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r ^ (n * n)) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) SignType.pow_odd, inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ ↑(SignType.sign r) * |r| = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n) sign_mul_abs inr n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ r = rinr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)]inr.hn n:ℕr:ℝh:n ≠ 0 ∧ 0 ≤ r ∨ Odd nho:Odd nhn:n ≠ 0⊢ Odd (n * n)
exact ho.mul ho All goals completed! 🐙theorem nthRoot_mul_of_even_of_nonneg {n : ℕ} {a b : ℝ} (hn : Even n)
(ha : 0 ≤ a) (hb : 0 ≤ b) :
Real.nthRoot n (a * b) = Real.nthRoot n a * Real.nthRoot n b := by n:ℕa:ℝb:ℝhn:Even nha:0 ≤ ahb:0 ≤ b⊢ nthRoot n (a * b) = nthRoot n a * nthRoot n b
simp only [Real.nthRoot_of_even hn, Real.mul_rpow ha hb] All goals completed! 🐙theorem nthRoot_mul_of_odd {n : ℕ} {a b : ℝ} (hn : Odd n) :
nthRoot n (a * b) = nthRoot n a * nthRoot n b := by n:ℕa:ℝb:ℝhn:Odd n⊢ nthRoot n (a * b) = nthRoot n a * nthRoot n b
simp [Real.nthRoot_of_odd hn, sign_mul, SignType.coe_mul, abs_mul,
Real.mul_rpow (abs_nonneg a) (abs_nonneg b)] n:ℕa:ℝb:ℝhn:Odd n⊢ (↑(SignType.sign a) * ↑(SignType.sign b)) ^ n * (|a| ^ (↑n)⁻¹ * |b| ^ (↑n)⁻¹) =
↑(SignType.sign a) ^ n * |a| ^ (↑n)⁻¹ * (↑(SignType.sign b) ^ n * |b| ^ (↑n)⁻¹)
ring All goals completed! 🐙end Real