@@ -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 :=
3535begin
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 ]
3838end
3939
4040lemma 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
4343lemma 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 :=
9462begin
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 _) }
10572end
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 :=
10875lt_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 :=
12085begin
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]
12788end
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+
12999lemma 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 ≠ 0 ∨ 1 < b ∧ n ≠ 0 ) :
104+ log b n = m ↔ b ^ m ≤ n ∧ n < b ^ (m + 1 ) :=
131105begin
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 _ } }
137116end
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 :=
143136begin
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 _ _) }
150152end
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 :=
153158begin
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
160163end
161164
162- lemma log_monotone {b : ℕ} : monotone (log b) :=
163- λ x y, log_mono_right
164-
165165lemma 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 :=
186169begin
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)]
198185end
199186
200187private 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 _),
320307end
321308
0 commit comments