Galois symbol
DefinitionMilnorConjecture_GaloisSymbolLet be a field with , a separable closure and with its Krull topology. Write for continuous cohomology with trivial coefficients .
For fix a square root . The Kummer character is
a continuous homomorphism representing the Kummer class (the boundary of the Kummer sequence). For , the Galois symbol is the class of the homogeneous cocycle
the homogeneous form of , i.e. the cup product . For it is the class of the constant .
These are exactly the values of the norm residue homomorphism on symbols.
Formalization Note H F n, kummerChar a and galoisSymbol a are sorry-free; continuity, additivity, invariance and the cocycle identity are proved in the file. The class does not depend on the choice of , since does not.
import Mathlib
import Definitions.Def_MilnorConjecture_HomogeneousCochains
/-!
# The Galois symbol `(F^×)ⁿ → Hⁿ(F, ℤ/2)`
For a field `F` with `2 ≠ 0` in `F`, write `F^sep` for its separable closure and
`G_F = Gal(F^sep/F)` for the absolute Galois group with its Krull topology. For `a ∈ F^×` fix a
square root `√a ∈ F^sep` and let `χ_a : G_F → ℤ/2` be the Kummer character,
`χ_a(σ) = 0` if `σ(√a) = √a` and `χ_a(σ) = 1` otherwise.
The Galois symbol of `(a₁, …, aₙ)` is the class in `Hⁿ_cts(G_F, ℤ/2)` of the homogeneous
cocycle `(x₀, …, xₙ) ↦ ∏ⱼ (χ_{aⱼ}(xⱼ) - χ_{aⱼ}(xⱼ₋₁))`, which is the homogeneous form of the
inhomogeneous cocycle `(σ₁, …, σₙ) ↦ χ_{a₁}(σ₁) ⋯ χ_{aₙ}(σₙ)`, i.e. of the cup product
`δa₁ ∪ ⋯ ∪ δaₙ` of Kummer classes.
-/
namespace MilnorConjecture
section Cochain
variable {G R : Type*} [CommRing R]
/-- Function-level homogeneous coboundary `(δf)(y) = ∑ᵢ (-1)ⁱ f(y ∘ ∂ᵢ)`. -/
def fcob {m : ℕ} (f : (Fin m → G) → R) (y : Fin (m + 1) → G) : R :=
∑ i : Fin (m + 1), (-1 : R) ^ (i : ℕ) * f (y ∘ i.succAbove)
/-- `(x₀, …, xₙ) ↦ ∏ⱼ (χⱼ(xⱼ) - χⱼ(xⱼ₋₁))` for functions `χ₁, …, χₙ : G → R`. -/
def prodCochain {n : ℕ} (χ : Fin n → G → R) (x : Fin (n + 1) → G) : R :=
∏ j : Fin n, (χ j (x j.succ) - χ j (x j.castSucc))
lemma prodCochain_succ {n : ℕ} (χ : Fin (n + 1) → G → R) (x : Fin (n + 2) → G) :
prodCochain χ x = (χ 0 (x 1) - χ 0 (x 0)) * prodCochain (Fin.tail χ) (Fin.tail x) := by
rw [prodCochain, Fin.prod_univ_succ]
rfl
/-- Leibniz rule for multiplying by the coboundary of a `0`-cochain:
`δ(δχ · Ψ) = -(δχ · δΨ)`. -/
lemma fcob_mul_tail {m : ℕ} (χ : G → R) (Ψ : (Fin (m + 1) → G) → R) (y : Fin (m + 3) → G) :
fcob (fun x : Fin (m + 2) → G ↦ (χ (x 1) - χ (x 0)) * Ψ (Fin.tail x)) y =
-((χ (y 1) - χ (y 0)) * fcob Ψ (Fin.tail y)) := by
simp only [fcob]
rw [Fin.sum_univ_succ, Fin.sum_univ_succ, Fin.sum_univ_succ (n := m + 1), mul_add, neg_add,
← add_assoc]
congr 1
· have h1 : (Fin.succ 0 : Fin (m + 3)).succAbove 1 = 2 := by
rw [show (1 : Fin (m + 2)) = Fin.succ 0 from rfl, Fin.succ_succAbove_succ]; rfl
have h2 : Fin.tail (y ∘ (Fin.succ 0 : Fin (m + 3)).succAbove) = fun i ↦ y i.succ.succ := by
funext i
simp only [Fin.tail, Function.comp_apply, Fin.succ_succAbove_succ, Fin.succAbove_zero]
simp only [Function.comp_apply, h1, h2, Fin.succ_succAbove_zero, Fin.succAbove_zero]
have e3 : Fin.tail (y ∘ Fin.succ) = fun i ↦ y i.succ.succ := rfl
have e4 : Fin.tail y ∘ Fin.succ = fun i ↦ y i.succ.succ := rfl
rw [Fin.succ_one_eq_two, Fin.succ_zero_eq_one, e3, e4]
simp only [Fin.val_one, Fin.val_zero, pow_one, pow_zero, one_mul]
ring
· rw [Finset.mul_sum, ← Finset.sum_neg_distrib]
refine Finset.sum_congr rfl fun j _ ↦ ?_
have h0 : (y ∘ j.succ.succ.succAbove) 0 = y 0 := by simp
have h1 : (y ∘ j.succ.succ.succAbove) 1 = y 1 := by
rw [Function.comp_apply, ← Fin.succ_zero_eq_one, Fin.succ_succAbove_succ,
Fin.succ_succAbove_zero, Fin.succ_zero_eq_one]
have h2 : Fin.tail (y ∘ j.succ.succ.succAbove) = Fin.tail y ∘ j.succ.succAbove := by
funext i
simp only [Fin.tail, Function.comp_apply, Fin.succ_succAbove_succ]
rw [h0, h1, h2]
simp only [Fin.val_succ]
ring
lemma fcob_prodCochain {n : ℕ} (χ : Fin n → G → R) (y : Fin (n + 2) → G) :
fcob (prodCochain χ) y = 0 := by
induction n with
| zero => simp [fcob, prodCochain, Fin.sum_univ_two]
| succ n ih =>
have : prodCochain χ =
fun x ↦ (χ 0 (x 1) - χ 0 (x 0)) * prodCochain (Fin.tail χ) (Fin.tail x) :=
funext (prodCochain_succ χ)
rw [this, fcob_mul_tail, ih, mul_zero, neg_zero]
end Cochain
variable (F : Type) [Field F]
/-- The absolute Galois group `Gal(F^sep/F)`, with its Krull topology. -/
abbrev AbsGal : Type := Gal(SeparableClosure F/F)
/-- `Hⁿ(F, ℤ/2) := Hⁿ_cts(Gal(F^sep/F), ℤ/2)`, with `ℤ/2` a trivial representation. -/
abbrev H (n : ℕ) : Type := continuousCohomology n (trivialRep (ZMod 2) (AbsGal F) (ZMod 2))
variable [NeZero (2 : F)] {F}
instance : NeZero ((2 : ℕ) : SeparableClosure F) :=
⟨by
rw [Nat.cast_ofNat, ← map_ofNat (algebraMap F (SeparableClosure F)) 2]
exact (map_ne_zero _).mpr (NeZero.ne (2 : F))⟩
/-- A chosen square root of `a` in `F^sep`. -/
noncomputable def sqrtSep (a : Fˣ) : SeparableClosure F :=
(IsSepClosed.exists_pow_nat_eq (algebraMap F (SeparableClosure F) a) 2).choose
lemma sqrtSep_sq (a : Fˣ) : sqrtSep a ^ 2 = algebraMap F (SeparableClosure F) a :=
(IsSepClosed.exists_pow_nat_eq (algebraMap F (SeparableClosure F) a) 2).choose_spec
/-- The Kummer character `χ_a : Gal(F^sep/F) → ℤ/2`: `χ_a(σ) = 0` iff `σ(√a) = √a`. -/
noncomputable def kummerCharFun (a : Fˣ) (σ : AbsGal F) : ZMod 2 :=
by classical exact if σ (sqrtSep a) = sqrtSep a then 0 else 1
lemma sqrtSep_ne_zero (a : Fˣ) : sqrtSep a ≠ 0 := by
intro h
have := sqrtSep_sq a
rw [h, zero_pow two_ne_zero, eq_comm, map_eq_zero] at this
exact a.ne_zero this
lemma neg_sqrtSep_ne (a : Fˣ) : -sqrtSep a ≠ sqrtSep a := by
intro h
have h2 : (2 : SeparableClosure F) * sqrtSep a = 0 := by rw [two_mul]; nth_rw 1 [← h]; ring
rcases mul_eq_zero.mp h2 with h2 | h2
· exact NeZero.ne ((2 : ℕ) : SeparableClosure F) (by exact_mod_cast h2)
· exact sqrtSep_ne_zero a h2
lemma apply_sqrtSep (a : Fˣ) (σ : AbsGal F) :
σ (sqrtSep a) = sqrtSep a ∨ σ (sqrtSep a) = -sqrtSep a := by
apply sq_eq_sq_iff_eq_or_eq_neg.mp
rw [← map_pow, sqrtSep_sq, AlgEquiv.commutes]
lemma kummerCharFun_mul (a : Fˣ) (σ τ : AbsGal F) :
kummerCharFun a (σ * τ) = kummerCharFun a σ + kummerCharFun a τ := by
have hne := neg_sqrtSep_ne a
rcases apply_sqrtSep a τ with hτ | hτ <;> rcases apply_sqrtSep a σ with hσ | hσ <;>
simp [kummerCharFun, AlgEquiv.mul_apply, hτ, hσ, map_neg, hne]
decide
lemma continuous_kummerCharFun (a : Fˣ) : Continuous (kummerCharFun a) := by
let S := MulAction.stabilizer (AbsGal F) (sqrtSep a)
have hS : ∀ σ : AbsGal F, σ ∈ S ↔ σ (sqrtSep a) = sqrtSep a := fun σ ↦ Iff.rfl
let E := IntermediateField.adjoin F {sqrtSep a}
have : FiniteDimensional F E :=
IntermediateField.adjoin.finiteDimensional (Algebra.IsIntegral.isIntegral (sqrtSep a))
have hle : E.fixingSubgroup ≤ S := fun σ hσ ↦
(hS σ).mpr ((IntermediateField.mem_fixingSubgroup_iff E σ).mp hσ _
(IntermediateField.mem_adjoin_simple_self F _))
have hopen : IsOpen (S : Set (AbsGal F)) := Subgroup.isOpen_mono hle E.fixingSubgroup_isOpen
have hclosed : IsClosed (S : Set (AbsGal F)) := Subgroup.isClosed_of_isOpen S hopen
apply IsLocallyConstant.continuous
rw [IsLocallyConstant.iff_isOpen_fiber_apply]
intro σ
by_cases hσ : σ (sqrtSep a) = sqrtSep a
· convert hopen using 1
ext τ
by_cases hτ : τ (sqrtSep a) = sqrtSep a <;> simp [kummerCharFun, hS, hσ, hτ]
· convert hclosed.isOpen_compl using 1
ext τ
by_cases hτ : τ (sqrtSep a) = sqrtSep a <;> simp [kummerCharFun, hS, hσ, hτ]
/-- The Kummer character as a continuous map. -/
noncomputable def kummerChar (a : Fˣ) : C(AbsGal F, ZMod 2) :=
⟨kummerCharFun a, continuous_kummerCharFun a⟩
/-- The homogeneous cocycle `(x₀, …, xₙ) ↦ ∏ⱼ (χ_{aⱼ}(xⱼ) - χ_{aⱼ}(xⱼ₋₁))`. -/
noncomputable def symbolCochain {n : ℕ} (a : Fin n → Fˣ) : C(Fin (n + 1) → AbsGal F, ZMod 2) :=
⟨prodCochain (fun j ↦ kummerChar (a j)), by
unfold prodCochain; fun_prop⟩
lemma symbolCochain_invariant {n : ℕ} (a : Fin n → Fˣ) (g : AbsGal F)
(v : Fin (n + 1) → AbsGal F) : symbolCochain a (fun i ↦ g * v i) = symbolCochain a v := by
simp only [symbolCochain, ContinuousMap.coe_mk, prodCochain, kummerChar, kummerCharFun_mul]
congr 1; funext j; ring
lemma coboundary_symbolCochain {n : ℕ} (a : Fin n → Fˣ) :
coboundary (n + 1) (symbolCochain a) = 0 := by
ext y
rw [coboundary_apply, ContinuousMap.zero_apply]
have := fcob_prodCochain (fun j ↦ kummerChar (a j)) y
simpa [fcob, symbolCochain, zsmul_eq_mul] using this
/-- The Galois symbol `(a₁, …, aₙ) ↦ δa₁ ∪ ⋯ ∪ δaₙ ∈ Hⁿ(F, ℤ/2)`. -/
noncomputable def galoisSymbol {n : ℕ} (a : Fin n → Fˣ) : H F n :=
classOf (ZMod 2) n (symbolCochain a) (symbolCochain_invariant a) (coboundary_symbolCochain a)
end MilnorConjecture
Read-back
What the Lean code literally says, in plain math · claude-opus-5-5
Read-back: Def_MilnorConjecture_GaloisSymbol
Everything lives in the namespace MilnorConjecture. The file imports Mathlib and the bundle file Def_MilnorConjecture_HomogeneousCochains, whose relevant definitions are unfolded below where used.
Imported bundle definitions (unfolded)
In the imported file, are types in one common universe with: a ring with a topology; a group with a topology making it a topological group, and locally compact; an additive commutative group, a -module, with a topology making it a topological additive group, with continuous scalar multiplication . For classOf one additionally assumes is a topological ring.
trivialRep k G Mis the topological -linear representation of on in which every acts as the identity.coboundary n F: for a continuous , it is the continuous function
where the hat means the -th coordinate is deleted (the acts as an integer multiple).
curryN n F: for continuous , it is the iterated currying , an element of the -th term of Mathlib's resolution, where and (continuous maps). For it is the value of at the empty tuple.- Mathlib's cochain complex. On the group acts by ; the differentials of the resolution are the constant function , and . Mathlib's continuous cohomology (
continuousCohomology n A) is the degree- cohomology of the complex of -invariants of (degree sitting on ), as a topological -module. classOf k n F hinv hcoc: given continuous with for all (hypothesishinv) and as a function on (hypothesishcoc), it is the cohomology class in of the invariant cocycle . (Formally: the cycle obtained by lifting the map , , evaluated at , then projected to homology.)
Section Cochain
Variables in scope for this section: arbitrary types and (no structure at all on ), with a commutative ring.
fcob. For , a function and ,
(a plain, non-continuous version of the alternating face sum; y ∘ i.succAbove is with coordinate removed).
prodCochain. For , a family of functions , and ,
Here the factor for index uses the coordinate (x j.succ) minus the coordinate (x j.castSucc). For the product is empty, so is the constant function on .
Lemma prodCochain_succ. For and :
Lemma fcob_mul_tail. For , , , : letting for ,
Lemma fcob_prodCochain. For every , every and every : .
Field-level declarations
After the section, is a type (in the lowest universe) that is a field. Initially is an explicit parameter.
AbsGal F is the group of -algebra automorphisms of SeparableClosure F (Mathlib's chosen separable closure of ), with group law composition () and Mathlib's Krull topology. Denote it .
H F n (for ) is the topological -module
Mathlib's continuous cohomology (as above) with coefficient ring (ZMod 2, with the discrete topology) and module (discrete) with trivial -action. No hypothesis on the characteristic is used in AbsGal or H.
From here on the variable line adds the hypothesis in (NeZero (2 : F), i.e. ), and becomes an implicit argument. This hypothesis is in scope for every remaining declaration.
Instance. Under in : the natural number cast into is nonzero (proved via injectivity of ). This instance is available to all later declarations.
sqrtSep a. For a unit , is some element with (image of in ), selected by the axiom of choice from the existence statement that, in a separably closed field where , every element has a square root. Nothing specifies which of the two roots is chosen; the choice is fixed per but otherwise arbitrary and not related across different (e.g. no relation between and is asserted).
Lemma sqrtSep_sq. in .
kummerCharFun a. For and ,
So value means fixes the chosen root, value means it does not.
Lemma sqrtSep_ne_zero. for every .
Lemma neg_sqrtSep_ne. .
Lemma apply_sqrtSep. For all , : or .
Lemma kummerCharFun_mul. For all , : in .
Lemma continuous_kummerCharFun. is continuous (Krull topology on , discrete topology on ).
kummerChar a is packaged as a continuous map .
symbolCochain a. For and a tuple of units of , this is the continuous map (product topology on ),
i.e. prodCochain with , , . (In subtraction equals addition.) For , is the constant function on .
Lemma symbolCochain_invariant. For all , , : .
Lemma coboundary_symbolCochain. , i.e. for every ,
galoisSymbol a. For and (with ), the output is an element of
namely classOf applied to (with , ) using the two lemmas above: the cohomology class of the -invariant homogeneous cocycle , i.e. . For (empty tuple) it is the class in of the constant function . The definition goes through the square roots selected by sqrtSep; the file proves no lemma about galoisSymbol itself (for example, nothing about how it depends on that choice, or about multiplicativity).
Confirmed by the mission captain (proposal self-audit).
Confirmed by the moderator at approval.