Module docstring
{"# Basic parity lemmas for the ring ℤ
See note [foundational algebra order theory]. ","#### Parity "}
{"# Basic parity lemmas for the ring ℤ
See note [foundational algebra order theory]. ","#### Parity "}
Int.odd_iff
theorem
: Odd n ↔ n % 2 = 1
lemma odd_iff : OddOdd n ↔ n % 2 = 1 where
mp := fun ⟨m, hm⟩ ↦ by simp [hm, add_emod]
mpr h := ⟨n / 2, by rw [← h, add_comm, emod_add_ediv n 2]⟩
Int.not_odd_iff
theorem
: ¬Odd n ↔ n % 2 = 0
lemma not_odd_iff : ¬Odd n¬Odd n ↔ n % 2 = 0 := by rw [odd_iff, emod_two_ne_one]
Int.not_odd_zero
theorem
: ¬Odd (0 : ℤ)
@[simp] lemma not_odd_zero : ¬Odd (0 : ℤ) := not_odd_iff.mpr rfl
Int.not_odd_iff_even
theorem
: ¬Odd n ↔ Even n
@[simp] lemma not_odd_iff_even : ¬Odd n¬Odd n ↔ Even n := by rw [not_odd_iff, even_iff]
Int.not_even_iff_odd
theorem
: ¬Even n ↔ Odd n
@[simp] lemma not_even_iff_odd : ¬Even n¬Even n ↔ Odd n := by rw [not_even_iff, odd_iff]
Int.even_or_odd
theorem
(n : ℤ) : Even n ∨ Odd n
lemma even_or_odd (n : ℤ) : EvenEven n ∨ Odd n := Or.imp_right not_even_iff_odd.1 <| em <| Even n
Int.even_or_odd'
theorem
(n : ℤ) : ∃ k, n = 2 * k ∨ n = 2 * k + 1
lemma even_or_odd' (n : ℤ) : ∃ k, n = 2 * k ∨ n = 2 * k + 1 := by
simpa only [two_mul, exists_or, Odd, Even] using even_or_odd n
Int.even_xor'_odd
theorem
(n : ℤ) : Xor' (Even n) (Odd n)
lemma even_xor'_odd (n : ℤ) : Xor' (Even n) (Odd n) := by
cases even_or_odd n with
| inl h => exact Or.inl ⟨h, not_odd_iff_even.2 h⟩
| inr h => exact Or.inr ⟨h, not_even_iff_odd.2 h⟩
Int.even_xor'_odd'
theorem
(n : ℤ) : ∃ k, Xor' (n = 2 * k) (n = 2 * k + 1)
lemma even_xor'_odd' (n : ℤ) : ∃ k, Xor' (n = 2 * k) (n = 2 * k + 1) := by
rcases even_or_odd n with (⟨k, rfl⟩ | ⟨k, rfl⟩) <;> use k
· simpa only [← two_mul, Xor', true_and, eq_self_iff_true, not_true, or_false,
and_false] using (succ_ne_self (2 * k)).symm
· simp only [Xor', add_eq_left, false_or, eq_self_iff_true, not_true, not_false_iff,
one_ne_zero, and_self_iff]
Int.instDecidablePredOdd
instance
: DecidablePred (Odd : ℤ → Prop)
instance : DecidablePred (Odd : ℤ → Prop) := fun _ => decidable_of_iff _ not_even_iff_odd
Int.even_add'
theorem
: Even (m + n) ↔ (Odd m ↔ Odd n)
lemma even_add' : EvenEven (m + n) ↔ (Odd m ↔ Odd n) := by
rw [even_add, ← not_odd_iff_even, ← not_odd_iff_even, not_iff_not]
Int.not_even_two_mul_add_one
theorem
(n : ℤ) : ¬Even (2 * n + 1)
lemma not_even_two_mul_add_one (n : ℤ) : ¬ Even (2 * n + 1) :=
not_even_iff_odd.2 <| odd_two_mul_add_one n
Int.even_sub'
theorem
: Even (m - n) ↔ (Odd m ↔ Odd n)
lemma even_sub' : EvenEven (m - n) ↔ (Odd m ↔ Odd n) := by
rw [even_sub, ← not_odd_iff_even, ← not_odd_iff_even, not_iff_not]
Int.odd_mul
theorem
: Odd (m * n) ↔ Odd m ∧ Odd n
lemma odd_mul : OddOdd (m * n) ↔ Odd m ∧ Odd n := by simp [← not_even_iff_odd, not_or, parity_simps]
Int.Odd.of_mul_left
theorem
(h : Odd (m * n)) : Odd m
Int.Odd.of_mul_right
theorem
(h : Odd (m * n)) : Odd n
Int.odd_pow
theorem
{n : ℕ} : Odd (m ^ n) ↔ Odd m ∨ n = 0
@[parity_simps] lemma odd_pow {n : ℕ} : OddOdd (m ^ n) ↔ Odd m ∨ n = 0 := by
rw [← not_iff_not, not_odd_iff_even, not_or, not_odd_iff_even, even_pow]
Int.odd_pow'
theorem
{n : ℕ} (h : n ≠ 0) : Odd (m ^ n) ↔ Odd m
lemma odd_pow' {n : ℕ} (h : n ≠ 0) : OddOdd (m ^ n) ↔ Odd m := odd_pow.trans <| or_iff_left h
Int.odd_add
theorem
: Odd (m + n) ↔ (Odd m ↔ Even n)
@[parity_simps] lemma odd_add : OddOdd (m + n) ↔ (Odd m ↔ Even n) := by
rw [← not_even_iff_odd, even_add, not_iff, ← not_even_iff_odd]
Int.odd_add'
theorem
: Odd (m + n) ↔ (Odd n ↔ Even m)
lemma odd_add' : OddOdd (m + n) ↔ (Odd n ↔ Even m) := by rw [add_comm, odd_add]
Int.ne_of_odd_add
theorem
(h : Odd (m + n)) : m ≠ n
lemma ne_of_odd_add (h : Odd (m + n)) : m ≠ n := by rintro rfl; simp [← not_even_iff_odd] at h
Int.odd_sub
theorem
: Odd (m - n) ↔ (Odd m ↔ Even n)
@[parity_simps] lemma odd_sub : OddOdd (m - n) ↔ (Odd m ↔ Even n) := by
rw [← not_even_iff_odd, even_sub, not_iff, ← not_even_iff_odd]
Int.odd_sub'
theorem
: Odd (m - n) ↔ (Odd n ↔ Even m)
Int.even_mul_succ_self
theorem
(n : ℤ) : Even (n * (n + 1))
lemma even_mul_succ_self (n : ℤ) : Even (n * (n + 1)) := by
simpa [even_mul, parity_simps] using n.even_or_odd
Int.even_mul_pred_self
theorem
(n : ℤ) : Even (n * (n - 1))
lemma even_mul_pred_self (n : ℤ) : Even (n * (n - 1)) := by
simpa [even_mul, parity_simps] using n.even_or_odd
Int.odd_coe_nat
theorem
(n : ℕ) : Odd (n : ℤ) ↔ Odd n
@[simp, norm_cast] lemma odd_coe_nat (n : ℕ) : OddOdd (n : ℤ) ↔ Odd n := by
rw [← not_even_iff_odd, ← Nat.not_even_iff_odd, even_coe_nat]
Int.natAbs_even
theorem
: Even n.natAbs ↔ Even n
@[simp] lemma natAbs_even : EvenEven n.natAbs ↔ Even n := by
simp [even_iff_two_dvd, dvd_natAbs, natCast_dvd.symm]
Int.natAbs_odd
theorem
: Odd n.natAbs ↔ Odd n
@[simp]
lemma natAbs_odd : OddOdd n.natAbs ↔ Odd n := by
rw [← not_even_iff_odd, ← Nat.not_even_iff_odd, natAbs_even]
Int.four_dvd_add_or_sub_of_odd
theorem
{a b : ℤ} (ha : Odd a) (hb : Odd b) : 4 ∣ a + b ∨ 4 ∣ a - b
lemma four_dvd_add_or_sub_of_odd {a b : ℤ} (ha : Odd a) (hb : Odd b) :
4 ∣ a + b4 ∣ a + b ∨ 4 ∣ a - b := by
obtain ⟨m, rfl⟩ := ha
obtain ⟨n, rfl⟩ := hb
omega
Int.two_mul_ediv_two_add_one_of_odd
theorem
: Odd n → 2 * (n / 2) + 1 = n
lemma two_mul_ediv_two_add_one_of_odd : Odd n → 2 * (n / 2) + 1 = n := by
rintro ⟨c, rfl⟩
rw [mul_comm]
convert Int.ediv_add_emod' (2 * c + 1) 2
simp [Int.add_emod]
Int.ediv_two_mul_two_add_one_of_odd
theorem
: Odd n → n / 2 * 2 + 1 = n
lemma ediv_two_mul_two_add_one_of_odd : Odd n → n / 2 * 2 + 1 = n := by
rintro ⟨c, rfl⟩
convert Int.ediv_add_emod' (2 * c + 1) 2
simp [Int.add_emod]
Int.add_one_ediv_two_mul_two_of_odd
theorem
: Odd n → 1 + n / 2 * 2 = n
lemma add_one_ediv_two_mul_two_of_odd : Odd n → 1 + n / 2 * 2 = n := by
rintro ⟨c, rfl⟩
rw [add_comm]
convert Int.ediv_add_emod' (2 * c + 1) 2
simp [Int.add_emod]
Int.two_mul_ediv_two_of_odd
theorem
(h : Odd n) : 2 * (n / 2) = n - 1
lemma two_mul_ediv_two_of_odd (h : Odd n) : 2 * (n / 2) = n - 1 :=
eq_sub_of_add_eq (two_mul_ediv_two_add_one_of_odd h)
Int.isSquare_natCast_iff
theorem
{n : ℕ} : IsSquare (n : ℤ) ↔ IsSquare n
@[norm_cast, simp]
theorem isSquare_natCast_iff {n : ℕ} : IsSquareIsSquare (n : ℤ) ↔ IsSquare n := by
constructor <;> rintro ⟨x, h⟩
· exact ⟨x.natAbs, (natAbs_mul_natAbs_eq h.symm).symm⟩
· exact ⟨x, mod_cast h⟩
Int.isSquare_ofNat_iff
theorem
{n : ℕ} : IsSquare (ofNat(n) : ℤ) ↔ IsSquare (ofNat(n) : ℕ)
@[simp]
theorem isSquare_ofNat_iff {n : ℕ} :
IsSquareIsSquare (ofNat(n) : ℤ) ↔ IsSquare (ofNat(n) : ℕ) :=
isSquare_natCast_iff