@@ -70,7 +70,7 @@ theorem le_exp_log (x : ℝ) : x ≤ exp (log x) := by
7070 · rw [exp_log_eq_abs h_zero]
7171 exact le_abs_self _
7272
73- @[simp]
73+ @ [simp, push ]
7474theorem log_exp (x : ℝ) : log (exp x) = x :=
7575 exp_injective <| exp_log (exp_pos x)
7676
@@ -96,25 +96,25 @@ theorem log_surjective : Surjective log := fun x => ⟨exp x, log_exp x⟩
9696theorem range_log : range log = univ :=
9797 log_surjective.range_eq
9898
99- @[simp]
99+ @ [simp, push ]
100100theorem log_zero : log 0 = 0 :=
101101 dif_pos rfl
102102
103- @[simp]
103+ @ [simp, push ]
104104theorem log_one : log 1 = 0 :=
105105 exp_injective <| by rw [exp_log zero_lt_one, exp_zero]
106106
107107/-- This holds true for all `x : ℝ` because of the junk values `0 / 0 = 0` and `log 0 = 0`. -/
108108@[simp] lemma log_div_self (x : ℝ) : log (x / x) = 0 := by
109109 obtain rfl | hx := eq_or_ne x 0 <;> simp [*]
110110
111- @[simp]
111+ @ [simp, push ]
112112theorem log_abs (x : ℝ) : log |x| = log x := by
113113 by_cases h : x = 0
114114 · simp [h]
115115 · rw [← exp_eq_exp, exp_log_eq_abs h, exp_log_eq_abs (abs_pos.2 h).ne', abs_abs]
116116
117- @[simp]
117+ @ [simp, push ]
118118theorem log_neg_eq_log (x : ℝ) : log (-x) = log x := by rw [← log_abs x, ← log_abs (-x), abs_neg]
119119
120120theorem sinh_log {x : ℝ} (hx : 0 < x) : sinh (log x) = (x - x⁻¹) / 2 := by
@@ -126,15 +126,17 @@ theorem cosh_log {x : ℝ} (hx : 0 < x) : cosh (log x) = (x + x⁻¹) / 2 := by
126126theorem surjOn_log' : SurjOn log (Iio 0 ) univ := fun x _ =>
127127 ⟨-exp x, neg_lt_zero.2 <| exp_pos x, by rw [log_neg_eq_log, log_exp]⟩
128128
129+ @[push]
129130theorem log_mul (hx : x ≠ 0 ) (hy : y ≠ 0 ) : log (x * y) = log x + log y :=
130131 exp_injective <| by
131132 rw [exp_log_eq_abs (mul_ne_zero hx hy), exp_add, exp_log_eq_abs hx, exp_log_eq_abs hy, abs_mul]
132133
134+ @[push]
133135theorem log_div (hx : x ≠ 0 ) (hy : y ≠ 0 ) : log (x / y) = log x - log y :=
134136 exp_injective <| by
135137 rw [exp_log_eq_abs (div_ne_zero hx hy), exp_sub, exp_log_eq_abs hx, exp_log_eq_abs hy, abs_div]
136138
137- @[simp]
139+ @ [simp, push ]
138140theorem log_inv (x : ℝ) : log x⁻¹ = -log x := by
139141 by_cases hx : x = 0 ; · simp [hx]
140142 rw [← exp_eq_exp, exp_log_eq_abs (inv_ne_zero hx), exp_neg, exp_log_eq_abs hx, abs_inv]
@@ -267,7 +269,7 @@ theorem log_eq_zero {x : ℝ} : log x = 0 ↔ x = 0 ∨ x = 1 ∨ x = -1 := by
267269theorem log_ne_zero {x : ℝ} : log x ≠ 0 ↔ x ≠ 0 ∧ x ≠ 1 ∧ x ≠ -1 := by
268270 simpa only [not_or] using log_eq_zero.not
269271
270- @[simp]
272+ @ [simp, push ]
271273theorem log_pow (x : ℝ) (n : ℕ) : log (x ^ n) = n * log x := by
272274 induction n with
273275 | zero => simp
@@ -276,12 +278,13 @@ theorem log_pow (x : ℝ) (n : ℕ) : log (x ^ n) = n * log x := by
276278 · simp
277279 · rw [pow_succ, log_mul (pow_ne_zero _ hx) hx, ih, Nat.cast_succ, add_mul, one_mul]
278280
279- @[simp]
281+ @ [simp, push ]
280282theorem log_zpow (x : ℝ) (n : ℤ) : log (x ^ n) = n * log x := by
281283 cases n
282284 · rw [Int.ofNat_eq_natCast, zpow_natCast, log_pow, Int.cast_natCast]
283285 · rw [zpow_negSucc, log_inv, log_pow, Int.cast_negSucc, Nat.cast_add_one, neg_mul_eq_neg_mul]
284286
287+ @[push]
285288theorem log_sqrt {x : ℝ} (hx : 0 ≤ x) : log (√x) = log x / 2 := by
286289 rw [eq_div_iff, mul_comm, ← Nat.cast_two, ← log_pow, sq_sqrt hx]
287290 exact two_ne_zero
@@ -375,11 +378,13 @@ lemma log_multiset_prod {s : Multiset ℝ} (h : ∀ x ∈ s, x ≠ 0) :
375378 rw [← prod_toList, log_list_prod (by simp_all), sum_map_toList]
376379
377380open Finset in
381+ @[push]
378382theorem log_prod {α : Type *} {s : Finset α} {f : α → ℝ} (hf : ∀ x ∈ s, f x ≠ 0 ) :
379383 log (∏ i ∈ s, f i) = ∑ i ∈ s, log (f i) := by
380384 rw [← prod_map_toList, log_list_prod (by simp_all)]
381385 simp
382386
387+ @[push]
383388protected theorem _root_.Finsupp.log_prod {α β : Type *} [Zero β] (f : α →₀ β) (g : α → β → ℝ)
384389 (hg : ∀ a, g a (f a) = 0 → f a = 0 ) : log (f.prod g) = f.sum fun a b ↦ log (g a b) :=
385390 log_prod fun _x hx h₀ ↦ Finsupp.mem_support_iff.1 hx <| hg _ h₀
0 commit comments