@@ -43,17 +43,49 @@ def mersenne (p : ℕ) : ℕ :=
43
43
2 ^ p - 1
44
44
#align mersenne mersenne
45
45
46
- theorem mersenne_pos {p : ℕ} (h : 0 < p) : 0 < mersenne p := by
47
- dsimp [mersenne]
48
- calc
49
- 0 < 2 ^ 1 - 1 := by norm_num
50
- _ ≤ 2 ^ p - 1 := Nat.sub_le_sub_right (Nat.pow_le_pow_of_le_right (Nat.succ_pos 1 ) h) 1
46
+ theorem strictMono_mersenne : StrictMono mersenne := fun m n h ↦
47
+ (Nat.sub_lt_sub_iff_right <| Nat.one_le_pow _ _ two_pos).2 <| by gcongr; norm_num1
48
+
49
+ @[simp]
50
+ theorem mersenne_lt_mersenne {p q : ℕ} : mersenne p < mersenne q ↔ p < q :=
51
+ strictMono_mersenne.lt_iff_lt
52
+
53
+ @[gcongr] protected alias ⟨_, GCongr.mersenne_lt_mersenne⟩ := mersenne_lt_mersenne
54
+
55
+ @[simp]
56
+ theorem mersenne_le_mersenne {p q : ℕ} : mersenne p ≤ mersenne q ↔ p ≤ q :=
57
+ strictMono_mersenne.le_iff_le
58
+
59
+ @[gcongr] protected alias ⟨_, GCongr.mersenne_le_mersenne⟩ := mersenne_le_mersenne
60
+
61
+ @[simp] theorem mersenne_zero : mersenne 0 = 0 := rfl
62
+
63
+ @[simp] theorem mersenne_pos {p : ℕ} : 0 < mersenne p ↔ 0 < p := mersenne_lt_mersenne (p := 0 )
51
64
#align mersenne_pos mersenne_pos
52
65
53
- theorem one_lt_mersenne {p : ℕ} (hp : 1 < p) : 1 < mersenne p :=
54
- lt_tsub_iff_right.2 <|
55
- calc 1 + 1 = 2 ^ 1 := by rw [one_add_one_eq_two, pow_one]
56
- _ < 2 ^ p := pow_lt_pow_right one_lt_two hp
66
+ namespace Mathlib.Meta.Positivity
67
+
68
+ open Lean Meta Qq Function
69
+
70
+ alias ⟨_, mersenne_pos_of_pos⟩ := mersenne_pos
71
+
72
+ /-- Extension for the `positivity` tactic: `mersenne`. -/
73
+ @[positivity mersenne _]
74
+ def evalMersenne : PositivityExt where eval {u α} _zα _pα e := do
75
+ match u, α, e with
76
+ | 0 , ~q(ℕ), ~q(mersenne $a) =>
77
+ let ra ← core q(inferInstance) q(inferInstance) a
78
+ assertInstancesCommute
79
+ match ra with
80
+ | .positive pa => pure (.positive q(mersenne_pos_of_pos $pa))
81
+ | _ => pure (.nonnegative q(Nat.zero_le (mersenne $a)))
82
+ | _, _, _ => throwError "not mersenne"
83
+
84
+ end Mathlib.Meta.Positivity
85
+
86
+ @[simp]
87
+ theorem one_lt_mersenne {p : ℕ} : 1 < mersenne p ↔ 1 < p :=
88
+ mersenne_lt_mersenne (p := 1 )
57
89
58
90
@[simp]
59
91
theorem succ_mersenne (k : ℕ) : mersenne k + 1 = 2 ^ k := by
@@ -415,7 +447,7 @@ Here and below, we introduce `p' = p - 2`, in order to avoid using subtraction i
415
447
416
448
/-- If `1 < p`, then `q p`, the smallest prime factor of `mersenne p`, is more than 2. -/
417
449
theorem two_lt_q (p' : ℕ) : 2 < q (p' + 2 ) := by
418
- refine (minFac_prime (one_lt_mersenne ?_).ne').two_le.lt_of_ne' ?_
450
+ refine (minFac_prime (one_lt_mersenne. 2 ?_).ne').two_le.lt_of_ne' ?_
419
451
· exact le_add_left _ _
420
452
· rw [Ne, minFac_eq_two_iff, mersenne, Nat.pow_succ']
421
453
exact Nat.two_not_dvd_two_mul_sub_one Nat.one_le_two_pow
@@ -527,7 +559,7 @@ theorem lucas_lehmer_sufficiency (p : ℕ) (w : 1 < p) : LucasLehmerTest p → (
527
559
rw [z] at a
528
560
rw [z] at t
529
561
have h₁ := order_ineq p' t
530
- have h₂ := Nat.minFac_sq_le_self (mersenne_pos (Nat.lt_of_succ_lt w)) a
562
+ have h₂ := Nat.minFac_sq_le_self (mersenne_pos. 2 (Nat.lt_of_succ_lt w)) a
531
563
have h := lt_of_lt_of_le h₁ h₂
532
564
exact not_lt_of_ge (Nat.sub_le _ _) h
533
565
#align lucas_lehmer_sufficiency lucas_lehmer_sufficiency
0 commit comments