Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+โ†‘Ctrl+โ†“to navigate, Ctrl+๐Ÿ–ฑ๏ธto focus. On Mac, use Cmdinstead of Ctrl.
/-
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
! leanprover-community/mathlib commit 8631e2d5ea77f6c13054d9151d82b83069680cb1
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Associated
import Mathlib.Algebra.Parity
import Mathlib.Data.Int.Dvd.Basic
import Mathlib.Data.Int.Units
import Mathlib.Data.Nat.Factorial.Basic
import Mathlib.Data.Nat.GCD.Basic
import Mathlib.Data.Nat.Sqrt
import Mathlib.Order.Bounds.Basic

/-!
# Prime numbers

This file deals with prime numbers: natural numbers `p โ‰ฅ 2` whose only divisors are `p` and `1`.

## Important declarations

- `Nat.Prime`: the predicate that expresses that a natural number `p` is prime
- `Nat.Primes`: the subtype of natural numbers that are prime
- `Nat.minFac n`: the minimal prime factor of a natural number `n โ‰  1`
- `Nat.exists_infinite_primes`: Euclid's theorem that there exist infinitely many prime numbers.
  This also appears as `Nat.not_bddAbove_setOf_prime` and `Nat.infinite_setOf_prime` (the latter
  in `Data.Nat.PrimeFin`).
- `Nat.prime_iff`: `Nat.Prime` coincides with the general definition of `Prime`
- `Nat.irreducible_iff_nat_prime`: a non-unit natural number is
                                  only divisible by `1` iff it is prime

-/


open Bool Subtype

open Nat

namespace Nat

/-- `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`. -/
-- Porting note: removed @[pp_nodot]
def 
Prime: (p : โ„•) โ†’ ?m.5 p
Prime
(p :
โ„•: Type
โ„•
) :=
Irreducible: {ฮฑ : Type ?u.8} โ†’ [inst : Monoid ฮฑ] โ†’ ฮฑ โ†’ Prop
Irreducible
p #align nat.prime
Nat.Prime: โ„• โ†’ Prop
Nat.Prime
theorem
irreducible_iff_nat_prime: โˆ€ (a : โ„•), Irreducible a โ†” Prime a
irreducible_iff_nat_prime
(a :
โ„•: Type
โ„•
) :
Irreducible: {ฮฑ : Type ?u.44} โ†’ [inst : Monoid ฮฑ] โ†’ ฮฑ โ†’ Prop
Irreducible
a โ†”
Nat.Prime: โ„• โ†’ Prop
Nat.Prime
a :=
Iff.rfl: โˆ€ {a : Prop}, a โ†” a
Iff.rfl
#align irreducible_iff_nat_prime
Nat.irreducible_iff_nat_prime: โˆ€ (a : โ„•), Irreducible a โ†” Prime a
Nat.irreducible_iff_nat_prime
theorem
not_prime_zero: ยฌPrime 0
not_prime_zero
: ยฌ
Prime: โ„• โ†’ Prop
Prime
0: ?m.62
0
|
h: ?m.77
h
=>
h: ?m.77
h
.
ne_zero: โˆ€ {ฮฑ : Type ?u.79} [inst : MonoidWithZero ฮฑ] {p : ฮฑ}, Irreducible p โ†’ p โ‰  0
ne_zero
rfl: โˆ€ {ฮฑ : Sort ?u.130} {a : ฮฑ}, a = a
rfl
#align nat.not_prime_zero
Nat.not_prime_zero: ยฌPrime 0
Nat.not_prime_zero
theorem
not_prime_one: ยฌPrime 1
not_prime_one
: ยฌ
Prime: โ„• โ†’ Prop
Prime
1: ?m.143
1
|
h: ?m.158
h
=>
h: ?m.158
h
.
ne_one: โˆ€ {ฮฑ : Type ?u.160} [inst : Monoid ฮฑ] {p : ฮฑ}, Irreducible p โ†’ p โ‰  1
ne_one
rfl: โˆ€ {ฮฑ : Sort ?u.179} {a : ฮฑ}, a = a
rfl
#align nat.not_prime_one
Nat.not_prime_one: ยฌPrime 1
Nat.not_prime_one
theorem
Prime.ne_zero: โˆ€ {n : โ„•}, Prime n โ†’ n โ‰  0
Prime.ne_zero
{n :
โ„•: Type
โ„•
} (
h: Prime n
h
:
Prime: โ„• โ†’ Prop
Prime
n) : n โ‰ 
0: ?m.198
0
:=
Irreducible.ne_zero: โˆ€ {ฮฑ : Type ?u.213} [inst : MonoidWithZero ฮฑ] {p : ฮฑ}, Irreducible p โ†’ p โ‰  0
Irreducible.ne_zero
h: Prime n
h
#align nat.prime.ne_zero
Nat.Prime.ne_zero: โˆ€ {n : โ„•}, Prime n โ†’ n โ‰  0
Nat.Prime.ne_zero
theorem
Prime.pos: โˆ€ {p : โ„•}, Prime p โ†’ 0 < p
Prime.pos
{p :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) :
0: ?m.291
0
< p :=
Nat.pos_of_ne_zero: โˆ€ {n : โ„•}, n โ‰  0 โ†’ 0 < n
Nat.pos_of_ne_zero
pp: Prime p
pp
.
ne_zero: โˆ€ {n : โ„•}, Prime n โ†’ n โ‰  0
ne_zero
#align nat.prime.pos
Nat.Prime.pos: โˆ€ {p : โ„•}, Prime p โ†’ 0 < p
Nat.Prime.pos
theorem
Prime.two_le: โˆ€ {p : โ„•}, Prime p โ†’ 2 โ‰ค p
Prime.two_le
: โˆ€ {p :
โ„•: Type
โ„•
},
Prime: โ„• โ†’ Prop
Prime
p โ†’
2: ?m.353
2
โ‰ค p | 0,
h: Prime 0
h
=> (
not_prime_zero: ยฌPrime 0
not_prime_zero
h: Prime 0
h
).
elim: โˆ€ {C : Sort ?u.412}, False โ†’ C
elim
| 1,
h: Prime 1
h
=> (
not_prime_one: ยฌPrime 1
not_prime_one
h: Prime 1
h
).
elim: โˆ€ {C : Sort ?u.436}, False โ†’ C
elim
| _ + 2, _ =>
le_add_self: โˆ€ {ฮฑ : Type ?u.528} [inst : CanonicallyOrderedAddMonoid ฮฑ] {a b : ฮฑ}, a โ‰ค b + a
le_add_self
#align nat.prime.two_le
Nat.Prime.two_le: โˆ€ {p : โ„•}, Prime p โ†’ 2 โ‰ค p
Nat.Prime.two_le
theorem
Prime.one_lt: โˆ€ {p : โ„•}, Prime p โ†’ 1 < p
Prime.one_lt
{p :
โ„•: Type
โ„•
} :
Prime: โ„• โ†’ Prop
Prime
p โ†’
1: ?m.722
1
< p :=
Prime.two_le: โˆ€ {p : โ„•}, Prime p โ†’ 2 โ‰ค p
Prime.two_le
#align nat.prime.one_lt
Nat.Prime.one_lt: โˆ€ {p : โ„•}, Prime p โ†’ 1 < p
Nat.Prime.one_lt
instance
Prime.one_lt': โˆ€ (p : โ„•) [hp : Fact (Prime p)], Fact (1 < p)
Prime.one_lt'
(p :
โ„•: Type
โ„•
) [
hp: Fact (Prime p)
hp
:
Fact: Prop โ†’ Prop
Fact
p.
Prime: โ„• โ†’ Prop
Prime
] :
Fact: Prop โ†’ Prop
Fact
(
1: ?m.775
1
< p) := โŸจ
hp: Fact (Prime p)
hp
.
1: โˆ€ {p : Prop} [self : Fact p], p
1
.
one_lt: โˆ€ {p : โ„•}, Prime p โ†’ 1 < p
one_lt
โŸฉ #align nat.prime.one_lt'
Nat.Prime.one_lt': โˆ€ (p : โ„•) [hp : Fact (Prime p)], Fact (1 < p)
Nat.Prime.one_lt'
theorem
Prime.ne_one: โˆ€ {p : โ„•}, Prime p โ†’ p โ‰  1
Prime.ne_one
{p :
โ„•: Type
โ„•
} (
hp: Prime p
hp
: p.
Prime: โ„• โ†’ Prop
Prime
) : p โ‰ 
1: ?m.849
1
:=
hp: Prime p
hp
.
one_lt: โˆ€ {p : โ„•}, Prime p โ†’ 1 < p
one_lt
.
ne': โˆ€ {ฮฑ : Type ?u.866} [inst : Preorder ฮฑ] {x y : ฮฑ}, x < y โ†’ y โ‰  x
ne'
#align nat.prime.ne_one
Nat.Prime.ne_one: โˆ€ {p : โ„•}, Prime p โ†’ p โ‰  1
Nat.Prime.ne_one
theorem
Prime.eq_one_or_self_of_dvd: โˆ€ {p : โ„•}, Prime p โ†’ โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
Prime.eq_one_or_self_of_dvd
{p :
โ„•: Type
โ„•
} (
pp: Prime p
pp
: p.
Prime: โ„• โ†’ Prop
Prime
) (m :
โ„•: Type
โ„•
) (
hm: m โˆฃ p
hm
: m โˆฃ p) : m =
1: ?m.955
1
โˆจ m = p :=

