@@ -31,170 +31,157 @@ such that `b^k ≤ n`, so if `b^k = n`, it returns exactly `k`. -/
31
31
log (n / b) + 1
32
32
else 0
33
33
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 :=
35
35
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 ]
38
38
end
39
39
40
40
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)
42
42
43
43
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)
45
45
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]
56
48
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⟩
76
50
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⟩ }
85
53
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 _ _)
91
58
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 :=
94
62
begin
95
63
induction y using nat.strong_induction_on with y ih generalizing x,
96
64
cases x,
97
- { exact iff_of_true hy (zero_le _) },
65
+ { exact iff_of_true hy.bot_lt (zero_le _) },
98
66
rw log, split_ifs,
99
67
{ 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 _) }
105
72
end
106
73
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 :=
108
75
lt_iff_lt_of_le_iff_le (pow_le_iff_le_log hb hy)
109
76
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
117
83
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 :=
120
85
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]
127
88
end
128
89
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
+
129
99
lemma lt_pow_succ_log_self {b : ℕ} (hb : 1 < b) (x : ℕ) :
130
100
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 ≠ 0 ∨ 1 < b ∧ n ≠ 0 ) :
104
+ log b n = m ↔ b ^ m ≤ n ∧ n < b ^ (m + 1 ) :=
131
105
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 _ } }
137
116
end
138
117
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
141
125
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 :=
143
136
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, _),
144
149
cases le_or_lt b 1 with hb hb,
145
150
{ 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 _ _) }
150
152
end
151
153
154
+ @[mono] lemma log_mono_right {b n m : ℕ} (h : n ≤ m) : log b n ≤ log b m :=
155
+ log_monotone h
156
+
152
157
@[mono] lemma log_anti_left {b c n : ℕ} (hc : 1 < c) (hb : c ≤ b) : log b n ≤ log c n :=
153
158
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
160
163
end
161
164
162
- lemma log_monotone {b : ℕ} : monotone (log b) :=
163
- λ x y, log_mono_right
164
-
165
165
lemma log_antitone_left {n : ℕ} : antitone_on (λ b, log b n) (set.Ioi 1 ) :=
166
166
λ _ hc _ _ hb, log_anti_left (set.mem_Iio.1 hc) hb
167
167
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
-
185
168
@[simp] lemma log_div_base (b n : ℕ) : log b (n / b) = log b n - 1 :=
186
169
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] },
187
172
cases lt_or_le n b with h h,
188
173
{ 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)]
198
185
end
199
186
200
187
private lemma add_pred_div_lt {b n : ℕ} (hb : 1 < b) (hn : 2 ≤ n) : (n + b - 1 ) / b < n :=
@@ -315,7 +302,7 @@ begin
315
302
cases n,
316
303
{ rw log_zero_right,
317
304
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 $
319
306
le_pow_clog hb _),
320
307
end
321
308
0 commit comments