Module docstring
{"# Units in the integers ","#### Units "}
{"# Units in the integers ","#### Units "}
Int.units_natAbs
theorem
(u : ℤˣ) : natAbs u = 1
lemma units_natAbs (u : ℤℤˣ) : natAbs u = 1 :=
Units.ext_iff.1 <|
Nat.units_eq_one
⟨natAbs u, natAbs ↑u⁻¹, by rw [← natAbs_mul, Units.mul_inv]; rfl, by
rw [← natAbs_mul, Units.inv_mul]; rfl⟩
Int.natAbs_of_isUnit
theorem
(hu : IsUnit u) : natAbs u = 1
@[simp] lemma natAbs_of_isUnit (hu : IsUnit u) : natAbs u = 1 := units_natAbs hu.unit
Int.isUnit_eq_one_or
theorem
(hu : IsUnit u) : u = 1 ∨ u = -1
lemma isUnit_eq_one_or (hu : IsUnit u) : u = 1 ∨ u = -1 := by
simpa only [natAbs_of_isUnit hu] using natAbs_eq u
Int.isUnit_ne_iff_eq_neg
theorem
(hu : IsUnit u) (hv : IsUnit v) : u ≠ v ↔ u = -v
lemma isUnit_ne_iff_eq_neg (hu : IsUnit u) (hv : IsUnit v) : u ≠ vu ≠ v ↔ u = -v := by
obtain rfl | rfl := isUnit_eq_one_or hu <;> obtain rfl | rfl := isUnit_eq_one_or hv <;> decide
Int.isUnit_eq_or_eq_neg
theorem
(hu : IsUnit u) (hv : IsUnit v) : u = v ∨ u = -v
lemma isUnit_eq_or_eq_neg (hu : IsUnit u) (hv : IsUnit v) : u = v ∨ u = -v :=
or_iff_not_imp_left.2 (isUnit_ne_iff_eq_neg hu hv).1
Int.isUnit_iff
theorem
: IsUnit u ↔ u = 1 ∨ u = -1
lemma isUnit_iff : IsUnitIsUnit u ↔ u = 1 ∨ u = -1 := by
refine ⟨fun h ↦ isUnit_eq_one_or h, fun h ↦ ?_⟩
rcases h with (rfl | rfl)
· exact isUnit_one
· exact ⟨⟨-1, -1, by decide, by decide⟩, rfl⟩
Int.mul_eq_one_iff_eq_one_or_neg_one
theorem
: u * v = 1 ↔ u = 1 ∧ v = 1 ∨ u = -1 ∧ v = -1
lemma mul_eq_one_iff_eq_one_or_neg_one : u * v = 1 ↔ u = 1 ∧ v = 1 ∨ u = -1 ∧ v = -1 := by
refine ⟨eq_one_or_neg_one_of_mul_eq_one', fun h ↦ Or.elim h (fun H ↦ ?_) fun H ↦ ?_⟩ <;>
obtain ⟨rfl, rfl⟩ := H <;> rfl
Int.mul_eq_neg_one_iff_eq_one_or_neg_one
theorem
: u * v = -1 ↔ u = 1 ∧ v = -1 ∨ u = -1 ∧ v = 1
lemma mul_eq_neg_one_iff_eq_one_or_neg_one : u * v = -1 ↔ u = 1 ∧ v = -1 ∨ u = -1 ∧ v = 1 := by
refine ⟨eq_one_or_neg_one_of_mul_eq_neg_one', fun h ↦ Or.elim h (fun H ↦ ?_) fun H ↦ ?_⟩ <;>
obtain ⟨rfl, rfl⟩ := H <;> rfl
Int.isUnit_iff_natAbs_eq
theorem
: IsUnit u ↔ u.natAbs = 1
lemma isUnit_iff_natAbs_eq : IsUnitIsUnit u ↔ u.natAbs = 1 := by simp [natAbs_eq_iff, isUnit_iff]
Int.ofNat_isUnit
theorem
{n : ℕ} : IsUnit (n : ℤ) ↔ IsUnit n
@[norm_cast]
lemma ofNat_isUnit {n : ℕ} : IsUnitIsUnit (n : ℤ) ↔ IsUnit n := by simp [isUnit_iff_natAbs_eq]
Int.isUnit_mul_self
theorem
(hu : IsUnit u) : u * u = 1
lemma isUnit_mul_self (hu : IsUnit u) : u * u = 1 :=
(isUnit_eq_one_or hu).elim (fun h ↦ h.symm ▸ rfl) fun h ↦ h.symm ▸ rfl
Int.isUnit_add_isUnit_eq_isUnit_add_isUnit
theorem
{a b c d : ℤ} (ha : IsUnit a) (hb : IsUnit b) (hc : IsUnit c) (hd : IsUnit d) :
a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c
lemma isUnit_add_isUnit_eq_isUnit_add_isUnit {a b c d : ℤ} (ha : IsUnit a) (hb : IsUnit b)
(hc : IsUnit c) (hd : IsUnit d) : a + b = c + d ↔ a = c ∧ b = d ∨ a = d ∧ b = c := by
rw [isUnit_iff] at ha hb hc hd
aesop