Witt vectors #
This file verifies that the ring operations on WittVector p R
satisfy the axioms of a commutative ring.
Main definitions #
WittVector.map: lifts a ring homomorphismR →+* Sto a ring homomorphism𝕎 R →+* 𝕎 S.WittVector.ghostComponent n x: evaluates thenth Witt polynomial on the firstncoefficients ofx, producing a value inR. This is a ring homomorphism.WittVector.ghostMap: a ring homomorphism𝕎 R →+* (ℕ → R), obtained by packaging all the ghost components together. Ifpis invertible inR, then the ghost map is an equivalence, which we use to define the ring operations on𝕎 R.WittVector.CommRing: the ring structure induced by the ghost components.
Notation #
We use notation 𝕎 R, entered \bbW, for the Witt vectors over R.
Implementation details #
As we prove that the ghost components respect the ring operations, we face a number of repetitive proofs. To avoid duplicating code we factor these proofs into a custom tactic, only slightly more powerful than a tactic macro. This tactic is not particularly useful outside of its applications in this file.
References #
[Hazewinkel, Witt Vectors][Haze09]
[Commelin and Lewis, Formalizing the Ring of Witt Vectors][CL21]
f : α → β induces a map from 𝕎 α to 𝕎 β by applying f componentwise.
If f is a ring homomorphism, then so is f, see WittVector.map f.
Equations
- WittVector.mapFun f x = WittVector.mk p (f ∘ x.coeff)
Instances For
Auxiliary tactic for showing that mapFun respects the ring operations.
Equations
- WittVector.mapFun.tacticMap_fun_tac = Lean.ParserDescr.node `WittVector.mapFun.tacticMap_fun_tac 1024 (Lean.ParserDescr.nonReservedSymbol "map_fun_tac" false)
Instances For
An auxiliary tactic for proving that ghostFun respects the ring operations.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The commutative ring structure on 𝕎 R.
Equations
- WittVector.instCommRing p R = Function.Surjective.commRing (WittVector.mapFun ⇑(MvPolynomial.counit R)) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
WittVector.map f is the ring homomorphism 𝕎 R →+* 𝕎 S naturally induced
by a ring homomorphism f : R →+* S. It acts coefficientwise.
Equations
- WittVector.map f = { toFun := WittVector.mapFun ⇑f, map_one' := ⋯, map_mul' := ⋯, map_zero' := ⋯, map_add' := ⋯ }
Instances For
WittVector.ghostMap is a ring homomorphism that maps each Witt vector
to the sequence of its ghost components.
Equations
- WittVector.ghostMap = { toFun := WittVector.ghostFun✝, map_one' := ⋯, map_mul' := ⋯, map_zero' := ⋯, map_add' := ⋯ }
Instances For
Evaluates the nth Witt polynomial on the first n coefficients of x,
producing a value in R.
Equations
- WittVector.ghostComponent n = (Pi.evalRingHom (fun (a : ℕ) => R) n).comp WittVector.ghostMap
Instances For
WittVector.ghostMap is a ring isomorphism when p is invertible in R.
Equations
- WittVector.ghostEquiv p R = { toFun := (↑↑WittVector.ghostMap).toFun, invFun := (WittVector.ghostEquiv'✝ p R).invFun, left_inv := ⋯, right_inv := ⋯, map_mul' := ⋯, map_add' := ⋯ }
Instances For
WittVector.coeff x 0 as a RingHom
Equations
- WittVector.constantCoeff = { toFun := fun (x : WittVector p R) => x.coeff 0, map_one' := ⋯, map_mul' := ⋯, map_zero' := ⋯, map_add' := ⋯ }