Skip to content

Commit e551247

Browse files
committed
refactor(Algebra/CharP): strengthen expansion of (x + y) ^ p ^ n (#31193)
Previously, we only knew that the remaining terms were divisible by `p`. Now we know they are divisible by `p * x * y`. From ClassFieldTheory Co-authored-by: Kenny Lau
1 parent 084bbea commit e551247

File tree

1 file changed

+54
-27
lines changed

1 file changed

+54
-27
lines changed

Mathlib/Algebra/CharP/Lemmas.lean

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,32 +22,51 @@ namespace Commute
2222
variable [Semiring R] {p : ℕ} (hp : p.Prime) {x y : R}
2323
include hp
2424

25-
protected theorem add_pow_prime_pow_eq (h : Commute x y) (n : ℕ) :
25+
protected lemma add_pow_prime_pow_eq' (h : Commute x y) (n : ℕ) :
2626
(x + y) ^ p ^ n =
2727
x ^ p ^ n + y ^ p ^ n +
28-
p * ∑ k ∈ Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * ↑((p ^ n).choose k / p) := by
29-
trans x ^ p ^ n + y ^ p ^ n + ∑ k ∈ Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * (p ^ n).choose k
30-
· simp_rw [h.add_pow, ← Nat.Ico_zero_eq_range, Ico_add_one_right_eq_Icc,
31-
Icc_eq_cons_Ico (zero_le _), Finset.sum_cons, Ico_eq_cons_Ioo (pow_pos hp.pos _),
32-
Finset.sum_cons, tsub_self, tsub_zero, pow_zero, Nat.choose_zero_right, Nat.choose_self,
33-
Nat.cast_one, mul_one, one_mul, ← add_assoc]
34-
· congr 1
35-
simp_rw [Finset.mul_sum, Nat.cast_comm, mul_assoc _ _ (p : R), ← Nat.cast_mul]
36-
refine Finset.sum_congr rfl fun i hi => ?_
37-
rw [mem_Ioo] at hi
38-
rw [Nat.div_mul_cancel (hp.dvd_choose_pow hi.1.ne' hi.2.ne)]
39-
40-
protected theorem add_pow_prime_eq (h : Commute x y) :
28+
p * ∑ k ∈ Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * ↑((p ^ n).choose k / p) := calc
29+
_ = ∑ k ∈ Icc 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * (p ^ n).choose k := by
30+
rw [h.add_pow, ← Nat.Ico_zero_eq_range, Ico_add_one_right_eq_Icc]
31+
_ = x ^ p ^ n + y ^ p ^ n + ∑ k ∈ Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * (p ^ n).choose k := by
32+
simp_rw [Icc_eq_cons_Ico (zero_le _), Ico_eq_cons_Ioo (pow_pos hp.pos _)]
33+
simp [-cons_eq_insert, add_assoc]
34+
_ = _ := by
35+
simp_rw [mul_sum]
36+
congr! 2 with k hk
37+
obtain ⟨hk₀, hk⟩ := mem_Ioo.1 hk
38+
-- The maths is over now. We just commute things to their place.
39+
rw [Nat.cast_comm, mul_assoc (_ * _)]
40+
norm_cast
41+
rw [Nat.div_mul_cancel (hp.dvd_choose_pow _ _)] <;> omega
42+
43+
protected lemma add_pow_prime_pow_eq (h : Commute x y) (n : ℕ) :
44+
(x + y) ^ p ^ n =
45+
x ^ p ^ n + y ^ p ^ n +
46+
p * x * y *
47+
∑ k ∈ Ioo 0 (p ^ n), x ^ (k - 1) * y ^ (p ^ n - k - 1) * ↑((p ^ n).choose k / p) := by
48+
rw [h.add_pow_prime_pow_eq' hp, mul_assoc _ x, mul_assoc, mul_sum _ _ (_ * _)]
49+
congr! 3 with k hk
50+
obtain ⟨hk₀, hk⟩ := mem_Ioo.1 hk
51+
rw [← mul_pow_sub_one (by omega), ← mul_pow_sub_one (n := p ^ n - k) (by omega)]
52+
rw [(h.pow_left _).mul_mul_mul_comm, mul_assoc (x * y)]
53+
54+
protected lemma add_pow_prime_eq' (h : Commute x y) :
55+
(x + y) ^ p = x ^ p + y ^ p + p * ∑ k ∈ Ioo 0 p, x ^ k * y ^ (p - k) * ↑(p.choose k / p) := by
56+
simpa using h.add_pow_prime_pow_eq' hp 1
57+
58+
protected lemma add_pow_prime_eq (h : Commute x y) :
4159
(x + y) ^ p =
42-
x ^ p + y ^ p + p * ∑ k ∈ Finset.Ioo 0 p, x ^ k * y ^ (p - k) * ↑(p.choose k / p) := by
60+
x ^ p + y ^ p + p * x * y *
61+
∑ k ∈ Ioo 0 p, x ^ (k - 1) * y ^ (p - k - 1) * ↑(p.choose k / p) := by
4362
simpa using h.add_pow_prime_pow_eq hp 1
4463

4564
protected theorem exists_add_pow_prime_pow_eq (h : Commute x y) (n : ℕ) :
46-
∃ r, (x + y) ^ p ^ n = x ^ p ^ n + y ^ p ^ n + p * r :=
65+
∃ r, (x + y) ^ p ^ n = x ^ p ^ n + y ^ p ^ n + p * x * y * r :=
4766
⟨_, h.add_pow_prime_pow_eq hp n⟩
4867

4968
protected theorem exists_add_pow_prime_eq (h : Commute x y) :
50-
∃ r, (x + y) ^ p = x ^ p + y ^ p + p * r :=
69+
∃ r, (x + y) ^ p = x ^ p + y ^ p + p * x * y * r :=
5170
⟨_, h.add_pow_prime_eq hp⟩
5271

5372
end Commute
@@ -57,23 +76,34 @@ section CommSemiring
5776
variable [CommSemiring R] {p : ℕ} (hp : p.Prime) (x y : R) (n : ℕ)
5877
include hp
5978

60-
theorem add_pow_prime_pow_eq :
79+
lemma add_pow_prime_pow_eq' :
80+
(x + y) ^ p ^ n =
81+
x ^ p ^ n + y ^ p ^ n +
82+
p * ∑ k ∈ Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * ↑((p ^ n).choose k / p) :=
83+
(Commute.all x y).add_pow_prime_pow_eq' hp n
84+
85+
lemma add_pow_prime_pow_eq :
6186
(x + y) ^ p ^ n =
6287
x ^ p ^ n + y ^ p ^ n +
63-
p * ∑ k ∈ Finset.Ioo 0 (p ^ n), x ^ k * y ^ (p ^ n - k) * ↑((p ^ n).choose k / p) :=
88+
p * x * y *
89+
∑ k ∈ Ioo 0 (p ^ n), x ^ (k - 1) * y ^ (p ^ n - k - 1) * ↑((p ^ n).choose k / p) :=
6490
(Commute.all x y).add_pow_prime_pow_eq hp n
6591

92+
lemma add_pow_prime_eq' :
93+
(x + y) ^ p = x ^ p + y ^ p + p * ∑ k ∈ Ioo 0 p, x ^ k * y ^ (p - k) * ↑(p.choose k / p) :=
94+
(Commute.all x y).add_pow_prime_eq' hp
95+
6696
theorem add_pow_prime_eq :
6797
(x + y) ^ p =
68-
x ^ p + y ^ p + p * ∑ k ∈ Finset.Ioo 0 p, x ^ k * y ^ (p - k) * ↑(p.choose k / p) :=
98+
x ^ p + y ^ p + p * x * y *
99+
∑ k ∈ Ioo 0 p, x ^ (k - 1) * y ^ (p - k - 1) * ↑(p.choose k / p) :=
69100
(Commute.all x y).add_pow_prime_eq hp
70101

71102
theorem exists_add_pow_prime_pow_eq :
72-
∃ r, (x + y) ^ p ^ n = x ^ p ^ n + y ^ p ^ n + p * r :=
103+
∃ r, (x + y) ^ p ^ n = x ^ p ^ n + y ^ p ^ n + p * x * y * r :=
73104
(Commute.all x y).exists_add_pow_prime_pow_eq hp n
74105

75-
theorem exists_add_pow_prime_eq :
76-
∃ r, (x + y) ^ p = x ^ p + y ^ p + p * r :=
106+
theorem exists_add_pow_prime_eq : ∃ r, (x + y) ^ p = x ^ p + y ^ p + p * x * y * r :=
77107
(Commute.all x y).exists_add_pow_prime_eq hp
78108

79109
end CommSemiring
@@ -237,10 +267,7 @@ end CharP
237267
lemma Nat.Prime.dvd_add_pow_sub_pow_of_dvd (hpri : p.Prime) {r : R} (h₁ : r ∣ x ^ p)
238268
(h₂ : r ∣ p * x) : r ∣ (x + y) ^ p - y ^ p := by
239269
rw [add_pow_prime_eq hpri, add_right_comm, add_assoc, add_sub_assoc, add_sub_cancel_right]
240-
apply dvd_add h₁ (h₂.trans <| mul_dvd_mul_left _ <| Finset.dvd_sum _)
241-
simp only [Finset.mem_Ioo, and_imp, mul_assoc]
242-
intro i hi0 _
243-
exact dvd_mul_of_dvd_left (dvd_rfl.pow hi0.ne') _
270+
exact dvd_add h₁ (h₂.trans <| (dvd_mul_right ..).trans <| dvd_mul_right ..)
244271

245272
end CommRing
246273

0 commit comments

Comments
 (0)