Goals accomplished! ๐Ÿ™
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: IsUnit m โˆจ IsUnit n


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: IsUnit m โˆจ IsUnit n


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: m = 1 โˆจ IsUnit n


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: IsUnit m โˆจ IsUnit n


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: m = 1 โˆจ n = 1


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: m = 1 โˆจ n = 1


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: m = 1 โˆจ n = 1


intro
m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m, n: โ„•

hn: p = m * n

this: m = 1 โˆจ n = 1


n = 1 โ†’ m = p
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m: โ„•

hn: p = m * 1

this: m = 1 โˆจ 1 = 1


m = p
p: โ„•

pp: Prime p

m: โ„•

hm: m โˆฃ p


m = 1 โˆจ m = p
p: โ„•

pp: Prime p

m: โ„•

hn: p = m * 1

this: m = 1 โˆจ 1 = 1


m = p
p: โ„•

pp: Prime p

m: โ„•

hn: p = m * 1

this: m = 1 โˆจ 1 = 1


m = m * 1
p: โ„•

pp: Prime p

m: โ„•

hn: p = m * 1

this: m = 1 โˆจ 1 = 1


m = p
p: โ„•

pp: Prime p

m: โ„•

hn: p = m * 1

this: m = 1 โˆจ 1 = 1


m = m

Goals accomplished! ๐Ÿ™
#align nat.prime.eq_one_or_self_of_dvd
Nat.Prime.eq_one_or_self_of_dvd: โˆ€ {p : โ„•}, Prime p โ†’ โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
Nat.Prime.eq_one_or_self_of_dvd
theorem
prime_def_lt'': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
prime_def_lt''
{p :
โ„•: Type
โ„•
} :
Prime: โ„• โ†’ Prop
Prime
p โ†”
2: ?m.1212
2
โ‰ค p โˆง โˆ€ (
m: ?m.1242
m
) (
_: m โˆฃ p
_
:
m: ?m.1242
m
โˆฃ p),
m: ?m.1242
m
=
1: ?m.1258
1
โˆจ
m: ?m.1242
m
= p :=

Goals accomplished! ๐Ÿ™

Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p



Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p



Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b



Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a = 1 โˆจ b = 1

Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a = p โ†’ b = 1
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b



Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a = p โ†’ b = 1
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a = p โ†’ b = 1
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


b = 1
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a = p โ†’ b = 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


b = 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


a * b = a * 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


b = 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


a = a * 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


b = 1
a, b: โ„•

h: 2 โ‰ค a โˆง โˆ€ (m : โ„•), m โˆฃ a โ†’ m = 1 โˆจ m = a

h1: 1 < a

hab: a = a * b


a = a

Goals accomplished! ๐Ÿ™

Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a โˆฃ a * b
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b


a โˆฃ a * b
p: โ„•

h: 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p

h1: 1 < p

a, b: โ„•

hab: p = a * b



