Documentation

Mathlib.Data.Nat.Prime

Prime numbers #

This file deals with prime numbers: natural numbers p ≥ 2 whose only divisors are p and 1.

Important declarations #

def Nat.Prime (p : ℕ) :

Nat.Prime p means that p is a prime number, that is, a natural number at least 2 whose only divisors are p and 1.

Equations
Instances For
    theorem Nat.Prime.ne_zero {n : ℕ} (h : Nat.Prime n) :
    n ≠ 0
    theorem Nat.Prime.pos {p : ℕ} (pp : Nat.Prime p) :
    0 < p
    theorem Nat.Prime.two_le {p : ℕ} :
    Nat.Prime p → 2 ≤ p
    theorem Nat.Prime.one_lt {p : ℕ} :
    Nat.Prime p → 1 < p
    theorem Nat.Prime.ne_one {p : ℕ} (hp : Nat.Prime p) :
    p ≠ 1
    theorem Nat.Prime.eq_one_or_self_of_dvd {p : ℕ} (pp : Nat.Prime p) (m : ℕ) (hm : m ∣ p) :
    m = 1 ∨ m = p
    theorem Nat.prime_def_lt'' {p : ℕ} :
    Nat.Prime p ↔ 2 ≤ p ∧ ∀ (m : ℕ), m ∣ p → m = 1 ∨ m = p
    theorem Nat.prime_def_lt {p : ℕ} :
    Nat.Prime p ↔ 2 ≤ p ∧ ∀ (m : ℕ), m < p → m ∣ p → m = 1
    theorem Nat.prime_def_lt' {p : ℕ} :
    Nat.Prime p ↔ 2 ≤ p ∧ ∀ (m : ℕ), 2 ≤ m → m < p → ¬m ∣ p
    theorem Nat.prime_def_le_sqrt {p : ℕ} :
    Nat.Prime p ↔ 2 ≤ p ∧ ∀ (m : ℕ), 2 ≤ m → m ≤ Nat.sqrt p → ¬m ∣ p
    theorem Nat.prime_of_coprime (n : ℕ) (h1 : 1 < n) (h : ∀ (m : ℕ), m < n → m ≠ 0 → Nat.Coprime n m) :

    This instance is slower than the instance decidablePrime defined below, but has the advantage that it works in the kernel for small values.

    If you need to prove that a particular number is prime, in any case you should not use by decide, but rather by norm_num, which is much faster.

    Equations
    Instances For
      theorem Nat.Prime.five_le_of_ne_two_of_ne_three {p : ℕ} (hp : Nat.Prime p) (h_two : p ≠ 2) (h_three : p ≠ 3) :
      5 ≤ p
      theorem Nat.Prime.pred_pos {p : ℕ} (pp : Nat.Prime p) :
      theorem Nat.dvd_prime {p : ℕ} {m : ℕ} (pp : Nat.Prime p) :
      m ∣ p ↔ m = 1 ∨ m = p
      theorem Nat.dvd_prime_two_le {p : ℕ} {m : ℕ} (pp : Nat.Prime p) (H : 2 ≤ m) :
      m ∣ p ↔ m = p
      theorem Nat.prime_dvd_prime_iff_eq {p : ℕ} {q : ℕ} (pp : Nat.Prime p) (qp : Nat.Prime q) :
      p ∣ q ↔ p = q
      theorem Nat.Prime.not_dvd_one {p : ℕ} (pp : Nat.Prime p) :
      ¬p ∣ 1
      theorem Nat.not_prime_mul {a : ℕ} {b : ℕ} (a1 : 1 < a) (b1 : 1 < b) :
      theorem Nat.not_prime_mul' {a : ℕ} {b : ℕ} {n : ℕ} (h : a * b = n) (h₁ : 1 < a) (h₂ : 1 < b) :
      theorem Nat.prime_mul_iff {a : ℕ} {b : ℕ} :
      theorem Nat.Prime.dvd_iff_eq {p : ℕ} {a : ℕ} (hp : Nat.Prime p) (a1 : a ≠ 1) :
      a ∣ p ↔ p = a
      theorem Nat.minFac_lemma (n : ℕ) (k : ℕ) (h : ¬n < k * k) :
      Nat.sqrt n - k < Nat.sqrt n + 2 - k
      def Nat.minFacAux (n : ℕ) :
      ℕ → ℕ

      If n < k * k, then minFacAux n k = n, if k | n, then minFacAux n k = k. Otherwise, minFacAux n k = minFacAux n (k+2) using well-founded recursion. If n is odd and 1 < n, then minFacAux n 3 is the smallest prime factor of n.

      Equations
      Instances For
        def Nat.minFac (n : ℕ) :

        Returns the smallest prime factor of n ≠ 1.

        Equations
        Instances For
          @[simp]
          @[simp]
          theorem Nat.minFac_eq (n : ℕ) :
          Nat.minFac n = if 2 ∣ n then 2 else Nat.minFacAux n 3
          theorem Nat.minFacAux_has_prop {n : ℕ} (n2 : 2 ≤ n) (k : ℕ) (i : ℕ) :
          k = 2 * i + 3 → (∀ (m : ℕ), 2 ≤ m → m ∣ n → k ≤ m) → Nat.minFacProp n (Nat.minFacAux n k)
          theorem Nat.minFac_prime {n : ℕ} (n1 : n ≠ 1) :
          theorem Nat.minFac_le_of_dvd {n : ℕ} {m : ℕ} :
          2 ≤ m → m ∣ n → Nat.minFac n ≤ m
          theorem Nat.minFac_le {n : ℕ} (H : 0 < n) :
          theorem Nat.le_minFac {m : ℕ} {n : ℕ} :
          n = 1 ∨ m ≤ Nat.minFac n ↔ ∀ (p : ℕ), Nat.Prime p → p ∣ n → m ≤ p
          theorem Nat.le_minFac' {m : ℕ} {n : ℕ} :
          n = 1 ∨ m ≤ Nat.minFac n ↔ ∀ (p : ℕ), 2 ≤ p → p ∣ n → m ≤ p
          @[simp]
          theorem Nat.Prime.minFac_eq {p : ℕ} (hp : Nat.Prime p) :

          This instance is faster in the virtual machine than decidablePrime1, but slower in the kernel.

          If you need to prove that a particular number is prime, in any case you should not use by decide, but rather by norm_num, which is much faster.

          Equations
          theorem Nat.minFac_le_div {n : ℕ} (pos : 0 < n) (np : ¬Nat.Prime n) :
          theorem Nat.minFac_sq_le_self {n : ℕ} (w : 0 < n) (h : ¬Nat.Prime n) :

          The square of the smallest prime factor of a composite number n is at most n.

          @[simp]
          theorem Nat.minFac_eq_one_iff {n : ℕ} :
          Nat.minFac n = 1 ↔ n = 1
          @[simp]
          theorem Nat.minFac_eq_two_iff (n : ℕ) :
          theorem Nat.exists_dvd_of_not_prime {n : ℕ} (n2 : 2 ≤ n) (np : ¬Nat.Prime n) :
          ∃ m, m ∣ n ∧ m ≠ 1 ∧ m ≠ n
          theorem Nat.exists_dvd_of_not_prime2 {n : ℕ} (n2 : 2 ≤ n) (np : ¬Nat.Prime n) :
          ∃ m, m ∣ n ∧ 2 ≤ m ∧ m < n
          theorem Nat.exists_prime_and_dvd {n : ℕ} (hn : n ≠ 1) :
          ∃ p, Nat.Prime p ∧ p ∣ n
          theorem Nat.dvd_of_forall_prime_mul_dvd {a : ℕ} {b : ℕ} (hdvd : ∀ (p : ℕ), Nat.Prime p → p ∣ a → p * a ∣ b) :
          a ∣ b
          theorem Nat.exists_infinite_primes (n : ℕ) :
          ∃ p, n ≤ p ∧ Nat.Prime p

          Euclid's theorem on the infinitude of primes. Here given in the form: for every n, there exists a prime number p ≥ n.

          theorem Nat.Prime.eq_two_or_odd {p : ℕ} (hp : Nat.Prime p) :
          p = 2 ∨ p % 2 = 1
          theorem Nat.Prime.eq_two_or_odd' {p : ℕ} (hp : Nat.Prime p) :
          p = 2 ∨ Odd p
          theorem Nat.Prime.even_iff {p : ℕ} (hp : Nat.Prime p) :
          Even p ↔ p = 2
          theorem Nat.Prime.odd_of_ne_two {p : ℕ} (hp : Nat.Prime p) (h_two : p ≠ 2) :
          Odd p
          theorem Nat.Prime.even_sub_one {p : ℕ} (hp : Nat.Prime p) (h2 : p ≠ 2) :
          Even (p - 1)

          A prime p satisfies p % 2 = 1 if and only if p ≠ 2.

          theorem Nat.coprime_of_dvd {m : ℕ} {n : ℕ} (H : ∀ (k : ℕ), Nat.Prime k → k ∣ m → ¬k ∣ n) :
          theorem Nat.coprime_of_dvd' {m : ℕ} {n : ℕ} (H : ∀ (k : ℕ), Nat.Prime k → k ∣ m → k ∣ n → k ∣ 1) :
          theorem Nat.factors_lemma {k : ℕ} :
          (k + 2) / Nat.minFac (k + 2) < k + 2
          theorem Nat.Prime.dvd_mul {p : ℕ} {m : ℕ} {n : ℕ} (pp : Nat.Prime p) :
          p ∣ m * n ↔ p ∣ m ∨ p ∣ n
          theorem Nat.Prime.not_dvd_mul {p : ℕ} {m : ℕ} {n : ℕ} (pp : Nat.Prime p) (Hm : ¬p ∣ m) (Hn : ¬p ∣ n) :
          ¬p ∣ m * n
          theorem Nat.Prime.prime {p : ℕ} :

          Alias of the forward direction of Nat.prime_iff.

          theorem Prime.nat_prime {p : ℕ} :

          Alias of the reverse direction of Nat.prime_iff.

          theorem Nat.Prime.dvd_of_dvd_pow {p : ℕ} {m : ℕ} {n : ℕ} (pp : Nat.Prime p) (h : p ∣ m ^ n) :
          p ∣ m
          theorem Nat.Prime.pow_not_prime' {x : ℕ} {n : ℕ} (hn : n ≠ 1) :
          theorem Nat.Prime.pow_not_prime {x : ℕ} {n : ℕ} (hn : 2 ≤ n) :
          theorem Nat.Prime.eq_one_of_pow {x : ℕ} {n : ℕ} (h : Nat.Prime (x ^ n)) :
          n = 1
          theorem Nat.Prime.pow_eq_iff {p : ℕ} {a : ℕ} {k : ℕ} (hp : Nat.Prime p) :
          a ^ k = p ↔ a = p ∧ k = 1
          theorem Nat.pow_minFac {n : ℕ} {k : ℕ} (hk : k ≠ 0) :
          theorem Nat.Prime.pow_minFac {p : ℕ} {k : ℕ} (hp : Nat.Prime p) (hk : k ≠ 0) :
          Nat.minFac (p ^ k) = p
          theorem Nat.Prime.mul_eq_prime_sq_iff {x : ℕ} {y : ℕ} {p : ℕ} (hp : Nat.Prime p) (hx : x ≠ 1) (hy : y ≠ 1) :
          x * y = p ^ 2 ↔ x = p ∧ y = p
          theorem Nat.Prime.dvd_factorial {n : ℕ} {p : ℕ} :
          theorem Nat.Prime.coprime_pow_of_not_dvd {p : ℕ} {m : ℕ} {a : ℕ} (pp : Nat.Prime p) (h : ¬p ∣ a) :
          Nat.Coprime a (p ^ m)
          theorem Nat.coprime_primes {p : ℕ} {q : ℕ} (pp : Nat.Prime p) (pq : Nat.Prime q) :
          theorem Nat.coprime_pow_primes {p : ℕ} {q : ℕ} (n : ℕ) (m : ℕ) (pp : Nat.Prime p) (pq : Nat.Prime q) (h : p ≠ q) :
          Nat.Coprime (p ^ n) (q ^ m)
          theorem Nat.coprime_or_dvd_of_prime {p : ℕ} (pp : Nat.Prime p) (i : ℕ) :
          theorem Nat.coprime_of_lt_prime {n : ℕ} {p : ℕ} (n_pos : 0 < n) (hlt : n < p) (pp : Nat.Prime p) :
          theorem Nat.eq_or_coprime_of_le_prime {n : ℕ} {p : ℕ} (n_pos : 0 < n) (hle : n ≤ p) (pp : Nat.Prime p) :
          p = n ∨ Nat.Coprime p n
          theorem Nat.dvd_prime_pow {p : ℕ} (pp : Nat.Prime p) {m : ℕ} {i : ℕ} :
          i ∣ p ^ m ↔ ∃ k, k ≤ m ∧ i = p ^ k
          theorem Nat.Prime.dvd_mul_of_dvd_ne {p1 : ℕ} {p2 : ℕ} {n : ℕ} (h_neq : p1 ≠ p2) (pp1 : Nat.Prime p1) (pp2 : Nat.Prime p2) (h1 : p1 ∣ n) (h2 : p2 ∣ n) :
          p1 * p2 ∣ n
          theorem Nat.eq_prime_pow_of_dvd_least_prime_pow {a : ℕ} {p : ℕ} {k : ℕ} (pp : Nat.Prime p) (h₁ : ¬a ∣ p ^ k) (h₂ : a ∣ p ^ (k + 1)) :
          a = p ^ (k + 1)

          If p is prime, and a doesn't divide p^k, but a does divide p^(k+1) then a = p^(k+1).

          theorem Nat.eq_one_iff_not_exists_prime_dvd {n : ℕ} :
          n = 1 ↔ ∀ (p : ℕ), Nat.Prime p → ¬p ∣ n
          theorem Nat.succ_dvd_or_succ_dvd_of_succ_sum_dvd_mul {p : ℕ} (p_prime : Nat.Prime p) {m : ℕ} {n : ℕ} {k : ℕ} {l : ℕ} (hpm : p ^ k ∣ m) (hpn : p ^ l ∣ n) (hpmn : p ^ (k + l + 1) ∣ m * n) :
          p ^ (k + 1) ∣ m ∨ p ^ (l + 1) ∣ n

          The type of prime numbers

          Equations
          Instances For
            Equations
            Equations
            Equations
            theorem Nat.Primes.coe_nat_inj (p : Nat.Primes) (q : Nat.Primes) :
            ↑p = ↑q ↔ p = q
            instance Nat.monoid.primePow {α : Type u_1} [Monoid α] :
            Equations
            • Nat.monoid.primePow = { pow := fun x p => x ^ ↑p }