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

Commit 114ff8a

Browse files
committed
feat(data/nat/multiplicity): rename nat.multiplicity_choose_prime_pow, add lemmas (#18183)
* Rename `nat.multiplicity_choose_prime_pow` to `nat.multiplicity_choose_prime_pow_add_multiplicity`. * Add `part_enat.eq_coe_sub_of_add_eq_coe` and a version of `nat.multiplicity_choose_prime_pow` with just the multiplicity of `p` in `choose (p ^ n) k` in the LHS. * Golf 2 proofs.
1 parent 57ac39b commit 114ff8a

File tree

3 files changed

+32
-30
lines changed

3 files changed

+32
-30
lines changed

src/data/nat/multiplicity.lean

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ begin
203203
exact dvd_mul_right _ _
204204
end
205205

206-
lemma multiplicity_choose_prime_pow {p n k : ℕ} (hp : p.prime)
207-
(hkn : k ≤ p ^ n) (hk0 : 0 < k) :
206+
lemma multiplicity_choose_prime_pow_add_multiplicity {p n k : ℕ} (hp : p.prime) (hkn : k ≤ p ^ n)
207+
(hk0 : k 0) :
208208
multiplicity p (choose (p ^ n) k) + multiplicity p k = n :=
209209
le_antisymm
210210
(have hdisj : disjoint
@@ -214,7 +214,7 @@ le_antisymm
214214
{contextual := tt},
215215
begin
216216
rw [multiplicity_choose hp hkn (lt_succ_self _),
217-
multiplicity_eq_card_pow_dvd (ne_of_gt hp.one_lt) hk0
217+
multiplicity_eq_card_pow_dvd (ne_of_gt hp.one_lt) hk0.bot_lt
218218
(lt_succ_of_le (log_mono_right hkn)),
219219
← nat.cast_add, part_enat.coe_le_coe, log_pow hp.one_lt,
220220
← card_disjoint_union hdisj, filter_union_right],
@@ -224,6 +224,11 @@ le_antisymm
224224
(by rw [← hp.multiplicity_pow_self];
225225
exact multiplicity_le_multiplicity_choose_add hp _ _)
226226

227+
lemma multiplicity_choose_prime_pow {p n k : ℕ} (hp : p.prime) (hkn : k ≤ p ^ n) (hk0 : k ≠ 0) :
228+
multiplicity p (choose (p ^ n) k) =
229+
↑(n - (multiplicity p k).get (finite_nat_iff.2 ⟨hp.ne_one, hk0.bot_lt⟩)) :=
230+
part_enat.eq_coe_sub_of_add_eq_coe $ multiplicity_choose_prime_pow_add_multiplicity hp hkn hk0
231+
227232
end prime
228233

229234
lemma multiplicity_two_factorial_lt : ∀ {n : ℕ} (h : n ≠ 0), multiplicity 2 n! < n :=

src/data/nat/part_enat.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ lemma some_eq_coe (n : ℕ) : some n = n := rfl
9494

9595
@[simp] lemma dom_coe (x : ℕ) : (x : part_enat).dom := trivial
9696

97+
instance : can_lift part_enat ℕ coe dom := ⟨λ n hn, ⟨n.get hn, part.some_get _⟩⟩
98+
9799
instance : has_le part_enat := ⟨λ x y, ∃ h : y.dom → x.dom, ∀ hy : y.dom, x.get (h hy) ≤ y.get hy⟩
98100
instance : has_top part_enat := ⟨none⟩
99101
instance : has_bot part_enat := ⟨0
@@ -326,6 +328,15 @@ instance : canonically_ordered_add_monoid part_enat :=
326328
..part_enat.order_bot,
327329
..part_enat.ordered_add_comm_monoid }
328330

331+
lemma eq_coe_sub_of_add_eq_coe {x y : part_enat} {n : ℕ} (h : x + y = n) :
332+
x = ↑(n - y.get (dom_of_le_coe ((le_add_left le_rfl).trans_eq h))) :=
333+
begin
334+
lift x to ℕ using dom_of_le_coe ((le_add_right le_rfl).trans_eq h),
335+
lift y to ℕ using dom_of_le_coe ((le_add_left le_rfl).trans_eq h),
336+
rw [← nat.cast_add, coe_inj] at h,
337+
rw [get_coe, coe_inj, eq_tsub_of_add_eq h]
338+
end
339+
329340
protected lemma add_lt_add_right {x y z : part_enat} (h : x < y) (hz : z ≠ ⊤) : x + z < y + z :=
330341
begin
331342
rcases ne_top_iff.mp (ne_top_of_lt h) with ⟨m, rfl⟩,

src/ring_theory/witt_vector/frobenius.lean

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -121,37 +121,23 @@ lemma map_frobenius_poly.key₁ (n j : ℕ) (hj : j < p ^ (n)) :
121121
p ^ (n - v p ⟨j + 1, j.succ_pos⟩) ∣ (p ^ n).choose (j + 1) :=
122122
begin
123123
apply multiplicity.pow_dvd_of_le_multiplicity,
124-
have aux : (multiplicity p ((p ^ n).choose (j + 1))).dom,
125-
{ rw [← multiplicity.finite_iff_dom, multiplicity.finite_nat_iff],
126-
exact ⟨hp.1.ne_one, nat.choose_pos hj⟩, },
127-
rw [← part_enat.coe_get aux, part_enat.coe_le_coe, tsub_le_iff_left,
128-
← part_enat.coe_le_coe, nat.cast_add, pnat_multiplicity, part_enat.coe_get,
129-
part_enat.coe_get, add_comm],
130-
exact (hp.1.multiplicity_choose_prime_pow hj j.succ_pos).ge,
124+
rw [hp.out.multiplicity_choose_prime_pow hj j.succ_ne_zero],
125+
refl,
131126
end
132127

133128
/-- A key numerical identity needed for the proof of `witt_vector.map_frobenius_poly`. -/
134-
lemma map_frobenius_poly.key₂ {n i j : ℕ} (hi : i < n) (hj : j < p ^ (n - i)) :
135-
j - (v p ⟨j + 1, j.succ_pos⟩) + n =
136-
i + j + (n - i - v p ⟨j + 1, j.succ_pos⟩) :=
129+
lemma map_frobenius_poly.key₂ {n i j : ℕ} (hi : i ≤ n) (hj : j < p ^ (n - i)) :
130+
j - v p ⟨j + 1, j.succ_pos⟩ + n = i + j + (n - i - v p ⟨j + 1, j.succ_pos⟩) :=
137131
begin
138132
generalize h : (v p ⟨j + 1, j.succ_pos⟩) = m,
139-
suffices : m ≤ n - i ∧ m ≤ j,
140-
{ rw [tsub_add_eq_add_tsub this.2, add_comm i j,
141-
add_tsub_assoc_of_le (this.1.trans (nat.sub_le n i)), add_assoc, tsub_right_comm, add_comm i,
142-
tsub_add_cancel_of_le (le_tsub_of_add_le_right ((le_tsub_iff_left hi.le).mp this.1))] },
143-
split,
144-
{ rw [← h, ← part_enat.coe_le_coe, pnat_multiplicity, part_enat.coe_get,
145-
← hp.1.multiplicity_choose_prime_pow hj j.succ_pos],
146-
apply le_add_left, refl },
147-
{ obtain ⟨c, hc⟩ : p ^ m ∣ j + 1,
148-
{ rw [← h], exact multiplicity.pow_multiplicity_dvd _, },
149-
obtain ⟨c, rfl⟩ : ∃ k : ℕ, c = k + 1,
150-
{ apply nat.exists_eq_succ_of_ne_zero, rintro rfl, simpa only using hc },
151-
rw [mul_add, mul_one] at hc,
152-
apply nat.le_of_lt_succ,
153-
calc m < p ^ m : nat.lt_pow_self hp.1.one_lt m
154-
... ≤ j + 1 : by { rw ← tsub_eq_of_eq_add_rev hc, apply nat.sub_le } }
133+
rsuffices ⟨h₁, h₂⟩ : m ≤ n - i ∧ m ≤ j,
134+
{ rw [tsub_add_eq_add_tsub h₂, add_comm i j,
135+
add_tsub_assoc_of_le (h₁.trans (nat.sub_le n i)), add_assoc, tsub_right_comm, add_comm i,
136+
tsub_add_cancel_of_le (le_tsub_of_add_le_right ((le_tsub_iff_left hi).mp h₁))] },
137+
have hle : p ^ m ≤ j + 1,
138+
from h ▸ nat.le_of_dvd j.succ_pos (multiplicity.pow_multiplicity_dvd _),
139+
exact ⟨(pow_le_pow_iff hp.1.one_lt).1 (hle.trans hj),
140+
nat.le_of_lt_succ ((nat.lt_pow_self hp.1.one_lt m).trans_le hle)⟩
155141
end
156142

157143
lemma map_frobenius_poly (n : ℕ) :
@@ -200,7 +186,7 @@ begin
200186
{ have aux : ∀ k : ℕ, (p ^ k : ℚ) ≠ 0,
201187
{ intro, apply pow_ne_zero, exact_mod_cast hp.1.ne_zero },
202188
simpa [aux, -one_div] with field_simps using this.symm },
203-
rw [mul_comm _ (p : ℚ), mul_assoc, mul_assoc, ← pow_add, map_frobenius_poly.key₂ p hi hj],
189+
rw [mul_comm _ (p : ℚ), mul_assoc, mul_assoc, ← pow_add, map_frobenius_poly.key₂ p hi.le hj],
204190
ring_exp
205191
end
206192

0 commit comments

Comments
 (0)