Goals accomplished! ๐Ÿ™
#align nat.prime_def_lt''
Nat.prime_def_lt'': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
Nat.prime_def_lt''
theorem
prime_def_lt: โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m < p โ†’ m โˆฃ p โ†’ m = 1
prime_def_lt
{p :
โ„•: Type
โ„•
} :
Prime: โ„• โ†’ Prop
Prime
p โ†”
2: ?m.2274
2
โ‰ค p โˆง โˆ€
m: ?m.2304
m
< p,
m: ?m.2304
m
โˆฃ p โ†’
m: ?m.2304
m
=
1: ?m.2328
1
:=
prime_def_lt'': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
prime_def_lt''
.
trans: โˆ€ {a b c : Prop}, (a โ†” b) โ†’ (b โ†” c) โ†’ (a โ†” c)
trans
<|
and_congr_right: โˆ€ {a b c : Prop}, (a โ†’ (b โ†” c)) โ†’ (a โˆง b โ†” a โˆง c)
and_congr_right
fun
p2: ?m.2376
p2
=>
forall_congr': โˆ€ {ฮฑ : Sort ?u.2378} {p q : ฮฑ โ†’ Prop}, (โˆ€ (a : ฮฑ), p a โ†” q a) โ†’ ((โˆ€ (a : ฮฑ), p a) โ†” โˆ€ (a : ฮฑ), q a)
forall_congr'
fun
_: ?m.2392
_
=> โŸจfun
h: ?m.2404
h
l: ?m.2407
l
d: ?m.2410
d
=> (
h: ?m.2404
h
d: ?m.2410
d
).
resolve_right: โˆ€ {a b : Prop}, a โˆจ b โ†’ ยฌb โ†’ a
resolve_right
(
ne_of_lt: โˆ€ {a b : โ„•}, a < b โ†’ a โ‰  b
ne_of_lt
l: ?m.2407
l
), fun
h: ?m.2433
h
d: ?m.2436
d
=> (
le_of_dvd: โˆ€ {m n : โ„•}, 0 < n โ†’ m โˆฃ n โ†’ m โ‰ค n
le_of_dvd
(
le_of_succ_le: โˆ€ {n m : โ„•}, succ n โ‰ค m โ†’ n โ‰ค m
le_of_succ_le
p2: ?m.2376
p2
)
d: ?m.2436
d
).
lt_or_eq_dec: โˆ€ {ฮฑ : Type ?u.2452} [inst : PartialOrder ฮฑ] [inst_1 : DecidableRel fun x x_1 => x โ‰ค x_1] {a b : ฮฑ}, a โ‰ค b โ†’ a < b โˆจ a = b
lt_or_eq_dec
.
imp_left: โˆ€ {a b c : Prop}, (a โ†’ b) โ†’ a โˆจ c โ†’ b โˆจ c
imp_left
fun
l: ?m.2546
l
=>
h: ?m.2433
h
l: ?m.2546
l
d: ?m.2436
d
โŸฉ #align nat.prime_def_lt
Nat.prime_def_lt: โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m < p โ†’ m โˆฃ p โ†’ m = 1
Nat.prime_def_lt
theorem
prime_def_lt': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p
prime_def_lt'
{p :
โ„•: Type
โ„•
} :
Prime: โ„• โ†’ Prop
Prime
p โ†”
2: ?m.2586
2
โ‰ค p โˆง โˆ€
m: ?m.2616
m
,
2: ?m.2622
2
โ‰ค
m: ?m.2616
m
โ†’
m: ?m.2616
m
< p โ†’ ยฌ
m: ?m.2616
m
โˆฃ p :=
prime_def_lt: โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), m < p โ†’ m โˆฃ p โ†’ m = 1
prime_def_lt
.
trans: โˆ€ {a b c : Prop}, (a โ†” b) โ†’ (b โ†” c) โ†’ (a โ†” c)
trans
<|
and_congr_right: โˆ€ {a b c : Prop}, (a โ†’ (b โ†” c)) โ†’ (a โˆง b โ†” a โˆง c)
and_congr_right
fun
p2: ?m.2745
p2
=>
forall_congr': โˆ€ {ฮฑ : Sort ?u.2747} {p q : ฮฑ โ†’ Prop}, (โˆ€ (a : ฮฑ), p a โ†” q a) โ†’ ((โˆ€ (a : ฮฑ), p a) โ†” โˆ€ (a : ฮฑ), q a)
forall_congr'
fun
m: ?m.2762
m
=> โŸจfun
h: ?m.2775
h
m2: ?m.2778
m2
l: ?m.2781
l
d: ?m.2784
d
=>
not_lt_of_ge: โˆ€ {ฮฑ : Type ?u.2786} [inst : Preorder ฮฑ] {a b : ฮฑ}, a โ‰ฅ b โ†’ ยฌa < b
not_lt_of_ge
m2: ?m.2778
m2
((
h: ?m.2775
h
l: ?m.2781
l
d: ?m.2784
d
).
symm: โˆ€ {ฮฑ : Sort ?u.2842} {a b : ฮฑ}, a = b โ†’ b = a
symm
โ–ธ

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: m < p โ†’ m โˆฃ p โ†’ m = 1

m2: 2 โ‰ค m

l: m < p

d: m โˆฃ p


1 < 2

Goals accomplished! ๐Ÿ™
), fun
h: ?m.2869
h
l: ?m.2874
l
d: ?m.2877
d
=>

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p

l: m < p

d: m โˆฃ p


m = 1
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค succ zero โ†’ succ zero < p โ†’ ยฌsucc zero โˆฃ p

l: succ zero < p

d: succ zero โˆฃ p


succ.zero
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค succ (succ m) โ†’ succ (succ m) < p โ†’ ยฌsucc (succ m) โˆฃ p

l: succ (succ m) < p

d: succ (succ m) โˆฃ p


succ.succ
succ (succ m) = 1
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p

l: m < p

d: m โˆฃ p


m = 1
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค succ zero โ†’ succ zero < p โ†’ ยฌsucc zero โˆฃ p

l: succ zero < p

d: succ zero โˆฃ p


succ.zero
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค succ (succ m) โ†’ succ (succ m) < p โ†’ ยฌsucc (succ m) โˆฃ p

l: succ (succ m) < p

d: succ (succ m) โˆฃ p


succ.succ
succ (succ m) = 1
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค 0

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค 0

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค 0

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
p: โ„•

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero
2 โ‰ค 0 โ†’ zero = 1
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค zero โ†’ zero < p โ†’ ยฌzero โˆฃ p

l: zero < p

d: zero โˆฃ p


zero

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p

l: m < p

d: m โˆฃ p


m = 1
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค succ zero โ†’ succ zero < p โ†’ ยฌsucc zero โˆฃ p

l: succ zero < p

d: succ zero โˆฃ p


succ.zero
p: โ„•

p2: 2 โ‰ค p

h: 2 โ‰ค succ zero โ†’ succ zero < p โ†’ ยฌsucc zero โˆฃ p

l: succ zero < p

d: succ zero โˆฃ p


succ.zero
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค succ (succ m) โ†’ succ (succ m) < p โ†’ ยฌsucc (succ m) โˆฃ p

l: succ (succ m) < p

d: succ (succ m) โˆฃ p


succ.succ
succ (succ m) = 1

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p

l: m < p

d: m โˆฃ p


m = 1
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค succ (succ m) โ†’ succ (succ m) < p โ†’ ยฌsucc (succ m) โˆฃ p

