Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 6a44930

Browse files
committed
refactor(data/pnat): move data.pnat.prime (#4839)
Remove the dependency `data.pnat.basic -> data.nat.prime`. Needed for #4822.
1 parent 3b2c97f commit 6a44930

File tree

6 files changed

+231
-200
lines changed

6 files changed

+231
-200
lines changed

src/data/pnat/basic.lean

Lines changed: 7 additions & 199 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ Copyright (c) 2017 Microsoft Corporation. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Author: Mario Carneiro, Neil Strickland
55
-/
6-
import data.nat.prime
6+
import data.nat.basic
7+
8+
/-!
9+
# The positive natural numbers
10+
11+
This file defines the type `ℕ+` or `pnat`, the subtype of natural numbers that are positive.
12+
-/
713

814
/-- `ℕ+` is the type of positive natural numbers. It is defined as a subtype,
915
and the VM representation of `ℕ+` is the same as `ℕ` because the proof
@@ -40,18 +46,6 @@ def to_pnat' (n : ℕ) : ℕ+ := succ_pnat (pred n)
4046
| 0 := rfl
4147
| (m + 1) := by {rw [if_pos (succ_pos m)], refl}
4248

43-
namespace primes
44-
instance coe_pnat : has_coe nat.primes ℕ+ := ⟨λ p, ⟨(p : ℕ), p.property.pos⟩⟩
45-
theorem coe_pnat_nat (p : nat.primes) : ((p : ℕ+) : ℕ) = p := rfl
46-
47-
theorem coe_pnat_inj (p q : nat.primes) : (p : ℕ+) = (q : ℕ+) → p = q := λ h,
48-
begin
49-
replace h : ((p : ℕ+) : ℕ) = ((q : ℕ+) : ℕ) := congr_arg subtype.val h,
50-
rw [coe_pnat_nat, coe_pnat_nat] at h,
51-
exact subtype.eq h,
52-
end
53-
54-
end primes
5549
end nat
5650

5751
namespace pnat
@@ -374,190 +368,4 @@ begin
374368
exact pnat.ne_zero n (eq_zero_of_zero_dvd h)
375369
end
376370

377-
/-- The greatest common divisor (gcd) of two positive natural numbers,
378-
viewed as positive natural number. -/
379-
def gcd (n m : ℕ+) : ℕ+ :=
380-
⟨nat.gcd (n : ℕ) (m : ℕ), nat.gcd_pos_of_pos_left (m : ℕ) n.pos⟩
381-
382-
/-- The least common multiple (lcm) of two positive natural numbers,
383-
viewed as positive natural number. -/
384-
def lcm (n m : ℕ+) : ℕ+ :=
385-
⟨nat.lcm (n : ℕ) (m : ℕ),
386-
by { let h := mul_pos n.pos m.pos,
387-
rw [← gcd_mul_lcm (n : ℕ) (m : ℕ), mul_comm] at h,
388-
exact pos_of_dvd_of_pos (dvd.intro (nat.gcd (n : ℕ) (m : ℕ)) rfl) h }⟩
389-
390-
@[simp] theorem gcd_coe (n m : ℕ+) : ((gcd n m) : ℕ) = nat.gcd n m := rfl
391-
392-
@[simp] theorem lcm_coe (n m : ℕ+) : ((lcm n m) : ℕ) = nat.lcm n m := rfl
393-
394-
theorem gcd_dvd_left (n m : ℕ+) : (gcd n m) ∣ n := dvd_iff.2 (nat.gcd_dvd_left (n : ℕ) (m : ℕ))
395-
396-
theorem gcd_dvd_right (n m : ℕ+) : (gcd n m) ∣ m := dvd_iff.2 (nat.gcd_dvd_right (n : ℕ) (m : ℕ))
397-
398-
theorem dvd_gcd {m n k : ℕ+} (hm : k ∣ m) (hn : k ∣ n) : k ∣ gcd m n :=
399-
dvd_iff.2 (@nat.dvd_gcd (m : ℕ) (n : ℕ) (k : ℕ) (dvd_iff.1 hm) (dvd_iff.1 hn))
400-
401-
theorem dvd_lcm_left (n m : ℕ+) : n ∣ lcm n m := dvd_iff.2 (nat.dvd_lcm_left (n : ℕ) (m : ℕ))
402-
403-
theorem dvd_lcm_right (n m : ℕ+) : m ∣ lcm n m := dvd_iff.2 (nat.dvd_lcm_right (n : ℕ) (m : ℕ))
404-
405-
theorem lcm_dvd {m n k : ℕ+} (hm : m ∣ k) (hn : n ∣ k) : lcm m n ∣ k :=
406-
dvd_iff.2 (@nat.lcm_dvd (m : ℕ) (n : ℕ) (k : ℕ) (dvd_iff.1 hm) (dvd_iff.1 hn))
407-
408-
theorem gcd_mul_lcm (n m : ℕ+) : (gcd n m) * (lcm n m) = n * m :=
409-
subtype.eq (nat.gcd_mul_lcm (n : ℕ) (m : ℕ))
410-
411-
lemma eq_one_of_lt_two {n : ℕ+} : n < 2 → n = 1 :=
412-
begin
413-
intro h, apply le_antisymm, swap, apply pnat.one_le,
414-
change n < 1 + 1 at h, rw pnat.lt_add_one_iff at h, apply h
415-
end
416-
417-
418-
section prime
419-
/-! ### Prime numbers -/
420-
421-
/-- Primality predicate for `ℕ+`, defined in terms of `nat.prime`. -/
422-
def prime (p : ℕ+) : Prop := (p : ℕ).prime
423-
424-
lemma prime.one_lt {p : ℕ+} : p.prime → 1 < p := nat.prime.one_lt
425-
426-
lemma prime_two : (2 : ℕ+).prime := nat.prime_two
427-
428-
lemma dvd_prime {p m : ℕ+} (pp : p.prime) :
429-
(m ∣ p ↔ m = 1 ∨ m = p) := by { rw pnat.dvd_iff, rw nat.dvd_prime pp, simp }
430-
431-
lemma prime.ne_one {p : ℕ+} : p.prime → p ≠ 1 :=
432-
by { intro pp, intro contra, apply nat.prime.ne_one pp, rw pnat.coe_eq_one_iff, apply contra }
433-
434-
@[simp]
435-
lemma not_prime_one : ¬ (1: ℕ+).prime := nat.not_prime_one
436-
437-
lemma prime.not_dvd_one {p : ℕ+} :
438-
p.prime → ¬ p ∣ 1 := λ pp : p.prime, by {rw dvd_iff, apply nat.prime.not_dvd_one pp}
439-
440-
lemma exists_prime_and_dvd {n : ℕ+} : 2 ≤ n → (∃ (p : ℕ+), p.prime ∧ p ∣ n) :=
441-
begin
442-
intro h, cases nat.exists_prime_and_dvd h with p hp,
443-
existsi (⟨p, nat.prime.pos hp.left⟩ : ℕ+), rw dvd_iff, apply hp
444-
end
445-
446-
end prime
447-
448-
section coprime
449-
/-! ### Coprime numbers and gcd -/
450-
451-
/-- Two pnats are coprime if their gcd is 1. -/
452-
def coprime (m n : ℕ+) : Prop := m.gcd n = 1
453-
454-
@[simp]
455-
lemma coprime_coe {m n : ℕ+} : nat.coprime ↑m ↑n ↔ m.coprime n :=
456-
by { unfold coprime, unfold nat.coprime, rw ← coe_inj, simp }
457-
458-
lemma coprime.mul {k m n : ℕ+} : m.coprime k → n.coprime k → (m * n).coprime k :=
459-
by { repeat {rw ← coprime_coe}, rw mul_coe, apply nat.coprime.mul }
460-
461-
lemma coprime.mul_right {k m n : ℕ+} : k.coprime m → k.coprime n → k.coprime (m * n) :=
462-
by { repeat {rw ← coprime_coe}, rw mul_coe, apply nat.coprime.mul_right }
463-
464-
lemma gcd_comm {m n : ℕ+} : m.gcd n = n.gcd m :=
465-
by { apply eq, simp only [gcd_coe], apply nat.gcd_comm }
466-
467-
lemma gcd_eq_left_iff_dvd {m n : ℕ+} : m ∣ n ↔ m.gcd n = m :=
468-
by { rw dvd_iff, rw nat.gcd_eq_left_iff_dvd, rw ← coe_inj, simp }
469-
470-
lemma gcd_eq_right_iff_dvd {m n : ℕ+} : m ∣ n ↔ n.gcd m = m :=
471-
by { rw gcd_comm, apply gcd_eq_left_iff_dvd, }
472-
473-
lemma coprime.gcd_mul_left_cancel (m : ℕ+) {n k : ℕ+} :
474-
k.coprime n → (k * m).gcd n = m.gcd n :=
475-
begin
476-
intro h, apply eq, simp only [gcd_coe, mul_coe],
477-
apply nat.coprime.gcd_mul_left_cancel, simpa
478-
end
479-
480-
lemma coprime.gcd_mul_right_cancel (m : ℕ+) {n k : ℕ+} :
481-
k.coprime n → (m * k).gcd n = m.gcd n :=
482-
begin
483-
rw mul_comm, apply coprime.gcd_mul_left_cancel,
484-
end
485-
486-
lemma coprime.gcd_mul_left_cancel_right (m : ℕ+) {n k : ℕ+} :
487-
k.coprime m → m.gcd (k * n) = m.gcd n :=
488-
begin
489-
intro h, iterate 2 {rw gcd_comm, symmetry}, apply coprime.gcd_mul_left_cancel _ h,
490-
end
491-
492-
lemma coprime.gcd_mul_right_cancel_right (m : ℕ+) {n k : ℕ+} :
493-
k.coprime m → m.gcd (n * k) = m.gcd n :=
494-
begin
495-
rw mul_comm, apply coprime.gcd_mul_left_cancel_right,
496-
end
497-
498-
@[simp]
499-
lemma one_gcd {n : ℕ+} : gcd 1 n = 1 :=
500-
by { rw ← gcd_eq_left_iff_dvd, apply one_dvd }
501-
502-
@[simp]
503-
lemma gcd_one {n : ℕ+} : gcd n 1 = 1 := by { rw gcd_comm, apply one_gcd }
504-
505-
@[symm]
506-
lemma coprime.symm {m n : ℕ+} : m.coprime n → n.coprime m :=
507-
by { unfold coprime, rw gcd_comm, simp }
508-
509-
@[simp]
510-
lemma one_coprime {n : ℕ+} : (1 : ℕ+).coprime n := one_gcd
511-
512-
@[simp]
513-
lemma coprime_one {n : ℕ+} : n.coprime 1 := coprime.symm one_coprime
514-
515-
lemma coprime.coprime_dvd_left {m k n : ℕ+} :
516-
m ∣ k → k.coprime n → m.coprime n :=
517-
by { rw dvd_iff, repeat {rw ← coprime_coe}, apply nat.coprime.coprime_dvd_left }
518-
519-
lemma coprime.factor_eq_gcd_left {a b m n : ℕ+} (cop : m.coprime n) (am : a ∣ m) (bn : b ∣ n):
520-
a = (a * b).gcd m :=
521-
begin
522-
rw gcd_eq_left_iff_dvd at am,
523-
conv_lhs {rw ← am}, symmetry,
524-
apply coprime.gcd_mul_right_cancel a,
525-
apply coprime.coprime_dvd_left bn cop.symm,
526-
end
527-
528-
lemma coprime.factor_eq_gcd_right {a b m n : ℕ+} (cop : m.coprime n) (am : a ∣ m) (bn : b ∣ n):
529-
a = (b * a).gcd m :=
530-
begin
531-
rw mul_comm, apply coprime.factor_eq_gcd_left cop am bn,
532-
end
533-
534-
lemma coprime.factor_eq_gcd_left_right {a b m n : ℕ+} (cop : m.coprime n) (am : a ∣ m) (bn : b ∣ n):
535-
a = m.gcd (a * b) :=
536-
begin
537-
rw gcd_comm, apply coprime.factor_eq_gcd_left cop am bn,
538-
end
539-
540-
lemma coprime.factor_eq_gcd_right_right {a b m n : ℕ+} (cop : m.coprime n) (am : a ∣ m) (bn : b ∣ n):
541-
a = m.gcd (b * a) :=
542-
begin
543-
rw gcd_comm, apply coprime.factor_eq_gcd_right cop am bn,
544-
end
545-
546-
lemma coprime.gcd_mul (k : ℕ+) {m n : ℕ+} (h: m.coprime n) :
547-
k.gcd (m * n) = k.gcd m * k.gcd n :=
548-
begin
549-
rw ← coprime_coe at h, apply eq,
550-
simp only [gcd_coe, mul_coe], apply nat.coprime.gcd_mul k h
551-
end
552-
553-
lemma gcd_eq_left {m n : ℕ+} : m ∣ n → m.gcd n = m :=
554-
by { rw dvd_iff, intro h, apply eq, simp only [gcd_coe], apply nat.gcd_eq_left h }
555-
556-
lemma coprime.pow {m n : ℕ+} (k l : ℕ) (h : m.coprime n) : (m ^ k).coprime (n ^ l) :=
557-
begin
558-
rw ← coprime_coe at *, simp only [pow_coe], apply nat.coprime.pow, apply h
559-
end
560-
561-
end coprime
562-
563371
end pnat

src/data/pnat/factors.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Copyright (c) 2019 Neil Strickland. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Author: Neil Strickland
55
-/
6-
import data.pnat.basic
6+
import data.pnat.prime
77
import data.multiset.sort
88
import data.int.gcd
99
import algebra.group

0 commit comments

Comments
 (0)