|
| 1 | +/- |
| 2 | +Copyright (c) 2026 Snir Broshi. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Snir Broshi |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.Data.Finsupp.Interval |
| 9 | +public import Mathlib.Data.Nat.Factorization.Defs |
| 10 | +public import Mathlib.NumberTheory.Divisors |
| 11 | + |
| 12 | +/-! |
| 13 | +# Results about divisors and factorizations |
| 14 | +-/ |
| 15 | + |
| 16 | +public section |
| 17 | + |
| 18 | +open Finsupp |
| 19 | + |
| 20 | +namespace Nat |
| 21 | + |
| 22 | +theorem coe_divisors_eq_prod_pow_le_factorization {n : ℕ} (hn : n ≠ 0) : |
| 23 | + n.divisors = { f.prod (· ^ ·) | f ≤ n.factorization } := by |
| 24 | + refine Set.ext fun k ↦ ⟨fun h ↦ ?_, fun ⟨f, hle, h⟩ ↦ mem_divisors.mpr ⟨?_, hn⟩⟩ |
| 25 | + · have hdvd := dvd_of_mem_divisors h |
| 26 | + have hk := ne_zero_of_dvd_ne_zero hn hdvd |
| 27 | + exact ⟨_, factorization_le_iff_dvd hk hn |>.mpr hdvd, factorization_prod_pow_eq_self hk⟩ |
| 28 | + · rw [← h, ← factorization_prod_pow_eq_self hn] |
| 29 | + exact prod_dvd_prod_of_subset_of_dvd (support_mono hle) fun p _ ↦ Nat.pow_dvd_pow p <| hle p |
| 30 | + |
| 31 | +theorem divisors_eq_image_Iic_factorization_prod_pow {n : ℕ} (hn : n ≠ 0) : |
| 32 | + n.divisors = (Finset.Iic n.factorization).image (·.prod (· ^ ·)) := by |
| 33 | + apply Finset.coe_inj.mp |
| 34 | + grind [coe_divisors_eq_prod_pow_le_factorization] |
| 35 | + |
| 36 | +theorem Iic_factorization_prod_pow_injective (n : ℕ) : |
| 37 | + (·.val.prod (· ^ ·) : Finset.Iic n.factorization → _).Injective := by |
| 38 | + have : ∀ d ≤ n.factorization, (d.prod (· ^ ·)).factorization = d := |
| 39 | + fun _ hd ↦ prod_pow_factorization_eq_self fun _ hp ↦ |
| 40 | + prime_of_mem_primeFactors <| support_mono hd hp |
| 41 | + grind [Function.Injective] |
| 42 | + |
| 43 | +theorem divisors_eq_map_attach_Iic_factorization_prod_pow {n : ℕ} (hn : n ≠ 0) : |
| 44 | + n.divisors = (Finset.Iic n.factorization).attach.map |
| 45 | + ⟨(·.val.prod (· ^ ·)), Iic_factorization_prod_pow_injective n⟩ := by |
| 46 | + rw [Finset.map_eq_image] |
| 47 | + change _ = (Finset.Iic n.factorization).attach.image ((·.prod (· ^ ·)) ∘ Subtype.val) |
| 48 | + rw [← Finset.image_image, Finset.attach_image_val] |
| 49 | + exact divisors_eq_image_Iic_factorization_prod_pow hn |
| 50 | + |
| 51 | +theorem coe_properDivisors_eq_prod_pow_lt_factorization {n : ℕ} : |
| 52 | + n.properDivisors = { f.prod (· ^ ·) | f < n.factorization } := by |
| 53 | + by_cases hn : n = 0 |
| 54 | + · simp [hn] |
| 55 | + refine Set.ext fun k ↦ ⟨fun h ↦ ?_, fun ⟨f, hlt, h⟩ ↦ ?_⟩ |
| 56 | + · have ⟨hdvd, hlt⟩ := mem_properDivisors.mp h |
| 57 | + have hk := ne_zero_of_dvd_ne_zero hn hdvd |
| 58 | + refine ⟨_, ?_, factorization_prod_pow_eq_self hk⟩ |
| 59 | + apply lt_of_le_of_ne <| factorization_le_iff_dvd hk hn |>.mpr hdvd |
| 60 | + exact mt (Nat.eq_of_factorization_eq' hk hn) hlt.ne |
| 61 | + · have : k ∣ n := by |
| 62 | + rw [← h, ← factorization_prod_pow_eq_self hn] |
| 63 | + apply prod_dvd_prod_of_subset_of_dvd <| support_mono hlt.le |
| 64 | + exact fun p _ ↦ Nat.pow_dvd_pow p <| hlt.le p |
| 65 | + refine mem_properDivisors.mpr ⟨this, lt_of_le_of_ne (le_of_dvd (Nat.pos_of_ne_zero hn) this) ?_⟩ |
| 66 | + suffices k.factorization = f from (this ▸ hlt.ne <| congrArg _ ·) |
| 67 | + refine h ▸ prod_pow_factorization_eq_self fun _ hp ↦ ?_ |
| 68 | + exact prime_of_mem_primeFactors <| support_mono hlt.le hp |
| 69 | + |
| 70 | +theorem properDivisors_eq_image_Iio_factorization_prod_pow {n : ℕ} : |
| 71 | + n.properDivisors = (Finset.Iio n.factorization).image (·.prod (· ^ ·)) := by |
| 72 | + apply Finset.coe_inj.mp |
| 73 | + grind [coe_properDivisors_eq_prod_pow_lt_factorization] |
| 74 | + |
| 75 | +theorem Iio_factorization_prod_pow_injective (n : ℕ) : |
| 76 | + (·.val.prod (· ^ ·) : Finset.Iio n.factorization → _).Injective := by |
| 77 | + have : ∀ d ≤ n.factorization, (d.prod (· ^ ·)).factorization = d := |
| 78 | + fun _ hd ↦ prod_pow_factorization_eq_self fun _ hp ↦ |
| 79 | + prime_of_mem_primeFactors <| support_mono hd hp |
| 80 | + grind [Function.Injective] |
| 81 | + |
| 82 | +theorem properDivisors_eq_map_attach_Iio_factorization_prod_pow {n : ℕ} : |
| 83 | + n.properDivisors = (Finset.Iio n.factorization).attach.map |
| 84 | + ⟨(·.val.prod (· ^ ·)), Iio_factorization_prod_pow_injective n⟩ := by |
| 85 | + rw [Finset.map_eq_image] |
| 86 | + change _ = (Finset.Iio n.factorization).attach.image ((·.prod (· ^ ·)) ∘ Subtype.val) |
| 87 | + rw [← Finset.image_image, Finset.attach_image_val] |
| 88 | + exact properDivisors_eq_image_Iio_factorization_prod_pow |
| 89 | + |
| 90 | +end Nat |
0 commit comments