l: succ (succ m) < p

d: succ (succ m) โˆฃ p


succ.succ
succ (succ m) = 1
p: โ„•

p2: 2 โ‰ค p

m: โ„•

h: 2 โ‰ค succ (succ m) โ†’ succ (succ m) < p โ†’ ยฌsucc (succ m) โˆฃ p

l: succ (succ m) < p

d: succ (succ m) โˆฃ p


succ.succ
succ (succ m) = 1

Goals accomplished! ๐Ÿ™
โŸฉ #align nat.prime_def_lt'
Nat.prime_def_lt': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p
Nat.prime_def_lt'
theorem
prime_def_le_sqrt: โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p
prime_def_le_sqrt
{p :
โ„•: Type
โ„•
} :
Prime: โ„• โ†’ Prop
Prime
p โ†”
2: ?m.3321
2
โ‰ค p โˆง โˆ€
m: ?m.3351
m
,
2: ?m.3357
2
โ‰ค
m: ?m.3351
m
โ†’
m: ?m.3351
m
โ‰ค
sqrt: โ„• โ†’ โ„•
sqrt
p โ†’ ยฌ
m: ?m.3351
m
โˆฃ p :=
prime_def_lt': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p
prime_def_lt'
.
trans: โˆ€ {a b c : Prop}, (a โ†” b) โ†’ (b โ†” c) โ†’ (a โ†” c)
trans
<|
and_congr_right: โˆ€ {a b c : Prop}, (a โ†’ (b โ†” c)) โ†’ (a โˆง b โ†” a โˆง c)
and_congr_right
fun
p2: ?m.3477
p2
=> โŸจfun
a: ?m.3486
a
m: ?m.3492
m
m2: ?m.3495
m2
l: ?m.3498
l
=>
a: ?m.3486
a
m: ?m.3492
m
m2: ?m.3495
m2
<|
lt_of_le_of_lt: โˆ€ {ฮฑ : Type ?u.3501} [inst : Preorder ฮฑ] {a b c : ฮฑ}, a โ‰ค b โ†’ b < c โ†’ a < c
lt_of_le_of_lt
l: ?m.3498
l
<|
sqrt_lt_self: โˆ€ {n : โ„•}, 1 < n โ†’ sqrt n < n
sqrt_lt_self
p2: ?m.3477
p2
, fun
a: ?m.3600
a
=> have : โˆ€ {m k :
โ„•: Type
โ„•
}, m โ‰ค k โ†’
1: ?m.3619
1
< m โ†’ p โ‰  m * k := fun {
m: ?m.3700
m
k: ?m.3703
k
}
mk: ?m.3706
mk
m1: ?m.3709
m1
e: ?m.3712
e
=>
a: ?m.3600
a
m: ?m.3700
m
m1: ?m.3709
m1
(
le_sqrt: โˆ€ {m n : โ„•}, m โ‰ค sqrt n โ†” m * m โ‰ค n
le_sqrt
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
(
e: ?m.3712
e
.
symm: โˆ€ {ฮฑ : Sort ?u.3718} {a b : ฮฑ}, a = b โ†’ b = a
symm
โ–ธ
Nat.mul_le_mul_left: โˆ€ {n m : โ„•} (k : โ„•), n โ‰ค m โ†’ k * n โ‰ค k * m
Nat.mul_le_mul_left
m: ?m.3700
m
mk: ?m.3706
mk
)) โŸจ
k: ?m.3703
k
,
e: ?m.3712
e
โŸฉ fun
m: ?m.3770
m
m2: ?m.3773
m2
l: ?m.3776
l
โŸจk,
e: p = m * k
e
โŸฉ =>

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k


p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

mk: m โ‰ค k


inl
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k


p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

mk: m โ‰ค k


inl
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

mk: m โ‰ค k


inl
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr

Goals accomplished! ๐Ÿ™
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k


p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
1 * m < k * m
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = m * k

km: k โ‰ค m


inr
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
1 * m < k * m
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
m < k * m
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
1 * m < k * m
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
m < p
p: โ„•

p2: 2 โ‰ค p

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p

this: โˆ€ {m k : โ„•}, m โ‰ค k โ†’ 1 < m โ†’ p โ‰  m * k

m: โ„•

m2: 2 โ‰ค m

l: m < p

xโœ: m โˆฃ p

k: โ„•

e: p = k * m

km: k โ‰ค m


inr
m < p
โŸฉ #align nat.prime_def_le_sqrt
Nat.prime_def_le_sqrt: โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โ‰ค sqrt p โ†’ ยฌm โˆฃ p
Nat.prime_def_le_sqrt
theorem
prime_of_coprime: โˆ€ (n : โ„•), 1 < n โ†’ (โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m) โ†’ Prime n
prime_of_coprime
(n :
โ„•: Type
โ„•
) (
h1: 1 < n
h1
:
1: ?m.4503
1
< n) (
h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m
h
: โˆ€
m: ?m.4539
m
< n,
m: ?m.4539
m
โ‰ 
0: ?m.4551
0
โ†’ n.
coprime: โ„• โ†’ โ„• โ†’ Prop
coprime
m: ?m.4539
m
) :
Prime: โ„• โ†’ Prop
Prime
n :=

Goals accomplished! ๐Ÿ™
n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

m: โ„•

mlt: m < n

mdvd: m โˆฃ n


m = 1
n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

m: โ„•

mlt: m < n

mdvd: m โˆฃ n


m = 1

Goals accomplished! ๐Ÿ™
n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

m: โ„•

mlt: m < n

mdvd: m โˆฃ n


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

mlt: 0 < n

mdvd: 0 โˆฃ n


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

m: โ„•

mlt: m < n

mdvd: m โˆฃ n


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

mlt: 0 < n

mdvd: 0 โˆฃ n


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

mlt: 0 < n

mdvd: n = 0


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

mlt: 0 < n

mdvd: n = 0


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

mlt: 0 < n

mdvd: n = 0


n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m

m: โ„•

mlt: m < n

mdvd: m โˆฃ n



Goals accomplished! ๐Ÿ™
n: โ„•

h1: 1 < n

h: โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m



