# mathlibdocumentation

ring_theory.witt_vector.truncated

# 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 #

• truncated_witt_vector: the underlying type of the ring of truncated Witt vectors
• truncated_witt_vector.comm_ring: the ring structure on truncated Witt vectors
• witt_vector.truncate: the quotient homomorphism that truncates a Witt vector, to obtain a truncated Witt vector
• truncated_witt_vector.truncate: the homomorphism that truncates a truncated Witt vector of length n to one of length m (for some m ≤ n)
• witt_vector.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 #

@[nolint]
def truncated_witt_vector (p n : ) (R : Type u_1) :
Type u_1

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.

truncated_witt_vector 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 truncated_witt_vector p n R. (truncated_witt_vector p₁ n R and truncated_witt_vector p₂ n R are definitionally equal as types but will have different ring operations.)

Equations
Instances for truncated_witt_vector
@[protected, instance]
def truncated_witt_vector.inhabited (p n : ) (R : Type u_1) [inhabited R] :
Equations
def truncated_witt_vector.mk (p : ) {n : } {R : Type u_1} (x : fin n → R) :

Create a truncated_witt_vector from a vector x.

Equations
def truncated_witt_vector.coeff {p n : } {R : Type u_1} (i : fin n) (x : R) :
R

x.coeff i is the ith entry of x.

