Witt vectors #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we define the type of p
-typical Witt vectors and ring operations on it.
The ring axioms are verified in ring_theory/witt_vector/basic.lean
.
For a fixed commutative ring R
and prime p
,
a Witt vector x : 𝕎 R
is an infinite sequence ℕ → R
of elements of R
.
However, the ring operations +
and *
are not defined in the obvious component-wise way.
Instead, these operations are defined via certain polynomials
using the machinery in structure_polynomial.lean
.
The n
th value of the sum of two Witt vectors can depend on the 0
-th through n
th values
of the summands. This effectively simulates a “carrying” operation.
Main definitions #
witt_vector p R
: the type ofp
-typical Witt vectors with coefficients inR
.witt_vector.coeff x n
: projects then
th value of the Witt vectorx
.
Notation #
We use notation 𝕎 R
, entered \bbW
, for the Witt vectors over R
.
References #
witt_vector p R
is the ring of p
-typical Witt vectors over the commutative ring R
,
where p
is a prime number.
If p
is invertible in R
, this ring is isomorphic to ℕ → R
(the product of ℕ
copies of R
).
If R
is a ring of characteristic p
, then witt_vector p R
is a ring of characteristic 0
.
The canonical example is witt_vector p (zmod p)
,
which is isomorphic to the p
-adic integers ℤ_[p]
.
Instances for witt_vector
- witt_vector.has_sizeof_inst
- witt_vector.functor
- witt_vector.is_lawful_functor
- witt_vector.has_zero
- witt_vector.inhabited
- witt_vector.has_one
- witt_vector.has_add
- witt_vector.has_sub
- witt_vector.has_nat_scalar
- witt_vector.has_int_scalar
- witt_vector.has_mul
- witt_vector.has_neg
- witt_vector.has_nat_pow
- witt_vector.has_nat_cast
- witt_vector.has_int_cast
- witt_vector.comm_ring
- witt_vector.nontrivial
- witt_vector.no_zero_divisors
- witt_vector.is_domain
The polynomials used for defining the element 0
of the ring of Witt vectors.
Equations
The polynomials used for defining the element 1
of the ring of Witt vectors.
Equations
The polynomials used for defining the addition of the ring of Witt vectors.
Equations
The polynomials used for defining repeated addition of the ring of Witt vectors.
Equations
- witt_vector.witt_nsmul p n = witt_structure_int p (n • mv_polynomial.X 0)
The polynomials used for defining repeated addition of the ring of Witt vectors.
Equations
- witt_vector.witt_zsmul p n = witt_structure_int p (n • mv_polynomial.X 0)
The polynomials used for describing the subtraction of the ring of Witt vectors.
Equations
The polynomials used for defining the multiplication of the ring of Witt vectors.
Equations
The polynomials used for defining the negation of the ring of Witt vectors.
Equations
The polynomials used for defining repeated addition of the ring of Witt vectors.
Equations
- witt_vector.witt_pow p n = witt_structure_int p (mv_polynomial.X 0 ^ n)
An auxiliary definition used in witt_vector.eval
.
Evaluates a polynomial whose variables come from the disjoint union of k
copies of ℕ
,
with a curried evaluation x
.
This can be defined more generally but we use only a specific instance here.
Equations
- witt_vector.peval φ x = ⇑(mv_polynomial.aeval (function.uncurry x)) φ
Let φ
be a family of polynomials, indexed by natural numbers, whose variables come from the
disjoint union of k
copies of ℕ
, and let xᵢ
be a Witt vector for 0 ≤ i < k
.
eval φ x
evaluates φ
mapping the variable X_(i, n)
to the n
th coefficient of xᵢ
.
Instantiating φ
with certain polynomials defined in structure_polynomial.lean
establishes the
ring operations on 𝕎 R
. For example, witt_vector.witt_add
is such a φ
with k = 2
;
evaluating this at (x₀, x₁)
gives us the sum of two Witt vectors x₀ + x₁
.
Equations
- witt_vector.eval φ x = {coeff := λ (n : ℕ), witt_vector.peval (φ n) (λ (i : fin k), (x i).coeff)}
Equations
Equations
- witt_vector.inhabited R = {default := 0}
Equations
Equations
- witt_vector.has_add R = {add := λ (x y : witt_vector p R), witt_vector.eval (witt_vector.witt_add p) ![x, y]}
Equations
- witt_vector.has_sub R = {sub := λ (x y : witt_vector p R), witt_vector.eval (witt_vector.witt_sub p) ![x, y]}
Equations
- witt_vector.has_nat_scalar R = {smul := λ (n : ℕ) (x : witt_vector p R), witt_vector.eval (witt_vector.witt_nsmul p n) ![x]}
Equations
- witt_vector.has_int_scalar R = {smul := λ (n : ℤ) (x : witt_vector p R), witt_vector.eval (witt_vector.witt_zsmul p n) ![x]}
Equations
- witt_vector.has_mul R = {mul := λ (x y : witt_vector p R), witt_vector.eval (witt_vector.witt_mul p) ![x, y]}
Equations
- witt_vector.has_neg R = {neg := λ (x : witt_vector p R), witt_vector.eval (witt_vector.witt_neg p) ![x]}
Equations
- witt_vector.has_nat_pow R = {pow := λ (x : witt_vector p R) (n : ℕ), witt_vector.eval (witt_vector.witt_pow p n) ![x]}