11/-
22Copyright (c) 2025 Bhavik Mehta. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
4- Authors: Bhavik Mehta, Arend Mellendijk
4+ Authors: Bhavik Mehta, Arend Mellendijk, Jeremy Tan
55-/
66module
77
8+ public import Mathlib.Algebra.EuclideanDomain.Int
9+ public import Mathlib.Algebra.GCDMonoid.Nat
10+ public import Mathlib.Data.Nat.Prime.Int
811public import Mathlib.Data.Nat.PrimeFin
12+ public import Mathlib.RingTheory.PrincipalIdealDomain
913public import Mathlib.RingTheory.Radical.Basic
1014public import Mathlib.RingTheory.UniqueFactorizationDomain.Nat
1115
1216/-!
13- # The radical in `ℕ`
17+ # The radical in `ℕ` and `ℤ`
18+
19+ ## Declarations for `ℕ`
1420
1521- `UniqueFactorizationMonoid.primeFactors_eq_natPrimeFactors`: The prime factors of a natural number
1622 are the same as the prime factors defined in `Nat.primeFactors`.
23+ - `Nat.radical_eq_prod_primeFactors`: The radical is computable for natural numbers.
1724- `Nat.radical_le_self_iff`: if `n ≠ 0`, `radical n ≤ n`.
1825- `Nat.two_le_radical_iff`: `2 ≤ n.radical` iff `2 ≤ n`.
1926
20- ## TODO
27+ ## Declarations for `ℤ`
2128
22- Add declarations for `ℤ`.
29+ - `UniqueFactorizationMonoid.primeFactors_eq_primeFactors_natAbs`: The prime factors of an integer
30+ are the same as the prime factors of its absolute value.
31+ - `Int.radical_eq_prod_primeFactors`: The radical is computable for integers.
2332 -/
2433
2534@[expose] public section
2635
2736open UniqueFactorizationMonoid
2837
29- section Nat
38+ /-! ### Lemmas about natural numbers -/
3039
3140lemma UniqueFactorizationMonoid.primeFactors_eq_natPrimeFactors :
3241 primeFactors = Nat.primeFactors := by
@@ -37,25 +46,32 @@ lemma UniqueFactorizationMonoid.primeFactors_eq_natPrimeFactors :
3746
3847namespace Nat
3948
40- @[simp] theorem radical_le_self_iff {n : ℕ} : radical n ≤ n ↔ n ≠ 0 :=
41- ⟨by aesop, fun h ↦ Nat.le_of_dvd (by lia) radical_dvd_self⟩
49+ variable {n : ℕ}
50+
51+ lemma radical_eq_prod_primeFactors : radical n = ∏ p ∈ n.primeFactors, p := by
52+ simp [radical, primeFactors_eq_natPrimeFactors]
4253
43- @[simp] theorem two_le_radical_iff {n : ℕ} : 2 ≤ radical n ↔ 2 ≤ n := by
44- refine ⟨?_, ?_⟩
45- · match n with | 0 | 1 | _ + 2 => simp
46- · intro hn
47- obtain ⟨p, hp, hpn⟩ := Nat.exists_prime_and_dvd (show n ≠ 1 by lia)
48- trans p
49- · apply hp.two_le
50- · apply Nat.le_of_dvd (Nat.pos_of_ne_zero radical_ne_zero)
51- rwa [dvd_radical_iff_of_irreducible hp.prime.irreducible (by lia)]
54+ lemma radical_pos (n) : 0 < radical n := pos_of_ne_zero radical_ne_zero
5255
53- @[simp] theorem one_lt_radical_iff {n : ℕ} : 1 < radical n ↔ 1 < n := two_le_radical_iff
56+ @[simp] lemma one_lt_radical_iff : 1 < radical n ↔ 1 < n := by
57+ have pp (p) (h : p ∈ n.primeFactors) : 1 ≤ p := pos_of_mem_primeFactors h
58+ rw [radical_eq_prod_primeFactors, ← @nonempty_primeFactors n, Finset.one_lt_prod_iff_of_one_le pp]
59+ exact ⟨fun ⟨p, h⟩ ↦ ⟨p, h.1 ⟩, fun ⟨p, h⟩ ↦ ⟨p, h, (mem_primeFactors.mp h).1 .one_lt⟩⟩
5460
55- @[simp] theorem radical_le_one_iff {n : ℕ} : radical n ≤ 1 ↔ n ≤ 1 := by
61+ @[simp] lemma two_le_radical_iff : 2 ≤ radical n ↔ 2 ≤ n := one_lt_radical_iff
62+
63+ @[simp] lemma radical_le_one_iff : radical n ≤ 1 ↔ n ≤ 1 := by
5664 simpa only [not_lt] using one_lt_radical_iff.not
5765
58- theorem radical_pos (n : ℕ) : 0 < radical n := pos_of_ne_zero radical_ne_zero
66+ @[simp] lemma radical_eq_one_iff : radical n = 1 ↔ n ≤ 1 := by
67+ rw [← radical_le_one_iff]
68+ grind [radical_pos n]
69+
70+ @[simp] lemma radical_le_self_iff : radical n ≤ n ↔ n ≠ 0 :=
71+ ⟨by aesop, fun h ↦ Nat.le_of_dvd (by lia) radical_dvd_self⟩
72+
73+ @[simp] lemma self_lt_radical_iff : n < radical n ↔ n = 0 := by
74+ simpa only [not_le, not_not] using radical_le_self_iff.not
5975
6076open Qq Lean Mathlib.Meta Finset
6177
@@ -79,4 +95,50 @@ end Mathlib.Meta.Positivity
7995
8096end Nat
8197
82- end Nat
98+ /-! ### Lemmas about integers -/
99+
100+ variable {z : ℤ}
101+
102+ lemma UniqueFactorizationMonoid.primeFactors_eq_primeFactors_natAbs :
103+ primeFactors z = z.natAbs.primeFactors.map Nat.castEmbedding := by
104+ obtain rfl | hz := eq_or_ne z 0 ; · simp
105+ ext p
106+ rw [mem_primeFactors, mem_normalizedFactors_iff' hz, irreducible_iff_prime,
107+ Int.nonneg_iff_normalize_eq_self, Finset.mem_map, Function.Embedding.coeFn_mk]
108+ refine ⟨fun ⟨pp, nnp, dp⟩ ↦ ?_, fun h ↦ ?_⟩
109+ · lift p to ℕ using nnp
110+ rw [← Nat.prime_iff_prime_int] at pp
111+ rw [Int.natCast_dvd] at dp
112+ exact ⟨p, by simp_all, rfl⟩
113+ · simp_rw [Nat.mem_primeFactors, Function.Embedding.toFun_eq_coe, Nat.castEmbedding_apply] at h
114+ obtain ⟨n, ⟨pn, dn, -⟩, rfl⟩ := h
115+ rw [Int.natCast_dvd, ← Nat.prime_iff_prime_int]
116+ exact ⟨pn, by simp, dn⟩
117+
118+ namespace Int
119+
120+ @[simp] lemma radical_natAbs_eq_radical : radical z.natAbs = radical z := by
121+ rw [Nat.radical_eq_prod_primeFactors, radical]
122+ simp [primeFactors_eq_primeFactors_natAbs]
123+
124+ lemma radical_eq_prod_primeFactors : radical z = ∏ p ∈ z.natAbs.primeFactors, p := by
125+ rw [← radical_natAbs_eq_radical, Nat.radical_eq_prod_primeFactors]
126+
127+ lemma radical_pos (z : ℤ) : 0 < radical z := by
128+ rw [← radical_natAbs_eq_radical, natCast_pos]
129+ exact Nat.radical_pos _
130+
131+ @[simp] lemma one_lt_radical_iff : 1 < radical z ↔ 1 < z.natAbs := by
132+ rw [← radical_natAbs_eq_radical, Nat.one_lt_cast]
133+ exact Nat.one_lt_radical_iff
134+
135+ @[simp] lemma two_le_radical_iff : 2 ≤ radical z ↔ 2 ≤ z.natAbs := one_lt_radical_iff
136+
137+ @[simp] lemma radical_le_one_iff : radical z ≤ 1 ↔ z.natAbs ≤ 1 := by
138+ simpa only [not_lt] using one_lt_radical_iff.not
139+
140+ @[simp] lemma radical_eq_one_iff : radical z = 1 ↔ z.natAbs ≤ 1 := by
141+ rw [← radical_le_one_iff]
142+ grind [radical_pos z]
143+
144+ end Int
0 commit comments