module Cubical.Algebra.CommAlgebra.Polynomials where
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function using (_$_; _∘_)
open import Cubical.Foundations.Structure using (withOpaqueStr)
open import Cubical.Foundations.Isomorphism using (isoFunInjective)
open import Cubical.Data.Nat
open import Cubical.Data.FinData
open import Cubical.Algebra.CommRing.Base
open import Cubical.Algebra.CommAlgebra.Base
open import Cubical.Algebra.CommRing.Polynomials.Typevariate as Poly hiding (var)
import Cubical.Algebra.CommRing.Polynomials.Typevariate.UniversalProperty
as Poly
private
variable
ℓ ℓ' ℓ'' : Level
_[_]ₐ : (R : CommRing ℓ) (I : Type ℓ') → CommAlgebra R (ℓ-max ℓ ℓ')
R [ I ]ₐ = (R [ I ]) , constPolynomial R I
module _ {R : CommRing ℓ} where
evPolyIn : {n : ℕ} (A : CommAlgebra R ℓ')
→ ⟨ R [ Fin n ]ₐ ⟩ₐ → FinVec ⟨ A ⟩ₐ n → ⟨ A ⟩ₐ
evPolyIn {n = n} A P v = Poly.inducedHom (CommAlgebra→CommRing A) (A .snd) v $cr P
module _ {R : CommRing ℓ} {I : Type ℓ'} where
var : I → ⟨ R [ I ]ₐ ⟩ₐ
var = Poly.var
inducedHom : (A : CommAlgebra R ℓ'') (φ : I → ⟨ A ⟩ₐ )
→ CommAlgebraHom (R [ I ]ₐ) A
inducedHom A ϕ =
CommAlgebraHomFromCommRingHom
f
(λ _ _ → refl)
where f : CommRingHom _ _
f = Poly.inducedHom (CommAlgebra→CommRing A) (A .snd) ϕ
inducedHomUnique :
(A : CommAlgebra R ℓ'') (φ : I → ⟨ A ⟩ₐ )
→ (f : CommAlgebraHom (R [ I ]ₐ) A) → (⟨ f ⟩ₐ→ ∘ var ≡ φ)
→ inducedHom A φ ≡ f
inducedHomUnique A φ f p =
CommAlgebraHom≡ $
cong fst $
Poly.inducedHomUnique _ _ φ (CommAlgebraHom→CommRingHom f) (cong fst (CommAlgebraHom→Triangle f)) p
{-
evaluateAt : {R : CommRing ℓ} {I : Type ℓ'} (A : CommAlgebra R ℓ'')
(f : CommAlgebraHom (R [ I ]) A)
→ (I → fst A)
evaluateAt A f x = f $a (Construction.var x)
homMapIso : {R : CommRing ℓ} {I : Type ℓ''} (A : CommAlgebra R ℓ')
→ Iso (CommAlgebraHom (R [ I ]) A) (I → (fst A))
Iso.fun (homMapIso A) = evaluateAt A
Iso.inv (homMapIso A) = inducedHom A
Iso.rightInv (homMapIso A) = λ ϕ → Theory.mapRetrievable A ϕ
Iso.leftInv (homMapIso {R = R} {I = I} A) =
λ f → Σ≡Prop (λ f → isPropIsCommAlgebraHom {M = R [ I ]} {N = A} f)
(Theory.homRetrievable A f)
inducedHomUnique :
{R : CommRing ℓ} {I : Type ℓ'} (A : CommAlgebra R ℓ'') (φ : I → fst A )
→ (f : CommAlgebraHom (R [ I ]) A) → ((i : I) → fst f (Construction.var i) ≡ φ i)
→ f ≡ inducedHom A φ
inducedHomUnique {I = I} A φ f p =
isoFunInjective (homMapIso A) f (inducedHom A φ) λ j i → p i j
homMapPath : {R : CommRing ℓ} {I : Type ℓ'} (A : CommAlgebra R (ℓ-max ℓ ℓ'))
→ CommAlgebraHom (R [ I ]) A ≡ (I → fst A)
homMapPath A = isoToPath (homMapIso A)
{- Corollary: Two homomorphisms with the same values on generators are equal -}
equalByUMP : {R : CommRing ℓ} {I : Type ℓ'}
→ (A : CommAlgebra R ℓ'')
→ (f g : CommAlgebraHom (R [ I ]) A)
→ ((i : I) → fst f (Construction.var i) ≡ fst g (Construction.var i))
→ (x : ⟨ R [ I ] ⟩) → fst f x ≡ fst g x
equalByUMP {R = R} {I = I} A f g = funExt⁻ ∘ cong fst ∘ isoFunInjective (homMapIso A) f g ∘ funExt
{- A corollary, which is useful for constructing isomorphisms to
algebras with the same universal property -}
isIdByUMP : {R : CommRing ℓ} {I : Type ℓ'}
→ (f : CommAlgebraHom (R [ I ]) (R [ I ]))
→ ((i : I) → fst f (Construction.var i) ≡ Construction.var i)
→ (x : ⟨ R [ I ] ⟩) → fst f x ≡ x
isIdByUMP {R = R} {I = I} f p = equalByUMP (R [ I ]) f (idCAlgHom (R [ I ])) p
-- The homomorphism induced by the variables is the identity.
inducedHomVar : (R : CommRing ℓ) (I : Type ℓ')
→ inducedHom (R [ I ]) Construction.var ≡ idCAlgHom (R [ I ])
inducedHomVar R I = isoFunInjective (homMapIso (R [ I ])) _ _ refl
module _ {R : CommRing ℓ} {A B : CommAlgebra R ℓ''} where
open AlgebraHoms
A′ = CommAlgebra→Algebra A
B′ = CommAlgebra→Algebra B
R′ = (CommRing→Ring R)
ν : AlgebraHom A′ B′ → (⟨ A ⟩ → ⟨ B ⟩)
ν φ = φ .fst
{-
Hom(R[I],A) → (I → A)
↓ ↓ψ
Hom(R[I],B) → (I → B)
-}
naturalEvR : {I : Type ℓ'} (ψ : CommAlgebraHom A B)
(f : CommAlgebraHom (R [ I ]) A)
→ (fst ψ) ∘ evaluateAt A f ≡ evaluateAt B (ψ ∘a f)
naturalEvR ψ f = refl
{-
Hom(R[I],A) ← (I → A)
↓ ↓ψ
Hom(R[I],B) ← (I → B)
-}
natIndHomR : {I : Type ℓ'} (ψ : CommAlgebraHom A B)
(ϕ : I → ⟨ A ⟩)
→ ψ ∘a inducedHom A ϕ ≡ inducedHom B (fst ψ ∘ ϕ)
natIndHomR ψ ϕ = isoFunInjective (homMapIso B) _ _
(evaluateAt B (ψ ∘a (inducedHom A ϕ)) ≡⟨ refl ⟩
fst ψ ∘ evaluateAt A (inducedHom A ϕ) ≡⟨ refl ⟩
fst ψ ∘ ϕ ≡⟨ Iso.rightInv (homMapIso B) _ ⟩
evaluateAt B (inducedHom B (fst ψ ∘ ϕ)) ∎)
{-
Hom(R[I],A) → (I → A)
↓ ↓
Hom(R[J],A) → (J → A)
-}
naturalEvL : {I J : Type ℓ'} (φ : J → I)
(f : CommAlgebraHom (R [ I ]) A)
→ (evaluateAt A f) ∘ φ
≡ evaluateAt A (f ∘a (inducedHom (R [ I ]) (λ x → Construction.var (φ x))))
naturalEvL φ f = refl
module _ {R : CommRing ℓ} where
{-
Prove that the FreeCommAlgebra over R on zero generators is
isomorphic to the initial R-Algebra - R itsself.
-}
freeOn⊥ : CommAlgebraEquiv (R [ ⊥ ]) (initialCAlg R)
freeOn⊥ =
equivByInitiality
R (R [ ⊥ ])
{- Show that R[⊥] has the universal property of the
initial R-Algbera and conclude that those are isomorphic -}
λ B → let to : CommAlgebraHom (R [ ⊥ ]) B → (⊥ → fst B)
to = evaluateAt B
from : (⊥ → fst B) → CommAlgebraHom (R [ ⊥ ]) B
from = inducedHom B
from-to : (x : _) → from (to x) ≡ x
from-to x =
Σ≡Prop (λ f → isPropIsCommAlgebraHom {M = R [ ⊥ ]} {N = B} f)
(Theory.homRetrievable B x)
equiv : CommAlgebraHom (R [ ⊥ ]) B ≃ (⊥ → fst B)
equiv =
isoToEquiv
(iso to from (λ x → isContr→isOfHLevel 1 isContr⊥→A _ _) from-to)
in isOfHLevelRespectEquiv 0 (invEquiv equiv) isContr⊥→A
-}