@@ -3,7 +3,13 @@ Copyright (c) 2017 Microsoft Corporation. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Author: Mario Carneiro, Neil Strickland
5
5
-/
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
+ -/
7
13
8
14
/-- `ℕ+` is the type of positive natural numbers. It is defined as a subtype,
9
15
and the VM representation of `ℕ+` is the same as `ℕ` because the proof
@@ -40,18 +46,6 @@ def to_pnat' (n : ℕ) : ℕ+ := succ_pnat (pred n)
40
46
| 0 := rfl
41
47
| (m + 1 ) := by {rw [if_pos (succ_pos m)], refl}
42
48
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
55
49
end nat
56
50
57
51
namespace pnat
@@ -374,190 +368,4 @@ begin
374
368
exact pnat.ne_zero n (eq_zero_of_zero_dvd h)
375
369
end
376
370
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
-
563
371
end pnat
0 commit comments