{-# OPTIONS --safe #-}
module Cubical.Algebra.Ring.DirectProd where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.HLevels
open import Cubical.Data.Sigma
open import Cubical.Algebra.Ring.Base
private
variable
ℓ ℓ' ℓ'' ℓ''' : Level
module _
(A'@(A , Ar) : Ring ℓ)
(B'@(B , Br) : Ring ℓ')
where
open RingStr Ar using ()
renaming
( 0r to 0A
; 1r to 1A
; _+_ to _+A_
; -_ to -A_
; _·_ to _·A_
; +Assoc to +AAssoc
; +IdR to +AIdR
; +IdL to +AIdL
; +InvR to +AInvR
; +InvL to +AInvL
; +Comm to +AComm
; ·Assoc to ·AAssoc
; ·IdL to ·AIdL
; ·IdR to ·AIdR
; ·DistR+ to ·ADistR+
; ·DistL+ to ·ADistL+
; is-set to isSetA )
open RingStr Br using ()
renaming
( 0r to 0B
; 1r to 1B
; _+_ to _+B_
; -_ to -B_
; _·_ to _·B_
; +Assoc to +BAssoc
; +IdR to +BIdR
; +IdL to +BIdL
; +InvR to +BInvR
; +InvL to +BInvL
; +Comm to +BComm
; ·Assoc to ·BAssoc
; ·IdL to ·BIdL
; ·IdR to ·BIdR
; ·DistR+ to ·BDistR+
; ·DistL+ to ·BDistL+
; is-set to isSetB )
DirectProd-Ring : Ring (ℓ-max ℓ ℓ')
fst DirectProd-Ring = A × B
RingStr.0r (snd DirectProd-Ring) = 0A , 0B
RingStr.1r (snd DirectProd-Ring) = 1A , 1B
(snd DirectProd-Ring RingStr.+ (a , b)) (a' , b') = (a +A a') , (b +B b')
(snd DirectProd-Ring RingStr.· (a , b)) (a' , b') = (a ·A a') , (b ·B b')
(RingStr.- snd DirectProd-Ring) (a , b) = (-A a) , (-B b)
RingStr.isRing (snd DirectProd-Ring) =
makeIsRing (isSet× isSetA isSetB)
(λ x y z i → +AAssoc (fst x) (fst y) (fst z) i , +BAssoc (snd x) (snd y) (snd z) i)
(λ x i → (+AIdR (fst x) i) , (+BIdR (snd x) i))
(λ x i → (+AInvR (fst x) i) , +BInvR (snd x) i)
(λ x y i → (+AComm (fst x) (fst y) i) , (+BComm (snd x) (snd y) i))
(λ x y z i → (·AAssoc (fst x) (fst y) (fst z) i) , (·BAssoc (snd x) (snd y) (snd z) i))
(λ x i → (·AIdR (fst x) i) , (·BIdR (snd x) i))
(λ x i → (·AIdL (fst x) i) , (·BIdL (snd x) i))
(λ x y z i → (·ADistR+ (fst x) (fst y) (fst z) i) , (·BDistR+ (snd x) (snd y) (snd z) i))
(λ x y z i → (·ADistL+ (fst x) (fst y) (fst z) i) , (·BDistL+ (snd x) (snd y) (snd z) i))
module Coproduct-Equiv
{Xr@(X , Xstr) : Ring ℓ}
{Yr@(Y , Ystr) : Ring ℓ'}
{X'r@(X' , X'str) : Ring ℓ''}
{Y'r@(Y' , Y'str) : Ring ℓ'''}
where
open Iso
open IsRingHom
open RingStr
_+X×X'_ : X × X' → X × X' → X × X'
_+X×X'_ = _+_ (snd (DirectProd-Ring Xr X'r))
_+Y×Y'_ : Y × Y' → Y × Y' → Y × Y'
_+Y×Y'_ = _+_ (snd (DirectProd-Ring Yr Y'r))
_·X×X'_ : X × X' → X × X' → X × X'
_·X×X'_ = _·_ (snd (DirectProd-Ring Xr X'r))
_·Y×Y'_ : Y × Y' → Y × Y' → Y × Y'
_·Y×Y'_ = _·_ (snd (DirectProd-Ring Yr Y'r))
re×re' : (re : RingEquiv Xr Yr) → (re' : RingEquiv X'r Y'r) → (X × X') ≃ (Y × Y')
re×re' re re' = ≃-× (fst re) (fst re')
Coproduct-Equiv-12 : (re : RingEquiv Xr Yr) → (re' : RingEquiv X'r Y'r) →
RingEquiv (DirectProd-Ring Xr X'r) (DirectProd-Ring Yr Y'r)
fst (Coproduct-Equiv-12 re re') = re×re' re re'
snd (Coproduct-Equiv-12 re re') = makeIsRingHom fun-pres1 fun-pres+ fun-pres·
where
fun-pres1 : (fst (re×re' re re')) (1r Xstr , 1r X'str) ≡ (1r (Yr .snd) , 1r (Y'r .snd))
fun-pres1 = ≡-× (pres1 (snd re)) (pres1 (snd re'))
fun-pres+ : (x1 x2 : X × X') → (fst (re×re' re re')) (x1 +X×X' x2) ≡ (( (fst (re×re' re re')) x1) +Y×Y' ( (fst (re×re' re re')) x2))
fun-pres+ (x1 , x'1) (x2 , x'2) = ≡-× (pres+ (snd re) x1 x2) (pres+ (snd re') x'1 x'2)
fun-pres· : (x1 x2 : X × X') → (fst (re×re' re re')) (x1 ·X×X' x2) ≡ (( (fst (re×re' re re')) x1) ·Y×Y' ( (fst (re×re' re re')) x2))
fun-pres· (x1 , x'1) (x2 , x'2) = ≡-× (pres· (snd re) x1 x2) (pres· (snd re') x'1 x'2)