Module docstring
{"# Prime numbers
This file contains some results about prime numbers which depend on finiteness of sets. "}
{"# Prime numbers
This file contains some results about prime numbers which depend on finiteness of sets. "}
Nat.infinite_setOf_prime
theorem
: {p | Prime p}.Infinite
/-- A version of `Nat.exists_infinite_primes` using the `Set.Infinite` predicate. -/
theorem infinite_setOf_prime : { p | Prime p }.Infinite :=
Set.infinite_of_not_bddAbove not_bddAbove_setOf_prime
Nat.Primes.infinite
instance
: Infinite Primes
instance Primes.infinite : Infinite Primes := infinite_setOf_prime.to_subtype
Nat.Primes.countable
instance
: Countable Primes
instance Primes.countable : Countable Primes := ⟨⟨coeNat.coe, coe_nat_injective⟩⟩
Nat.primeFactors
definition
(n : ℕ) : Finset ℕ
/-- The prime factors of a natural number as a finset. -/
def primeFactors (n : ℕ) : Finset ℕ := n.primeFactorsList.toFinset
Nat.toFinset_factors
theorem
(n : ℕ) : n.primeFactorsList.toFinset = n.primeFactors
@[simp] lemma toFinset_factors (n : ℕ) : n.primeFactorsList.toFinset = n.primeFactors := rfl
Nat.mem_primeFactors
theorem
: p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n ∧ n ≠ 0
Nat.mem_primeFactors_of_ne_zero
theorem
(hn : n ≠ 0) : p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n
lemma mem_primeFactors_of_ne_zero (hn : n ≠ 0) : p ∈ n.primeFactorsp ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n := by
simp [hn]
Nat.primeFactors_mono
theorem
(hmn : m ∣ n) (hn : n ≠ 0) : primeFactors m ⊆ primeFactors n
lemma primeFactors_mono (hmn : m ∣ n) (hn : n ≠ 0) : primeFactorsprimeFactors m ⊆ primeFactors n := by
simp only [subset_iff, mem_primeFactors, and_imp]
exact fun p hp hpm _ ↦ ⟨hp, hpm.trans hmn, hn⟩
Nat.mem_primeFactors_iff_mem_primeFactorsList
theorem
: p ∈ n.primeFactors ↔ p ∈ n.primeFactorsList
lemma mem_primeFactors_iff_mem_primeFactorsList : p ∈ n.primeFactorsp ∈ n.primeFactors ↔ p ∈ n.primeFactorsList := by
simp only [primeFactors, List.mem_toFinset]
Nat.prime_of_mem_primeFactors
theorem
(hp : p ∈ n.primeFactors) : p.Prime
lemma prime_of_mem_primeFactors (hp : p ∈ n.primeFactors) : p.Prime := (mem_primeFactors.1 hp).1
Nat.dvd_of_mem_primeFactors
theorem
(hp : p ∈ n.primeFactors) : p ∣ n
lemma dvd_of_mem_primeFactors (hp : p ∈ n.primeFactors) : p ∣ n := (mem_primeFactors.1 hp).2.1
Nat.pos_of_mem_primeFactors
theorem
(hp : p ∈ n.primeFactors) : 0 < p
lemma pos_of_mem_primeFactors (hp : p ∈ n.primeFactors) : 0 < p :=
(prime_of_mem_primeFactors hp).pos
Nat.le_of_mem_primeFactors
theorem
(h : p ∈ n.primeFactors) : p ≤ n
lemma le_of_mem_primeFactors (h : p ∈ n.primeFactors) : p ≤ n :=
le_of_dvd (mem_primeFactors.1 h).2.2.bot_lt <| dvd_of_mem_primeFactors h
Nat.primeFactors_zero
theorem
: primeFactors 0 = ∅
@[simp] lemma primeFactors_zero : primeFactors 0 = ∅ := by
ext
simp
Nat.primeFactors_one
theorem
: primeFactors 1 = ∅
@[simp] lemma primeFactors_one : primeFactors 1 = ∅ := by
ext
simpa using Prime.ne_one
Nat.primeFactors_eq_empty
theorem
: n.primeFactors = ∅ ↔ n = 0 ∨ n = 1
@[simp] lemma primeFactors_eq_empty : n.primeFactors = ∅ ↔ n = 0 ∨ n = 1 := by
constructor
· contrapose!
rintro hn
obtain ⟨p, hp, hpn⟩ := exists_prime_and_dvd hn.2
exact Nonempty.ne_empty <| ⟨_, mem_primeFactors.2 ⟨hp, hpn, hn.1⟩⟩
· rintro (rfl | rfl) <;> simp
Nat.nonempty_primeFactors
theorem
{n : ℕ} : n.primeFactors.Nonempty ↔ 1 < n
@[simp]
lemma nonempty_primeFactors {n : ℕ} : n.primeFactors.Nonempty ↔ 1 < n := by
rw [← not_iff_not, Finset.not_nonempty_iff_eq_empty, primeFactors_eq_empty, not_lt,
Nat.le_one_iff_eq_zero_or_eq_one]
Nat.Prime.primeFactors
theorem
(hp : p.Prime) : p.primeFactors = { p }
@[simp] protected lemma Prime.primeFactors (hp : p.Prime) : p.primeFactors = {p} := by
simp [Nat.primeFactors, primeFactorsList_prime hp]
Nat.primeFactors_mul
theorem
(ha : a ≠ 0) (hb : b ≠ 0) : (a * b).primeFactors = a.primeFactors ∪ b.primeFactors
lemma primeFactors_mul (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).primeFactors = a.primeFactors ∪ b.primeFactors := by
ext; simp only [Finset.mem_union, mem_primeFactors_iff_mem_primeFactorsList,
mem_primeFactorsList_mul ha hb]
Nat.Coprime.primeFactors_mul
theorem
{a b : ℕ} (hab : Coprime a b) : (a * b).primeFactors = a.primeFactors ∪ b.primeFactors
lemma Coprime.primeFactors_mul {a b : ℕ} (hab : Coprime a b) :
(a * b).primeFactors = a.primeFactors ∪ b.primeFactors :=
(List.toFinset.ext <| mem_primeFactorsList_mul_of_coprime hab).trans <| List.toFinset_union _ _
Nat.primeFactors_gcd
theorem
(ha : a ≠ 0) (hb : b ≠ 0) : (a.gcd b).primeFactors = a.primeFactors ∩ b.primeFactors
lemma primeFactors_gcd (ha : a ≠ 0) (hb : b ≠ 0) :
(a.gcd b).primeFactors = a.primeFactors ∩ b.primeFactors := by
ext; simp [dvd_gcd_iff, ha, hb, gcd_ne_zero_left ha]; aesop
Nat.disjoint_primeFactors
theorem
(ha : a ≠ 0) (hb : b ≠ 0) : Disjoint a.primeFactors b.primeFactors ↔ Coprime a b
@[simp] lemma disjoint_primeFactors (ha : a ≠ 0) (hb : b ≠ 0) :
DisjointDisjoint a.primeFactors b.primeFactors ↔ Coprime a b := by
simp [disjoint_iff_inter_eq_empty, coprime_iff_gcd_eq_one, ← primeFactors_gcd, gcd_ne_zero_left,
ha, hb]
Nat.Coprime.disjoint_primeFactors
theorem
(hab : Coprime a b) : Disjoint a.primeFactors b.primeFactors
protected lemma Coprime.disjoint_primeFactors (hab : Coprime a b) :
Disjoint a.primeFactors b.primeFactors :=
List.disjoint_toFinset_iff_disjoint.2 <| coprime_primeFactorsList_disjoint hab
Nat.primeFactors_pow_succ
theorem
(n k : ℕ) : (n ^ (k + 1)).primeFactors = n.primeFactors
lemma primeFactors_pow_succ (n k : ℕ) : (n ^ (k + 1)).primeFactors = n.primeFactors := by
rcases eq_or_ne n 0 with (rfl | hn)
· simp
induction' k with k ih
· simp
· rw [pow_succ', primeFactors_mul hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
Nat.primeFactors_pow
theorem
(n : ℕ) (hk : k ≠ 0) : (n ^ k).primeFactors = n.primeFactors
lemma primeFactors_pow (n : ℕ) (hk : k ≠ 0) : (n ^ k).primeFactors = n.primeFactors := by
cases k
· simp at hk
rw [primeFactors_pow_succ]
Nat.primeFactors_prime_pow
theorem
(hk : k ≠ 0) (hp : Prime p) : (p ^ k).primeFactors = { p }
/-- The only prime divisor of positive prime power `p^k` is `p` itself -/
lemma primeFactors_prime_pow (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).primeFactors = {p} := by simp [primeFactors_pow p hk, hp]