Documentation

LeanPool.HasseMinkowski.HilbertSymbol.Padic

The p-adic Hilbert symbol at an odd prime #

This file begins the computation of the Hilbert symbol (a,b)_p on ℚ_[p] for odd p, following Serre's explicit formula

(a,b)_p = (-1)^{αβ(p-1)/2} · (u/p)^β · (v/p)^α, where a = p^α u, b = p^β v, u,v ∈ ℤ_[p]ˣ, and (·/p) is the quadratic character modulo p.

The first ingredient is the "case 00" of the formula: two p-adic units have Hilbert symbol 1. Although upstream states this through the Legendre symbol (with both valuations zero the formula collapses), the underlying geometric content is just that the ternary form z² - u x² - v y² has a nontrivial zero: modulo p this form is isotropic (sum of two squares cover a finite field), and a nonsingular mod-p point Hensel-lifts.

We prove this here as hilbertSym_padicInt_units. The remaining cases 10 / 11 (one resp. two factors divisible by p) and the general multiplicativity mul_left_eq are recorded in HANDOFF-hilbertpadic.md as the outstanding work; only p = 2 is out of scope entirely.

General consequences of a nontrivial zero #

theorem HasseMinkowski.hilbertSym_eq_one_of_sol {k : Type u_1} [Field k] {a b : k} (ha : a ≠ 0) (hb : b ≠ 0) (h : ∃ (z : k) (x : k) (y : k), (z, x, y) ≠ (0, 0, 0) ∧ z ^ 2 - a * x ^ 2 - b * y ^ 2 = 0) :

A quadratic form z² - a x² - b y² with a nontrivial zero has Hilbert symbol 1 (provided a and b are nonzero).

theorem HasseMinkowski.hilbertSym_sq_left {k : Type u_1} [Field k] {a b : k} (ha : a ≠ 0) (hb : b ≠ 0) :
hilbertSym (a ^ 2) b = 1
theorem HasseMinkowski.hilbertSym_sq_right {k : Type u_1} [Field k] {a b : k} (ha : a ≠ 0) (hb : b ≠ 0) :
hilbertSym a (b ^ 2) = 1
theorem HasseMinkowski.hilbertSym_mul_square_eq {k : Type u_1} [Field k] {a a' b b' : k} (ha' : a' ≠ 0) (hb' : b' ≠ 0) :
hilbertSym (a * a' ^ 2) (b * b' ^ 2) = hilbertSym a b

Isotropy of u x² + v y² = 1 over 𝔽_p #

theorem HasseMinkowski.zmod_sq_add_sq_eq_one {p : ℕ} [Fact (Nat.Prime p)] {u v : ZMod p} (hu : u ≠ 0) (hv : v ≠ 0) :
∃ (x : ZMod p) (y : ZMod p), u * x ^ 2 + v * y ^ 2 = 1

The case of two units #

theorem HasseMinkowski.hilbertSym_padicInt_units {p : ℕ} [Fact (Nat.Prime p)] (hp : p ≠ 2) (u v : ℤ_[p]ˣ) :
hilbertSym ↑↑u ↑↑v = 1
theorem HasseMinkowski.hilbertSym_padic_odd_case00 {p : ℕ} [Fact (Nat.Prime p)] (hp : p ≠ 2) {a b : ℚ_[p]} (ha : ‖a‖ = 1) (hb : ‖b‖ = 1) :

Case 10: a unit against an element of valuation 1 #

Serre's formula for (a,b)_p with a a unit and b of valuation 1 collapses to the Legendre symbol (a/p) of the unit a. Geometrically the form z² - a x² - b y² has its b-term divisible by p, so after rescaling to an integral solution with a unit coordinate a mod-p argument identifies a with a square exactly when a solution exists.

The scaling lemma below is the same normalization as Padic.exists_padicInt_solution (Padics/CommonRoot.lean), but with both coefficients arbitrary — the coefficients never enter the rescaling.

