Skip to content

Commit 05879a4

Browse files
YaelDilliesRuben-VandeVelde
authored andcommitted
chore: Move sign of power lemmas (#11986)
* Move the sign of power lemmas from `Algebra.Parity` to `Algebra.GroupPower.Order`. * For this to work, I must swap the order of import between `Algebra.GroupPower.Order` and `Algebra.Parity`. This means that I need to weaken one `assert_not_exists` to allow importing `Data.Set.Defs`. This is inconsequential. * Use them to golf and deprecate the `bit0`/`bit1` lemmas * Delete the deprecated `pow_bit0_abs`, `pow_bit0_pos_of_neg`, `pow_bit1_neg` Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>
1 parent 64c5b6d commit 05879a4

6 files changed

Lines changed: 115 additions & 173 deletions

File tree

Mathlib/Algebra/GroupPower/Order.lean

Lines changed: 101 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@ Authors: Jeremy Avigad, Robert Y. Lewis
66
import Mathlib.Algebra.GroupPower.CovariantClass
77
import Mathlib.Algebra.GroupPower.Ring
88
import Mathlib.Algebra.Order.Ring.Canonical
9+
import Mathlib.Algebra.Parity
910

1011
#align_import algebra.group_power.order from "leanprover-community/mathlib"@"00f91228655eecdcd3ac97a7fd8dbcb139fe990a"
1112

1213
/-!
1314
# Lemmas about the interaction of power operations with order
14-
15-
Note that some lemmas are in `Algebra/GroupPower/Lemmas.lean` as they import files which
16-
depend on this file.
1715
-/
1816

19-
assert_not_exists Set.range
17+
-- We should need only a minimal development of sets in order to get here.
18+
assert_not_exists Set.Subsingleton
2019

2120
open Function Int
2221

@@ -298,22 +297,9 @@ theorem sq_pos_of_pos (ha : 0 < a) : 0 < a ^ 2 := pow_pos ha _
298297
end StrictOrderedSemiring
299298

300299
section StrictOrderedRing
301-
set_option linter.deprecated false
302-
303300
variable [StrictOrderedRing R] {a : R}
304301

305-
theorem pow_bit0_pos_of_neg (ha : a < 0) (n : ℕ) : 0 < a ^ bit0 n := by
306-
rw [pow_bit0']
307-
exact pow_pos (mul_pos_of_neg_of_neg ha ha) _
308-
#align pow_bit0_pos_of_neg pow_bit0_pos_of_neg
309-
310-
theorem pow_bit1_neg (ha : a < 0) (n : ℕ) : a ^ bit1 n < 0 := by
311-
rw [bit1, pow_succ']
312-
exact mul_neg_of_neg_of_pos ha (pow_bit0_pos_of_neg ha n)
313-
#align pow_bit1_neg pow_bit1_neg
314-
315-
theorem sq_pos_of_neg (ha : a < 0) : 0 < a ^ 2 :=
316-
pow_bit0_pos_of_neg ha 1
302+
lemma sq_pos_of_neg (ha : a < 0) : 0 < a ^ 2 := by rw [sq]; exact mul_pos_of_neg_of_neg ha ha
317303
#align sq_pos_of_neg sq_pos_of_neg
318304

319305
end StrictOrderedRing
@@ -394,6 +380,16 @@ theorem lt_of_mul_self_lt_mul_self (hb : 0 ≤ b) : a * a < b * b → a < b := b
394380
exact lt_of_pow_lt_pow_left _ hb
395381
#align lt_of_mul_self_lt_mul_self lt_of_mul_self_lt_mul_self
396382

383+
/-!
384+
### Lemmas for canonically linear ordered semirings or linear ordered rings
385+
386+
The slightly unusual typeclass assumptions `[LinearOrderedSemiring R] [ExistsAddOfLE R]` cover two
387+
more familiar settings:
388+
* `[LinearOrderedRing R]`, eg `ℤ`, `ℚ` or `ℝ`
389+
* `[CanonicallyLinearOrderedSemiring R]` (although we don't actually have this typeclass), eg `ℕ`,
390+
`ℚ≥0` or `ℝ≥0`
391+
-/
392+
397393
variable [ExistsAddOfLE R]
398394

399395
lemma add_sq_le : (a + b) ^ 22 * (a ^ 2 + b ^ 2) := by
@@ -425,11 +421,10 @@ lemma add_pow_le (ha : 0 ≤ a) (hb : 0 ≤ b) : ∀ n, (a + b) ^ n ≤ 2 ^ (n -
425421
· exact mul_add_mul_le_mul_add_mul (pow_le_pow_left ha hab _) hab
426422
· exact mul_add_mul_le_mul_add_mul' (pow_le_pow_left hb hba _) hba
427423

428-
-- TODO: State using `Even`
429-
protected lemma Even.add_pow_le (hn : ∃ k, 2 * k = n) :
424+
protected lemma Even.add_pow_le (hn : Even n) :
430425
(a + b) ^ n ≤ 2 ^ (n - 1) * (a ^ n + b ^ n) := by
431426
obtain ⟨n, rfl⟩ := hn
432-
rw [pow_mul]
427+
rw [← two_mul, pow_mul]
433428
calc
434429
_ ≤ (2 * (a ^ 2 + b ^ 2)) ^ n := pow_le_pow_left (sq_nonneg _) add_sq_le _
435430
_ = 2 ^ n * (a ^ 2 + b ^ 2) ^ n := by -- TODO: Should be `Nat.cast_commute`
@@ -442,76 +437,113 @@ protected lemma Even.add_pow_le (hn : ∃ k, 2 * k = n) :
442437
· rfl
443438
· simp [Nat.two_mul]
444439

445-
end LinearOrderedSemiring
440+
lemma Even.pow_nonneg (hn : Even n) (a : R) : 0 ≤ a ^ n := by
441+
obtain ⟨k, rfl⟩ := hn; rw [pow_add]; exact mul_self_nonneg _
442+
#align even.pow_nonneg Even.pow_nonneg
443+
444+
lemma Even.pow_pos (hn : Even n) (ha : a ≠ 0) : 0 < a ^ n :=
445+
(hn.pow_nonneg _).lt_of_ne' (pow_ne_zero _ ha)
446+
#align even.pow_pos Even.pow_pos
447+
448+
lemma Even.pow_pos_iff (hn : Even n) (h₀ : n ≠ 0) : 0 < a ^ n ↔ a ≠ 0 := by
449+
obtain ⟨k, rfl⟩ := hn; rw [pow_add, mul_self_pos (α := R), pow_ne_zero_iff (by simpa using h₀)]
450+
#align even.pow_pos_iff Even.pow_pos_iff
451+
452+
lemma Odd.pow_neg_iff (hn : Odd n) : a ^ n < 0 ↔ a < 0 := by
453+
refine ⟨lt_imp_lt_of_le_imp_le (pow_nonneg · _), fun ha ↦ ?_⟩
454+
obtain ⟨k, rfl⟩ := hn
455+
rw [pow_succ]
456+
exact mul_neg_of_pos_of_neg ((even_two_mul _).pow_pos ha.ne) ha
457+
#align odd.pow_neg_iff Odd.pow_neg_iff
446458

447-
section LinearOrderedRing
448-
variable [LinearOrderedRing R] {a b : R} {n : ℕ}
459+
lemma Odd.pow_nonneg_iff (hn : Odd n) : 0 ≤ a ^ n ↔ 0 ≤ a :=
460+
le_iff_le_iff_lt_iff_lt.2 hn.pow_neg_iff
461+
#align odd.pow_nonneg_iff Odd.pow_nonneg_iff
462+
463+
lemma Odd.pow_nonpos_iff (hn : Odd n) : a ^ n ≤ 0 ↔ a ≤ 0 := by
464+
rw [le_iff_lt_or_eq, le_iff_lt_or_eq, hn.pow_neg_iff, pow_eq_zero_iff]
465+
rintro rfl; simp [Odd, eq_comm (a := 0)] at hn
466+
#align odd.pow_nonpos_iff Odd.pow_nonpos_iff
467+
468+
lemma Odd.pow_pos_iff (hn : Odd n) : 0 < a ^ n ↔ 0 < a := lt_iff_lt_of_le_iff_le hn.pow_nonpos_iff
469+
#align odd.pow_pos_iff Odd.pow_pos_iff
470+
471+
alias ⟨_, Odd.pow_nonpos⟩ := Odd.pow_nonpos_iff
472+
alias ⟨_, Odd.pow_neg⟩ := Odd.pow_neg_iff
473+
#align odd.pow_nonpos Odd.pow_nonpos
474+
#align odd.pow_neg Odd.pow_neg
475+
476+
lemma Odd.strictMono_pow (hn : Odd n) : StrictMono fun a : R => a ^ n := by
477+
have hn₀ : n ≠ 0 := by rintro rfl; simp [Odd, eq_comm (a := 0)] at hn
478+
intro a b hab
479+
obtain ha | ha := le_total 0 a
480+
· exact pow_lt_pow_left hab ha hn₀
481+
obtain hb | hb := lt_or_le 0 b
482+
· exact (hn.pow_nonpos ha).trans_lt (pow_pos hb _)
483+
obtain ⟨c, hac⟩ := exists_add_of_le ha
484+
obtain ⟨d, hbd⟩ := exists_add_of_le hb
485+
have hd := nonneg_of_le_add_right (hb.trans_eq hbd)
486+
refine lt_of_add_lt_add_right (a := c ^ n + d ^ n) ?_
487+
dsimp
488+
calc
489+
a ^ n + (c ^ n + d ^ n) = d ^ n := by
490+
rw [← add_assoc, hn.pow_add_pow_eq_zero hac.symm, zero_add]
491+
_ < c ^ n := pow_lt_pow_left ?_ hd hn₀
492+
_ = b ^ n + (c ^ n + d ^ n) := by rw [add_left_comm, hn.pow_add_pow_eq_zero hbd.symm, add_zero]
493+
refine lt_of_add_lt_add_right (a := a + b) ?_
494+
rwa [add_rotate', ← hbd, add_zero, add_left_comm, ← add_assoc, ← hac, zero_add]
495+
#align odd.strict_mono_pow Odd.strictMono_pow
496+
497+
lemma sq_pos_iff {a : R} : 0 < a ^ 2 ↔ a ≠ 0 := even_two.pow_pos_iff two_ne_zero
498+
#align sq_pos_iff sq_pos_iff
499+
500+
alias ⟨_, sq_pos_of_ne_zero⟩ := sq_pos_iff
501+
alias pow_two_pos_of_ne_zero := sq_pos_of_ne_zero
502+
#align sq_pos_of_ne_zero sq_pos_of_ne_zero
503+
#align pow_two_pos_of_ne_zero pow_two_pos_of_ne_zero
504+
505+
lemma pow_four_le_pow_two_of_pow_two_le (h : a ^ 2 ≤ b) : a ^ 4 ≤ b ^ 2 :=
506+
(pow_mul a 2 2).symm ▸ pow_le_pow_left (sq_nonneg a) h 2
507+
#align pow_four_le_pow_two_of_pow_two_le pow_four_le_pow_two_of_pow_two_le
449508

450509
section deprecated
451510
set_option linter.deprecated false
452511

453-
theorem pow_bit0_nonneg (a : R) (n : ℕ) : 0 ≤ a ^ bit0 n := by
454-
rw [pow_bit0]
455-
exact mul_self_nonneg _
512+
@[deprecated Even.pow_nonneg] -- 2024-04-06
513+
lemma pow_bit0_nonneg (a : R) (n : ℕ) : 0 ≤ a ^ bit0 n := (even_bit0 _).pow_nonneg _
456514
#align pow_bit0_nonneg pow_bit0_nonneg
457515

458-
theorem pow_bit0_pos {a : R} (h : a ≠ 0) (n : ℕ) : 0 < a ^ bit0 n :=
459-
(pow_bit0_nonneg a n).lt_of_ne (pow_ne_zero _ h).symm
516+
@[deprecated Even.pow_pos] -- 2024-04-06
517+
lemma pow_bit0_pos {a : R} (h : a ≠ 0) (n : ℕ) : 0 < a ^ bit0 n := (even_bit0 _).pow_pos h
460518
#align pow_bit0_pos pow_bit0_pos
461519

462-
theorem pow_bit0_pos_iff (a : R) {n : ℕ} (hn : n ≠ 0) : 0 < a ^ bit0 n ↔ a ≠ 0 := by
463-
refine' ⟨fun h => _, fun h => pow_bit0_pos h n⟩
464-
rintro rfl
465-
rw [zero_pow (Nat.bit0_ne_zero hn)] at h
466-
exact lt_irrefl _ h
520+
@[deprecated Even.pow_pos_iff] -- 2024-04-06
521+
lemma pow_bit0_pos_iff (a : R) {n : ℕ} (hn : n ≠ 0) : 0 < a ^ bit0 n ↔ a ≠ 0 :=
522+
(even_bit0 _).pow_pos_iff (by simpa [bit0])
467523
#align pow_bit0_pos_iff pow_bit0_pos_iff
468524

469-
@[simp]
470-
lemma pow_bit1_neg_iff : a ^ bit1 n < 0 ↔ a < 0 :=
471-
fun h ↦ not_le.1 fun h' => not_le.2 h <| pow_nonneg h' _, fun ha ↦ pow_bit1_neg ha n⟩
525+
@[simp, deprecated Odd.pow_neg_iff] -- 2024-04-06
526+
lemma pow_bit1_neg_iff : a ^ bit1 n < 0 ↔ a < 0 := (odd_bit1 _).pow_neg_iff
472527
#align pow_bit1_neg_iff pow_bit1_neg_iff
473528

474-
@[simp]
475-
lemma pow_bit1_nonneg_iff : 0 ≤ a ^ bit1 n ↔ 0 ≤ a := le_iff_le_iff_lt_iff_lt.2 pow_bit1_neg_iff
529+
@[simp, deprecated Odd.pow_nonneg_iff] -- 2024-04-06
530+
lemma pow_bit1_nonneg_iff : 0 ≤ a ^ bit1 n ↔ 0 ≤ a := (odd_bit1 _).pow_nonneg_iff
476531
#align pow_bit1_nonneg_iff pow_bit1_nonneg_iff
477532

478-
@[simp]
479-
lemma pow_bit1_nonpos_iff : a ^ bit1 n ≤ 0 ↔ a ≤ 0 := by
480-
simp only [le_iff_lt_or_eq, pow_bit1_neg_iff, pow_eq_zero_iff']; simp [bit1]
533+
@[simp, deprecated Odd.pow_nonpos_iff] -- 2024-04-06
534+
lemma pow_bit1_nonpos_iff : a ^ bit1 n ≤ 0 ↔ a ≤ 0 := (odd_bit1 _).pow_nonpos_iff
481535
#align pow_bit1_nonpos_iff pow_bit1_nonpos_iff
482536

483-
@[simp]
484-
lemma pow_bit1_pos_iff : 0 < a ^ bit1 n ↔ 0 < a := lt_iff_lt_of_le_iff_le pow_bit1_nonpos_iff
537+
@[simp, deprecated Odd.pow_pos_iff] -- 2024-04-06
538+
lemma pow_bit1_pos_iff : 0 < a ^ bit1 n ↔ 0 < a := (odd_bit1 _).pow_pos_iff
485539
#align pow_bit1_pos_iff pow_bit1_pos_iff
486540

487-
lemma strictMono_pow_bit1 (n : ℕ) : StrictMono (· ^ bit1 n : R → R) := by
488-
intro a b hab
489-
rcases le_total a 0 with ha | ha
490-
· rcases le_or_lt b 0 with hb | hb
491-
· rw [← neg_lt_neg_iff, ← neg_pow_bit1, ← neg_pow_bit1]
492-
exact pow_lt_pow_left (neg_lt_neg hab) (neg_nonneg.2 hb) n.bit1_ne_zero
493-
· exact (pow_bit1_nonpos_iff.2 ha).trans_lt (pow_bit1_pos_iff.2 hb)
494-
· exact pow_lt_pow_left hab ha n.bit1_ne_zero
541+
@[deprecated Odd.strictMono_pow] -- 2024-04-06
542+
lemma strictMono_pow_bit1 (n : ℕ) : StrictMono (· ^ bit1 n : R → R) := (odd_bit1 _).strictMono_pow
495543
#align strict_mono_pow_bit1 strictMono_pow_bit1
496544

497545
end deprecated
498-
499-
lemma sq_pos_iff {R : Type*} [LinearOrderedSemiring R] [ExistsAddOfLE R] {a : R} :
500-
0 < a ^ 2 ↔ a ≠ 0 := by
501-
rw [← pow_ne_zero_iff two_ne_zero, (sq_nonneg a).lt_iff_ne, ne_comm]
502-
#align sq_pos_iff sq_pos_iff
503-
504-
alias ⟨_, sq_pos_of_ne_zero⟩ := sq_pos_iff
505-
#align sq_pos_of_ne_zero sq_pos_of_ne_zero
506-
507-
alias pow_two_pos_of_ne_zero := sq_pos_of_ne_zero
508-
#align pow_two_pos_of_ne_zero pow_two_pos_of_ne_zero
509-
510-
lemma pow_four_le_pow_two_of_pow_two_le (h : a ^ 2 ≤ b) : a ^ 4 ≤ b ^ 2 :=
511-
(pow_mul a 2 2).symm ▸ pow_le_pow_left (sq_nonneg a) h 2
512-
#align pow_four_le_pow_two_of_pow_two_le pow_four_le_pow_two_of_pow_two_le
513-
514-
end LinearOrderedRing
546+
end LinearOrderedSemiring
515547

516548
namespace MonoidHom
517549

Mathlib/Algebra/Order/Ring/Abs.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ lemma abs_pow (a : α) (n : ℕ) : |a ^ n| = |a| ^ n := (absHom.toMonoidHom : α
6363
lemma pow_abs (a : α) (n : ℕ) : |a| ^ n = |a ^ n| := (abs_pow a n).symm
6464
#align pow_abs pow_abs
6565

66+
lemma Even.pow_abs (hn : Even n) (a : α) : |a| ^ n = a ^ n := by
67+
rw [← abs_pow, abs_eq_self]; exact hn.pow_nonneg _
68+
#align even.pow_abs Even.pow_abs
69+
6670
lemma abs_neg_one_pow (n : ℕ) : |(-1 : α) ^ n| = 1 := by rw [← pow_abs, abs_neg, abs_one, one_pow]
6771
#align abs_neg_one_pow abs_neg_one_pow
6872

Mathlib/Algebra/Parity.lean

Lines changed: 6 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Damiano Testa
55
-/
66
import Mathlib.Algebra.Group.Opposite
7-
import Mathlib.Algebra.Order.Ring.Abs
7+
import Mathlib.Algebra.GroupPower.Ring
8+
import Mathlib.Algebra.Order.Group.Abs
9+
import Mathlib.Algebra.Order.Ring.Canonical
10+
import Mathlib.Data.Nat.Cast.Basic
811
import Mathlib.Data.Nat.Cast.Commute
912
import Mathlib.Data.Set.Defs
1013

@@ -279,7 +282,7 @@ theorem even_iff_exists_two_mul (a : α) : Even a ↔ ∃ b, a = 2 * b := by
279282
simp [even_iff_exists_two_nsmul]
280283
#align even_iff_exists_two_mul even_iff_exists_two_mul
281284

282-
theorem even_iff_two_dvd {a : α} : Even a ↔ 2 ∣ a := by simp [Even, Dvd.dvd, two_mul]
285+
theorem even_iff_two_dvd : Even a ↔ 2 ∣ a := by simp [Even, Dvd.dvd, two_mul]
283286
#align even_iff_two_dvd even_iff_two_dvd
284287

285288
alias ⟨Even.two_dvd, _⟩ := even_iff_two_dvd
@@ -338,7 +341,7 @@ def Odd (a : α) : Prop :=
338341
#align odd Odd
339342

340343
set_option linter.deprecated false in
341-
theorem odd_iff_exists_bit1 {a : α} : Odd a ↔ ∃ b, a = bit1 b :=
344+
theorem odd_iff_exists_bit1 : Odd a ↔ ∃ b, a = bit1 b :=
342345
exists_congr fun b => by
343346
rw [two_mul]
344347
rfl
@@ -522,99 +525,3 @@ theorem odd_abs [LinearOrder α] : Odd (abs a) ↔ Odd a := by
522525
#align odd_abs odd_abs
523526

524527
end Ring
525-
526-
section Powers
527-
528-
/-!
529-
### Lemmas for canonically linear ordered semirings or linear ordered rings
530-
531-
The slightly unusual typeclass assumptions `[LinearOrderedSemiring R] [ExistsAddOfLE R]` cover two
532-
more familiar settings:
533-
* `[LinearOrderedRing R]`, eg `ℤ`, `ℚ` or `ℝ`
534-
* `[CanonicallyLinearOrderedSemiring R]` (although we don't actually have this typeclass), eg `ℕ`,
535-
`ℚ≥0` or `ℝ≥0`
536-
-/
537-
538-
section LinearOrderedSemiring
539-
variable [LinearOrderedSemiring R] [ExistsAddOfLE R] {a b : R} {n : ℕ}
540-
541-
theorem Even.pow_nonneg (hn : Even n) (a : R) : 0 ≤ a ^ n := by
542-
obtain ⟨k, rfl⟩ := hn; rw [pow_add]; exact mul_self_nonneg _
543-
#align even.pow_nonneg Even.pow_nonneg
544-
545-
theorem Even.pow_pos (hn : Even n) (ha : a ≠ 0) : 0 < a ^ n :=
546-
(hn.pow_nonneg _).lt_of_ne' (pow_ne_zero _ ha)
547-
#align even.pow_pos Even.pow_pos
548-
549-
theorem Odd.pow_neg_iff (hn : Odd n) : a ^ n < 0 ↔ a < 0 := by
550-
refine ⟨lt_imp_lt_of_le_imp_le (pow_nonneg · _), fun ha ↦ ?_⟩
551-
obtain ⟨k, rfl⟩ := hn
552-
rw [pow_succ]
553-
exact mul_neg_of_pos_of_neg ((even_two_mul _).pow_pos ha.ne) ha
554-
#align odd.pow_neg_iff Odd.pow_neg_iff
555-
556-
theorem Odd.pow_nonneg_iff (hn : Odd n) : 0 ≤ a ^ n ↔ 0 ≤ a :=
557-
le_iff_le_iff_lt_iff_lt.2 hn.pow_neg_iff
558-
#align odd.pow_nonneg_iff Odd.pow_nonneg_iff
559-
560-
theorem Odd.pow_nonpos_iff (hn : Odd n) : a ^ n ≤ 0 ↔ a ≤ 0 := by
561-
rw [le_iff_lt_or_eq, le_iff_lt_or_eq, hn.pow_neg_iff, pow_eq_zero_iff]
562-
rintro rfl; simp [Odd, eq_comm (a := 0)] at hn
563-
#align odd.pow_nonpos_iff Odd.pow_nonpos_iff
564-
565-
theorem Odd.pow_pos_iff (hn : Odd n) : 0 < a ^ n ↔ 0 < a :=
566-
lt_iff_lt_of_le_iff_le hn.pow_nonpos_iff
567-
#align odd.pow_pos_iff Odd.pow_pos_iff
568-
569-
alias ⟨_, Odd.pow_nonpos⟩ := Odd.pow_nonpos_iff
570-
#align odd.pow_nonpos Odd.pow_nonpos
571-
572-
alias ⟨_, Odd.pow_neg⟩ := Odd.pow_neg_iff
573-
#align odd.pow_neg Odd.pow_neg
574-
575-
theorem Even.pow_pos_iff (hn : Even n) (h₀ : n ≠ 0) : 0 < a ^ n ↔ a ≠ 0 :=
576-
fun h ha => by
577-
rw [ha, zero_pow h₀] at h
578-
exact lt_irrefl 0 h, hn.pow_pos⟩
579-
#align even.pow_pos_iff Even.pow_pos_iff
580-
581-
lemma Odd.strictMono_pow (hn : Odd n) : StrictMono fun a : R => a ^ n := by
582-
have hn₀ : n ≠ 0 := by rintro rfl; simp [Odd, eq_comm (a := 0)] at hn
583-
intro a b hab
584-
obtain ha | ha := le_total 0 a
585-
· exact pow_lt_pow_left hab ha hn₀
586-
obtain hb | hb := lt_or_le 0 b
587-
· exact (hn.pow_nonpos ha).trans_lt (pow_pos hb _)
588-
obtain ⟨c, hac⟩ := exists_add_of_le ha
589-
obtain ⟨d, hbd⟩ := exists_add_of_le hb
590-
have hd := nonneg_of_le_add_right (hb.trans_eq hbd)
591-
refine lt_of_add_lt_add_right (a := c ^ n + d ^ n) ?_
592-
dsimp
593-
calc
594-
a ^ n + (c ^ n + d ^ n) = d ^ n := by
595-
rw [← add_assoc, hn.pow_add_pow_eq_zero hac.symm, zero_add]
596-
_ < c ^ n := pow_lt_pow_left ?_ hd hn₀
597-
_ = b ^ n + (c ^ n + d ^ n) := by rw [add_left_comm, hn.pow_add_pow_eq_zero hbd.symm, add_zero]
598-
refine lt_of_add_lt_add_right (a := a + b) ?_
599-
rwa [add_rotate', ← hbd, add_zero, add_left_comm, ← add_assoc, ← hac, zero_add]
600-
#align odd.strict_mono_pow Odd.strictMono_pow
601-
602-
end LinearOrderedSemiring
603-
604-
section LinearOrderedRing
605-
variable [LinearOrderedRing R] {a : R} {n : ℕ}
606-
607-
theorem Even.pow_abs {p : ℕ} (hp : Even p) (a : R) : |a| ^ p = a ^ p := by
608-
rw [← abs_pow, abs_eq_self]
609-
exact hp.pow_nonneg _
610-
#align even.pow_abs Even.pow_abs
611-
612-
set_option linter.deprecated false in
613-
@[simp]
614-
theorem pow_bit0_abs (a : R) (p : ℕ) : |a| ^ bit0 p = a ^ bit0 p :=
615-
(even_bit0 _).pow_abs _
616-
#align pow_bit0_abs pow_bit0_abs
617-
618-
end LinearOrderedRing
619-
620-
end Powers

Mathlib/Analysis/Calculus/FDeriv/Symmetric.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ theorem Convex.taylor_approx_two_segment {v w : E} (hv : x + v ∈ interior s)
169169
zero_smul, Ne, not_false_iff, bit0_eq_zero, zero_pow]
170170
abel
171171
· simp only [Real.norm_eq_abs, abs_mul, add_nonneg (norm_nonneg v) (norm_nonneg w), abs_of_nonneg,
172-
hpos.le, mul_assoc, pow_bit0_abs, norm_nonneg, abs_pow]
172+
hpos.le, mul_assoc, norm_nonneg, abs_pow]
173173
#align convex.taylor_approx_two_segment Convex.taylor_approx_two_segment
174174

175175
/-- One can get `f'' v w` as the limit of `h ^ (-2)` times the alternate sum of the values of `f`

Mathlib/Data/Rat/Sqrt.lean

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Johannes Hölzl, Mario Carneiro
55
-/
66
import Mathlib.Algebra.Order.Ring.Abs
7-
import Mathlib.Algebra.Parity
87
import Mathlib.Data.Rat.Order
98
import Mathlib.Data.Rat.Lemmas
109
import Mathlib.Data.Int.Sqrt

0 commit comments

Comments
 (0)