Skip to content

Commit 034c50c

Browse files
committed
feat(Data/Nat/Factorization/Divisors): calculate divisors using prime factorization (#34554)
1 parent 6d1799a commit 034c50c

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4002,6 +4002,7 @@ public import Mathlib.Data.Nat.Factorial.NatCast
40024002
public import Mathlib.Data.Nat.Factorial.SuperFactorial
40034003
public import Mathlib.Data.Nat.Factorization.Basic
40044004
public import Mathlib.Data.Nat.Factorization.Defs
4005+
public import Mathlib.Data.Nat.Factorization.Divisors
40054006
public import Mathlib.Data.Nat.Factorization.Induction
40064007
public import Mathlib.Data.Nat.Factorization.LCM
40074008
public import Mathlib.Data.Nat.Factorization.PrimePow
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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

Comments
 (0)