module Algebra.CommRing.Properties where open import Level open import Function open import Algebra open import Data.Product open import Data.Nat using (ℕ; zero; suc) open import Relation.Unary import Algebra.Ring.Properties as RP private variable ℓ ℓ' ℓ'' : Level module Units (R' : CommutativeRing ℓ ℓ') where open CommutativeRing R' renaming (Carrier to R) open import Relation.Binary.Reasoning.Setoid setoid open RP.Units ring using (0RightAnnihilates; 0LeftAnnihilates) public open import Algebra.Properties.Ring ring public semiRing : RawSemiring _ _ semiRing = record { Carrier = R ; _≈_ = _≈_ ; _+_ = _+_ ; _*_ = _*_ ; 0# = 0# ; 1# = 1# } open import Algebra.Definitions.RawSemiring semiRing Rˣ : Pred R _ Rˣ r = Σ[ r' ∈ R ] ((r * r') ≈ 1#) RˣContainsOne : 1# ∈ Rˣ RˣContainsOne = 1# , *-identity .proj₁ 1# *-rinv : (r : R) (r∈Rˣ : r ∈ Rˣ) → r * r∈Rˣ .proj₁ ≈ 1# *-rinv r r∈Rˣ = r∈Rˣ .proj₂ RˣMultClosed : (r r' : R) (r∈Rˣ : r ∈ Rˣ) (r'∈Rˣ : r' ∈ Rˣ) → (r * r') ∈ Rˣ RˣMultClosed r r' r∈Rˣ r'∈Rˣ = r⁻¹ * r'⁻¹ , path where r⁻¹ = r∈Rˣ .proj₁ r'⁻¹ = r'∈Rˣ .proj₁ path : r * r' * (r⁻¹ * r'⁻¹) ≈ 1# path = begin r * r' * (r⁻¹ * r'⁻¹) ≈⟨ *-congʳ (*-comm _ _) ⟩ r' * r * (r⁻¹ * r'⁻¹) ≈⟨ (sym $ *-assoc _ _ _) ⟩ r' * r * r⁻¹ * r'⁻¹ ≈⟨ *-congʳ (*-assoc _ _ _) ⟩ r' * (r * r⁻¹) * r'⁻¹ ≈⟨ *-congʳ (*-congˡ (*-rinv r r∈Rˣ)) ⟩ r' * 1# * r'⁻¹ ≈⟨ *-congʳ (*-identityʳ _) ⟩ r' * r'⁻¹ ≈⟨ *-rinv r' r'∈Rˣ ⟩ 1# ∎ ^-presUnit : ∀ (f : R) (n : ℕ) → f ∈ Rˣ → f ^ n ∈ Rˣ ^-presUnit f zero f∈Rˣ = RˣContainsOne ^-presUnit f (suc n) f∈Rˣ = RˣMultClosed f (f ^ n) f∈Rˣ (^-presUnit f n f∈Rˣ) UnitsAreNotZeroDivisors : (r : R) (r∈Rˣ : r ∈ Rˣ) → ∀ r' → r' * r ≈ 0# → r' ≈ 0# UnitsAreNotZeroDivisors r r∈Rˣ r' p = let r⁻¹ = r∈Rˣ .proj₁ in begin r' ≈˘⟨ *-identityʳ _ ⟩ r' * 1# ≈⟨ *-congˡ (sym (*-rinv _ r∈Rˣ)) ⟩ r' * (r * r⁻¹) ≈˘⟨ *-assoc _ _ _ ⟩ r' * r * r⁻¹ ≈⟨ *-congʳ p ⟩ 0# * r⁻¹ ≈⟨ 0LeftAnnihilates _ ⟩ 0# ∎