@@ -22,32 +22,51 @@ namespace Commute
2222variable [Semiring R] {p : ℕ} (hp : p.Prime) {x y : R}
2323include 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
4564protected 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
4968protected 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
5372end Commute
@@ -57,23 +76,34 @@ section CommSemiring
5776variable [CommSemiring R] {p : ℕ} (hp : p.Prime) (x y : R) (n : ℕ)
5877include 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+
6696theorem 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
71102theorem 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
79109end CommSemiring
@@ -237,10 +267,7 @@ end CharP
237267lemma 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
245272end CommRing
246273
0 commit comments