@@ -57,8 +57,9 @@ theorem Nat.lt_mul_iff {a b : Nat} : a < a * b ↔ 0 < a ∧ 1 < b := by
5757 · simp
5858 · simp [ha]
5959
60- theorem helper {n i : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j < i → n % j ≠ 0 ) (hi : n % i = 0 )
61- (k : Nat) (hk : n / i < k) (hk₁ : k < n) : n % k ≠ 0 := by
60+ theorem mod_ne_zero_of_forall_of_div_lt {n i : Nat} (hn : 1 < n)
61+ (h : ∀ j, 2 ≤ j → j < i → n % j ≠ 0 ) (hi : n % i = 0 ) (k : Nat) (hk : n / i < k) (hk₁ : k < n) :
62+ n % k ≠ 0 := by
6263 intro hk₂
6364 obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hk₂
6465 rw [Nat.lt_mul_iff] at hk₁
@@ -72,8 +73,9 @@ theorem helper {n i : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j < i → n % j
7273 · rw [Nat.div_lt_iff_lt_mul hi₀] at hk
7374 exact Nat.lt_of_mul_lt_mul_left hk
7475
75- theorem similar_helper {n : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j * j ≤ n → n % j ≠ 0 )
76- (k : Nat) (hk : n < k * k) (hk₁ : k < n) : n % k ≠ 0 := by
76+ theorem mod_ne_zero_of_forall_of_lt_mul_self {n : Nat} (hn : 1 < n)
77+ (h : ∀ j, 2 ≤ j → j * j ≤ n → n % j ≠ 0 ) (k : Nat) (hk : n < k * k) (hk₁ : k < n) :
78+ n % k ≠ 0 := by
7779 intro hk₂
7880 obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hk₂
7981 rw [Nat.lt_mul_iff] at hk₁
@@ -82,53 +84,23 @@ theorem similar_helper {n : Nat} (hn : 1 < n) (h : ∀ j, 2 ≤ j → j * j ≤
8284 · refine Nat.mul_le_mul_right _ (Nat.le_of_lt ?_)
8385 exact Nat.lt_of_mul_lt_mul_left hk
8486
85- theorem largestDivisorSpec_iff {n i : Nat} (hn : 1 < n) :
86- LargestDivisorSpec n i ↔ i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
87- constructor
88- · rintro (h|h)
89- · refine ⟨hn, Nat.mod_one _, fun j hj hj₁ => Nat.not_lt.1 (fun hj₂ => ?_)⟩
90- by_cases hj₃ : j * j ≤ n
91- · exact h j (by omega) hj₃ hj₁
92- · exact similar_helper hn h j (by omega) hj hj₁
93- · rename_i i hi hi'
94- refine ⟨?_, ?_, fun j hj hj₁ => ?_⟩
95- · apply Nat.div_lt_self <;> omega
96- · exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hi'))
97- · exact Nat.not_lt.1 (fun hj₂ => helper hn h hi' j hj₂ hj hj₁)
98- · rintro ⟨hi₁, hi₂, hi₃⟩
99- obtain (h|rfl|h) := Nat.lt_trichotomy i 1
100- · obtain rfl : i = 0 := by omega
101- omega
102- · refine LargestDivisorSpec.one (fun j hj hj₁ hj₂ => absurd (hi₃ j ?_ hj₂) (by omega))
103- exact Nat.lt_of_lt_of_le (Nat.lt_mul_self_iff.2 (by omega)) hj₁
104- · obtain ⟨d, rfl⟩ := Nat.dvd_of_mod_eq_zero hi₂
105- have hd : 0 < d := Nat.pos_iff_ne_zero.2 (fun hd => by simp [hd] at hn)
106- rw (occs := [2 ]) [← Nat.mul_div_cancel (m := i) (n := d) hd]
107- refine LargestDivisorSpec.div ?_ ?_ (by simp)
108- · intro j hj₁ hj₂ hj₃
109- have : ¬ i * d / j ≤ i := by
110- rw [Nat.not_le, Nat.lt_div_iff_mul_lt_of_dvd (by omega) (Nat.dvd_of_mod_eq_zero hj₃)]
111- exact Nat.mul_lt_mul_of_pos_left hj₂ (by omega)
112- refine absurd (hi₃ _ ?_ ?_) this
113- · apply Nat.div_lt_self (by omega) (by omega)
114- · exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hj₃))
115- · rw [Nat.lt_mul_iff] at hi₁
116- omega
117-
118- theorem largestDivisorSpec_unique {n i k : Nat} (hn : 1 < n)
119- (hi : LargestDivisorSpec n i) (hk : LargestDivisorSpec n k) : i = k := by
120- simp only [largestDivisorSpec_iff hn] at hi hk
121- apply Nat.le_antisymm
122- · apply hk.2 .2 _ hi.1 hi.2 .1
123- · apply hi.2 .2 _ hk.1 hk.2 .1
87+ theorem largestDivisorSpec.out {n i : Nat} (hn : 1 < n) :
88+ LargestDivisorSpec n i → i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
89+ rintro (h|h)
90+ · refine ⟨hn, Nat.mod_one _, fun j hj hj₁ => Nat.not_lt.1 (fun hj₂ => ?_)⟩
91+ by_cases hj₃ : j * j ≤ n
92+ · exact h j (by omega) hj₃ hj₁
93+ · exact mod_ne_zero_of_forall_of_lt_mul_self hn h j (by omega) hj hj₁
94+ · rename_i i hi hi'
95+ refine ⟨?_, ?_, fun j hj hj₁ => ?_⟩
96+ · apply Nat.div_lt_self <;> omega
97+ · exact Nat.mod_eq_zero_of_dvd (Nat.div_dvd_of_dvd (Nat.dvd_of_mod_eq_zero hi'))
98+ · exact Nat.not_lt.1 (fun hj₂ => mod_ne_zero_of_forall_of_div_lt hn h hi' j hj₂ hj hj₁)
12499
125100theorem largestDivisor_eq_iff {n i : Nat} (hn : 1 < n) :
126101 largestDivisor n = i ↔ i < n ∧ n % i = 0 ∧ ∀ j, j < n → n % j = 0 → j ≤ i := by
127- rw [← largestDivisorSpec_iff hn]
128- refine ⟨?_, fun hi => ?_⟩
129- · rintro rfl
130- apply largestDivisorSpec_largestDivisor
131- · apply largestDivisorSpec_unique hn largestDivisorSpec_largestDivisor hi
102+ have h := largestDivisorSpec.out hn (by exact largestDivisorSpec_largestDivisor)
103+ exact ⟨fun h' => h' ▸ h, fun hi => Nat.le_antisymm (hi.2 .2 _ h.1 h.2 .1 ) (h.2 .2 _ hi.1 hi.2 .1 )⟩
132104
133105/-!
134106## Prompt
0 commit comments