Truncated Witt vectors #
The ring of truncated Witt vectors (of length n
) is a quotient of the ring of Witt vectors.
It retains the first n
coefficients of each Witt vector.
In this file, we set up the basic quotient API for this ring.
The ring of Witt vectors is the projective limit of all the rings of truncated Witt vectors.
Main declarations #
TruncatedWittVector
: the underlying type of the ring of truncated Witt vectorsTruncatedWittVector.instCommRing
: the ring structure on truncated Witt vectorsWittVector.truncate
: the quotient homomorphism that truncates a Witt vector, to obtain a truncated Witt vectorTruncatedWittVector.truncate
: the homomorphism that truncates a truncated Witt vector of lengthn
to one of lengthm
(for somem ≤ n
)WittVector.lift
: the unique ring homomorphism into the ring of Witt vectors that is compatible with a family of ring homomorphisms to the truncated Witt vectors: this realizes the ring of Witt vectors as projective limit of the rings of truncated Witt vectors
References #
[Hazewinkel, Witt Vectors][Haze09]
[Commelin and Lewis, Formalizing the Ring of Witt Vectors][CL21]
A truncated Witt vector over R
is a vector of elements of R
,
i.e., the first n
coefficients of a Witt vector.
We will define operations on this type that are compatible with the (untruncated) Witt
vector operations.
TruncatedWittVector p n R
takes a parameter p : ℕ
that is not used in the definition.
In practice, this number p
is assumed to be a prime number,
and under this assumption we construct a ring structure on TruncatedWittVector p n R
.
(TruncatedWittVector p₁ n R
and TruncatedWittVector p₂ n R
are definitionally
equal as types but will have different ring operations.)
Equations
- TruncatedWittVector x n R = (Fin n → R)
Instances For
Equations
- instInhabitedTruncatedWittVector p n R = { default := fun (x : Fin n) => default }
Create a TruncatedWittVector
from a vector x
.
Equations
- TruncatedWittVector.mk p x = x
Instances For
x.coeff i
is the i
th entry of x
.
Equations
- TruncatedWittVector.coeff i x = x i
Instances For
We can turn a truncated Witt vector x
into a Witt vector
by setting all coefficients after x
to be 0.
Equations
- x.out = { coeff := fun (i : ℕ) => if h : i < n then TruncatedWittVector.coeff ⟨i, h⟩ x else 0 }
Instances For
truncateFun n x
uses the first n
entries of x
to construct a TruncatedWittVector
,
which has the same base p
as x
.
This function is bundled into a ring homomorphism in WittVector.truncate
Equations
- WittVector.truncateFun n x = TruncatedWittVector.mk p fun (i : Fin n) => x.coeff ↑i
Instances For
Equations
- TruncatedWittVector.instZero p n R = { zero := WittVector.truncateFun n 0 }
Equations
- TruncatedWittVector.instOne p n R = { one := WittVector.truncateFun n 1 }
Equations
- TruncatedWittVector.instNatCast p n R = { natCast := fun (i : ℕ) => WittVector.truncateFun n ↑i }
Equations
- TruncatedWittVector.instIntCast p n R = { intCast := fun (i : ℤ) => WittVector.truncateFun n ↑i }
Equations
- TruncatedWittVector.instAdd p n R = { add := fun (x y : TruncatedWittVector p n R) => WittVector.truncateFun n (x.out + y.out) }
Equations
- TruncatedWittVector.instMul p n R = { mul := fun (x y : TruncatedWittVector p n R) => WittVector.truncateFun n (x.out * y.out) }
Equations
- TruncatedWittVector.instNeg p n R = { neg := fun (x : TruncatedWittVector p n R) => WittVector.truncateFun n (-x.out) }
Equations
- TruncatedWittVector.instSub p n R = { sub := fun (x y : TruncatedWittVector p n R) => WittVector.truncateFun n (x.out - y.out) }
Equations
- TruncatedWittVector.hasNatScalar p n R = { smul := fun (m : ℕ) (x : TruncatedWittVector p n R) => WittVector.truncateFun n (m • x.out) }
Equations
- TruncatedWittVector.hasIntScalar p n R = { smul := fun (m : ℤ) (x : TruncatedWittVector p n R) => WittVector.truncateFun n (m • x.out) }
Equations
- TruncatedWittVector.hasNatPow p n R = { pow := fun (x : TruncatedWittVector p n R) (m : ℕ) => WittVector.truncateFun n (x.out ^ m) }
A macro tactic used to prove that truncateFun
respects ring operations.
Equations
- witt_truncateFun_tac = Lean.ParserDescr.node `witt_truncateFun_tac 1024 (Lean.ParserDescr.nonReservedSymbol "witt_truncateFun_tac" false)
Instances For
Alias of WittVector.truncateFun_natCast
.
Alias of WittVector.truncateFun_intCast
.
Equations
- TruncatedWittVector.instCommRing p n R = Function.Surjective.commRing (WittVector.truncateFun n) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯
truncate n
is a ring homomorphism that truncates x
to its first n
entries
to obtain a TruncatedWittVector
, which has the same base p
as x
.
Equations
- WittVector.truncate n = { toFun := WittVector.truncateFun n, map_one' := ⋯, map_mul' := ⋯, map_zero' := ⋯, map_add' := ⋯ }
Instances For
A ring homomorphism that truncates a truncated Witt vector of length m
to
a truncated Witt vector of length n
, for n ≤ m
.
Equations
- TruncatedWittVector.truncate hm = ((WittVector.truncate m).liftOfRightInverse TruncatedWittVector.out ⋯) ⟨WittVector.truncate n, ⋯⟩
Instances For
Equations
- TruncatedWittVector.instFintype = Pi.fintype
Given a family fₖ : S → TruncatedWittVector p k R
and s : S
, we produce a Witt vector by
defining the k
th entry to be the final entry of fₖ s
.
Equations
- WittVector.liftFun f s = { coeff := fun (k : ℕ) => TruncatedWittVector.coeff (Fin.last k) ((f (k + 1)) s) }
Instances For
Given compatible ring homs from S
into TruncatedWittVector n
for each n
, we can lift these
to a ring hom S → 𝕎 R
.
lift
defines the universal property of 𝕎 R
as the inverse limit of TruncatedWittVector n
.
Equations
- WittVector.lift f f_compat = { toFun := WittVector.liftFun f, map_one' := ⋯, map_mul' := ⋯, map_zero' := ⋯, map_add' := ⋯ }
Instances For
The uniqueness part of the universal property of 𝕎 R
.
The universal property of 𝕎 R
as projective limit of truncated Witt vector rings.
Equations
- One or more equations did not get rendered due to their size.