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

Commit ad76a5e

Browse files
committed
feat(data/nat/log): log_mul, log_div (#11164)
Even with division over natural, the log "spec" holds. Co-authored-by: Yakov Pechersky <pechersky@users.noreply.github.com>
1 parent 23b01cc commit ad76a5e

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

src/data/nat/log.lean

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,17 @@ by { rw ←pow_le_iff_le_log hb (pow_pos (zero_lt_one.trans hb) _),
120120
lemma log_pos {b n : ℕ} (hb : 1 < b) (hn : b ≤ n) : 0 < log b n :=
121121
by { rwa [←succ_le_iff, ←pow_le_iff_le_log hb (hb.le.trans hn), pow_one] }
122122

123+
lemma log_mul_base (b n : ℕ) (hb : 1 < b) (hn : 0 < n) : log b (n * b) = log b n + 1 :=
124+
eq_of_forall_le_iff $ λ z,
125+
begin
126+
cases z,
127+
{ simp },
128+
have : 0 < b := zero_lt_one.trans hb,
129+
rw [←pow_le_iff_le_log hb, pow_succ', (strict_mono_mul_right_of_pos this).le_iff_le,
130+
pow_le_iff_le_log hb hn, nat.succ_le_succ_iff],
131+
simp [hn, this]
132+
end
133+
123134
lemma lt_pow_succ_log_self {b : ℕ} (hb : 1 < b) {x : ℕ} (hx : 0 < x) :
124135
x < b ^ (log b x).succ :=
125136
begin
@@ -157,6 +168,45 @@ lemma log_monotone {b : ℕ} : monotone (λ n : ℕ, log b n) :=
157168
lemma log_antitone_left {n : ℕ} : antitone_on (λ b, log b n) (set.Ioi 1) :=
158169
λ _ hc _ _ hb, log_le_log_of_left_ge (set.mem_Iio.1 hc) hb
159170

171+
@[simp] lemma log_div_mul_self (b n : ℕ) : log b (n / b * b) = log b n :=
172+
begin
173+
refine eq_of_forall_le_iff (λ z, _),
174+
split,
175+
{ intro h,
176+
exact h.trans (log_monotone (div_mul_le_self _ _)) },
177+
{ intro h,
178+
rcases b with _|_|b,
179+
{ simpa using h },
180+
{ simpa using h },
181+
rcases n.zero_le.eq_or_lt with rfl|hn,
182+
{ simpa using h },
183+
cases le_or_lt b.succ.succ n with hb hb,
184+
{ cases z,
185+
{ simp },
186+
have : 0 < b.succ.succ := nat.succ_pos',
187+
rw [←pow_le_iff_le_log, pow_succ'] at h ⊢,
188+
{ rwa [(strict_mono_mul_right_of_pos this).le_iff_le,
189+
nat.le_div_iff_mul_le _ _ nat.succ_pos'] },
190+
all_goals { simp [hn, nat.div_pos hb nat.succ_pos'] } },
191+
{ simpa [div_eq_of_lt, hb, log_eq_zero] using h } }
192+
end
193+
194+
@[simp] lemma log_div_base (b n : ℕ) : log b (n / b) = log b n - 1 :=
195+
begin
196+
cases lt_or_le n b with h h,
197+
{ simp [div_eq_of_lt, h, log_eq_zero] },
198+
rcases n.zero_le.eq_or_lt with rfl|hn,
199+
{ simp },
200+
rcases b with _|_|b,
201+
{ simp },
202+
{ simp },
203+
rw [←succ_inj', ←succ_inj'],
204+
simp_rw succ_eq_add_one,
205+
rw [nat.sub_add_cancel, ←log_mul_base];
206+
{ simp [succ_le_iff, log_pos, h, nat.div_pos] },
207+
end
208+
209+
160210
private lemma add_pred_div_lt {b n : ℕ} (hb : 1 < b) (hn : 2 ≤ n) : (n + b - 1)/b < n :=
161211
begin
162212
rw [div_lt_iff_lt_mul _ _ (zero_lt_one.trans hb), ←succ_le_iff, ←pred_eq_sub_one,

0 commit comments

Comments
 (0)