Goals accomplished! ๐Ÿ™
#align nat.prime_of_coprime
Nat.prime_of_coprime: โˆ€ (n : โ„•), 1 < n โ†’ (โˆ€ (m : โ„•), m < n โ†’ m โ‰  0 โ†’ coprime n m) โ†’ Prime n
Nat.prime_of_coprime
section /-- 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. -/ @[local instance] def
decidablePrime1: (p : โ„•) โ†’ Decidable (Prime p)
decidablePrime1
(p :
โ„•: Type
โ„•
) :
Decidable: Prop โ†’ Type
Decidable
(
Prime: โ„• โ†’ Prop
Prime
p) :=
decidable_of_iff': {a : Prop} โ†’ (b : Prop) โ†’ (a โ†” b) โ†’ [inst : Decidable b] โ†’ Decidable a
decidable_of_iff'
_: Prop
_
prime_def_lt': โˆ€ {p : โ„•}, Prime p โ†” 2 โ‰ค p โˆง โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m < p โ†’ ยฌm โˆฃ p
prime_def_lt'
#align nat.decidable_prime_1
Nat.decidablePrime1: (p : โ„•) โ†’ Decidable (Prime p)
Nat.decidablePrime1
theorem
prime_two: Prime 2
prime_two
:
Prime: โ„• โ†’ Prop
Prime
2: ?m.5130
2
:=

Goals accomplished! ๐Ÿ™

Goals accomplished! ๐Ÿ™
#align nat.prime_two
Nat.prime_two: Prime 2
Nat.prime_two
theorem
prime_three: Prime 3
prime_three
:
Prime: โ„• โ†’ Prop
Prime
3: ?m.5176
3
:=

Goals accomplished! ๐Ÿ™

Goals accomplished! ๐Ÿ™
#align nat.prime_three
Nat.prime_three: Prime 3
Nat.prime_three
theorem
Prime.five_le_of_ne_two_of_ne_three: โˆ€ {p : โ„•}, Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ 5 โ‰ค p
Prime.five_le_of_ne_two_of_ne_three
{p :
โ„•: Type
โ„•
} (
hp: Prime p
hp
: p.
Prime: โ„• โ†’ Prop
Prime
) (
h_two: p โ‰  2
h_two
: p โ‰ 
2: ?m.5251
2
) (
h_three: p โ‰  3
h_three
: p โ‰ 
3: ?m.5265
3
) :
5: ?m.5274
5
โ‰ค p :=

Goals accomplished! ๐Ÿ™
p: โ„•

hp: Prime p

h_two: p โ‰  2

h_three: p โ‰  3


p: โ„•

hp: Prime p

h_two: p โ‰  2

h_three: p โ‰  3

h: p < 5


p: โ„•

hp: Prime p

h_two: p โ‰  2

h_three: p โ‰  3


p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

hp: Prime p

h_two: p โ‰  2

h_three: p โ‰  3


p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

h: 0 < 5


Prime 0 โ†’ 0 โ‰  2 โ†’ 0 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

h: 1 < 5


Prime 1 โ†’ 1 โ‰  2 โ†’ 1 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

h: 2 < 5


Prime 2 โ†’ 2 โ‰  2 โ†’ 2 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

h: 3 < 5


Prime 3 โ†’ 3 โ‰  2 โ†’ 3 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p: โ„•

h: 4 < 5


Prime 4 โ†’ 4 โ‰  2 โ†’ 4 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False
p, n: โ„•

h: n + 5 < 5


Prime (n + 5) โ†’ n + 5 โ‰  2 โ†’ n + 5 โ‰  3 โ†’ False
p: โ„•

h: p < 5


Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ False

