@@ -6,17 +6,16 @@ Authors: Jeremy Avigad, Robert Y. Lewis
66import Mathlib.Algebra.GroupPower.CovariantClass
77import Mathlib.Algebra.GroupPower.Ring
88import 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
2120open Function Int
2221
@@ -298,22 +297,9 @@ theorem sq_pos_of_pos (ha : 0 < a) : 0 < a ^ 2 := pow_pos ha _
298297end StrictOrderedSemiring
299298
300299section StrictOrderedRing
301- set_option linter.deprecated false
302-
303300variable [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
319305end 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+
397393variable [ExistsAddOfLE R]
398394
399395lemma add_sq_le : (a + b) ^ 2 ≤ 2 * (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
450509section deprecated
451510set_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
497545end 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
516548namespace MonoidHom
517549
0 commit comments