mathlib documentation


Witt polynomials

To endow witt_vector p R with a ring structure, we need to study the so-called Witt polynomials.

Fix a base value p : ℕ. The p-adic Witt polynomials are an infinite family of polynomials indexed by a natural number n, taking values in an arbitrary ring R. The variables of these polynomials are represented by natural numbers. The variable set of the nth Witt polynomial contains at most n+1 elements {0, ..., n}, with exactly these variables when R has characteristic 0.

These polynomials are used to define the addition and multiplication operators on the type of Witt vectors. (While this type itself is not complicated, the ring operations are what make it interesting.)

When the base p is invertible in R, the p-adic Witt polynomials form a basis for mv_polynomial ℕ R, equivalent to the standard basis.

Main declarations


In this file we use the following notation

def witt_polynomial (p : ) (R : Type u_1) [comm_ring R] (n : ) :

witt_polynomial p R n is the n-th Witt polynomial with respect to a prime p with coefficients in a commutative ring R. It is defined as:

∑_{i ≤ n} p^i X_i^{p^{n-i}} ∈ R[X_0, X_1, X_2, …].

theorem witt_polynomial_eq_sum_C_mul_X_pow (p : ) (R : Type u_1) [comm_ring R] (n : ) :
witt_polynomial p R n = ∑ (i : ) in finset.range (n + 1), (mv_polynomial.C (p ^ i)) * mv_polynomial.X i ^ p ^ (n - i)

We set up notation locally to this file, to keep statements short and comprehensible. This allows us to simply write W n or W_ ℤ n.

theorem map_witt_polynomial (p : ) {R : Type u_1} [comm_ring R] {S : Type u_2} [comm_ring S] (f : R →+* S) (n : ) :

theorem constant_coeff_witt_polynomial (p : ) (R : Type u_1) [comm_ring R] [hp : fact ( p)] (n : ) :

theorem witt_polynomial_zero (p : ) (R : Type u_1) [comm_ring R] :


theorem aeval_witt_polynomial (p : ) (R : Type u_1) [comm_ring R] {A : Type u_2} [comm_ring A] [algebra R A] (f : → A) (n : ) :
(mv_polynomial.aeval f) (witt_polynomial p R n) = ∑ (i : ) in finset.range (n + 1), (p ^ i) * f i ^ p ^ (n - i)

theorem witt_polynomial_zmod_self (p n : ) :
witt_polynomial p (zmod (p ^ (n + 1))) (n + 1) = (mv_polynomial.expand p) (witt_polynomial p (zmod (p ^ (n + 1))) n)

Over the ring zmod (p^(n+1)), we produce the n+1st Witt polynomial by expanding the nth witt polynomial by p.

theorem witt_polynomial_vars (p : ) (R : Type u_1) [comm_ring R] [hp : fact ( p)] [char_zero R] (n : ) :

theorem witt_polynomial_vars_subset (p : ) (R : Type u_1) [comm_ring R] [hp : fact ( p)] (n : ) :

Witt polynomials as a basis of the polynomial algebra

If p is invertible in R, then the Witt polynomials form a basis of the polynomial algebra mv_polynomial ℕ R. The polynomials X_in_terms_of_W give the coordinate transformation in the backwards direction.

def X_in_terms_of_W (p : ) (R : Type u_1) [comm_ring R] [invertible p] :

The X_in_terms_of_W p R n is the polynomial on the basis of Witt polynomials that corresponds to the ordinary X n.

theorem X_in_terms_of_W_eq (p : ) (R : Type u_1) [comm_ring R] [invertible p] {n : } :


theorem X_in_terms_of_W_zero (p : ) (R : Type u_1) [comm_ring R] [invertible p] :

theorem X_in_terms_of_W_aux (p : ) (R : Type u_1) [comm_ring R] [invertible p] (n : ) :