theorem HasseMinkowski.exists_padicInt_solution_gen {p : ℕ} [Fact (Nat.Prime p)] {c₁ c₂ x y z : ℚ_[p]} (hnontriv : (x, y, z) ≠ (0, 0, 0)) (hsol : z ^ 2 - c₁ * x ^ 2 - c₂ * y ^ 2 = 0) :
∃ (Z : ℤ_[p]) (X : ℤ_[p]) (Y : ℤ_[p]), ↑Z ^ 2 - c₁ * ↑X ^ 2 - c₂ * ↑Y ^ 2 = 0 ∧ (IsUnit Z ∨ IsUnit X ∨ IsUnit Y)
theorem HasseMinkowski.hilbertSym_padic_odd_case10 {p : ℕ} [Fact (Nat.Prime p)] (hp : p ≠ 2) (u : ℤ_[p]ˣ) {c : ℚ_[p]} (hc : ‖c‖ = (↑p)⁻¹) :
hilbertSym (↑↑u) c = (quadraticChar (ZMod p)) (PadicInt.toZMod ↑u)

Case 11: two elements of valuation 1 #

With both arguments of valuation 1 the form z² - p x² - p y² has a nontrivial zero exactly when -1 is a square modulo p, i.e. (p,p)_p = (-1)^{(p-1)/2}. The square direction is the explicit solution (0, s, 1) with s² = -1; the non-square direction reduces an integral solution mod p twice, forcing X² + Y² ≡ 0.

theorem HasseMinkowski.hilbertSym_padic_odd_case11_units {p : ℕ} [Fact (Nat.Prime p)] (hp : p ≠ 2) (u v : ℤ_[p]ˣ) :
hilbertSym (↑p * ↑↑u) (↑p * ↑↑v) = (quadraticChar (ZMod p)) (-(PadicInt.toZMod ↑u * PadicInt.toZMod ↑v))

The general formula for odd p #

Assembling the four square-class cases gives Serre's formula. For nonzero a, b : ℚ_[p] write a = p ^ α · u, b = p ^ β · v with α = a.valuation, β = b.valuation and units u = padicUnit a ha, v = padicUnit b hb (the "unit part" a · p ^ (-α)). Then

(a,b)_p = (-1)^{αβ(p-1)/2} · χ(u)^β · χ(v)^α, χ = quadraticChar (ZMod p).

Since χ(-1) = (-1)^{(p-1)/2} the sign is χ(-1)^{αβ}. Negative exponents are handled by parityPow, which is b ^ n when b = ±1 and depends only on the parity of n.

The proof reduces α, β modulo 2 by absorbing (p^{α/2})² into the arguments through hilbertSym_mul_square_eq, then checks the four parities against the case lemmas 00, 10 and 11. Bilinearity in the first argument follows formally.

noncomputable def HasseMinkowski.padicUnit {p : ℕ} [Fact (Nat.Prime p)] (a : ℚ_[p]) (ha : a ≠ 0) :

The unit part of a nonzero p-adic number: a = p ^ a.valuation * padicUnit a ha.

Equations
Instances For
    theorem HasseMinkowski.coe_padicUnit {p : ℕ} [Fact (Nat.Prime p)] (a : ℚ_[p]) (ha : a ≠ 0) :
    ↑↑(padicUnit a ha) = a * ↑p ^ (-a.valuation)
    theorem HasseMinkowski.norm_padicUnit {p : ℕ} [Fact (Nat.Prime p)] (a : ℚ_[p]) (ha : a ≠ 0) :
    ‖↑↑(padicUnit a ha)‖ = 1
    theorem HasseMinkowski.padicUnit_spec {p : ℕ} [Fact (Nat.Prime p)] (a : ℚ_[p]) (ha : a ≠ 0) :
    a = ↑p ^ a.valuation * ↑↑(padicUnit a ha)

    parityPow b n is b ^ n when b = ±1, well defined for negative n.

    Equations
    Instances For
      theorem HasseMinkowski.padicUnit_mul {p : ℕ} [Fact (Nat.Prime p)] (a a' : ℚ_[p]) (ha : a ≠ 0) (ha' : a' ≠ 0) :
      ↑(padicUnit (a * a') ⋯) = ↑(padicUnit a ha) * ↑(padicUnit a' ha')
      theorem HasseMinkowski.hilbertSym_reduce {p : ℕ} [Fact (Nat.Prime p)] (a b : ℚ_[p]) (ha : a ≠ 0) (hb : b ≠ 0) :
      hilbertSym a b = hilbertSym (↑p ^ (a.valuation % 2) * ↑↑(padicUnit a ha)) (↑p ^ (b.valuation % 2) * ↑↑(padicUnit b hb))
      theorem HasseMinkowski.hilbertSym_padic_odd_mul_left {p : ℕ} [Fact (Nat.Prime p)] (hp : p ≠ 2) (a a' b : ℚ_[p]) :
      hilbertSym (a * a') b = hilbertSym a b * hilbertSym a' b