Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit dc9db54

Browse files
committed
feat(data/nat/log): review/extend API (#17809)
* Add `nat.lt_mul_self_iff`. * Mark `nat.log_eq_zero_iff` as `@[simp]`. * Add a `@[simp]` lemma `nat.log_pos_iff`. * Assume `≠ 0` instead of `0 <` in `nat.pow_le_iff_le_log` and `nat.lt_pow_iff_log_lt`, add implications with weaker assumptions: - `nat.le_log_of_pow_le`, - `nat.log_lt_of_lt_pow`, - `nat.lt_pow_of_log_lt`, - `nat.pow_le_of_le_log`. * Add `nat.log_eq_iff` and `nat.log_eq_of_pow_le_of_lt_pow`. * Assume `n ≠ 0` instead of `0 < n` in `nat.log_mul_base`, use implicit arguments. * Add `nat.log_eq_iff` and `nat.log_eq_of_pow_le_of_lt_pow`. * Add `nat.log_eq_one_iff'`, a version of `log_eq_one_iff` with seemingly weaker RHS. * Drop assumption `1 < b` in `nat.pow_log_le_self`.
1 parent 41abcdc commit dc9db54

File tree

5 files changed

+120
-139
lines changed

5 files changed

+120
-139
lines changed

src/data/int/log.lean

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,10 @@ lemma zpow_log_le_self {b : ℕ} {r : R} (hb : 1 < b) (hr : 0 < r) :
9292
begin
9393
cases le_total 1 r with hr1 hr1,
9494
{ rw log_of_one_le_right _ hr1,
95-
refine le_trans _ (nat.floor_le hr.le),
96-
rw [zpow_coe_nat, ←nat.cast_pow, nat.cast_le],
97-
exact nat.pow_log_le_self hb (nat.floor_pos.mpr hr1) },
95+
rw [zpow_coe_nat, ← nat.cast_pow, ← nat.le_floor_iff hr.le],
96+
exact nat.pow_log_le_self b (nat.floor_pos.mpr hr1).ne' },
9897
{ rw [log_of_right_le_one _ hr1, zpow_neg, zpow_coe_nat, ← nat.cast_pow],
99-
apply inv_le_of_inv_le hr,
100-
refine (nat.le_ceil _).trans (nat.cast_le.2 _),
101-
exact nat.le_pow_clog hb _ },
98+
exact inv_le_of_inv_le hr (nat.ceil_le.1 $ nat.le_pow_clog hb _) },
10299
end
103100

104101
lemma lt_zpow_succ_log_self {b : ℕ} (hb : 1 < b) (r : R) :

