data.nat.prime_fin
⟷
Mathlib.Data.Nat.PrimeFin
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -43,7 +43,7 @@ theorem primeFactors_pow_succ (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.f
· simp
induction' k with k ih
· simp
- rw [pow_succ, factors_mul_to_finset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
+ rw [pow_succ', factors_mul_to_finset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
#align nat.pow_succ_factors_to_finset Nat.primeFactors_pow_succ
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -27,48 +27,48 @@ theorem infinite_setOf_prime : {p | Prime p}.Infinite :=
#align nat.infinite_set_of_prime Nat.infinite_setOf_prime
-/
-#print Nat.factors_mul_toFinset /-
+#print Nat.primeFactors_mul /-
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
-theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
+theorem primeFactors_mul {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext fun x => (mem_factors_mul ha hb).trans List.mem_union_iff.symm).trans <|
List.toFinset_union _ _
-#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
+#align nat.factors_mul_to_finset Nat.primeFactors_mul
-/
-#print Nat.pow_succ_factors_toFinset /-
-theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.factors.toFinset :=
+#print Nat.primeFactors_pow_succ /-
+theorem primeFactors_pow_succ (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.factors.toFinset :=
by
rcases eq_or_ne n 0 with (rfl | hn)
· simp
induction' k with k ih
· simp
rw [pow_succ, factors_mul_to_finset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
-#align nat.pow_succ_factors_to_finset Nat.pow_succ_factors_toFinset
+#align nat.pow_succ_factors_to_finset Nat.primeFactors_pow_succ
-/
-#print Nat.pow_factors_toFinset /-
-theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
+#print Nat.primeFactors_pow /-
+theorem primeFactors_pow (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
(n ^ k).factors.toFinset = n.factors.toFinset :=
by
cases k
· simpa using hk
rw [pow_succ_factors_to_finset]
-#align nat.pow_factors_to_finset Nat.pow_factors_toFinset
+#align nat.pow_factors_to_finset Nat.primeFactors_pow
-/
-#print Nat.prime_pow_prime_divisor /-
+#print Nat.primeFactors_prime_pow /-
/-- The only prime divisor of positive prime power `p^k` is `p` itself -/
-theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
+theorem primeFactors_prime_pow {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_to_finset p hk, factors_prime hp]
-#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
+#align nat.prime_pow_prime_divisor Nat.primeFactors_prime_pow
-/
-#print Nat.factors_mul_toFinset_of_coprime /-
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
+#print Nat.Coprime.primeFactors_mul /-
+theorem Nat.Coprime.primeFactors_mul {a b : ℕ} (hab : Coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
-#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
+#align nat.factors_mul_to_finset_of_coprime Nat.Coprime.primeFactors_mul
-/
end Nat
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Jeremy Avigad, Mario Carneiro
-/
-import Mathbin.Data.Nat.Factors
-import Mathbin.Data.Set.Finite
+import Data.Nat.Factors
+import Data.Set.Finite
#align_import data.nat.prime_fin from "leanprover-community/mathlib"@"327c3c0d9232d80e250dc8f65e7835b82b266ea5"
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -65,7 +65,7 @@ theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
-/
#print Nat.factors_mul_toFinset_of_coprime /-
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
+theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -31,7 +31,7 @@ theorem infinite_setOf_prime : {p | Prime p}.Infinite :=
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
- (List.toFinset.ext fun x => (mem_factors_mul ha hb).trans List.mem_union.symm).trans <|
+ (List.toFinset.ext fun x => (mem_factors_mul ha hb).trans List.mem_union_iff.symm).trans <|
List.toFinset_union _ _
#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Jeremy Avigad, Mario Carneiro
-
-! This file was ported from Lean 3 source module data.nat.prime_fin
-! leanprover-community/mathlib commit 327c3c0d9232d80e250dc8f65e7835b82b266ea5
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Data.Nat.Factors
import Mathbin.Data.Set.Finite
+#align_import data.nat.prime_fin from "leanprover-community/mathlib"@"327c3c0d9232d80e250dc8f65e7835b82b266ea5"
+
/-!
# Prime numbers
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -30,13 +30,16 @@ theorem infinite_setOf_prime : {p | Prime p}.Infinite :=
#align nat.infinite_set_of_prime Nat.infinite_setOf_prime
-/
+#print Nat.factors_mul_toFinset /-
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext fun x => (mem_factors_mul ha hb).trans List.mem_union.symm).trans <|
List.toFinset_union _ _
#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
+-/
+#print Nat.pow_succ_factors_toFinset /-
theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.factors.toFinset :=
by
rcases eq_or_ne n 0 with (rfl | hn)
@@ -45,7 +48,9 @@ theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset =
· simp
rw [pow_succ, factors_mul_to_finset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
#align nat.pow_succ_factors_to_finset Nat.pow_succ_factors_toFinset
+-/
+#print Nat.pow_factors_toFinset /-
theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
(n ^ k).factors.toFinset = n.factors.toFinset :=
by
@@ -53,16 +58,21 @@ theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
· simpa using hk
rw [pow_succ_factors_to_finset]
#align nat.pow_factors_to_finset Nat.pow_factors_toFinset
+-/
+#print Nat.prime_pow_prime_divisor /-
/-- The only prime divisor of positive prime power `p^k` is `p` itself -/
theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_to_finset p hk, factors_prime hp]
#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
+-/
+#print Nat.factors_mul_toFinset_of_coprime /-
theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
+-/
end Nat
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -25,7 +25,7 @@ namespace Nat
#print Nat.infinite_setOf_prime /-
/-- A version of `nat.exists_infinite_primes` using the `set.infinite` predicate. -/
-theorem infinite_setOf_prime : { p | Prime p }.Infinite :=
+theorem infinite_setOf_prime : {p | Prime p}.Infinite :=
Set.infinite_of_not_bddAbove not_bddAbove_setOf_prime
#align nat.infinite_set_of_prime Nat.infinite_setOf_prime
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -30,12 +30,6 @@ theorem infinite_setOf_prime : { p | Prime p }.Infinite :=
#align nat.infinite_set_of_prime Nat.infinite_setOf_prime
-/
-/- warning: nat.factors_mul_to_finset -> Nat.factors_mul_toFinset is a dubious translation:
-lean 3 declaration is
- forall {a : Nat} {b : Nat}, (Ne.{1} Nat a (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) -> (Ne.{1} Nat b (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) a b))) (Union.union.{0} (Finset.{0} Nat) (Finset.hasUnion.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors a)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors b))))
-but is expected to have type
- forall {a : Nat} {b : Nat}, (Ne.{1} Nat a (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) -> (Ne.{1} Nat b (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) a b))) (Union.union.{0} (Finset.{0} Nat) (Finset.instUnionFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors a)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors b))))
-Case conversion may be inaccurate. Consider using '#align nat.factors_mul_to_finset Nat.factors_mul_toFinsetₓ'. -/
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
@@ -43,12 +37,6 @@ theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
List.toFinset_union _ _
#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
-/- warning: nat.pow_succ_factors_to_finset -> Nat.pow_succ_factors_toFinset is a dubious translation:
-lean 3 declaration is
- forall (n : Nat) (k : Nat), Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) n (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) k (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne))))))) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors n))
-but is expected to have type
- forall (n : Nat) (k : Nat), Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) n (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) k (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1)))))) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors n))
-Case conversion may be inaccurate. Consider using '#align nat.pow_succ_factors_to_finset Nat.pow_succ_factors_toFinsetₓ'. -/
theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.factors.toFinset :=
by
rcases eq_or_ne n 0 with (rfl | hn)
@@ -58,12 +46,6 @@ theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset =
rw [pow_succ, factors_mul_to_finset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
#align nat.pow_succ_factors_to_finset Nat.pow_succ_factors_toFinset
-/- warning: nat.pow_factors_to_finset -> Nat.pow_factors_toFinset is a dubious translation:
-lean 3 declaration is
- forall (n : Nat) {k : Nat}, (Ne.{1} Nat k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) n k))) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors n)))
-but is expected to have type
- forall (n : Nat) {k : Nat}, (Ne.{1} Nat k (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) n k))) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors n)))
-Case conversion may be inaccurate. Consider using '#align nat.pow_factors_to_finset Nat.pow_factors_toFinsetₓ'. -/
theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
(n ^ k).factors.toFinset = n.factors.toFinset :=
by
@@ -72,23 +54,11 @@ theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
rw [pow_succ_factors_to_finset]
#align nat.pow_factors_to_finset Nat.pow_factors_toFinset
-/- warning: nat.prime_pow_prime_divisor -> Nat.prime_pow_prime_divisor is a dubious translation:
-lean 3 declaration is
- forall {p : Nat} {k : Nat}, (Ne.{1} Nat k (OfNat.ofNat.{0} Nat 0 (OfNat.mk.{0} Nat 0 (Zero.zero.{0} Nat Nat.hasZero)))) -> (Nat.Prime p) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat (Monoid.Pow.{0} Nat Nat.monoid)) p k))) (Singleton.singleton.{0, 0} Nat (Finset.{0} Nat) (Finset.hasSingleton.{0} Nat) p))
-but is expected to have type
- forall {p : Nat} {k : Nat}, (Ne.{1} Nat k (OfNat.ofNat.{0} Nat 0 (instOfNatNat 0))) -> (Nat.Prime p) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors (HPow.hPow.{0, 0, 0} Nat Nat Nat (instHPow.{0, 0} Nat Nat instPowNat) p k))) (Singleton.singleton.{0, 0} Nat (Finset.{0} Nat) (Finset.instSingletonFinset.{0} Nat) p))
-Case conversion may be inaccurate. Consider using '#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisorₓ'. -/
/-- The only prime divisor of positive prime power `p^k` is `p` itself -/
theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_to_finset p hk, factors_prime hp]
#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
-/- warning: nat.factors_mul_to_finset_of_coprime -> Nat.factors_mul_toFinset_of_coprime is a dubious translation:
-lean 3 declaration is
- forall {a : Nat} {b : Nat}, (Nat.coprime a b) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) a b))) (Union.union.{0} (Finset.{0} Nat) (Finset.hasUnion.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors a)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => Nat.decidableEq a b) (Nat.factors b))))
-but is expected to have type
- forall {a : Nat} {b : Nat}, (Nat.coprime a b) -> (Eq.{1} (Finset.{0} Nat) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) a b))) (Union.union.{0} (Finset.{0} Nat) (Finset.instUnionFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors a)) (List.toFinset.{0} Nat (fun (a : Nat) (b : Nat) => instDecidableEqNat a b) (Nat.factors b))))
-Case conversion may be inaccurate. Consider using '#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprimeₓ'. -/
theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -54,7 +54,7 @@ lemma pos_of_mem_primeFactors (hp : p ∈ n.primeFactors) : 0 < p :=
(prime_of_mem_primeFactors hp).pos
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
+ le_of_dvd (mem_primeFactors.1 h).2.2.bot_lt <| dvd_of_mem_primeFactors h
@[simp] lemma primeFactors_zero : primeFactors 0 = ∅ := rfl
@[simp] lemma primeFactors_one : primeFactors 1 = ∅ := rfl
@@ -64,7 +64,7 @@ lemma le_of_mem_primeFactors (h : p ∈ n.primeFactors) : p ≤ n :=
· contrapose!
rintro hn
obtain ⟨p, hp, hpn⟩ := exists_prime_and_dvd hn.2
- exact Nonempty.ne_empty $ ⟨_, mem_primeFactors.2 ⟨hp, hpn, hn.1⟩⟩
+ exact Nonempty.ne_empty <| ⟨_, mem_primeFactors.2 ⟨hp, hpn, hn.1⟩⟩
· rintro (rfl | rfl) <;> simp
@[simp]
@@ -96,7 +96,7 @@ lemma primeFactors_gcd (ha : a ≠ 0) (hb : b ≠ 0) :
protected lemma Coprime.disjoint_primeFactors (hab : Coprime a b) :
Disjoint a.primeFactors b.primeFactors :=
- List.disjoint_toFinset_iff_disjoint.2 $ coprime_factors_disjoint hab
+ List.disjoint_toFinset_iff_disjoint.2 <| coprime_factors_disjoint hab
lemma primeFactors_pow_succ (n k : ℕ) : (n ^ (k + 1)).primeFactors = n.primeFactors := by
rcases eq_or_ne n 0 with (rfl | hn)
@@ -67,6 +67,11 @@ lemma le_of_mem_primeFactors (h : p ∈ n.primeFactors) : p ≤ n :=
exact Nonempty.ne_empty $ ⟨_, mem_primeFactors.2 ⟨hp, hpn, hn.1⟩⟩
· rintro (rfl | rfl) <;> simp
+@[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]
+
@[simp] protected lemma Prime.primeFactors (hp : p.Prime) : p.primeFactors = {p} := by
simp [Nat.primeFactors, factors_prime hp]
@@ -35,7 +35,7 @@ instance Primes.countable : Countable Primes := ⟨⟨coeNat.coe, coe_nat_inject
@[simp] lemma toFinset_factors (n : ℕ) : n.factors.toFinset = n.primeFactors := rfl
@[simp] lemma mem_primeFactors : p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n ∧ n ≠ 0 := by
- simp_rw [←toFinset_factors, List.mem_toFinset, mem_factors']
+ simp_rw [← toFinset_factors, List.mem_toFinset, mem_factors']
lemma mem_primeFactors_of_ne_zero (hn : n ≠ 0) : p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n := by
simp [hn]
@@ -86,7 +86,7 @@ lemma primeFactors_gcd (ha : a ≠ 0) (hb : b ≠ 0) :
@[simp] lemma disjoint_primeFactors (ha : a ≠ 0) (hb : b ≠ 0) :
Disjoint 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,
+ simp [disjoint_iff_inter_eq_empty, coprime_iff_gcd_eq_one, ← primeFactors_gcd, gcd_ne_zero_left,
ha, hb]
protected lemma Coprime.disjoint_primeFactors (hab : Coprime a b) :
@@ -57,7 +57,7 @@ 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
@[simp] lemma primeFactors_zero : primeFactors 0 = ∅ := rfl
-@[simp] lemma primeFactors_one : primeFactors 0 = ∅ := rfl
+@[simp] lemma primeFactors_one : primeFactors 1 = ∅ := rfl
@[simp] lemma primeFactors_eq_empty : n.primeFactors = ∅ ↔ n = 0 ∨ n = 1 := by
constructor
mathlib can't make up its mind on whether to spell "the prime factors of n
" as n.factors.toFinset
or n.factorization.support
, even though those two are defeq. This PR proposes to unify everything to a new definition Nat.primeFactors
, and streamline the existing scattered API about n.factors.toFinset
and n.factorization.support
to Nat.primeFactors
. We also get to write a bit more API that didn't make sense before, eg primeFactors_mono
.
@@ -15,8 +15,10 @@ import Mathlib.Data.Set.Finite
This file contains some results about prime numbers which depend on finiteness of sets.
-/
+open Finset
namespace Nat
+variable {a b k m n p : ℕ}
/-- A version of `Nat.exists_infinite_primes` using the `Set.Infinite` predicate. -/
theorem infinite_setOf_prime : { p | Prime p }.Infinite :=
@@ -27,37 +29,87 @@ instance Primes.infinite : Infinite Primes := infinite_setOf_prime.to_subtype
instance Primes.countable : Countable Primes := ⟨⟨coeNat.coe, coe_nat_injective⟩⟩
-/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
-theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
- (a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
- (List.toFinset.ext fun _ => (mem_factors_mul ha hb).trans List.mem_union_iff.symm).trans <|
- List.toFinset_union _ _
-#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
+/-- The prime factors of a natural number as a finset. -/
+@[pp_dot] def primeFactors (n : ℕ) : Finset ℕ := n.factors.toFinset
-theorem pow_succ_factors_toFinset (n k : ℕ) :
- (n ^ (k + 1)).factors.toFinset = n.factors.toFinset := by
+@[simp] lemma toFinset_factors (n : ℕ) : n.factors.toFinset = n.primeFactors := rfl
+
+@[simp] lemma mem_primeFactors : p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n ∧ n ≠ 0 := by
+ simp_rw [←toFinset_factors, List.mem_toFinset, mem_factors']
+
+lemma mem_primeFactors_of_ne_zero (hn : n ≠ 0) : p ∈ n.primeFactors ↔ p.Prime ∧ p ∣ n := by
+ simp [hn]
+
+lemma primeFactors_mono (hmn : m ∣ n) (hn : n ≠ 0) : primeFactors m ⊆ primeFactors n := by
+ simp only [subset_iff, mem_primeFactors, and_imp]
+ exact fun p hp hpm _ ↦ ⟨hp, hpm.trans hmn, hn⟩
+
+lemma mem_primeFactors_iff_mem_factors : p ∈ n.primeFactors ↔ p ∈ n.factors := by
+ simp only [primeFactors, List.mem_toFinset]
+
+lemma prime_of_mem_primeFactors (hp : p ∈ n.primeFactors) : p.Prime := (mem_primeFactors.1 hp).1
+lemma dvd_of_mem_primeFactors (hp : p ∈ n.primeFactors) : p ∣ n := (mem_primeFactors.1 hp).2.1
+
+lemma pos_of_mem_primeFactors (hp : p ∈ n.primeFactors) : 0 < p :=
+ (prime_of_mem_primeFactors hp).pos
+
+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
+
+@[simp] lemma primeFactors_zero : primeFactors 0 = ∅ := rfl
+@[simp] lemma primeFactors_one : primeFactors 0 = ∅ := rfl
+
+@[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
+
+@[simp] protected lemma Prime.primeFactors (hp : p.Prime) : p.primeFactors = {p} := by
+ simp [Nat.primeFactors, factors_prime hp]
+
+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_factors, mem_factors_mul ha hb]
+#align nat.factors_mul_to_finset Nat.primeFactors_mul
+
+lemma Coprime.primeFactors_mul {a b : ℕ} (hab : Coprime a b) :
+ (a * b).primeFactors = a.primeFactors ∪ b.primeFactors :=
+ (List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
+#align nat.factors_mul_to_finset_of_coprime Nat.Coprime.primeFactors_mul
+
+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
+
+@[simp] lemma disjoint_primeFactors (ha : a ≠ 0) (hb : b ≠ 0) :
+ Disjoint 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]
+
+protected lemma Coprime.disjoint_primeFactors (hab : Coprime a b) :
+ Disjoint a.primeFactors b.primeFactors :=
+ List.disjoint_toFinset_iff_disjoint.2 $ coprime_factors_disjoint hab
+
+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', factors_mul_toFinset hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
-#align nat.pow_succ_factors_to_finset Nat.pow_succ_factors_toFinset
+ · rw [pow_succ', primeFactors_mul hn (pow_ne_zero _ hn), ih, Finset.union_idempotent]
+#align nat.pow_succ_factors_to_finset Nat.primeFactors_pow_succ
-theorem pow_factors_toFinset (n : ℕ) {k : ℕ} (hk : k ≠ 0) :
- (n ^ k).factors.toFinset = n.factors.toFinset := by
+lemma primeFactors_pow (n : ℕ) (hk : k ≠ 0) : (n ^ k).primeFactors = n.primeFactors := by
cases k
· simp at hk
- rw [pow_succ_factors_toFinset]
-#align nat.pow_factors_to_finset Nat.pow_factors_toFinset
+ rw [primeFactors_pow_succ]
+#align nat.pow_factors_to_finset Nat.primeFactors_pow
/-- The only prime divisor of positive prime power `p^k` is `p` itself -/
-theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
- (p ^ k).factors.toFinset = {p} := by simp [pow_factors_toFinset p hk, factors_prime hp]
-#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
-
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
- (a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
- (List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
-#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
+lemma primeFactors_prime_pow (hk : k ≠ 0) (hp : Prime p) :
+ (p ^ k).primeFactors = {p} := by simp [primeFactors_pow p hk, hp]
+#align nat.prime_pow_prime_divisor Nat.primeFactors_prime_pow
end Nat
@@ -55,7 +55,7 @@ theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_toFinset p hk, factors_prime hp]
#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
+theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
@@ -55,7 +55,7 @@ theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_toFinset p hk, factors_prime hp]
#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
+theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
Some changes have already been review and delegated in #6910 and #7148.
The diff that needs looking at is https://github.com/leanprover-community/mathlib4/pull/7174/commits/64d6d07ee18163627c8f517eb31455411921c5ac
The std bump PR was insta-merged already!
Co-authored-by: leanprover-community-mathlib4-bot <leanprover-community-mathlib4-bot@users.noreply.github.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -55,7 +55,7 @@ theorem prime_pow_prime_divisor {p k : ℕ} (hk : k ≠ 0) (hp : Prime p) :
(p ^ k).factors.toFinset = {p} := by simp [pow_factors_toFinset p hk, factors_prime hp]
#align nat.prime_pow_prime_divisor Nat.prime_pow_prime_divisor
-theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : coprime a b) :
+theorem factors_mul_toFinset_of_coprime {a b : ℕ} (hab : Coprime a b) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
(List.toFinset.ext <| mem_factors_mul_of_coprime hab).trans <| List.toFinset_union _ _
#align nat.factors_mul_to_finset_of_coprime Nat.factors_mul_toFinset_of_coprime
Notably there is now a l1 ∪ l2
notation for List.union
.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Bulhwi Cha <chabulhwi@semmalgil.com>
@@ -30,7 +30,7 @@ instance Primes.countable : Countable Primes := ⟨⟨coeNat.coe, coe_nat_inject
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
- (List.toFinset.ext fun _ => (mem_factors_mul ha hb).trans List.mem_union.symm).trans <|
+ (List.toFinset.ext fun _ => (mem_factors_mul ha hb).trans List.mem_union_iff.symm).trans <|
List.toFinset_union _ _
#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
Nat.Primes
(#6238)
The type of prime numbers is infinite and countable.
@@ -3,6 +3,7 @@ Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Jeremy Avigad, Mario Carneiro
-/
+import Mathlib.Data.Countable.Defs
import Mathlib.Data.Nat.Factors
import Mathlib.Data.Set.Finite
@@ -22,6 +23,10 @@ theorem infinite_setOf_prime : { p | Prime p }.Infinite :=
Set.infinite_of_not_bddAbove not_bddAbove_setOf_prime
#align nat.infinite_set_of_prime Nat.infinite_setOf_prime
+instance Primes.infinite : Infinite Primes := infinite_setOf_prime.to_subtype
+
+instance Primes.countable : Countable Primes := ⟨⟨coeNat.coe, coe_nat_injective⟩⟩
+
/-- If `a`, `b` are positive, the prime divisors of `a * b` are the union of those of `a` and `b` -/
theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
(a * b).factors.toFinset = a.factors.toFinset ∪ b.factors.toFinset :=
@@ -2,15 +2,12 @@
Copyright (c) 2015 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Jeremy Avigad, Mario Carneiro
-
-! This file was ported from Lean 3 source module data.nat.prime_fin
-! leanprover-community/mathlib commit d6fad0e5bf2d6f48da9175d25c3dc5706b3834ce
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Data.Nat.Factors
import Mathlib.Data.Set.Finite
+#align_import data.nat.prime_fin from "leanprover-community/mathlib"@"d6fad0e5bf2d6f48da9175d25c3dc5706b3834ce"
+
/-!
# Prime numbers
by
s! (#3825)
This PR puts, with one exception, every single remaining by
that lies all by itself on its own line to the previous line, thus matching the current behaviour of start-port.sh
. The exception is when the by
begins the second or later argument to a tuple or anonymous constructor; see https://github.com/leanprover-community/mathlib4/pull/3825#discussion_r1186702599.
Essentially this is s/\n *by$/ by/g
, but with manual editing to satisfy the linter's max-100-char-line requirement. The Python style linter is also modified to catch these "isolated by
s".
@@ -32,8 +32,8 @@ theorem factors_mul_toFinset {a b : ℕ} (ha : a ≠ 0) (hb : b ≠ 0) :
List.toFinset_union _ _
#align nat.factors_mul_to_finset Nat.factors_mul_toFinset
-theorem pow_succ_factors_toFinset (n k : ℕ) : (n ^ (k + 1)).factors.toFinset = n.factors.toFinset :=
- by
+theorem pow_succ_factors_toFinset (n k : ℕ) :
+ (n ^ (k + 1)).factors.toFinset = n.factors.toFinset := by
rcases eq_or_ne n 0 with (rfl | hn)
· simp
induction' k with k ih
The unported dependencies are