Skip to content

Commit 83f6619

Browse files
committed
feat: radical lemmas for natural numbers and integers (leanprover-community#35673)
These are needed as part of a project I'm doing for my PhD under Frank Stephan. Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
1 parent 40710e1 commit 83f6619

File tree

3 files changed

+88
-20
lines changed

3 files changed

+88
-20
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6511,6 +6511,7 @@ public import Mathlib.RingTheory.QuasiFinite.Basic
65116511
public import Mathlib.RingTheory.QuasiFinite.Polynomial
65126512
public import Mathlib.RingTheory.QuasiFinite.Weakly
65136513
public import Mathlib.RingTheory.QuotSMulTop
6514+
public import Mathlib.RingTheory.Radical
65146515
public import Mathlib.RingTheory.Radical.Basic
65156516
public import Mathlib.RingTheory.Radical.NatInt
65166517
public import Mathlib.RingTheory.ReesAlgebra

Mathlib/RingTheory/Radical.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module -- shake: keep-all
2+
3+
public import Mathlib.RingTheory.Radical.NatInt
4+
5+
deprecated_module (since := "2026-03-04")
Lines changed: 82 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,41 @@
11
/-
22
Copyright (c) 2025 Bhavik Mehta. All rights reserved.
33
Released 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
-/
66
module
77

8+
public import Mathlib.Algebra.EuclideanDomain.Int
9+
public import Mathlib.Algebra.GCDMonoid.Nat
10+
public import Mathlib.Data.Nat.Prime.Int
811
public import Mathlib.Data.Nat.PrimeFin
12+
public import Mathlib.RingTheory.PrincipalIdealDomain
913
public import Mathlib.RingTheory.Radical.Basic
1014
public 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

2736
open UniqueFactorizationMonoid
2837

29-
section Nat
38+
/-! ### Lemmas about natural numbers -/
3039

3140
lemma UniqueFactorizationMonoid.primeFactors_eq_natPrimeFactors :
3241
primeFactors = Nat.primeFactors := by
@@ -37,25 +46,32 @@ lemma UniqueFactorizationMonoid.primeFactors_eq_natPrimeFactors :
3746

3847
namespace 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

6076
open Qq Lean Mathlib.Meta Finset
6177

@@ -79,4 +95,50 @@ end Mathlib.Meta.Positivity
7995

8096
end 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

Comments
 (0)