@@ -7,6 +7,8 @@ import algebra.gcd_domain
7
7
import algebra.field_power
8
8
import ring_theory.multiplicity
9
9
import data.real.cau_seq
10
+ import tactic.ring_exp
11
+ import tactic.basic
10
12
11
13
/-!
12
14
# p-adic norm
@@ -157,6 +159,24 @@ begin
157
159
using padic_val_rat_def p n_nonzero,
158
160
end
159
161
162
+ lemma one_le_padic_val_nat_of_dvd {n p : nat} [prime : fact p.prime] (nonzero : n ≠ 0 ) (div : p ∣ n) :
163
+ 1 ≤ padic_val_nat p n :=
164
+ begin
165
+ rw @padic_val_nat_def _ prime _ nonzero,
166
+ let one_le_mul : _ ≤ multiplicity p n :=
167
+ @multiplicity.le_multiplicity_of_pow_dvd _ _ _ p n 1 (begin norm_num, exact div end ),
168
+ simp only [enat.coe_one] at one_le_mul,
169
+ rcases one_le_mul with ⟨_, q⟩,
170
+ dsimp at q,
171
+ solve_by_elim,
172
+ end
173
+
174
+ @[simp]
175
+ lemma padic_val_nat_zero (m : nat) : padic_val_nat m 0 = 0 := by simpa
176
+
177
+ @[simp]
178
+ lemma padic_val_nat_one (m : nat) : padic_val_nat m 1 = 0 := by simp [padic_val_nat]
179
+
160
180
end padic_val_nat
161
181
162
182
namespace padic_val_rat
@@ -297,6 +317,137 @@ theorem min_le_padic_val_rat_add {q r : ℚ}
297
317
298
318
end padic_val_rat
299
319
320
+ namespace padic_val_nat
321
+
322
+ /--
323
+ A rewrite lemma for `padic_val_nat p (q * r)` with conditions `q ≠ 0`, `r ≠ 0`.
324
+ -/
325
+ protected lemma mul (p : ℕ) [p_prime : fact p.prime] {q r : ℕ} (hq : q ≠ 0 ) (hr : r ≠ 0 ) :
326
+ padic_val_nat p (q * r) = padic_val_nat p q + padic_val_nat p r :=
327
+ begin
328
+ apply int.coe_nat_inj,
329
+ simp only [padic_val_rat_of_nat, nat.cast_mul],
330
+ rw padic_val_rat.mul,
331
+ norm_cast,
332
+ exact cast_ne_zero.mpr hq,
333
+ exact cast_ne_zero.mpr hr,
334
+ end
335
+
336
+ /--
337
+ Dividing out by a prime factor reduces the padic_val_nat by 1.
338
+ -/
339
+ protected lemma div {p : ℕ} [p_prime : fact p.prime] {b : ℕ} (dvd : p ∣ b) :
340
+ (padic_val_nat p (b / p)) = (padic_val_nat p b) - 1 :=
341
+ begin
342
+ by_cases b_split : (b = 0 ),
343
+ { simp [b_split], },
344
+ { have split_frac : padic_val_rat p (b / p) = padic_val_rat p b - padic_val_rat p p :=
345
+ padic_val_rat.div p (nat.cast_ne_zero.mpr b_split) (nat.cast_ne_zero.mpr (nat.prime.ne_zero p_prime)),
346
+ rw padic_val_rat.padic_val_rat_self (nat.prime.one_lt p_prime) at split_frac,
347
+ have r : 1 ≤ padic_val_nat p b := one_le_padic_val_nat_of_dvd b_split dvd,
348
+ exact_mod_cast split_frac, }
349
+ end
350
+
351
+ end padic_val_nat
352
+
353
+ section padic_val_nat
354
+
355
+ /--
356
+ If a prime doesn't appear in `n`, `padic_val_nat p n` is `0`.
357
+ -/
358
+ lemma padic_val_nat_of_not_dvd {p : ℕ} [fact p.prime] {n : ℕ} (not_dvd : ¬(p ∣ n)) :
359
+ padic_val_nat p n = 0 :=
360
+ begin
361
+ by_cases hn : n = 0 ,
362
+ { subst hn, simp at not_dvd, trivial, },
363
+ { rw padic_val_nat_def hn,
364
+ exact (@multiplicity.unique' _ _ _ p n 0 (by simp) (by simpa using not_dvd)).symm,
365
+ assumption, },
366
+ end
367
+
368
+ lemma padic_val_nat_primes {p q : ℕ} [p_prime : fact p.prime] [q_prime : fact q.prime] (neq : p ≠ q) :
369
+ padic_val_nat p q = 0 :=
370
+ @padic_val_nat_of_not_dvd p p_prime q $ (not_congr (iff.symm (prime_dvd_prime_iff_eq p_prime q_prime))).mp neq
371
+
372
+ protected lemma padic_val_nat.div' {p : ℕ} [p_prime : fact p.prime] :
373
+ ∀ {m : ℕ} (cpm : coprime p m) {b : ℕ} (dvd : m ∣ b), padic_val_nat p (b / m) = padic_val_nat p b
374
+ | 0 := λ cpm b dvd, by { rw zero_dvd_iff at dvd, rw [dvd, nat.zero_div], }
375
+ | (n + 1 ) :=
376
+ λ cpm b dvd,
377
+ begin
378
+ rcases dvd with ⟨c, rfl⟩,
379
+ rw [mul_div_right c (nat.succ_pos _)],by_cases hc : c = 0 ,
380
+ { rw [hc, mul_zero] },
381
+ { rw padic_val_nat.mul,
382
+ { suffices : ¬ p ∣ (n+1 ),
383
+ { rw [padic_val_nat_of_not_dvd this , zero_add] },
384
+ contrapose! cpm,
385
+ exact p_prime.dvd_iff_not_coprime.mp cpm },
386
+ { exact nat.succ_ne_zero _ },
387
+ { exact hc } },
388
+ end
389
+
390
+ lemma padic_val_nat_eq_factors_count (p : ℕ) [hp : fact p.prime] :
391
+ ∀ (n : ℕ), padic_val_nat p n = (factors n).count p
392
+ | 0 := rfl
393
+ | 1 := by { rw padic_val_nat_one, refl }
394
+ | (m + 2 ) :=
395
+ let n := m + 2 in
396
+ let q := min_fac n in
397
+ have hq : fact q.prime := min_fac_prime (show m + 2 ≠ 1 , by linarith),
398
+ have wf : n / q < n := nat.div_lt_self (nat.succ_pos _) hq.one_lt,
399
+ begin
400
+ rw factors_add_two,
401
+ show padic_val_nat p n = list.count p (q :: (factors (n / q))),
402
+ rw [list.count_cons', ← padic_val_nat_eq_factors_count],
403
+ split_ifs with h,
404
+ have p_dvd_n : p ∣ n,
405
+ { have : q ∣ n := nat.min_fac_dvd n,
406
+ cc },
407
+ { rw [←h, padic_val_nat.div],
408
+ { have : 1 ≤ padic_val_nat p n := one_le_padic_val_nat_of_dvd (by linarith) p_dvd_n,
409
+ exact (nat.sub_eq_iff_eq_add this ).mp rfl, },
410
+ { exact p_dvd_n, }, },
411
+ { suffices : p.coprime q,
412
+ { rw [padic_val_nat.div' this (min_fac_dvd n), add_zero], },
413
+ rwa nat.coprime_primes hp hq, },
414
+ end
415
+
416
+ open_locale big_operators
417
+
418
+ lemma prod_pow_prime_padic_val_nat (n : nat) (hn : n ≠ 0 ) (m : nat) (pr : n < m) :
419
+ ∏ p in finset.filter nat.prime (finset.range m), p ^ (padic_val_nat p n) = n :=
420
+ begin
421
+ rw ← nat.pos_iff_ne_zero at hn,
422
+ have H : (factors n : multiset ℕ).prod = n,
423
+ { rw [multiset.coe_prod, prod_factors hn], },
424
+ rw finset.prod_multiset_count at H,
425
+ conv_rhs { rw ← H, },
426
+ refine finset.prod_bij_ne_one (λ p hp hp', p) _ _ _ _,
427
+ { rintro p hp hpn,
428
+ rw [finset.mem_filter, finset.mem_range] at hp,
429
+ haveI Hp : fact p.prime := hp.2 ,
430
+ rw [multiset.mem_to_finset, multiset.mem_coe, mem_factors_iff_dvd hn Hp],
431
+ contrapose! hpn,
432
+ rw [padic_val_nat_of_not_dvd hpn, nat.pow_zero], },
433
+ { intros, assumption },
434
+ { intros p hp hpn,
435
+ rw [multiset.mem_to_finset, multiset.mem_coe] at hp,
436
+ haveI Hp : fact p.prime := mem_factors hp,
437
+ simp only [exists_prop, ne.def, finset.mem_filter, finset.mem_range],
438
+ refine ⟨p, ⟨_, Hp⟩, ⟨_, rfl⟩⟩,
439
+ { rw mem_factors_iff_dvd hn Hp at hp, exact lt_of_le_of_lt (le_of_dvd hn hp) pr },
440
+ { rw padic_val_nat_eq_factors_count,
441
+ simp only [pow_eq_pow, ne.def, multiset.coe_count] at hpn,
442
+ convert hpn } },
443
+ { intros p hp hpn,
444
+ rw [finset.mem_filter, finset.mem_range] at hp,
445
+ haveI Hp : fact p.prime := hp.2 ,
446
+ rw [padic_val_nat_eq_factors_count, multiset.coe_count, pow_eq_pow] }
447
+ end
448
+
449
+ end padic_val_nat
450
+
300
451
/--
301
452
If `q ≠ 0`, the p-adic norm of a rational `q` is `p ^ (-(padic_val_rat p q))`.
302
453
If `q = 0`, the p-adic norm of `q` is 0.
0 commit comments