Module docstring
{"# IsSquare and Even for natural numbers
","#### Parity "}
{"# IsSquare and Even for natural numbers
","#### Parity "}
Nat.even_iff
theorem
: Even n ↔ n % 2 = 0
lemma even_iff : EvenEven n ↔ n % 2 = 0 where
mp := fun ⟨m, hm⟩ ↦ by simp [← Nat.two_mul, hm]
mpr h := ⟨n / 2, (mod_add_div n 2).symm.trans (by simp [← Nat.two_mul, h])⟩
Nat.instDecidablePredEven
instance
: DecidablePred (Even : ℕ → Prop)
instance : DecidablePred (Even : ℕ → Prop) := fun _ ↦ decidable_of_iff _ even_iff.symm
Nat.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' (Nat.sqrt m * Nat.sqrt m = m) <| by
simp_rw [← Nat.exists_mul_self m, IsSquare, eq_comm]
Nat.not_even_iff
theorem
: ¬Even n ↔ n % 2 = 1
lemma not_even_iff : ¬ Even n¬ Even n ↔ n % 2 = 1 := by rw [even_iff, mod_two_not_eq_zero]
Nat.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
Nat.not_even_one
theorem
: ¬Even 1
@[simp] lemma not_even_one : ¬Even 1 := by simp [even_iff]
Nat.even_add
theorem
: Even (m + n) ↔ (Even m ↔ Even n)
@[parity_simps] lemma even_add : EvenEven (m + n) ↔ (Even m ↔ Even n) := by
rcases mod_two_eq_zero_or_one m with h₁ | h₁ <;> rcases mod_two_eq_zero_or_one n with h₂ | h₂ <;>
simp [even_iff, h₁, h₂, Nat.add_mod]
Nat.even_add_one
theorem
: Even (n + 1) ↔ ¬Even n
@[parity_simps] lemma even_add_one : EvenEven (n + 1) ↔ ¬Even n := by simp [even_add]
Nat.succ_mod_two_eq_zero_iff
theorem
: (m + 1) % 2 = 0 ↔ m % 2 = 1
lemma succ_mod_two_eq_zero_iff : (m + 1) % 2 = 0 ↔ m % 2 = 1 := by
simp [← Nat.even_iff, ← Nat.not_even_iff, parity_simps]
Nat.succ_mod_two_eq_one_iff
theorem
: (m + 1) % 2 = 1 ↔ m % 2 = 0
lemma succ_mod_two_eq_one_iff : (m + 1) % 2 = 1 ↔ m % 2 = 0 := by
simp [← Nat.even_iff, ← Nat.not_even_iff, parity_simps]
Nat.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_mod]
Nat.two_not_dvd_two_mul_sub_one
theorem
: ∀ {n}, 0 < n → ¬2 ∣ 2 * n - 1
lemma two_not_dvd_two_mul_sub_one : ∀ {n}, 0 < n → ¬2 ∣ 2 * n - 1
| n + 1, _ => two_not_dvd_two_mul_add_one n
Nat.even_sub
theorem
(h : n ≤ m) : Even (m - n) ↔ (Even m ↔ Even n)
@[parity_simps] lemma even_sub (h : n ≤ m) : EvenEven (m - n) ↔ (Even m ↔ Even n) := by
conv_rhs => rw [← Nat.sub_add_cancel h, even_add]
by_cases h : Even n <;> simp [h]
Nat.even_mul
theorem
: Even (m * n) ↔ Even m ∨ Even n
@[parity_simps] lemma even_mul : EvenEven (m * n) ↔ Even m ∨ Even n := by
rcases mod_two_eq_zero_or_one m with h₁ | h₁ <;> rcases mod_two_eq_zero_or_one n with h₂ | h₂ <;>
simp [even_iff, h₁, h₂, Nat.mul_mod]
Nat.even_pow
theorem
: Even (m ^ n) ↔ Even m ∧ n ≠ 0
/-- If `m` and `n` are natural numbers, then the natural number `m^n` is even
if and only if `m` is even and `n` is positive. -/
@[parity_simps] lemma even_pow : EvenEven (m ^ n) ↔ Even m ∧ n ≠ 0 := by
induction n <;> simp +contextual [*, pow_succ', even_mul]
Nat.even_pow'
theorem
(h : n ≠ 0) : Even (m ^ n) ↔ Even m
lemma even_pow' (h : n ≠ 0) : EvenEven (m ^ n) ↔ Even m := even_pow.trans <| and_iff_left h
Nat.even_mul_succ_self
theorem
(n : ℕ) : Even (n * (n + 1))
lemma even_mul_succ_self (n : ℕ) : Even (n * (n + 1)) := by rw [even_mul, even_add_one]; exact em _
Nat.even_mul_pred_self
theorem
: ∀ n : ℕ, Even (n * (n - 1))
lemma even_mul_pred_self : ∀ n : ℕ, Even (n * (n - 1))
| 0 => .zero
| (n + 1) => mul_comm (n + 1 - 1) (n + 1) ▸ even_mul_succ_self n
Nat.two_mul_div_two_of_even
theorem
: Even n → 2 * (n / 2) = n
lemma two_mul_div_two_of_even : Even n → 2 * (n / 2) = n := fun h ↦
Nat.mul_div_cancel_left' ((even_iff_exists_two_nsmul _).1 h)
Nat.div_two_mul_two_of_even
theorem
: Even n → n / 2 * 2 = n
lemma div_two_mul_two_of_even : Even n → n / 2 * 2 = n :=
fun h ↦ Nat.div_mul_cancel ((even_iff_exists_two_nsmul _).1 h)
Nat.one_lt_of_ne_zero_of_even
theorem
(h0 : n ≠ 0) (hn : Even n) : 1 < n
theorem one_lt_of_ne_zero_of_even (h0 : n ≠ 0) (hn : Even n) : 1 < n := by
refine Nat.one_lt_iff_ne_zero_and_ne_one.mpr (And.intro h0 ?_)
intro h
rw [h] at hn
exact Nat.not_even_one hn
Nat.add_one_lt_of_even
theorem
(hn : Even n) (hm : Even m) (hnm : n < m) : n + 1 < m
theorem add_one_lt_of_even (hn : Even n) (hm : Even m) (hnm : n < m) :
n + 1 < m := by
rcases hn with ⟨n, rfl⟩
rcases hm with ⟨m, rfl⟩
omega