src/data/nat/choose/factorization.lean

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,16 @@ end
4949
A `pow` form of `nat.factorization_choose_le`
5050
-/
5151
lemma pow_factorization_choose_le (hn : 0 < n) : p ^ (choose n k).factorization p ≤ n :=
52-
begin
53-
cases le_or_lt p 1,
54-
{ exact (pow_le_pow_of_le_left' h _).trans ((le_of_eq (one_pow _)).trans hn) },
55-
{ exact (pow_le_iff_le_log h hn).mpr factorization_choose_le_log },
56-
end
52+
pow_le_of_le_log hn.ne' factorization_choose_le_log
5753

5854
/--
5955
Primes greater than about `sqrt n` appear only to multiplicity 0 or 1 in the binomial coefficient.
6056
-/
6157
lemma factorization_choose_le_one (p_large : n < p ^ 2) : (choose n k).factorization p ≤ 1 :=
6258
begin
6359
apply factorization_choose_le_log.trans,
64-
rcases n.eq_zero_or_pos with rfl | hn0, { simp },
65-
refine lt_succ_iff.1 ((lt_pow_iff_log_lt _ hn0).1 p_large),
66-
contrapose! hn0,
67-
exact lt_succ_iff.1 (lt_of_lt_of_le p_large (pow_le_one' hn0 2)),
60+
rcases eq_or_ne n 0 with rfl | hn0, { simp },
61+
exact lt_succ_iff.1 (log_lt_of_lt_pow hn0 p_large),
6862
end
6963

7064
lemma factorization_choose_of_lt_three_mul

src/data/nat/log.lean

Lines changed: 106 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -31,170 +31,157 @@ such that `b^k ≤ n`, so if `b^k = n`, it returns exactly `k`. -/
3131
log (n / b) + 1
3232
else 0
3333

34-
private lemma log_eq_zero_aux {b n : ℕ} (hnb : n < b ∨ b ≤ 1) : log b n = 0 :=
34+
@[simp] lemma log_eq_zero_iff {b n : ℕ} : log b n = 0 ↔ n < b ∨ b ≤ 1 :=
3535
begin
36-
rw [or_iff_not_and_not, not_lt, not_le] at hnb,
37-
rw [log, ←ite_not, if_pos hnb]
36+
rw [log, ite_eq_right_iff],
37+
simp only [nat.succ_ne_zero, imp_false, decidable.not_and_distrib, not_le, not_lt]
3838
end
3939

4040
lemma log_of_lt {b n : ℕ} (hb : n < b) : log b n = 0 :=
41-
log_eq_zero_aux (or.inl hb)
41+
log_eq_zero_iff.2 (or.inl hb)
4242

4343
lemma log_of_left_le_one {b : ℕ} (hb : b ≤ 1) (n) : log b n = 0 :=
44-
log_eq_zero_aux (or.inr hb)
44+
log_eq_zero_iff.2 (or.inr hb)
4545

46-
lemma log_of_one_lt_of_le {b n : ℕ} (h : 1 < b) (hn : b ≤ n) : log b n = log b (n / b) + 1 :=
47-
by { rw log, exact if_pos ⟨hn, h⟩ }
48-
49-
lemma log_eq_zero_iff {b n : ℕ} : log b n = 0 ↔ n < b ∨ b ≤ 1 :=
50-
⟨λ h_log, begin
51-
by_contra' h,
52-
have := log_of_one_lt_of_le h.2 h.1,
53-
rw h_log at this,
54-
exact succ_ne_zero _ this.symm
55-
end, log_eq_zero_aux⟩
46+
@[simp] lemma log_pos_iff {b n : ℕ} : 0 < log b n ↔ b ≤ n ∧ 1 < b :=
47+
by rw [pos_iff_ne_zero, ne.def, log_eq_zero_iff, not_or_distrib, not_lt, not_le]
5648

57-
lemma log_eq_one_iff {b n : ℕ} : log b n = 1 ↔ n < b * b ∧ 1 < b ∧ b ≤ n :=
58-
-- This is best possible: if b = 2, n = 5, then 1 < b and b ≤ n but n > b * b.
59-
begin
60-
refine ⟨λ h_log, _, _⟩,
61-
{ have bound : 1 < b ∧ b ≤ n,
62-
{ contrapose h_log,
63-
rw [not_and_distrib, not_lt, not_le, or_comm, ←log_eq_zero_iff] at h_log,
64-
rw h_log,
65-
exact nat.zero_ne_one, },
66-
cases bound with one_lt_b b_le_n,
67-
refine ⟨_, one_lt_b, b_le_n⟩,
68-
rw [log_of_one_lt_of_le one_lt_b b_le_n, succ_inj',
69-
log_eq_zero_iff, nat.div_lt_iff_lt_mul (lt_trans zero_lt_one one_lt_b)] at h_log,
70-
exact h_log.resolve_right (λ b_small, lt_irrefl _ (lt_of_lt_of_le one_lt_b b_small)), },
71-
{ rintros ⟨h, one_lt_b, b_le_n⟩,
72-
rw [log_of_one_lt_of_le one_lt_b b_le_n, succ_inj',
73-
log_eq_zero_iff, nat.div_lt_iff_lt_mul (lt_trans zero_lt_one one_lt_b)],
74-
exact or.inl h, },
75-
end
49+
lemma log_pos {b n : ℕ} (hb : 1 < b) (hbn : b ≤ n) : 0 < log b n := log_pos_iff.2 ⟨hbn, hb⟩
7650

77-
@[simp] lemma log_zero_left : ∀ n, log 0 n = 0 :=
78-
log_of_left_le_one zero_le_one
79-
80-
@[simp] lemma log_zero_right (b : ℕ) : log b 0 = 0 :=
81-
by { rw log, cases b; refl }
82-
83-
@[simp] lemma log_one_left : ∀ n, log 1 n = 0 :=
84-
log_of_left_le_one le_rfl
51+
lemma log_of_one_lt_of_le {b n : ℕ} (h : 1 < b) (hn : b ≤ n) : log b n = log b (n / b) + 1 :=
52+
by { rw log, exact if_pos ⟨hn, h⟩ }
8553

86-
@[simp] lemma log_one_right (b : ℕ) : log b 1 = 0 :=
87-
if h : b ≤ 1 then
88-
log_of_left_le_one h 1
89-
else
90-
log_of_lt (not_le.mp h)
54+
@[simp] lemma log_zero_left : ∀ n, log 0 n = 0 := log_of_left_le_one zero_le_one
55+
@[simp] lemma log_zero_right (b : ℕ) : log b 0 = 0 := log_eq_zero_iff.2 (le_total 1 b)
56+
@[simp] lemma log_one_left : ∀ n, log 1 n = 0 := log_of_left_le_one le_rfl
57+
@[simp] lemma log_one_right (b : ℕ) : log b 1 = 0 := log_eq_zero_iff.2 (lt_or_le _ _)
9158

92-
/-- `pow b` and `log b` (almost) form a Galois connection. -/
93-
lemma pow_le_iff_le_log {b : ℕ} (hb : 1 < b) {x y : ℕ} (hy : 0 < y) : b ^ x ≤ y ↔ x ≤ log b y :=
59+
/-- `pow b` and `log b` (almost) form a Galois connection. See also `nat.pow_le_of_le_log` and
60+
`nat.le_log_of_pow_le` for individual implications under weaker assumptions. -/
61+
lemma pow_le_iff_le_log {b : ℕ} (hb : 1 < b) {x y : ℕ} (hy : y ≠ 0) : b ^ x ≤ y ↔ x ≤ log b y :=
9462
begin
9563
induction y using nat.strong_induction_on with y ih generalizing x,
9664
cases x,
97-
{ exact iff_of_true hy (zero_le _) },
65+
{ exact iff_of_true hy.bot_lt (zero_le _) },
9866
rw log, split_ifs,
9967
{ have b_pos : 0 < b := zero_le_one.trans_lt hb,
100-
rw [succ_eq_add_one, add_le_add_iff_right, ←ih (y / b) (div_lt_self hy hb)
101-
(nat.div_pos h.1 b_pos), le_div_iff_mul_le b_pos, pow_succ'] },
102-
{ refine iff_of_false (λ hby, h ⟨le_trans _ hby, hb⟩) (not_succ_le_zero _),
103-
convert pow_mono hb.le (zero_lt_succ x),
104-
exact (pow_one b).symm }
68+
rw [succ_eq_add_one, add_le_add_iff_right, ←ih (y / b) (div_lt_self hy.bot_lt hb)
69+
(nat.div_pos h.1 b_pos).ne', le_div_iff_mul_le b_pos, pow_succ'] },
70+
{ exact iff_of_false (λ hby, h ⟨(le_self_pow hb.le x.succ_ne_zero).trans hby, hb⟩)
71+
(not_succ_le_zero _) }
10572
end
10673

107-
lemma lt_pow_iff_log_lt {b : ℕ} (hb : 1 < b) {x y : ℕ} (hy : 0 < y) : y < b ^ x ↔ log b y < x :=
74+
lemma lt_pow_iff_log_lt {b : ℕ} (hb : 1 < b) {x y : ℕ} (hy : y ≠ 0) : y < b ^ x ↔ log b y < x :=
10875
lt_iff_lt_of_le_iff_le (pow_le_iff_le_log hb hy)
10976

110-
lemma log_pow {b : ℕ} (hb : 1 < b) (x : ℕ) : log b (b ^ x) = x :=
111-
eq_of_forall_le_iff $ λ z,
112-
by { rw ←pow_le_iff_le_log hb (pow_pos (zero_lt_one.trans hb) _),
113-
exact (pow_right_strict_mono hb).le_iff_le }
114-
115-
lemma log_pos {b n : ℕ} (hb : 1 < b) (hn : b ≤ n) : 0 < log b n :=
116-
by { rwa [←succ_le_iff, ←pow_le_iff_le_log hb (hb.le.trans hn), pow_one] }
77+
lemma pow_le_of_le_log {b x y : ℕ} (hy : y ≠ 0) (h : x ≤ log b y) : b ^ x ≤ y :=
78+
begin
79+
refine (le_or_lt b 1).elim (λ hb, _) (λ hb, (pow_le_iff_le_log hb hy).2 h),
80+
rw [log_of_left_le_one hb, nonpos_iff_eq_zero] at h,
81+
rwa [h, pow_zero, one_le_iff_ne_zero]
82+
end
11783

118-
lemma log_mul_base (b n : ℕ) (hb : 1 < b) (hn : 0 < n) : log b (n * b) = log b n + 1 :=
119-
eq_of_forall_le_iff $ λ z,
84+
lemma le_log_of_pow_le {b x y : ℕ} (hb : 1 < b) (h : b ^ x ≤ y) : x ≤ log b y :=
12085
begin
121-
cases z,
122-
{ simp },
123-
have : 0 < b := zero_lt_one.trans hb,
124-
rw [←pow_le_iff_le_log hb, pow_succ', (strict_mono_mul_right_of_pos this).le_iff_le,
125-
pow_le_iff_le_log hb hn, nat.succ_le_succ_iff],
126-
simp [hn, this]
86+
rcases ne_or_eq y 0 with hy | rfl,
87+
exacts [(pow_le_iff_le_log hb hy).1 h, (h.not_lt (pow_pos (zero_lt_one.trans hb) _)).elim]
12788
end
12889

90+
lemma pow_log_le_self (b : ℕ) {x : ℕ} (hx : x ≠ 0) : b ^ log b x ≤ x :=
91+
pow_le_of_le_log hx le_rfl
92+
93+
lemma log_lt_of_lt_pow {b x y : ℕ} (hy : y ≠ 0) : y < b ^ x → log b y < x :=
94+
lt_imp_lt_of_le_imp_le (pow_le_of_le_log hy)
95+
96+
lemma lt_pow_of_log_lt {b x y : ℕ} (hb : 1 < b) : log b y < x → y < b ^ x :=
97+
lt_imp_lt_of_le_imp_le (le_log_of_pow_le hb)
98+
12999
lemma lt_pow_succ_log_self {b : ℕ} (hb : 1 < b) (x : ℕ) :
130100
x < b ^ (log b x).succ :=
101+
lt_pow_of_log_lt hb (lt_succ_self _)
102+
103+
lemma log_eq_iff {b m n : ℕ} (h : m ≠ 01 < b ∧ n ≠ 0) :
104+
log b n = m ↔ b ^ m ≤ n ∧ n < b ^ (m + 1) :=
131105
begin
132-
cases x.eq_zero_or_pos with hx hx,
133-
{ simp only [hx, log_zero_right, pow_one],
134-
exact pos_of_gt hb },
135-
rw [←not_le, pow_le_iff_le_log hb hx, not_le],
136-
exact lt_succ_self _,
106+
rcases em (1 < b ∧ n ≠ 0) with ⟨hb, hn⟩|hbn,
107+
{ rw [le_antisymm_iff, ← lt_succ_iff, ← pow_le_iff_le_log, ← lt_pow_iff_log_lt, and.comm];
108+
assumption },
109+
{ have hm : m ≠ 0, from h.resolve_right hbn,
110+
rw [not_and_distrib, not_lt, ne.def, not_not] at hbn,
111+
rcases hbn with hb|rfl,
112+
{ simpa only [log_of_left_le_one hb, hm.symm, false_iff, not_and, not_lt]
113+
using le_trans (pow_le_pow_of_le_one' hb m.le_succ) },
114+
{ simpa only [log_zero_right, hm.symm, false_iff, not_and, not_lt, le_zero_iff, pow_succ]
115+
using mul_eq_zero_of_right _ } }
137116
end
138117

139-
lemma pow_log_le_self {b : ℕ} (hb : 1 < b) {x : ℕ} (hx : 0 < x) : b ^ log b x ≤ x :=
140-
(pow_le_iff_le_log hb hx).2 le_rfl
118+
lemma log_eq_of_pow_le_of_lt_pow {b m n : ℕ} (h₁ : b ^ m ≤ n) (h₂ : n < b ^ (m + 1)) :
119+
log b n = m :=
120+
begin
121+
rcases eq_or_ne m 0 with rfl | hm,
122+
{ rw [pow_one] at h₂, exact log_of_lt h₂ },
123+
{ exact (log_eq_iff (or.inl hm)).2 ⟨h₁, h₂⟩ }
124+
end
141125

142-
@[mono] lemma log_mono_right {b n m : ℕ} (h : n ≤ m) : log b n ≤ log b m :=
126+
lemma log_pow {b : ℕ} (hb : 1 < b) (x : ℕ) : log b (b ^ x) = x :=
127+
log_eq_of_pow_le_of_lt_pow le_rfl (pow_lt_pow hb x.lt_succ_self)
128+
129+
lemma log_eq_one_iff' {b n : ℕ} : log b n = 1 ↔ b ≤ n ∧ n < b * b:=
130+
by rw [log_eq_iff (or.inl one_ne_zero), pow_add, pow_one]
131+
132+
lemma log_eq_one_iff {b n : ℕ} : log b n = 1 ↔ n < b * b ∧ 1 < b ∧ b ≤ n :=
133+
log_eq_one_iff'.trans ⟨λ h, ⟨h.2, lt_mul_self_iff.1 (h.1.trans_lt h.2), h.1⟩, λ h, ⟨h.2.2, h.1⟩⟩
134+
135+
lemma log_mul_base {b n : ℕ} (hb : 1 < b) (hn : n ≠ 0) : log b (n * b) = log b n + 1 :=
143136
begin
137+
apply log_eq_of_pow_le_of_lt_pow; rw [pow_succ'],
138+
exacts [mul_le_mul_right' (pow_log_le_self _ hn) _,
139+
(mul_lt_mul_right (zero_lt_one.trans hb)).2 (lt_pow_succ_log_self hb _)]
140+
end
141+
142+
lemma pow_log_le_add_one (b : ℕ) : ∀ x, b ^ log b x ≤ x + 1
143+
| 0 := by rw [log_zero_right, pow_zero]
144+
| (x + 1) := (pow_log_le_self b x.succ_ne_zero).trans (x + 1).le_succ
145+
146+
lemma log_monotone {b : ℕ} : monotone (log b) :=
147+
begin
148+
refine monotone_nat_of_le_succ (λ n, _),
144149
cases le_or_lt b 1 with hb hb,
145150
{ rw log_of_left_le_one hb, exact zero_le _ },
146-
{ cases nat.eq_zero_or_pos n with hn hn,
147-
{ rw [hn, log_zero_right], exact zero_le _ },
148-
{ rw ←pow_le_iff_le_log hb (hn.trans_le h),
149-
exact (pow_log_le_self hb hn).trans h } }
151+
{ exact le_log_of_pow_le hb (pow_log_le_add_one _ _) }
150152
end
151153

154+
@[mono] lemma log_mono_right {b n m : ℕ} (h : n ≤ m) : log b n ≤ log b m :=
155+
log_monotone h
156+
152157
@[mono] lemma log_anti_left {b c n : ℕ} (hc : 1 < c) (hb : c ≤ b) : log b n ≤ log c n :=
153158
begin
154-
cases n, { rw [log_zero_right, log_zero_right] },
155-
rw ←pow_le_iff_le_log hc (zero_lt_succ n),
156-
calc c ^ log b n.succ ≤ b ^ log b n.succ : pow_le_pow_of_le_left
157-
(zero_lt_one.trans hc).le hb _
158-
... ≤ n.succ : pow_log_le_self (hc.trans_le hb)
159-
(zero_lt_succ n)
159+
rcases eq_or_ne n 0 with rfl | hn, { rw [log_zero_right, log_zero_right] },
160+
apply le_log_of_pow_le hc,
161+
calc c ^ log b n ≤ b ^ log b n : pow_le_pow_of_le_left' hb _
162+
... ≤ n : pow_log_le_self _ hn
160163
end
161164

162-
lemma log_monotone {b : ℕ} : monotone (log b) :=
163-
λ x y, log_mono_right
164-
165165
lemma log_antitone_left {n : ℕ} : antitone_on (λ b, log b n) (set.Ioi 1) :=
166166
λ _ hc _ _ hb, log_anti_left (set.mem_Iio.1 hc) hb
167167

168-
@[simp] lemma log_div_mul_self (b n : ℕ) : log b (n / b * b) = log b n :=
169-
eq_of_forall_le_iff (λ z, ⟨λ h, h.trans (log_monotone (div_mul_le_self _ _)), λ h, begin
170-
rcases b with _|_|b,
171-
{ rwa log_zero_left at * },
172-
{ rwa log_one_left at * },
173-
rcases n.zero_le.eq_or_lt with rfl|hn,
174-
{ rwa [nat.zero_div, zero_mul] },
175-
cases le_or_lt b.succ.succ n with hb hb,
176-
{ cases z,
177-
{ apply zero_le },
178-
rw [←pow_le_iff_le_log, pow_succ'] at h ⊢,
179-
{ rwa [(strict_mono_mul_right_of_pos nat.succ_pos').le_iff_le,
180-
nat.le_div_iff_mul_le nat.succ_pos'] },
181-
all_goals { simp [hn, nat.div_pos hb nat.succ_pos'] } },
182-
{ simpa [div_eq_of_lt, hb, log_of_lt] using h }
183-
end⟩)
184-
185168
@[simp] lemma log_div_base (b n : ℕ) : log b (n / b) = log b n - 1 :=
186169
begin
170+
cases le_or_lt b 1 with hb hb,
171+
{ rw [log_of_left_le_one hb, log_of_left_le_one hb, nat.zero_sub] },
187172
cases lt_or_le n b with h h,
188173
{ rw [div_eq_of_lt h, log_of_lt h, log_zero_right] },
189-
rcases n.zero_le.eq_or_lt with rfl|hn,
190-
{ rw [nat.zero_div, log_zero_right] },
191-
rcases b with _|_|b,
192-
{ rw [log_zero_left, log_zero_left] },
193-
{ rw [log_one_left, log_one_left] },
194-
rw [←succ_inj', ←succ_inj'],
195-
simp_rw succ_eq_add_one,
196-
rw [nat.sub_add_cancel, ←log_mul_base];
197-
{ simp [succ_le_iff, log_pos, h, nat.div_pos] },
174+
rw [log_of_one_lt_of_le hb h, add_tsub_cancel_right]
175+
end
176+
177+
@[simp] lemma log_div_mul_self (b n : ℕ) : log b (n / b * b) = log b n :=
178+
begin
179+
cases le_or_lt b 1 with hb hb,
180+
{ rw [log_of_left_le_one hb, log_of_left_le_one hb] },
181+
cases lt_or_le n b with h h,
182+
{ rw [div_eq_of_lt h, zero_mul, log_zero_right, log_of_lt h] },
183+
rw [log_mul_base hb (nat.div_pos h (zero_le_one.trans_lt hb)).ne', log_div_base,
184+
tsub_add_cancel_of_le (succ_le_iff.2 $ log_pos hb h)]
198185
end
199186

200187
private lemma add_pred_div_lt {b n : ℕ} (hb : 1 < b) (hn : 2 ≤ n) : (n + b - 1) / b < n :=
@@ -315,7 +302,7 @@ begin
315302
cases n,
316303
{ rw log_zero_right,
317304
exact zero_le _},
318-
exact (pow_right_strict_mono hb).le_iff_le.1 ((pow_log_le_self hb $ succ_pos _).trans $
305+
exact (pow_right_strict_mono hb).le_iff_le.1 ((pow_log_le_self b n.succ_ne_zero).trans $
319306
le_pow_clog hb _),
320307
end
321308

src/data/nat/multiplicity.lean

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,12 @@ calc
5858
begin
5959
rw [mem_filter, mem_Ico, mem_Ico, lt_succ_iff, ←@part_enat.coe_le_coe i, part_enat.coe_get,
6060
←pow_dvd_iff_le_multiplicity, and.right_comm],
61-
refine (and_iff_left_of_imp (λ h, _)).symm,
61+
refine (and_iff_left_of_imp (λ h, lt_of_le_of_lt _ hb)).symm,
6262
cases m,
6363
{ rw [zero_pow, zero_dvd_iff] at h,
64-
exact (hn.ne' h.2).elim,
65-
{ exact h.1 } },
66-
exact ((pow_le_iff_le_log (succ_lt_succ $ nat.pos_of_ne_zero $ succ_ne_succ.1 hm) hn).1 $
67-
le_of_dvd hn h.2).trans_lt hb,
64+
exacts [(hn.ne' h.2).elim, h.1] },
65+
exact le_log_of_pow_le (one_lt_iff_ne_zero_and_ne_one.2 ⟨m.succ_ne_zero, hm⟩)
66+
(le_of_dvd hn h.2)
6867
end
6968

7069
namespace prime

src/data/nat/order/basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@ begin
291291
simp [add_comm, nat.add_sub_assoc, one_le_iff_ne_zero.2 hi]
292292
end
293293

294+
@[simp] theorem lt_mul_self_iff : ∀ {n : ℕ}, n < n * n ↔ 1 < n
295+
| 0 := iff_of_false (lt_irrefl _) zero_le_one.not_lt
296+
| (n + 1) := lt_mul_iff_one_lt_left n.succ_pos
297+
294298
/-!
295299
### Recursion and induction principles
296300

0 commit comments

Comments
 (0)