Module docstring
{"# Parity of integers ","#### Parity "}
{"# Parity of integers ","#### Parity "}
Int.emod_two_ne_one
theorem
: ¬n % 2 = 1 ↔ n % 2 = 0
@[simp] lemma emod_two_ne_one : ¬n % 2 = 1¬n % 2 = 1 ↔ n % 2 = 0 := by
rcases emod_two_eq_zero_or_one n with h | h <;> simp [h]
Int.one_emod_two
theorem
: (1 : Int) % 2 = 1
@[simp] lemma one_emod_two : (1 : Int) % 2 = 1 := rfl
Int.emod_two_ne_zero
theorem
: ¬n % 2 = 0 ↔ n % 2 = 1
@[local simp] lemma emod_two_ne_zero : ¬n % 2 = 0¬n % 2 = 0 ↔ n % 2 = 1 := by
rcases emod_two_eq_zero_or_one n with h | h <;> simp [h]
Int.even_iff
theorem
: Even n ↔ n % 2 = 0
lemma even_iff : EvenEven n ↔ n % 2 = 0 where
mp := fun ⟨m, hm⟩ ↦ by simp [← Int.two_mul, hm]
mpr h := ⟨n / 2, (emod_add_ediv n 2).symm.trans (by simp [← Int.two_mul, h])⟩
Int.not_even_iff
theorem
: ¬Even n ↔ n % 2 = 1
lemma not_even_iff : ¬Even n¬Even n ↔ n % 2 = 1 := by rw [even_iff, emod_two_ne_zero]
Int.two_dvd_ne_zero
theorem
: ¬2 ∣ n ↔ n % 2 = 1
@[simp] lemma two_dvd_ne_zero : ¬2 ∣ n¬2 ∣ n ↔ n % 2 = 1 :=
(even_iff_exists_two_nsmul _).symm.not.trans not_even_iff
Int.instDecidablePredEven
instance
: DecidablePred (Even : ℤ → Prop)
instance : DecidablePred (Even : ℤ → Prop) := fun _ ↦ decidable_of_iff _ even_iff.symm
Int.instDecidablePredIsSquare
instance
: DecidablePred (IsSquare : ℤ → Prop)
/-- `IsSquare` can be decided on `ℤ` by checking against the square root. -/
instance : DecidablePred (IsSquare : ℤ → Prop) :=
fun m ↦ decidable_of_iff' (sqrt m * sqrt m = m) <| by
simp_rw [← exists_mul_self m, IsSquare, eq_comm]
Int.not_even_one
theorem
: ¬Even (1 : ℤ)
@[simp] lemma not_even_one : ¬Even (1 : ℤ) := by simp [even_iff]
Int.even_add
theorem
: Even (m + n) ↔ (Even m ↔ Even n)
@[parity_simps] lemma even_add : EvenEven (m + n) ↔ (Even m ↔ Even n) := by
rcases emod_two_eq_zero_or_one m with h₁ | h₁ <;>
rcases emod_two_eq_zero_or_one n with h₂ | h₂ <;>
simp [even_iff, h₁, h₂, Int.add_emod, one_add_one_eq_two, emod_self]
Int.two_not_dvd_two_mul_add_one
theorem
(n : ℤ) : ¬2 ∣ 2 * n + 1
lemma two_not_dvd_two_mul_add_one (n : ℤ) : ¬2 ∣ 2 * n + 1 := by simp [add_emod]
Int.even_sub
theorem
: Even (m - n) ↔ (Even m ↔ Even n)
@[parity_simps]
lemma even_sub : EvenEven (m - n) ↔ (Even m ↔ Even n) := by simp [sub_eq_add_neg, parity_simps]
Int.even_add_one
theorem
: Even (n + 1) ↔ ¬Even n
@[parity_simps] lemma even_add_one : EvenEven (n + 1) ↔ ¬Even n := by simp [even_add]
Int.even_sub_one
theorem
: Even (n - 1) ↔ ¬Even n
@[parity_simps] lemma even_sub_one : EvenEven (n - 1) ↔ ¬Even n := by simp [even_sub]
Int.even_mul
theorem
: Even (m * n) ↔ Even m ∨ Even n
@[parity_simps] lemma even_mul : EvenEven (m * n) ↔ Even m ∨ Even n := by
rcases emod_two_eq_zero_or_one m with h₁ | h₁ <;>
rcases emod_two_eq_zero_or_one n with h₂ | h₂ <;>
simp [even_iff, h₁, h₂, Int.mul_emod]
Int.even_pow
theorem
{n : ℕ} : Even (m ^ n) ↔ Even m ∧ n ≠ 0
Int.even_pow'
theorem
{n : ℕ} (h : n ≠ 0) : Even (m ^ n) ↔ Even m
lemma even_pow' {n : ℕ} (h : n ≠ 0) : EvenEven (m ^ n) ↔ Even m := even_pow.trans <| and_iff_left h
Int.even_coe_nat
theorem
(n : ℕ) : Even (n : ℤ) ↔ Even n
@[simp, norm_cast] lemma even_coe_nat (n : ℕ) : EvenEven (n : ℤ) ↔ Even n := by
rw_mod_cast [even_iff, Nat.even_iff]
Int.two_mul_ediv_two_of_even
theorem
: Even n → 2 * (n / 2) = n
lemma two_mul_ediv_two_of_even : Even n → 2 * (n / 2) = n :=
fun h ↦ Int.mul_ediv_cancel' ((even_iff_exists_two_nsmul _).mp h)
Int.ediv_two_mul_two_of_even
theorem
: Even n → n / 2 * 2 = n
lemma ediv_two_mul_two_of_even : Even n → n / 2 * 2 = n :=
fun h ↦ Int.ediv_mul_cancel ((even_iff_exists_two_nsmul _).mp h)