Module docstring
{"# Absolute values in linear ordered rings. "}
{"# Absolute values in linear ordered rings. "}
mabs_zpow
theorem
(n : ℤ) (a : α) : |a ^ n|ₘ = |a|ₘ ^ |n|
@[to_additive] lemma mabs_zpow (n : ℤ) (a : α) : |a ^ n|ₘ = |a|ₘ ^ |n| := by
obtain n0 | n0 := le_total 0 n
· obtain ⟨n, rfl⟩ := Int.eq_ofNat_of_zero_le n0
simp only [mabs_pow, zpow_natCast, Nat.abs_cast]
· obtain ⟨m, h⟩ := Int.eq_ofNat_of_zero_le (neg_nonneg.2 n0)
rw [← mabs_inv, ← zpow_neg, ← abs_neg, h, zpow_natCast, Nat.abs_cast, zpow_natCast]
exact mabs_pow m _
odd_abs
theorem
[LinearOrder α] [Ring α] {a : α} : Odd (abs a) ↔ Odd a
lemma odd_abs [LinearOrder α] [Ring α] {a : α} : OddOdd (abs a) ↔ Odd a := by
rcases abs_choice a with h | h <;> simp only [h, odd_neg]
abs_one
theorem
: |(1 : α)| = 1
@[simp] lemma abs_one : |(1 : α)| = 1 := abs_of_pos zero_lt_one
abs_two
theorem
: |(2 : α)| = 2
lemma abs_two : |(2 : α)| = 2 := abs_of_pos zero_lt_two
abs_mul
theorem
(a b : α) : |a * b| = |a| * |b|
lemma abs_mul (a b : α) : |a * b| = |a| * |b| := by
rw [abs_eq (mul_nonneg (abs_nonneg a) (abs_nonneg b))]
rcases le_total a 0 with ha | ha <;> rcases le_total b 0 with hb | hb <;>
simp only [abs_of_nonpos, abs_of_nonneg, true_or, or_true, eq_self_iff_true, neg_mul,
mul_neg, neg_neg, *]
absHom
definition
: α →*₀ α
abs_pow
theorem
(a : α) (n : ℕ) : |a ^ n| = |a| ^ n
pow_abs
theorem
(a : α) (n : ℕ) : |a| ^ n = |a ^ n|
Even.pow_abs
theorem
(hn : Even n) (a : α) : |a| ^ n = a ^ n
lemma Even.pow_abs (hn : Even n) (a : α) : |a| ^ n = a ^ n := by
rw [← abs_pow, abs_eq_self]; exact hn.pow_nonneg _
abs_neg_one_pow
theorem
(n : ℕ) : |(-1 : α) ^ n| = 1
lemma abs_neg_one_pow (n : ℕ) : |(-1 : α) ^ n| = 1 := by rw [← pow_abs, abs_neg, abs_one, one_pow]
abs_pow_eq_one
theorem
(a : α) (h : n ≠ 0) : |a ^ n| = 1 ↔ |a| = 1
lemma abs_pow_eq_one (a : α) (h : n ≠ 0) : |a ^ n||a ^ n| = 1 ↔ |a| = 1 := by
convert pow_left_inj₀ (abs_nonneg a) zero_le_one h
exacts [(pow_abs _ _).symm, (one_pow _).symm]
abs_mul_abs_self
theorem
(a : α) : |a| * |a| = a * a
@[simp] lemma abs_mul_abs_self (a : α) : |a| * |a| = a * a :=
abs_by_cases (fun x => x * x = a * a) rfl (neg_mul_neg a a)
abs_mul_self
theorem
(a : α) : |a * a| = a * a
@[simp]
lemma abs_mul_self (a : α) : |a * a| = a * a := by rw [abs_mul, abs_mul_abs_self]
abs_eq_iff_mul_self_eq
theorem
: |a| = |b| ↔ a * a = b * b
lemma abs_eq_iff_mul_self_eq : |a||a| = |b| ↔ a * a = b * b := by
rw [← abs_mul_abs_self, ← abs_mul_abs_self b]
exact (mul_self_inj (abs_nonneg a) (abs_nonneg b)).symm
abs_lt_iff_mul_self_lt
theorem
: |a| < |b| ↔ a * a < b * b
lemma abs_lt_iff_mul_self_lt : |a||a| < |b| ↔ a * a < b * b := by
rw [← abs_mul_abs_self, ← abs_mul_abs_self b]
exact mul_self_lt_mul_self_iff (abs_nonneg a) (abs_nonneg b)
abs_le_iff_mul_self_le
theorem
: |a| ≤ |b| ↔ a * a ≤ b * b
lemma abs_le_iff_mul_self_le : |a||a| ≤ |b| ↔ a * a ≤ b * b := by
rw [← abs_mul_abs_self, ← abs_mul_abs_self b]
exact mul_self_le_mul_self_iff (abs_nonneg a) (abs_nonneg b)
abs_le_one_iff_mul_self_le_one
theorem
: |a| ≤ 1 ↔ a * a ≤ 1
lemma abs_le_one_iff_mul_self_le_one : |a||a| ≤ 1 ↔ a * a ≤ 1 := by
simpa only [abs_one, one_mul] using abs_le_iff_mul_self_le (a := a) (b := 1)
sq_abs
theorem
(a : α) : |a| ^ 2 = a ^ 2
@[simp] lemma sq_abs (a : α) : |a| ^ 2 = a ^ 2 := by simpa only [sq] using abs_mul_abs_self a
abs_sq
theorem
(x : α) : |x ^ 2| = x ^ 2
lemma abs_sq (x : α) : |x ^ 2| = x ^ 2 := by simpa only [sq] using abs_mul_self x
sq_lt_sq
theorem
: a ^ 2 < b ^ 2 ↔ |a| < |b|
lemma sq_lt_sq : a ^ 2 < b ^ 2 ↔ |a| < |b| := by
simpa only [sq_abs] using sq_lt_sq₀ (abs_nonneg a) (abs_nonneg b)
sq_lt_sq'
theorem
(h1 : -b < a) (h2 : a < b) : a ^ 2 < b ^ 2
lemma sq_lt_sq' (h1 : -b < a) (h2 : a < b) : a ^ 2 < b ^ 2 :=
sq_lt_sq.2 (lt_of_lt_of_le (abs_lt.2 ⟨h1, h2⟩) (le_abs_self _))
sq_le_sq
theorem
: a ^ 2 ≤ b ^ 2 ↔ |a| ≤ |b|
lemma sq_le_sq : a ^ 2 ≤ b ^ 2 ↔ |a| ≤ |b| := by
simpa only [sq_abs] using sq_le_sq₀ (abs_nonneg a) (abs_nonneg b)
sq_le_sq'
theorem
(h1 : -b ≤ a) (h2 : a ≤ b) : a ^ 2 ≤ b ^ 2
abs_lt_of_sq_lt_sq
theorem
(h : a ^ 2 < b ^ 2) (hb : 0 ≤ b) : |a| < b
lemma abs_lt_of_sq_lt_sq (h : a ^ 2 < b ^ 2) (hb : 0 ≤ b) : |a| < b := by
rwa [← abs_of_nonneg hb, ← sq_lt_sq]
abs_lt_of_sq_lt_sq'
theorem
(h : a ^ 2 < b ^ 2) (hb : 0 ≤ b) : -b < a ∧ a < b
lemma abs_lt_of_sq_lt_sq' (h : a ^ 2 < b ^ 2) (hb : 0 ≤ b) : -b < a ∧ a < b :=
abs_lt.1 <| abs_lt_of_sq_lt_sq h hb
abs_le_of_sq_le_sq
theorem
(h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : |a| ≤ b
lemma abs_le_of_sq_le_sq (h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : |a| ≤ b := by
rwa [← abs_of_nonneg hb, ← sq_le_sq]
le_of_sq_le_sq
theorem
(h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : a ≤ b
theorem le_of_sq_le_sq (h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : a ≤ b :=
le_abs_self a |>.trans <| abs_le_of_sq_le_sq h hb
abs_le_of_sq_le_sq'
theorem
(h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : -b ≤ a ∧ a ≤ b
lemma abs_le_of_sq_le_sq' (h : a ^ 2 ≤ b ^ 2) (hb : 0 ≤ b) : -b ≤ a ∧ a ≤ b :=
abs_le.1 <| abs_le_of_sq_le_sq h hb
sq_eq_sq_iff_abs_eq_abs
theorem
(a b : α) : a ^ 2 = b ^ 2 ↔ |a| = |b|
lemma sq_eq_sq_iff_abs_eq_abs (a b : α) : a ^ 2 = b ^ 2 ↔ |a| = |b| := by
simp only [le_antisymm_iff, sq_le_sq]
sq_le_one_iff_abs_le_one
theorem
(a : α) : a ^ 2 ≤ 1 ↔ |a| ≤ 1
@[simp] lemma sq_le_one_iff_abs_le_one (a : α) : a ^ 2 ≤ 1 ↔ |a| ≤ 1 := by
simpa only [one_pow, abs_one] using sq_le_sq (a := a) (b := 1)
sq_lt_one_iff_abs_lt_one
theorem
(a : α) : a ^ 2 < 1 ↔ |a| < 1
@[simp] lemma sq_lt_one_iff_abs_lt_one (a : α) : a ^ 2 < 1 ↔ |a| < 1 := by
simpa only [one_pow, abs_one] using sq_lt_sq (a := a) (b := 1)
one_le_sq_iff_one_le_abs
theorem
(a : α) : 1 ≤ a ^ 2 ↔ 1 ≤ |a|
@[simp] lemma one_le_sq_iff_one_le_abs (a : α) : 1 ≤ a ^ 2 ↔ 1 ≤ |a| := by
simpa only [one_pow, abs_one] using sq_le_sq (a := 1) (b := a)
one_lt_sq_iff_one_lt_abs
theorem
(a : α) : 1 < a ^ 2 ↔ 1 < |a|
@[simp] lemma one_lt_sq_iff_one_lt_abs (a : α) : 1 < a ^ 2 ↔ 1 < |a| := by
simpa only [one_pow, abs_one] using sq_lt_sq (a := 1) (b := a)
exists_abs_lt
theorem
{α : Type*} [Ring α] [LinearOrder α] [IsStrictOrderedRing α] (a : α) : ∃ b > 0, |a| < b
lemma exists_abs_lt {α : Type*} [Ring α] [LinearOrder α] [IsStrictOrderedRing α]
(a : α) : ∃ b > 0, |a| < b :=
⟨|a| + 1, lt_of_lt_of_le zero_lt_one <| by simp, lt_add_one |a|⟩
abs_sub_sq
theorem
(a b : α) : |a - b| * |a - b| = a * a + b * b - (1 + 1) * a * b
theorem abs_sub_sq (a b : α) : |a - b| * |a - b| = a * a + b * b - (1 + 1) * a * b := by
rw [abs_mul_abs_self]
simp only [mul_add, add_comm, add_left_comm, mul_comm, sub_eq_add_neg, mul_one, mul_neg,
neg_add_rev, neg_neg, add_assoc]
abs_unit_intCast
theorem
(a : ℤˣ) : |((a : ℤ) : α)| = 1
lemma abs_unit_intCast (a : ℤℤˣ) : |((a : ℤ) : α)| = 1 := by
cases Int.units_eq_one_or a <;> simp_all
abs_pow_sub_pow_le
theorem
: |a ^ n - b ^ n| ≤ |a - b| * n * max |a| |b| ^ (n - 1)
theorem abs_pow_sub_pow_le : |a ^ n - b ^ n| ≤ |a - b| * n * max |a| |b| ^ (n - 1) := by
obtain _ | n := n; · simp
rw [Nat.add_sub_cancel, pow_sub_pow_eq_sub_mul_geomSum, abs_mul, mul_assoc, Nat.cast_succ]
exact mul_le_mul_of_nonneg_left (abs_geomSum_le ..) (abs_nonneg _)
abs_dvd
theorem
(a b : α) : |a| ∣ b ↔ a ∣ b
@[simp]
theorem abs_dvd (a b : α) : |a||a| ∣ b|a| ∣ b ↔ a ∣ b := by
rcases abs_choice a with h | h <;> simp only [h, neg_dvd]
abs_dvd_self
theorem
(a : α) : |a| ∣ a
dvd_abs
theorem
(a b : α) : a ∣ |b| ↔ a ∣ b
@[simp]
theorem dvd_abs (a b : α) : a ∣ |b|a ∣ |b| ↔ a ∣ b := by
rcases abs_choice b with h | h <;> simp only [h, dvd_neg]
self_dvd_abs
theorem
(a : α) : a ∣ |a|
theorem self_dvd_abs (a : α) : a ∣ |a| :=
(dvd_abs a a).mpr (dvd_refl a)
abs_dvd_abs
theorem
(a b : α) : |a| ∣ |b| ↔ a ∣ b
theorem abs_dvd_abs (a b : α) : |a||a| ∣ |b||a| ∣ |b| ↔ a ∣ b :=
(abs_dvd _ _).trans (dvd_abs _ _)
pow_eq_pow_iff_of_ne_zero
theorem
(hn : n ≠ 0) : a ^ n = b ^ n ↔ a = b ∨ a = -b ∧ Even n
lemma pow_eq_pow_iff_of_ne_zero (hn : n ≠ 0) : a ^ n = b ^ n ↔ a = b ∨ a = -b ∧ Even n :=
match n.even_xor_odd with
| .inl hne => by simp only [*, and_true, ← abs_eq_abs,
← pow_left_inj₀ (abs_nonneg a) (abs_nonneg b) hn, hne.1.pow_abs]
| .inr hn => by simp [hn, (hn.1.strictMono_pow (R := R)).injective.eq_iff]
pow_eq_pow_iff_cases
theorem
: a ^ n = b ^ n ↔ n = 0 ∨ a = b ∨ a = -b ∧ Even n
lemma pow_eq_pow_iff_cases : a ^ n = b ^ n ↔ n = 0 ∨ a = b ∨ a = -b ∧ Even n := by
rcases eq_or_ne n 0 with rfl | hn <;> simp [pow_eq_pow_iff_of_ne_zero, *]
pow_eq_one_iff_of_ne_zero
theorem
(hn : n ≠ 0) : a ^ n = 1 ↔ a = 1 ∨ a = -1 ∧ Even n
lemma pow_eq_one_iff_of_ne_zero (hn : n ≠ 0) : a ^ n = 1 ↔ a = 1 ∨ a = -1 ∧ Even n := by
simp [← pow_eq_pow_iff_of_ne_zero hn]
pow_eq_one_iff_cases
theorem
: a ^ n = 1 ↔ n = 0 ∨ a = 1 ∨ a = -1 ∧ Even n
lemma pow_eq_one_iff_cases : a ^ n = 1 ↔ n = 0 ∨ a = 1 ∨ a = -1 ∧ Even n := by
simp [← pow_eq_pow_iff_cases]
pow_eq_neg_pow_iff
theorem
(hb : b ≠ 0) : a ^ n = -b ^ n ↔ a = -b ∧ Odd n
lemma pow_eq_neg_pow_iff (hb : b ≠ 0) : a ^ n = -b ^ n ↔ a = -b ∧ Odd n :=
match n.even_or_odd with
| .inl he =>
suffices a ^ n > -b ^ n by simpa [he, not_odd_iff_even.2 he] using this.ne'
lt_of_lt_of_le (by simp [he.pow_pos hb]) (he.pow_nonneg _)
| .inr ho => by
simp only [ho, and_true, ← ho.neg_pow, (ho.strictMono_pow (R := R)).injective.eq_iff]
pow_eq_neg_one_iff
theorem
: a ^ n = -1 ↔ a = -1 ∧ Odd n
lemma pow_eq_neg_one_iff : a ^ n = -1 ↔ a = -1 ∧ Odd n := by
simpa using pow_eq_neg_pow_iff (R := R) one_ne_zero
Odd.mod_even_iff
theorem
(ha : Even a) : Odd (n % a) ↔ Odd n
/-- If `a` is even, then `n` is odd iff `n % a` is odd. -/
lemma Odd.mod_even_iff (ha : Even a) : OddOdd (n % a) ↔ Odd n :=
((even_sub' <| mod_le n a).mp <|
even_iff_two_dvd.mpr <| (even_iff_two_dvd.mp ha).trans <| dvd_sub_mod n).symm
Even.mod_even_iff
theorem
(ha : Even a) : Even (n % a) ↔ Even n
/-- If `a` is even, then `n` is even iff `n % a` is even. -/
lemma Even.mod_even_iff (ha : Even a) : EvenEven (n % a) ↔ Even n :=
((even_sub <| mod_le n a).mp <|
even_iff_two_dvd.mpr <| (even_iff_two_dvd.mp ha).trans <| dvd_sub_mod n).symm
Odd.mod_even
theorem
(hn : Odd n) (ha : Even a) : Odd (n % a)
/-- If `n` is odd and `a` is even, then `n % a` is odd. -/
lemma Odd.mod_even (hn : Odd n) (ha : Even a) : Odd (n % a) := (Odd.mod_even_iff ha).mpr hn
Even.mod_even
theorem
(hn : Even n) (ha : Even a) : Even (n % a)
/-- If `n` is even and `a` is even, then `n % a` is even. -/
lemma Even.mod_even (hn : Even n) (ha : Even a) : Even (n % a) :=
(Even.mod_even_iff ha).mpr hn
Odd.of_dvd_nat
theorem
(hn : Odd n) (hm : m ∣ n) : Odd m
lemma Odd.of_dvd_nat (hn : Odd n) (hm : m ∣ n) : Odd m :=
not_even_iff_odd.1 <| mt hm.even (not_even_iff_odd.2 hn)
Odd.ne_two_of_dvd_nat
theorem
{m n : ℕ} (hn : Odd n) (hm : m ∣ n) : m ≠ 2
/-- `2` is not a factor of an odd natural number. -/
lemma Odd.ne_two_of_dvd_nat {m n : ℕ} (hn : Odd n) (hm : m ∣ n) : m ≠ 2 := by
rintro rfl
exact absurd (hn.of_dvd_nat hm) (by decide)