Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit e001509

Browse files
committed
feat(field_theory/chevalley_warning): Binary version (#18083)
Derive the two multivariate polynomials version of Chevalley-Warning from the general one.
1 parent e7bab9a commit e001509

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

src/field_theory/chevalley_warning.lean

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ and `q` is notation for the cardinality of `K`.
1818
1. Let `f` be a multivariate polynomial in finitely many variables (`X s`, `s : σ`)
1919
such that the total degree of `f` is less than `(q-1)` times the cardinality of `σ`.
2020
Then the evaluation of `f` on all points of `σ → K` (aka `K^σ`) sums to `0`.
21-
(`sum_mv_polynomial_eq_zero`)
22-
2. The Chevalley–Warning theorem (`char_dvd_card_solutions`).
21+
(`sum_eval_eq_zero`)
22+
2. The Chevalley–Warning theorem (`char_dvd_card_solutions_of_sum_lt`).
2323
Let `f i` be a finite family of multivariate polynomials
2424
in finitely many variables (`X s`, `s : σ`) such that
2525
the sum of the total degrees of the `f i` is less than the cardinality of `σ`.
@@ -41,12 +41,12 @@ open_locale big_operators
4141
section finite_field
4242
open mv_polynomial function (hiding eval) finset finite_field
4343

44-
variables {K : Type*} {σ : Type*} [fintype K] [field K] [fintype σ]
44+
variables {K σ ι : Type*} [fintype K] [field K] [fintype σ] [decidable_eq σ]
4545
local notation `q` := fintype.card K
4646

47-
lemma mv_polynomial.sum_mv_polynomial_eq_zero [decidable_eq σ] (f : mv_polynomial σ K)
47+
lemma mv_polynomial.sum_eval_eq_zero (f : mv_polynomial σ K)
4848
(h : f.total_degree < (q - 1) * fintype.card σ) :
49-
(∑ x, eval x f) = 0 :=
49+
∑ x, eval x f = 0 :=
5050
begin
5151
haveI : decidable_eq K := classical.dec_eq K,
5252
calc (∑ x, eval x f)
@@ -86,15 +86,14 @@ begin
8686
rw equiv.subtype_equiv_codomain_symm_apply_ne, }
8787
end
8888

89-
variables [decidable_eq K] [decidable_eq σ]
89+
variables [decidable_eq K] (p : ℕ) [char_p K p]
9090

