diff -r 1260be3f33a4 -r 400aecdfd71f src/HOL/Transcendental.thy --- a/src/HOL/Transcendental.thy Mon Jul 03 16:46:37 2023 +0100 +++ b/src/HOL/Transcendental.thy Tue Jul 04 12:53:01 2023 +0100 @@ -2716,42 +2716,48 @@ lemma floor_log_eq_powr_iff: "x > 0 \ b > 1 \ \log b x\ = k \ b powr k \ x \ x < b powr (k + 1)" by (auto simp: floor_eq_iff powr_le_iff less_powr_iff) -lemma floor_log_nat_eq_powr_iff: fixes b n k :: nat - shows "\ b \ 2; k > 0 \ \ - floor (log b (real k)) = n \ b^n \ k \ k < b^(n+1)" +lemma power_of_nat_log_ge: "b > 1 \ b ^ nat \log b x\ \ x" + by (smt (verit) less_log_of_power of_nat_ceiling) + +lemma floor_log_nat_eq_powr_iff: + fixes b n k :: nat + shows "\ b \ 2; k > 0 \ \ floor (log b (real k)) = n \ b^n \ k \ k < b^(n+1)" by (auto simp: floor_log_eq_powr_iff powr_add powr_realpow of_nat_power[symmetric] of_nat_mult[symmetric] ac_simps simp del: of_nat_power of_nat_mult) -lemma floor_log_nat_eq_if: fixes b n k :: nat +lemma floor_log_nat_eq_if: + fixes b n k :: nat assumes "b^n \ k" "k < b^(n+1)" "b \ 2" - shows "floor (log b (real k)) = n" -proof - - have "k \ 1" using assms(1,3) one_le_power[of b n] by linarith - with assms show ?thesis by(simp add: floor_log_nat_eq_powr_iff) -qed - -lemma ceiling_log_eq_powr_iff: "\ x > 0; b > 1 \ - \ \log b x\ = int k + 1 \ b powr k < x \ x \ b powr (k + 1)" -by (auto simp: ceiling_eq_iff powr_less_iff le_powr_iff) - -lemma ceiling_log_nat_eq_powr_iff: fixes b n k :: nat - shows "\ b \ 2; k > 0 \ \ - ceiling (log b (real k)) = int n + 1 \ (b^n < k \ k \ b^(n+1))" -using ceiling_log_eq_powr_iff -by (auto simp: powr_add powr_realpow of_nat_power[symmetric] of_nat_mult[symmetric] ac_simps - simp del: of_nat_power of_nat_mult) - -lemma ceiling_log_nat_eq_if: fixes b n k :: nat + shows "floor (log b (real k)) = n" +proof - + have "k \ 1" + using assms linorder_le_less_linear by force + with assms show ?thesis + by(simp add: floor_log_nat_eq_powr_iff) +qed + +lemma ceiling_log_eq_powr_iff: + "\ x > 0; b > 1 \ \ \log b x\ = int k + 1 \ b powr k < x \ x \ b powr (k + 1)" + by (auto simp: ceiling_eq_iff powr_less_iff le_powr_iff) + +lemma ceiling_log_nat_eq_powr_iff: + fixes b n k :: nat + shows "\ b \ 2; k > 0 \ \ ceiling (log b (real k)) = int n + 1 \ (b^n < k \ k \ b^(n+1))" + using ceiling_log_eq_powr_iff + by (auto simp: powr_add powr_realpow of_nat_power[symmetric] of_nat_mult[symmetric] ac_simps + simp del: of_nat_power of_nat_mult) + +lemma ceiling_log_nat_eq_if: + fixes b n k :: nat assumes "b^n < k" "k \ b^(n+1)" "b \ 2" - shows "ceiling (log b (real k)) = int n + 1" -proof - - have "k \ 1" using assms(1,3) one_le_power[of b n] by linarith - with assms show ?thesis by(simp add: ceiling_log_nat_eq_powr_iff) -qed - -lemma floor_log2_div2: fixes n :: nat assumes "n \ 2" -shows "floor(log 2 n) = floor(log 2 (n div 2)) + 1" + shows "\log (real b) (real k)\ = int n + 1" + using assms ceiling_log_nat_eq_powr_iff by force + +lemma floor_log2_div2: + fixes n :: nat + assumes "n \ 2" + shows "\log 2 (real n)\ = \log 2 (n div 2)\ + 1" proof cases assume "n=2" thus ?thesis by simp next @@ -2768,8 +2774,9 @@ show ?thesis by simp qed -lemma ceiling_log2_div2: assumes "n \ 2" -shows "ceiling(log 2 (real n)) = ceiling(log 2 ((n-1) div 2 + 1)) + 1" +lemma ceiling_log2_div2: + assumes "n \ 2" + shows "ceiling(log 2 (real n)) = ceiling(log 2 ((n-1) div 2 + 1)) + 1" proof cases assume "n=2" thus ?thesis by simp next @@ -2797,17 +2804,7 @@ lemma powr_int: assumes "x > 0" shows "x powr i = (if i \ 0 then x ^ nat i else 1 / x ^ nat (-i))" -proof (cases "i < 0") - case True - have r: "x powr i = 1 / x powr (- i)" - by (simp add: powr_minus field_simps) - show ?thesis using \i < 0\ \x > 0\ - by (simp add: r field_simps powr_realpow[symmetric]) -next - case False - then show ?thesis - by (simp add: assms powr_realpow[symmetric]) -qed + by (simp add: assms inverse_eq_divide powr_real_of_int) definition powr_real :: "real \ real \ real" where [code_abbrev, simp]: "powr_real = Transcendental.powr"