-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInfinitud_de_primos.lean
104 lines (92 loc) · 3.41 KB
/
Infinitud_de_primos.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
-- Infinitud_de_primos.lean
-- Existen infinitos números primos.
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 25-enero-2024
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Demostrar que hay infinitos números primos.
-- ---------------------------------------------------------------------
-- Demostración en lenguaje natural
-- ================================
-- Se usarán los siguientes lemas de los números naturales
-- n ≠ 1 → el menor factor primo de n es primo (L1)
-- n! > 0 (L2)
-- 0 < k → n < k + n (L3)
-- k < n → n ≠ k (L4)
-- k ≱ n → k ≤ n (L5)
-- 0 < k → k ≤ n → k ∣ n! (L6)
-- 0 < minFac(n) (L7)
-- k ∣ m → (k ∣ n ↔ k ∣ m + n) (L8)
-- minFac(n) ∣ n (L9)
-- Prime(n) → ¬n ∣ 1 (L10)
--
-- Sea p el menor factor primo de n! + 1. Tenemos que demostrar que n ≤
-- p y que p es primo.
--
-- Para demostrar que p es primo, por el lema L1, basta demostrar que
-- n! + 1 ≠ 1
-- Su demostración es
-- n ! > 0 [por L2]
-- ==> n ! + 1 > 1 [por L3]
-- ==> n ! + 1 ≠ 1 [por L4]
--
-- Para demostrar n ≤ p, por el lema L5, basta demostrar que
-- n ≱ p
-- Su demostración es
-- n ≥ p
-- ==> p ∣ n! [por L6 y L7]
-- ==> p | 1 [por L8 y (p | n! + 1) por L9]
-- ==> Falso [por L10 y p es primo]
-- Demostración con Lean4
-- ======================
import Mathlib.Tactic
import Mathlib.Data.Nat.Prime.Defs
open Nat
-- 1ª demostración
-- ===============
example
(n : ℕ) :
∃ p, n ≤ p ∧ Nat.Prime p :=
by
let p := minFac (n ! + 1)
have h1 : Nat.Prime p := by
apply minFac_prime
-- ⊢ n ! + 1 ≠ 1
have h3 : n ! > 0 := factorial_pos n
have h4 : n ! + 1 > 1 := Nat.lt_add_of_pos_left h3
show n ! + 1 ≠ 1
exact Nat.ne_of_gt h4
use p
constructor
. -- ⊢ n ≤ p
apply le_of_not_ge
-- ⊢ ¬n ≥ p
intro h5
-- h5 : n ≥ p
-- ⊢ False
have h6 : p ∣ n ! := dvd_factorial (minFac_pos _) h5
have h7 : p ∣ 1 := (Nat.dvd_add_iff_right h6).mpr (minFac_dvd _)
show False
exact (Nat.Prime.not_dvd_one h1) h7
. -- ⊢ Nat.Prime p
exact h1
-- 2ª demostración
-- ===============
example
(n : ℕ) :
∃ p, n ≤ p ∧ Nat.Prime p :=
exists_infinite_primes n
-- Lemas usados
-- ============
-- variable (k m n : ℕ)
-- #check (Nat.Prime.not_dvd_one : Nat.Prime n → ¬n ∣ 1)
-- #check (Nat.dvd_add_iff_right : k ∣ m → (k ∣ n ↔ k ∣ m + n))
-- #check (Nat.dvd_one : n ∣ 1 ↔ n = 1)
-- #check (Nat.lt_add_of_pos_left : 0 < k → n < k + n)
-- #check (Nat.ne_of_gt : k < n → n ≠ k)
-- #check (dvd_factorial : 0 < k → k ≤ n → k ∣ n !)
-- #check (factorial_pos n: n ! > 0)
-- #check (le_of_not_ge : ¬k ≥ n → k ≤ n)
-- #check (minFac_dvd n : minFac n ∣ n)
-- #check (minFac_pos n : 0 < minFac n)
-- #check (minFac_prime : n ≠ 1 → Nat.Prime (minFac n))