Equations
• = x i
@[ext]
theorem truncated_witt_vector.ext {p n : } {R : Type u_1} {x y : R} (h : ∀ (i : fin n), ) :
x = y
theorem truncated_witt_vector.ext_iff {p n : } {R : Type u_1} {x y : R} :
x = y ∀ (i : fin n),
@[simp]
theorem truncated_witt_vector.coeff_mk {p n : } {R : Type u_1} (x : fin n → R) (i : fin n) :
@[simp]
theorem truncated_witt_vector.mk_coeff {p n : } {R : Type u_1} (x : R) :
(λ (i : fin n), = x
def truncated_witt_vector.out {p n : } {R : Type u_1} [comm_ring R] (x : R) :
R

We can turn a truncated Witt vector x into a Witt vector by setting all coefficients after x to be 0.

Equations
@[simp]
theorem truncated_witt_vector.coeff_out {p n : } {R : Type u_1} [comm_ring R] (x : R) (i : fin n) :
theorem truncated_witt_vector.out_injective {p n : } {R : Type u_1} [comm_ring R] :
def witt_vector.truncate_fun {p : } (n : ) {R : Type u_1} (x : R) :

truncate_fun n x uses the first n entries of x to construct a truncated_witt_vector, which has the same base p as x. This function is bundled into a ring homomorphism in witt_vector.truncate

Equations
@[simp]
theorem witt_vector.coeff_truncate_fun {p n : } {R : Type u_1} (x : R) (i : fin n) :
@[simp]
theorem witt_vector.out_truncate_fun {p n : } {R : Type u_1} [comm_ring R] (x : R) :
.out =
@[simp]
theorem truncated_witt_vector.truncate_fun_out {p n : } {R : Type u_1} [comm_ring R] (x : R) :
@[protected, instance]
noncomputable def truncated_witt_vector.has_zero (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_one (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_nat_cast (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_int_cast (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_add (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_mul (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_neg (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_sub (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_nat_scalar (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
R)
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_int_scalar (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
R)
Equations
@[protected, instance]
noncomputable def truncated_witt_vector.has_nat_pow (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
@[simp]
theorem truncated_witt_vector.coeff_zero (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] (i : fin n) :

A macro tactic used to prove that truncate_fun respects ring operations.

theorem witt_vector.truncate_fun_surjective (p n : ) (R : Type u_1) [comm_ring R] :
@[simp]
theorem witt_vector.truncate_fun_zero (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
@[simp]
theorem witt_vector.truncate_fun_one (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
@[simp]
theorem witt_vector.truncate_fun_add {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x y : R) :
(x + y) =
@[simp]
theorem witt_vector.truncate_fun_mul {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x y : R) :
(x * y) =
theorem witt_vector.truncate_fun_neg {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x : R) :
theorem witt_vector.truncate_fun_sub {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x y : R) :
(x - y) =
theorem witt_vector.truncate_fun_nsmul {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x : R) (m : ) :
(m x) =
theorem witt_vector.truncate_fun_zsmul {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x : R) (m : ) :
(m x) =
theorem witt_vector.truncate_fun_pow {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x : R) (m : ) :
(x ^ m) =
theorem witt_vector.truncate_fun_nat_cast {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (m : ) :
theorem witt_vector.truncate_fun_int_cast {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (m : ) :
@[protected, instance]
noncomputable def truncated_witt_vector.comm_ring (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
Equations
• = _ _ _ _ _ _ _ _
def witt_vector.truncate {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] :
R →+*

truncate n is a ring homomorphism that truncates x to its first n entries to obtain a truncated_witt_vector, which has the same base p as x.

Equations
theorem witt_vector.truncate_surjective (p : ) [hp : fact (nat.prime p)] (n : ) (R : Type u_1) [comm_ring R] :
@[simp]
theorem witt_vector.coeff_truncate {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] (x : R) (i : fin n) :
= x.coeff i
theorem witt_vector.mem_ker_truncate {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (x : R) :
∀ (i : ), i < nx.coeff i = 0
@[simp]
theorem witt_vector.truncate_mk (p : ) [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] (f : → R) :
{coeff := f} = (λ (k : fin n), f k)
noncomputable def truncated_witt_vector.truncate {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] {m : } (hm : n m) :

A ring homomorphism that truncates a truncated Witt vector of length m to a truncated Witt vector of length n, for n ≤ m.

Equations
@[simp]
theorem truncated_witt_vector.truncate_comp_witt_vector_truncate {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] {m : } (hm : n m) :
@[simp]
theorem truncated_witt_vector.truncate_witt_vector_truncate {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] {m : } (hm : n m) (x : R) :
x) =
@[simp]
theorem truncated_witt_vector.truncate_truncate {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {n₁ n₂ n₃ : } (h1 : n₁ n₂) (h2 : n₂ n₃) (x : R) :
@[simp]
theorem truncated_witt_vector.truncate_comp {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {n₁ n₂ n₃ : } (h1 : n₁ n₂) (h2 : n₂ n₃) :
theorem truncated_witt_vector.truncate_surjective {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] {m : } (hm : n m) :
@[simp]
theorem truncated_witt_vector.coeff_truncate {p : } [hp : fact (nat.prime p)] {n : } {R : Type u_1} [comm_ring R] {m : } (hm : n m) (i : fin n) (x : R) :
@[protected, instance]
def truncated_witt_vector.fintype {p n : } {R : Type u_1} [fintype R] :
Equations
theorem truncated_witt_vector.card (p n : ) {R : Type u_1} [fintype R] :
=
theorem truncated_witt_vector.infi_ker_truncate {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] :
(⨅ (i : ), =
noncomputable def witt_vector.lift_fun {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] (f : Π (k : ), S →+* ) (s : S) :
R

Given a family fₖ : S → truncated_witt_vector p k R and s : S, we produce a Witt vector by defining the kth entry to be the final entry of fₖ s.

Equations
@[simp]
theorem witt_vector.truncate_lift_fun {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] {f : Π (k : ), S →+* } (f_compat : ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁) (s : S) :
= (f n) s
noncomputable def witt_vector.lift {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] (f : Π (k : ), S →+* ) (f_compat : ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁) :
S →+* R

Given compatible ring homs from S into truncated_witt_vector 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 truncated_witt_vector n.

Equations
@[simp]
theorem witt_vector.truncate_lift {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] {f : Π (k : ), S →+* } (f_compat : ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁) (s : S) :
((witt_vector.lift (λ (k₂ : ), f k₂) f_compat) s) = (f n) s
@[simp]
theorem witt_vector.truncate_comp_lift {p : } [hp : fact (nat.prime p)] (n : ) {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] {f : Π (k : ), S →+* } (f_compat : ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁) :
(witt_vector.lift (λ (k₂ : ), f k₂) f_compat) = f n
theorem witt_vector.lift_unique {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] {f : Π (k : ), S →+* } (f_compat : ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁) (g : S →+* R) (g_compat : ∀ (k : ), g = f k) :
witt_vector.lift (λ (k₂ : ), f k₂) f_compat = g

The uniqueness part of the universal property of 𝕎 R.

noncomputable def witt_vector.lift_equiv {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] :
{f // ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁} (S →+* R)

The universal property of 𝕎 R as projective limit of truncated Witt vector rings.

Equations
@[simp]
theorem witt_vector.lift_equiv_symm_apply_coe {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] (g : S →+* R) (k : ) :
@[simp]
theorem witt_vector.lift_equiv_apply {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] (f : {f // ∀ (k₁ k₂ : ) (hk : k₁ k₂), (f k₂) = f k₁}) :
theorem witt_vector.hom_ext {p : } [hp : fact (nat.prime p)] {R : Type u_1} [comm_ring R] {S : Type u_2} [semiring S] (g₁ g₂ : S →+* R) (h : ∀ (k : ), g₁ = g₂) :
g₁ = g₂