Module docstring
{"# Lemmas about regular elements in rings. "}
{"# Lemmas about regular elements in rings. "}
isLeftRegular_of_non_zero_divisor
theorem
[NonUnitalNonAssocRing α] (k : α) (h : ∀ x : α, k * x = 0 → x = 0) : IsLeftRegular k
/-- Left `Mul` by a `k : α` over `[Ring α]` is injective, if `k` is not a zero divisor.
The typeclass that restricts all terms of `α` to have this property is `NoZeroDivisors`. -/
theorem isLeftRegular_of_non_zero_divisor [NonUnitalNonAssocRing α] (k : α)
(h : ∀ x : α, k * x = 0 → x = 0) : IsLeftRegular k := by
refine fun x y (h' : k * x = k * y) => sub_eq_zero.mp (h _ ?_)
rw [mul_sub, sub_eq_zero, h']
isRightRegular_of_non_zero_divisor
theorem
[NonUnitalNonAssocRing α] (k : α) (h : ∀ x : α, x * k = 0 → x = 0) : IsRightRegular k
/-- Right `Mul` by a `k : α` over `[Ring α]` is injective, if `k` is not a zero divisor.
The typeclass that restricts all terms of `α` to have this property is `NoZeroDivisors`. -/
theorem isRightRegular_of_non_zero_divisor [NonUnitalNonAssocRing α] (k : α)
(h : ∀ x : α, x * k = 0 → x = 0) : IsRightRegular k := by
refine fun x y (h' : x * k = y * k) => sub_eq_zero.mp (h _ ?_)
rw [sub_mul, sub_eq_zero, h']
isRegular_of_ne_zero'
theorem
[NonUnitalNonAssocRing α] [NoZeroDivisors α] {k : α} (hk : k ≠ 0) : IsRegular k
theorem isRegular_of_ne_zero' [NonUnitalNonAssocRing α] [NoZeroDivisors α] {k : α} (hk : k ≠ 0) :
IsRegular k :=
⟨isLeftRegular_of_non_zero_divisor k fun _ h =>
(NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero h).resolve_left hk,
isRightRegular_of_non_zero_divisor k fun _ h =>
(NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero h).resolve_right hk⟩
isRegular_iff_ne_zero'
theorem
[Nontrivial α] [NonUnitalNonAssocRing α] [NoZeroDivisors α] {k : α} : IsRegular k ↔ k ≠ 0
theorem isRegular_iff_ne_zero' [Nontrivial α] [NonUnitalNonAssocRing α] [NoZeroDivisors α]
{k : α} : IsRegularIsRegular k ↔ k ≠ 0 :=
⟨fun h => by
rintro rfl
exact not_not.mpr h.left not_isLeftRegular_zero, isRegular_of_ne_zero'⟩
NoZeroDivisors.toCancelMonoidWithZero
abbrev
[Ring α] [NoZeroDivisors α] : CancelMonoidWithZero α
/-- A ring with no zero divisors is a `CancelMonoidWithZero`.
Note this is not an instance as it forms a typeclass loop. -/
abbrev NoZeroDivisors.toCancelMonoidWithZero [Ring α] [NoZeroDivisors α] : CancelMonoidWithZero α :=
{ (by infer_instance : MonoidWithZero α) with
mul_left_cancel_of_ne_zero := fun ha =>
@IsRegular.left _ _ _ (isRegular_of_ne_zero' ha) _ _,
mul_right_cancel_of_ne_zero := fun hb =>
@IsRegular.right _ _ _ (isRegular_of_ne_zero' hb) _ _ }
NoZeroDivisors.toCancelCommMonoidWithZero
abbrev
[CommRing α] [NoZeroDivisors α] : CancelCommMonoidWithZero α
/-- A commutative ring with no zero divisors is a `CancelCommMonoidWithZero`.
Note this is not an instance as it forms a typeclass loop. -/
abbrev NoZeroDivisors.toCancelCommMonoidWithZero [CommRing α] [NoZeroDivisors α] :
CancelCommMonoidWithZero α :=
{ NoZeroDivisors.toCancelMonoidWithZero, ‹CommRing α› with }
IsDomain.toCancelMonoidWithZero
instance
[Semiring α] [IsDomain α] : CancelMonoidWithZero α
instance (priority := 100) IsDomain.toCancelMonoidWithZero [Semiring α] [IsDomain α] :
CancelMonoidWithZero α :=
{ }
IsDomain.toCancelCommMonoidWithZero
instance
: CancelCommMonoidWithZero α
instance (priority := 100) IsDomain.toCancelCommMonoidWithZero : CancelCommMonoidWithZero α :=
{ mul_left_cancel_of_ne_zero := IsLeftCancelMulZero.mul_left_cancel_of_ne_zero }