@@ -3,7 +3,7 @@ Copyright (c) 2015 Microsoft Corporation. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Leonardo de Moura, Jeremy Avigad, Mario Carneiro
5
5
-/
6
- import algebra.associated
6
+ import data.list.prime
7
7
import data.list.sort
8
8
import data.nat.gcd
9
9
import data.nat.sqrt
@@ -538,28 +538,6 @@ theorem prime_iff {p : ℕ} : p.prime ↔ _root_.prime p :=
538
538
theorem irreducible_iff_prime {p : ℕ} : irreducible p ↔ _root_.prime p :=
539
539
by rw [←prime_iff, prime]
540
540
541
- /-- Prime `p` divides the product of `L : list ℕ` iff it divides some `a ∈ L` -/
542
- lemma prime.dvd_prod_iff {p : ℕ} {L : list ℕ} (pp : p.prime) :
543
- p ∣ L.prod ↔ ∃ a ∈ L, p ∣ a :=
544
- begin
545
- split,
546
- { intros h,
547
- induction L,
548
- { simp only [list.prod_nil] at h, exact absurd h (prime.not_dvd_one pp) },
549
- { rw list.prod_cons at h,
550
- cases (prime.dvd_mul pp).mp h,
551
- { use L_hd, simp [h_1] },
552
- { rcases L_ih h_1 with ⟨x, hx1, hx2⟩, use x, simp [list.mem_cons_iff, hx1, hx2] } } },
553
- { exact λ ⟨a, ha1, ha2⟩, dvd_trans ha2 (list.dvd_prod ha1) },
554
- end
555
- -- TODO: This proof duplicates a more general proof in `algebra/associated`.
556
- -- The two proofs should be integrated after the merger of `nat.prime` and `prime`
557
- -- that's about to occur. (2021-12-17)
558
-
559
- lemma prime.not_dvd_prod {p : ℕ} {L : list ℕ} (pp : prime p) (hL : ∀ a ∈ L, ¬ p ∣ a) :
560
- ¬ p ∣ L.prod :=
561
- mt (prime.dvd_prod_iff pp).mp (not_bex.mpr hL)
562
-
563
541
theorem prime.dvd_of_dvd_pow {p m n : ℕ} (pp : prime p) (h : p ∣ m^n) : p ∣ m :=
564
542
begin
565
543
induction n with n IH,
@@ -723,17 +701,12 @@ by simpa using not_iff_not.mpr ne_one_iff_exists_prime_dvd
723
701
section
724
702
open list
725
703
726
- lemma mem_list_primes_of_dvd_prod {p : ℕ} (hp : prime p) :
727
- ∀ {l : list ℕ}, (∀ p ∈ l, prime p) → p ∣ prod l → p ∈ l :=
728
- begin
729
- intros L hL hpL,
730
- rcases (prime.dvd_prod_iff hp).mp hpL with ⟨x, hx1, hx2⟩,
731
- rwa ((prime_dvd_prime_iff_eq hp (hL x hx1)).mp hx2)
732
- end
733
-
734
704
lemma mem_factors_iff_dvd {n p : ℕ} (hn : 0 < n) (hp : prime p) : p ∈ factors n ↔ p ∣ n :=
735
705
⟨λ h, prod_factors hn ▸ list.dvd_prod h,
736
- λ h, mem_list_primes_of_dvd_prod hp (@prime_of_mem_factors n) ((prod_factors hn).symm ▸ h)⟩
706
+ λ h, mem_list_primes_of_dvd_prod
707
+ (prime_iff.mp hp)
708
+ (λ p h, prime_iff.mp (prime_of_mem_factors h))
709
+ ((prod_factors hn).symm ▸ h)⟩
737
710
738
711
lemma dvd_of_mem_factors {n p : ℕ} (h : p ∈ n.factors) : p ∣ n :=
739
712
begin
@@ -746,36 +719,18 @@ lemma mem_factors {n p} (hn : 0 < n) : p ∈ factors n ↔ prime p ∧ p ∣ n :
746
719
⟨λ h, ⟨prime_of_mem_factors h, (mem_factors_iff_dvd hn $ prime_of_mem_factors h).mp h⟩,
747
720
λ ⟨hprime, hdvd⟩, (mem_factors_iff_dvd hn hprime).mpr hdvd⟩
748
721
749
- lemma perm_of_prod_eq_prod : ∀ {l₁ l₂ : list ℕ}, prod l₁ = prod l₂ →
750
- (∀ p ∈ l₁, prime p) → (∀ p ∈ l₂, prime p) → l₁ ~ l₂
751
- | [] [] _ _ _ := perm.nil
752
- | [] (a :: l) h₁ h₂ h₃ :=
753
- have ha : a ∣ 1 := @prod_nil ℕ _ ▸ h₁.symm ▸ (@prod_cons _ _ l a).symm ▸ dvd_mul_right _ _,
754
- absurd ha (prime.not_dvd_one (h₃ a (mem_cons_self _ _)))
755
- | (a :: l) [] h₁ h₂ h₃ :=
756
- have ha : a ∣ 1 := @prod_nil ℕ _ ▸ h₁ ▸ (@prod_cons _ _ l a).symm ▸ dvd_mul_right _ _,
757
- absurd ha (prime.not_dvd_one (h₂ a (mem_cons_self _ _)))
758
- | (a :: l₁) (b :: l₂) h hl₁ hl₂ :=
759
- have hl₁' : ∀ p ∈ l₁, prime p := λ p hp, hl₁ p (mem_cons_of_mem _ hp),
760
- have hl₂' : ∀ p ∈ (b :: l₂).erase a, prime p := λ p hp, hl₂ p (mem_of_mem_erase hp),
761
- have ha : a ∈ (b :: l₂) := mem_list_primes_of_dvd_prod (hl₁ a (mem_cons_self _ _)) hl₂
762
- (h ▸ by rw prod_cons; exact dvd_mul_right _ _),
763
- have hb : b :: l₂ ~ a :: (b :: l₂).erase a := perm_cons_erase ha,
764
- have hl : prod l₁ = prod ((b :: l₂).erase a) :=
765
- (nat.mul_right_inj (prime.pos (hl₁ a (mem_cons_self _ _)))).1 $
766
- by rwa [← prod_cons, ← prod_cons, ← hb.prod_eq],
767
- perm.trans ((perm_of_prod_eq_prod hl hl₁' hl₂').cons _) hb.symm
768
-
769
722
/-- **Fundamental theorem of arithmetic** -/
770
723
lemma factors_unique {n : ℕ} {l : list ℕ} (h₁ : prod l = n) (h₂ : ∀ p ∈ l, prime p) :
771
724
l ~ factors n :=
772
725
begin
773
- refine perm_of_prod_eq_prod _ h₂ (λ p, prime_of_mem_factors),
774
- rw h₁,
775
- refine (prod_factors (nat.pos_of_ne_zero _)).symm,
776
- rintro rfl,
777
- rw prod_eq_zero_iff at h₁,
778
- exact prime.ne_zero (h₂ 0 h₁) rfl,
726
+ refine perm_of_prod_eq_prod _ _ _,
727
+ { rw h₁,
728
+ refine (prod_factors (nat.pos_of_ne_zero _)).symm,
729
+ rintro rfl,
730
+ rw prod_eq_zero_iff at h₁,
731
+ exact prime.ne_zero (h₂ 0 h₁) rfl },
732
+ { simp_rw ←prime_iff, exact h₂ },
733
+ { simp_rw ←prime_iff, exact (λ p, prime_of_mem_factors) },
779
734
end
780
735
781
736
lemma prime.factors_pow {p : ℕ} (hp : p.prime) (n : ℕ) :
0 commit comments