Goals accomplished! ๐Ÿ™
#align nat.prime.five_le_of_ne_two_of_ne_three
Nat.Prime.five_le_of_ne_two_of_ne_three: โˆ€ {p : โ„•}, Prime p โ†’ p โ‰  2 โ†’ p โ‰  3 โ†’ 5 โ‰ค p
Nat.Prime.five_le_of_ne_two_of_ne_three
end theorem
Prime.pred_pos: โˆ€ {p : โ„•}, Prime p โ†’ 0 < pred p
Prime.pred_pos
{p :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) :
0: ?m.7513
0
<
pred: โ„• โ†’ โ„•
pred
p :=
lt_pred_iff: โˆ€ {m n : โ„•}, n < pred m โ†” succ n < m
lt_pred_iff
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
pp: Prime p
pp
.
one_lt: โˆ€ {p : โ„•}, Prime p โ†’ 1 < p
one_lt
#align nat.prime.pred_pos
Nat.Prime.pred_pos: โˆ€ {p : โ„•}, Prime p โ†’ 0 < pred p
Nat.Prime.pred_pos
theorem
succ_pred_prime: โˆ€ {p : โ„•}, Prime p โ†’ succ (pred p) = p
succ_pred_prime
{p :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) :
succ: โ„• โ†’ โ„•
succ
(
pred: โ„• โ†’ โ„•
pred
p) = p :=
succ_pred_eq_of_pos: โˆ€ {n : โ„•}, 0 < n โ†’ succ (pred n) = n
succ_pred_eq_of_pos
pp: Prime p
pp
.
pos: โˆ€ {p : โ„•}, Prime p โ†’ 0 < p
pos
#align nat.succ_pred_prime
Nat.succ_pred_prime: โˆ€ {p : โ„•}, Prime p โ†’ succ (pred p) = p
Nat.succ_pred_prime
theorem
dvd_prime: โˆ€ {p m : โ„•}, Prime p โ†’ (m โˆฃ p โ†” m = 1 โˆจ m = p)
dvd_prime
{p m :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) : m โˆฃ p โ†” m =
1: ?m.7606
1
โˆจ m = p := โŸจfun
d: ?m.7645
d
=>
pp: Prime p
pp
.
eq_one_or_self_of_dvd: โˆ€ {p : โ„•}, Prime p โ†’ โˆ€ (m : โ„•), m โˆฃ p โ†’ m = 1 โˆจ m = p
eq_one_or_self_of_dvd
m
d: ?m.7645
d
, fun
h: ?m.7658
h
=>
h: ?m.7658
h
.
elim: โˆ€ {a b c : Prop}, a โˆจ b โ†’ (a โ†’ c) โ†’ (b โ†’ c) โ†’ c
elim
(fun
e: ?m.7670
e
=>
e: ?m.7670
e
.
symm: โˆ€ {ฮฑ : Sort ?u.7672} {a b : ฮฑ}, a = b โ†’ b = a
symm
โ–ธ
one_dvd: โˆ€ {ฮฑ : Type ?u.7683} [inst : Monoid ฮฑ] (a : ฮฑ), 1 โˆฃ a
one_dvd
_: ?m.7684
_
) fun
e: ?m.7744
e
=>
e: ?m.7744
e
.
symm: โˆ€ {ฮฑ : Sort ?u.7746} {a b : ฮฑ}, a = b โ†’ b = a
symm
โ–ธ
dvd_rfl: โˆ€ {ฮฑ : Type ?u.7754} [inst : Monoid ฮฑ] {a : ฮฑ}, a โˆฃ a
dvd_rfl
โŸฉ #align nat.dvd_prime
Nat.dvd_prime: โˆ€ {p m : โ„•}, Prime p โ†’ (m โˆฃ p โ†” m = 1 โˆจ m = p)
Nat.dvd_prime
theorem
dvd_prime_two_le: โˆ€ {p m : โ„•}, Prime p โ†’ 2 โ‰ค m โ†’ (m โˆฃ p โ†” m = p)
dvd_prime_two_le
{p m :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) (
H: 2 โ‰ค m
H
:
2: ?m.7819
2
โ‰ค m) : m โˆฃ p โ†” m = p := (
dvd_prime: โˆ€ {p m : โ„•}, Prime p โ†’ (m โˆฃ p โ†” m = 1 โˆจ m = p)
dvd_prime
pp: Prime p
pp
).
trans: โˆ€ {a b c : Prop}, (a โ†” b) โ†’ (b โ†” c) โ†’ (a โ†” c)
trans
<|
or_iff_right_of_imp: โˆ€ {a b : Prop}, (a โ†’ b) โ†’ (a โˆจ b โ†” b)
or_iff_right_of_imp
<|
Not.elim: โˆ€ {a : Prop} {ฮฑ : Sort ?u.7884}, ยฌa โ†’ a โ†’ ฮฑ
Not.elim
<|
ne_of_gt: โˆ€ {a b : โ„•}, b < a โ†’ a โ‰  b
ne_of_gt
H: 2 โ‰ค m
H
#align nat.dvd_prime_two_le
Nat.dvd_prime_two_le: โˆ€ {p m : โ„•}, Prime p โ†’ 2 โ‰ค m โ†’ (m โˆฃ p โ†” m = p)
Nat.dvd_prime_two_le
theorem
prime_dvd_prime_iff_eq: โˆ€ {p q : โ„•}, Prime p โ†’ Prime q โ†’ (p โˆฃ q โ†” p = q)
prime_dvd_prime_iff_eq
{p q :
โ„•: Type
โ„•
} (
pp: Prime p
pp
: p.
Prime: โ„• โ†’ Prop
Prime
) (
qp: Prime q
qp
: q.
Prime: โ„• โ†’ Prop
Prime
) : p โˆฃ q โ†” p = q :=
dvd_prime_two_le: โˆ€ {p m : โ„•}, Prime p โ†’ 2 โ‰ค m โ†’ (m โˆฃ p โ†” m = p)
dvd_prime_two_le
qp: Prime q
qp
(
Prime.two_le: โˆ€ {p : โ„•}, Prime p โ†’ 2 โ‰ค p
Prime.two_le
pp: Prime p
pp
) #align nat.prime_dvd_prime_iff_eq
Nat.prime_dvd_prime_iff_eq: โˆ€ {p q : โ„•}, Prime p โ†’ Prime q โ†’ (p โˆฃ q โ†” p = q)
Nat.prime_dvd_prime_iff_eq
theorem
Prime.not_dvd_one: โˆ€ {p : โ„•}, Prime p โ†’ ยฌp โˆฃ 1
Prime.not_dvd_one
{p :
โ„•: Type
โ„•
} (
pp: Prime p
pp
:
Prime: โ„• โ†’ Prop
Prime
p) : ยฌp โˆฃ
1: ?m.7960
1
:=
Irreducible.not_dvd_one: โˆ€ {ฮฑ : Type ?u.7978} [inst : CommMonoid ฮฑ] {p : ฮฑ}, Irreducible p โ†’ ยฌp โˆฃ 1
Irreducible.not_dvd_one
pp: Prime p
pp
#align nat.prime.not_dvd_one
Nat.Prime.not_dvd_one: โˆ€ {p : โ„•}, Prime p โ†’ ยฌp โˆฃ 1
Nat.Prime.not_dvd_one
theorem
not_prime_mul: โˆ€ {a b : โ„•}, 1 < a โ†’ 1 < b โ†’ ยฌPrime (a * b)
not_prime_mul
{a b :
โ„•: Type
โ„•
} (
a1: 1 < a
a1
:
1: ?m.8054
1
< a) (
b1: 1 < b
b1
:
1: ?m.8091
1
< b) : ยฌ
Prime: โ„• โ†’ Prop
Prime
(a * b) := fun
h: ?m.8173
h
=>
ne_of_lt: โˆ€ {a b : โ„•}, a < b โ†’ a โ‰  b
ne_of_lt
(
Nat.mul_lt_mul_of_pos_left: โˆ€ {n m k : โ„•}, n < m โ†’ k > 0 โ†’ k * n < k * m
Nat.mul_lt_mul_of_pos_left
b1: 1 < b
b1
(
lt_of_succ_lt: โˆ€ {n m : โ„•}, succ n < m โ†’ n < m
lt_of_succ_lt
a1: 1 < a
a1
)) <|

Goals accomplished! ๐Ÿ™
a, b: โ„•

a1: 1 < a

b1: 1 < b

h: Prime (a * b)


a * 1 = a * b

Goals accomplished! ๐Ÿ™
#align nat.not_prime_mul
Nat.not_prime_mul: โˆ€ {a b : โ„•}, 1 < a โ†’ 1 < b โ†’ ยฌPrime (a * b)
Nat.not_prime_mul
theorem
not_prime_mul': โˆ€ {a b n : โ„•}, a * b = n โ†’ 1 < a โ†’ 1 < b โ†’ ยฌPrime n
not_prime_mul'
{a b n :
โ„•: Type
โ„•
} (
h: a * b = n
h
: a * b = n) (
hโ‚: 1 < a
hโ‚
:
1: ?m.8759
1
< a) (
hโ‚‚: 1 < b
hโ‚‚
:
1: ?m.8796
1
< b) : ยฌ
Prime: โ„• โ†’ Prop
Prime
n :=

Goals accomplished! ๐Ÿ™
a, b, n: โ„•

h: a * b = n

hโ‚: 1 < a

hโ‚‚: 1 < b


a, b, n: โ„•

h: a * b = n

hโ‚: 1 < a

hโ‚‚: 1 < b


a, b, n: โ„•

h: a * b = n

hโ‚: 1 < a

hโ‚‚: 1 < b


a, b, n: โ„•

h: a * b = n

hโ‚: 1 < a

hโ‚‚: 1 < b


a, b, n: โ„•

h: a * b = n

hโ‚: 1 < a

hโ‚‚: 1 < b