91-
/-- The Chevalley–Warning theorem.
91+
/-- The **Chevalley–Warning theorem**, finitary version.
9292
Let `(f i)` be a finite family of multivariate polynomials
9393
in finitely many variables (`X s`, `s : σ`) over a finite field of characteristic `p`.
9494
Assume that the sum of the total degrees of the `f i` is less than the cardinality of `σ`.
9595
Then the number of common solutions of the `f i` is divisible by `p`. -/
96-
theorem char_dvd_card_solutions_family (p : ℕ) [char_p K p]
97-
{ι : Type*} {s : finset ι} {f : ι → mv_polynomial σ K}
96+
theorem char_dvd_card_solutions_of_sum_lt {s : finset ι} {f : ι → mv_polynomial σ K}
9897
(h : (∑ i in s, (f i).total_degree) < fintype.card σ) :
9998
p ∣ fintype.card {x : σ → K // ∀ i ∈ s, eval x (f i) = 0} :=
10099
begin
@@ -131,7 +130,7 @@ begin
131130
rw [← char_p.cast_eq_zero_iff K, ← key],
132131
show ∑ x, eval x F = 0,
133132
-- We are now ready to apply the main machine, proven before.
134-
apply F.sum_mv_polynomial_eq_zero,
133+
apply F.sum_eval_eq_zero,
135134
-- It remains to verify the crucial assumption of this machine
136135
show F.total_degree < (q - 1) * fintype.card σ,
137136
calc F.total_degree ≤ ∑ i in s, (1 - (f i)^(q - 1)).total_degree : total_degree_finset_prod s _
@@ -147,22 +146,43 @@ begin
147146
... ≤ (q - 1) * (f i).total_degree : total_degree_pow _ _
148147
end
149148

150-
/-- The Chevalley–Warning theorem.
149+
/-- The **Chevalley–Warning theorem**, fintype version.
150+
Let `(f i)` be a finite family of multivariate polynomials
151+
in finitely many variables (`X s`, `s : σ`) over a finite field of characteristic `p`.
152+
Assume that the sum of the total degrees of the `f i` is less than the cardinality of `σ`.
153+
Then the number of common solutions of the `f i` is divisible by `p`. -/
154+
theorem char_dvd_card_solutions_of_fintype_sum_lt [fintype ι] {f : ι → mv_polynomial σ K}
155+
(h : (∑ i, (f i).total_degree) < fintype.card σ) :
156+
p ∣ fintype.card {x : σ → K // ∀ i, eval x (f i) = 0} :=
157+
by simpa using char_dvd_card_solutions_of_sum_lt p h
158+
159+
/-- The **Chevalley–Warning theorem**, unary version.
151160
Let `f` be a multivariate polynomial in finitely many variables (`X s`, `s : σ`)
152161
over a finite field of characteristic `p`.
153162
Assume that the total degree of `f` is less than the cardinality of `σ`.
154163
Then the number of solutions of `f` is divisible by `p`.
155-
See `char_dvd_card_solutions_family` for a version that takes a family of polynomials `f i`. -/
156-
theorem char_dvd_card_solutions (p : ℕ) [char_p K p]
157-
{f : mv_polynomial σ K} (h : f.total_degree < fintype.card σ) :
164+
See `char_dvd_card_solutions_of_sum_lt` for a version that takes a family of polynomials `f i`. -/
165+
theorem char_dvd_card_solutions {f : mv_polynomial σ K} (h : f.total_degree < fintype.card σ) :
158166
p ∣ fintype.card {x : σ → K // eval x f = 0} :=
159167
begin
160168
let F : unit → mv_polynomial σ K := λ _, f,
161-
have : ∑ i : unit, (F i).total_degree < fintype.card σ,
162-
{ simpa only [fintype.univ_punit, sum_singleton] using h, },
163-
have key := char_dvd_card_solutions_family p this,
164-
simp only [F, fintype.univ_punit, forall_eq, mem_singleton] at key,
165-
convert key,
169+
have : ∑ i : unit, (F i).total_degree < fintype.card σ := h,
170+
simpa only [F, fintype.univ_punit, forall_eq, mem_singleton] using
171+
char_dvd_card_solutions_of_sum_lt p this,
172+
end
173+
174+
/-- The **Chevalley–Warning theorem**, binary version.
175+
Let `f₁`, `f₂` be two multivariate polynomials in finitely many variables (`X s`, `s : σ`) over a
176+
finite field of characteristic `p`.
177+
Assume that the sum of the total degrees of `f₁` and `f₂` is less than the cardinality of `σ`.
178+
Then the number of common solutions of the `f₁` and `f₂` is divisible by `p`. -/
179+
theorem char_dvd_card_solutions_of_add_lt {f₁ f₂ : mv_polynomial σ K}
180+
(h : f₁.total_degree + f₂.total_degree < fintype.card σ) :
181+
p ∣ fintype.card {x : σ → K // eval x f₁ = 0 ∧ eval x f₂ = 0} :=
182+
begin
183+
let F : bool → mv_polynomial σ K := λ b, cond b f₂ f₁,
184+
have : ∑ b : bool, (F b).total_degree < fintype.card σ := (add_comm _ _).trans_lt h,
185+
simpa only [F, bool.forall_bool] using char_dvd_card_solutions_of_fintype_sum_lt p this,
166186
end
167187

168188
end finite_field

0 commit comments

Comments
 (0)