{-# OPTIONS --safe --lossy-unification #-} module Cubical.Algebra.CommRing.Quotient.Base where open import Cubical.Foundations.Prelude open import Cubical.Foundations.Structure open import Cubical.Foundations.Powerset open import Cubical.Functions.Surjection open import Cubical.Data.Nat open import Cubical.Data.FinData open import Cubical.HITs.SetQuotients using ([_]; squash/; elimProp2) open import Cubical.HITs.PropositionalTruncation as PT open import Cubical.Algebra.CommRing open import Cubical.Algebra.CommRing.Ideal open import Cubical.Algebra.CommRing.FGIdeal open import Cubical.Algebra.CommRing.Kernel open import Cubical.Algebra.Ring import Cubical.Algebra.Ring.Quotient as Ring private variable ℓ ℓ' : Level _/_ : (R : CommRing ℓ) → (I : IdealsIn R) → CommRing ℓ R / I = fst asRing , commringstr _ _ _ _ _ (iscommring (RingStr.isRing (snd asRing)) (elimProp2 (λ _ _ → squash/ _ _) commEq)) where asRing = (CommRing→Ring R) Ring./ (CommIdeal→Ideal I) _·/_ : fst asRing → fst asRing → fst asRing _·/_ = RingStr._·_ (snd asRing) commEq : (x y : fst R) → ([ x ] ·/ [ y ]) ≡ ([ y ] ·/ [ x ]) commEq x y i = [ CommRingStr.·Comm (snd R) x y i ] [_]/ : {R : CommRing ℓ} {I : IdealsIn R} → (a : fst R) → fst (R / I) [ a ]/ = [ a ] module Quotient-FGideal-CommRing-Ring (A : CommRing ℓ) (B : Ring ℓ') (g : RingHom (CommRing→Ring A) B) {n : ℕ} (v : FinVec ⟨ A ⟩ n) (gnull : (k : Fin n) → g $r v k ≡ RingStr.0r (snd B)) where open RingStr (snd B) using (0r; is-set) zeroOnGeneratedIdeal : (x : ⟨ A ⟩) → x ∈ fst (generatedIdeal A v) → g $r x ≡ 0r zeroOnGeneratedIdeal x x∈FGIdeal = PT.elim (λ _ → is-set (g $r x) 0r) (λ {(α , isLC) → subst _ (sym isLC) (cancelLinearCombination A B g _ α v gnull)}) x∈FGIdeal inducedHom : RingHom (CommRing→Ring (A / (generatedIdeal _ v))) B inducedHom = Ring.UniversalProperty.inducedHom (CommRing→Ring A) (CommIdeal→Ideal ideal) g zeroOnGeneratedIdeal where ideal = generatedIdeal A v module Quotient-FGideal-CommRing-CommRing (A : CommRing ℓ) (B : CommRing ℓ') (g : CommRingHom A B) {n : ℕ} (v : FinVec ⟨ A ⟩ n) (gnull : (k : Fin n) → g $r v k ≡ CommRingStr.0r (snd B)) where inducedHom : CommRingHom (A / (generatedIdeal _ v)) B inducedHom = Quotient-FGideal-CommRing-Ring.inducedHom A (CommRing→Ring B) g v gnull module UniversalProperty (R S : CommRing ℓ) (I : IdealsIn R) (f : CommRingHom R S) (I⊆ker : (x : ⟨ R ⟩) → x ∈ fst I → fst f x ≡ CommRingStr.0r (snd S)) where inducedHom : CommRingHom (R / I) S inducedHom = Ring.UniversalProperty.inducedHom (CommRing→Ring R) (CommIdeal→Ideal I) f I⊆ker quotientHom : (R : CommRing ℓ) → (I : IdealsIn R) → CommRingHom R (R / I) quotientHom R I = Ring.quotientHom (CommRing→Ring R) (CommIdeal→Ideal I) quotientHomSurjective : (R : CommRing ℓ) → (I : IdealsIn R) → isSurjection (fst (quotientHom R I)) quotientHomSurjective R I = Ring.quotientHomSurjective (CommRing→Ring R) (CommIdeal→Ideal I) module _ {R : CommRing ℓ} (I : IdealsIn R) where open CommRingStr ⦃...⦄ private π = quotientHom R I instance _ = snd R _ = snd (R / I) kernel≡I : kernelIdeal R (R / I) π ≡ I kernel≡I = cong Ideal→CommIdeal (Ring.kernel≡I (CommIdeal→Ideal I)) zeroOnIdeal : (x : ⟨ R ⟩) → x ∈ fst I → fst π x ≡ 0r zeroOnIdeal x x∈I = subst (λ P → fst ((fst P) x)) (sym kernel≡I) x∈I