Goals accomplished! ๐Ÿ™
#align nat.not_prime_mul'
Nat.not_prime_mul': โˆ€ {a b n : โ„•}, a * b = n โ†’ 1 < a โ†’ 1 < b โ†’ ยฌPrime n
Nat.not_prime_mul'
theorem
prime_mul_iff: โˆ€ {a b : โ„•}, Prime (a * b) โ†” Prime a โˆง b = 1 โˆจ Prime b โˆง a = 1
prime_mul_iff
{a b :
โ„•: Type
โ„•
} :
Nat.Prime: โ„• โ†’ Prop
Nat.Prime
(a * b) โ†” a.
Prime: โ„• โ†’ Prop
Prime
โˆง b =
1: ?m.8927
1
โˆจ b.
Prime: โ„• โ†’ Prop
Prime
โˆง a =
1: ?m.8954
1
:=

Goals accomplished! ๐Ÿ™

Goals accomplished! ๐Ÿ™
#align nat.prime_mul_iff
Nat.prime_mul_iff: โˆ€ {a b : โ„•}, Prime (a * b) โ†” Prime a โˆง b = 1 โˆจ Prime b โˆง a = 1
Nat.prime_mul_iff
theorem
Prime.dvd_iff_eq: โˆ€ {p a : โ„•}, Prime p โ†’ a โ‰  1 โ†’ (a โˆฃ p โ†” p = a)
Prime.dvd_iff_eq
{p a :
โ„•: Type
โ„•
} (
hp: Prime p
hp
: p.
Prime: โ„• โ†’ Prop
Prime
) (
a1: a โ‰  1
a1
: a โ‰ 
1: ?m.9169
1
) : a โˆฃ p โ†” p = a :=

Goals accomplished! ๐Ÿ™
p, a: โ„•

hp: Prime p

a1: a โ‰  1


p, a: โ„•

hp: Prime p

a1: a โ‰  1



Goals accomplished! ๐Ÿ™
p, a: โ„•

hp: Prime p

a1: a โ‰  1


p = a โ†’ a โˆฃ p
p: โ„•

hp: Prime p

a1: p โ‰  1


p, a: โ„•

hp: Prime p

a1: a โ‰  1


p = a โ†’ a โˆฃ p

Goals accomplished! ๐Ÿ™
p, a: โ„•

hp: Prime p

a1: a โ‰  1


a โˆฃ p โ†’ p = a
p, a: โ„•

hp: Prime p

a1: a โ‰  1


a: โ„•

a1: a โ‰  1

j: โ„•

hp: Prime (a * j)


intro
a * j = a
p, a: โ„•

hp: Prime p

a1: a โ‰  1


a: โ„•

a1: a โ‰  1

leftโœ: Prime a

hp: Prime (a * 1)


intro.inl.intro
a * 1 = a
j: โ„•

leftโœ: Prime j

a1: 1 โ‰  1

hp: Prime (1 * j)


intro.inr.intro
1 * j = 1
p, a: โ„•

hp: Prime p

a1: a โ‰  1


a: โ„•

a1: a โ‰  1

leftโœ: Prime a

hp: Prime (a * 1)


intro.inl.intro
a * 1 = a
a: โ„•

a1: a โ‰  1

leftโœ: Prime a

hp: Prime (a * 1)


intro.inl.intro
a * 1 = a
j: โ„•

leftโœ: Prime j

a1: 1 โ‰  1

hp: Prime (1 * j)


intro.inr.intro
1 * j = 1

Goals accomplished! ๐Ÿ™
p, a: โ„•

hp: Prime p

a1: a โ‰  1


j: โ„•

leftโœ: Prime j

a1: 1 โ‰  1

hp: Prime (1 * j)


intro.inr.intro
1 * j = 1
j: โ„•

leftโœ: Prime j

a1: 1 โ‰  1

hp: Prime (1 * j)


intro.inr.intro
1 * j = 1

Goals accomplished! ๐Ÿ™
#align nat.prime.dvd_iff_eq
Nat.Prime.dvd_iff_eq: โˆ€ {p a : โ„•}, Prime p โ†’ a โ‰  1 โ†’ (a โˆฃ p โ†” p = a)
Nat.Prime.dvd_iff_eq
section MinFac theorem
minFac_lemma: โˆ€ (n k : โ„•), ยฌn < k * k โ†’ sqrt n - k < sqrt n + 2 - k
minFac_lemma
(n k :
โ„•: Type
โ„•
) (
h: ยฌn < k * k
h
: ยฌn < k * k) :
sqrt: โ„• โ†’ โ„•
sqrt
n - k <
sqrt: โ„• โ†’ โ„•
sqrt
n +
2: ?m.9582
2
- k := (
tsub_lt_tsub_iff_right: โˆ€ {ฮฑ : Type ?u.9709} [inst : CanonicallyLinearOrderedAddMonoid ฮฑ] [inst_1 : Sub ฮฑ] [inst_2 : OrderedSub ฮฑ] {a b c : ฮฑ} [inst_3 : ContravariantClass ฮฑ ฮฑ (fun x x_1 => x + x_1) fun x x_1 => x โ‰ค x_1], c โ‰ค a โ†’ (a - c < b - c โ†” a < b)
tsub_lt_tsub_iff_right
<|
le_sqrt: โˆ€ {m n : โ„•}, m โ‰ค sqrt n โ†” m * m โ‰ค n
le_sqrt
.
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
<|
le_of_not_gt: โˆ€ {ฮฑ : Type ?u.9729} [inst : LinearOrder ฮฑ] {a b : ฮฑ}, ยฌa > b โ†’ a โ‰ค b
le_of_not_gt
h: ยฌn < k * k
h
).
2: โˆ€ {a b : Prop}, (a โ†” b) โ†’ b โ†’ a
2
<|
Nat.lt_add_of_pos_right: โˆ€ {n k : โ„•}, 0 < k โ†’ n < n + k
Nat.lt_add_of_pos_right
(

Goals accomplished! ๐Ÿ™
n, k: โ„•

h: ยฌn < k * k


0 < 2

Goals accomplished! ๐Ÿ™
) #align nat.min_fac_lemma
Nat.minFac_lemma: โˆ€ (n k : โ„•), ยฌn < k * k โ†’ sqrt n - k < sqrt n + 2 - k
Nat.minFac_lemma
/-- 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 then `minFacAux n 3` is the smallest prime factor of `n`. -/ def
minFacAux: โ„• โ†’ โ„• โ†’ โ„•
minFacAux
(n :
โ„•: Type
โ„•
) :
โ„•: Type
โ„•
โ†’
โ„•: Type
โ„•
|
k: ?m.10013
k
=> if
h: ?m.10085
h
: n <
k: ?m.10013
k
*
k: ?m.10013
k
then n else if
k: ?m.10013
k
โˆฃ n then
k: ?m.10013
k
else have :=
minFac_lemma: โˆ€ (n k : โ„•), ยฌn < k * k โ†’ sqrt n - k < sqrt n + 2 - k
minFac_lemma
n
k: ?m.10013
k
h: ?m.10090
h
minFacAux: โ„• โ†’ โ„• โ†’ โ„•
minFacAux
n (
k: ?m.10013
k
+
2: ?m.10117
2
) termination_by _ n k =>
sqrt: โ„• โ†’ โ„•
sqrt
n +
2: ?m.10250
2
-
k: ?ฮฑ
k
#align nat.min_fac_aux
Nat.minFacAux: โ„• โ†’ โ„• โ†’ โ„•
Nat.minFacAux
/-- Returns the smallest prime factor of `n โ‰  1`. -/ def
minFac: โ„• โ†’ โ„•
minFac
(n :
โ„•: Type
โ„•
) :
โ„•: Type
โ„•
:= if
2: ?m.30036
2
โˆฃ n then
2: ?m.30063
2
else
minFacAux: โ„• โ†’ โ„• โ†’ โ„•
minFacAux
n
3: ?m.30073
3
#align nat.min_fac
Nat.minFac: โ„• โ†’ โ„•
Nat.minFac
@[simp] theorem
minFac_zero: minFac 0 = 2
minFac_zero
:
minFac: โ„• โ†’ โ„•
minFac
0: ?m.30110
0
=
2: ?m.30121
2
:=
rfl: โˆ€ {ฮฑ : Sort ?u.30139} {a : ฮฑ}, a = a
rfl
#align nat.min_fac_zero
Nat.minFac_zero: minFac 0 = 2
Nat.minFac_zero
@[simp] theorem
minFac_one: minFac 1 = 1
minFac_one
:
minFac: โ„• โ†’ โ„•
minFac
1: ?m.30159
1
=
1: ?m.30170
1
:=
rfl: โˆ€ {ฮฑ : Sort ?u.30187} {a : ฮฑ}, a = a
rfl
#align nat.min_fac_one
Nat.minFac_one: minFac 1 = 1
Nat.minFac_one
theorem
minFac_eq: โˆ€ (n : โ„•), minFac n = if 2 โˆฃ n then 2 else minFacAux n 3
minFac_eq
(n :
โ„•: Type
โ„•
) :
minFac: โ„• โ†’ โ„•
minFac
n = if
2: ?m.30227
2
โˆฃ n then
2: ?m.30243
2
else
minFacAux: โ„• โ†’ โ„• โ†’ โ„•
minFacAux
n
3: ?m.30253
3
:=
rfl: โˆ€ {ฮฑ : Sort ?u.30279} {a : ฮฑ}, a = a
rfl
#align nat.min_fac_eq
Nat.minFac_eq: โˆ€ (n : โ„•), minFac n = if 2 โˆฃ n then 2 else minFacAux n 3
Nat.minFac_eq
private def
minFacProp: โ„• โ†’ โ„• โ†’ Prop
minFacProp
(n k :
โ„•: Type
โ„•
) :=
2: ?m.30419
2
โ‰ค k โˆง k โˆฃ n โˆง โˆ€
m: ?m.30455
m
,
2: ?m.30461
2
โ‰ค
m: ?m.30455
m
โ†’
m: ?m.30455
m
โˆฃ n โ†’ k โ‰ค
m: ?m.30455
m
theorem
minFacAux_has_prop: โˆ€ {n : โ„•}, 2 โ‰ค n โ†’ โˆ€ (k i : โ„•), k = 2 * i + 3 โ†’ (โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ k โ‰ค m) โ†’ Nat.minFacProp n (minFacAux n k)
minFacAux_has_prop
{n :
โ„•: Type
โ„•
} (
n2: 2 โ‰ค n
n2
:
2: ?m.30580
2
โ‰ค n) : โˆ€
k: ?m.30612
k
i: ?m.30615
i
,
k: ?m.30612
k
=
2: ?m.30627
2
*
i: ?m.30615
i
+
3: ?m.30637
3
โ†’ (โˆ€
m: ?m.30705
m
,
2: ?m.30711
2
โ‰ค
m: ?m.30705
m
โ†’
m: ?m.30705
m
โˆฃ n โ†’
k: ?m.30612
k
โ‰ค
m: ?m.30705
m
) โ†’
minFacProp: โ„• โ†’ โ„• โ†’ Prop
minFacProp
n (
minFacAux: โ„• โ†’ โ„• โ†’ โ„•
minFacAux
n
k: ?m.30612
k
) |
k: ?m.31052
k
=> fun
i: ?m.31055
i
e: ?m.31058
e
a: ?m.31061
a
=>

Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k


pos
Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


neg
Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k


pos
Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


neg
Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (if h : n < xโœ * xโœ then n else if xโœ โˆฃ n then xโœ else let_fun this := (_ : sqrt n - xโœ < sqrt n + 2 - xโœ); minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k


pos
Nat.minFacProp n n
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k


pos
Nat.minFacProp n n
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k

pp: Prime n


pos
Nat.minFacProp n n
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: n < k * k


pos
Nat.minFacProp n n

Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))

Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k


n: โ„•

n2: 2 โ‰ค n

i: โ„•

k:= 2 * i + 3: โ„•

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ 2 * i + 3 โ‰ค m

h: ยฌn < k * k


n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k



Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: k โˆฃ n


pos
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: k โˆฃ n


pos
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k


neg
Nat.minFacProp n (if xโœ โˆฃ n then xโœ else minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: k โˆฃ n


pos
Nat.minFacProp n xโœ
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: k โˆฃ n


pos
Nat.minFacProp n xโœ
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: k โˆฃ n


pos
Nat.minFacProp n xโœ
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (minFacAux n (xโœ + 2))

Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m


Nat.minFacProp n (minFacAux n xโœ)
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (minFacAux n (xโœ + 2))
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n


neg
Nat.minFacProp n (minFacAux n (xโœ + 2))

Goals accomplished! ๐Ÿ™
n: โ„•

n2: 2 โ‰ค n

xโœ: โ„•

k:= xโœ: โ„•

i: โ„•

e: xโœ = 2 * i + 3

a: โˆ€ (m : โ„•), 2 โ‰ค m โ†’ m โˆฃ n โ†’ xโœ โ‰ค m

h: ยฌn < k * k

k2: 2 โ‰ค k

dk: ยฌk โˆฃ n

this: sqrt n - k < sqrt n + 2 - k


k + 2 = 2 * (i + 1) + 3

Goals accomplished! ๐Ÿ™