(* Title: LnSum3.thy Author: Kevin Donnelly and Jeremy Avigad *) header {* Identities involving sums and ln, part 3 *} theory LnSum3 = LnSum2:; lemma lndivxsum_minus: "sumr 0 (Suc n) (%m. ln ((real (Suc n)) / (real (Suc m)))) = sumr 0 (Suc n) (%m. ln (real (Suc n))) - sumr 0 (Suc n) (%m. ln (real (Suc m)))"; proof -; have "0 < real (Suc n)"; by (simp add: real_of_nat_ge_zero); moreover have "0 < real (Suc m)" by (simp add: real_of_nat_ge_zero); ultimately have "(%m. ln (real (Suc n) / real (Suc m))) = (%m. ln (real (Suc n)) - ln(real (Suc m)))"; by(simp add: ext ln_div); then have "sumr 0 (Suc n) (%m. ln ((real (Suc n)) / (real (Suc m)))) = sumr 0 (Suc n) (%m. ln (real (Suc n)) - ln(real (Suc m)))"; by simp; also have "sumr 0 (Suc n) (%m. ln (real (Suc n)) - ln(real (Suc m))) = sumr 0 (Suc n) (%m. ln (real (Suc n))) - sumr 0 (Suc n) (%m. ln (real (Suc m)))"; by(simp only: sumr_diff[THEN sym]); finally show ?thesis;.; qed; lemma lndivxsum_minus2: "sumr 0 (Suc n) (%m. ln ((real (Suc n)) / (real (Suc m)))) = (real (Suc n)) * (ln (real (Suc n))) - (sumr 0 (Suc n) (%m. ln (real (Suc m))))"; proof -; have "sumr 0 (Suc n) (%m. ln (real (Suc n))) = real (Suc n) * ln (real (Suc n))"; by (rule sumr_const); then show "sumr 0 (Suc n) (%m. ln ((real (Suc n)) / (real (Suc m)))) = (real (Suc n)) * (ln (real (Suc n))) - (sumr 0 (Suc n) (%m. ln (real (Suc m))))"; apply(insert lndivxsum_minus[of n]); by(auto simp add: lndivxsum_minus simp del: sumr.simps); qed; lemma lndivxsum_eq_x_bigo_ln: "(%n. sumr 0 (Suc n) (%m. ln ((real (Suc n)) / (real (Suc m))))) : (%n. real n) +o O(%n. ln (real (Suc n)))"; proof -; have 1: "(%n. sumr 0 (Suc n) (%m. ln (real (Suc n) / real (Suc m)))) = (%n. (real (Suc n)) * (ln (real (Suc n)))) - (%n. (sumr 0 (Suc n) (%m. ln (real (Suc m)))))"; apply(simp add: lndivxsum_minus2 del: sumr.simps); by(simp add: ext func_diff_minus); moreover have 2: "(%m. sumr 0 (Suc m) (%n. (ln (real (Suc n))))) \<elteqo> ((%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m))) +o O(%n::nat. ln (real (n + 1)))" by(rule fn_lnx_sum_bigo_ln2); ultimately; have "(%n. sumr 0 (Suc n) (%m. ln (real (Suc n) / real (Suc m)))) : ((%n. (real (Suc n)) * (ln (real (Suc n)))) - (((%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m))))) +o O(%n::nat. ln (real (n + 1)))"; apply(simp (no_asm_use)); apply(erule bigo_minus_cong2); by(simp); moreover have "((%n. (real (Suc n)) * (ln (real (Suc n)))) - (((%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m))))) = (%m. (real m))"; apply(rule ext); by(simp add: func_diff_minus func_plus); ultimately show ?thesis; by(auto); qed; lemma ln_sq_sum: "ln (real (Suc n)) * (ln (real (Suc n))) = sumr 0 n (%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i))))"; apply(induct_tac n); by(auto); lemma ln_sq_diff_factor: "ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i))) = (ln (real (Suc (Suc i))) - ln (real (Suc i))) * (ln (real (Suc (Suc i))) + ln (real (Suc i)))"; by (auto simp add: ring_eq_simps); lemma ln_factor_minus_1: "ln (real (Suc (Suc i))) - ln (real (Suc i)) = ln (1 + 1 / (real (Suc i)))"; proof -; have "ln (real (Suc (Suc i))) - ln (real (Suc i)) = ln (real (Suc (Suc i)) / real (Suc i))"; by(auto simp add: ln_div); also have "... = ln ((real (Suc i)) / (real (Suc i)) + 1 / real (Suc i))"; apply (subgoal_tac "real(Suc (Suc i)) = real(Suc i) + 1"); apply (erule ssubst); apply (simp only: add_divide_distrib [THEN sym]); apply simp; done; also have "... = ln (1 + 1 / (real (Suc i)))" by simp; finally show ?thesis;.; qed; lemma ln_factor_minus_lbound: "1 / (real (Suc i)) - 1 / (real (Suc i)) * (1 / (real (Suc i))) <= ln (real (Suc (Suc i))) - ln (real (Suc i))"; apply(subst ln_factor_minus_1); apply(rule ln_approx_lower); apply(auto simp add: real_divide_def); apply(subgoal_tac "1 = inverse 1",erule ssubst); apply(rule real_inverse_le_swap); by(auto simp add: real_of_nat_Suc); lemma ln_factor_minus_ubound: "ln (real (Suc (Suc i))) - ln (real (Suc i)) <= 1 / (real (Suc i))"; apply(subst ln_factor_minus_1); apply(rule ln_approx_upper); apply(auto simp add: real_divide_def); apply(subgoal_tac "1 = inverse 1",erule ssubst); apply(rule real_inverse_le_swap); by(auto simp add: real_of_nat_Suc); lemma ln_factor_plus_lbound: "2 * ln (real (Suc i)) <= (ln (real (Suc (Suc i))) + ln (real (Suc i)))"; by(auto); lemma ln_factor_plus_ubound: "(ln (real (Suc (Suc i))) + ln (real (Suc i))) <= 2 * ln (real (Suc i)) + 1 / (real (Suc i))"; proof -; have "ln (real (Suc (Suc i))) + ln (real (Suc i)) = 2 * ln (real (Suc i)) + (ln (real (Suc (Suc i))) - ln (real (Suc i)))"; by(auto); also have "2 * ln (real (Suc i)) + (ln (real (Suc (Suc i))) - ln (real (Suc i))) <= 2 * ln (real (Suc i)) + 1 / (real (Suc i))"; apply (rule add_left_mono); by(simp only: ln_factor_minus_ubound); finally show ?thesis;.; qed; lemma ln_sq_diff_lbound: "2 * ln (real (Suc i)) / (real (Suc i)) - 2 * ln (real (Suc i)) / (real (Suc i)) * (1 / (real (Suc i))) <= ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i)))"; proof -; have " 2 * ln (real (Suc i)) / real (Suc i) - 2 * ln (real (Suc i)) / real (Suc i) * (1 / real (Suc i)) = 2 * ln (real (Suc i)) * (1 / (real (Suc i)) - 1 / (real (Suc i)) * (1 / (real (Suc i))))"; by(auto simp add: ring_eq_simps); also have "... <= (ln (real (Suc (Suc i))) + ln (real (Suc i))) * (ln (real (Suc (Suc i))) - ln (real (Suc i)))"; apply (rule mult_mono); apply simp; apply (rule ln_factor_minus_lbound); apply (rule nonneg_plus_nonneg); apply auto; apply (rule real_one_div_le_anti_mono); apply auto; apply (subgoal_tac "1 * real(Suc i) <= real(Suc i) * real(Suc i)"); apply simp; apply (rule mult_right_mono); apply simp; apply simp; done; also have "... = (ln (real (Suc (Suc i))) - ln (real (Suc i))) * (ln (real (Suc (Suc i))) + ln (real (Suc i)))"; by simp; finally show ?thesis; apply(subst ln_sq_diff_factor);.; qed; lemma ln_sq_diff_ubound: "ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i))) <= 2 * ln (real (Suc i)) / (real (Suc i)) + 1 / (real (Suc i) * (real (Suc i)))"; proof -; have "ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)) = (ln (real (Suc (Suc i))) - ln (real (Suc i))) * (ln (real (Suc (Suc i))) + ln (real (Suc i)))"; by(simp add: ln_sq_diff_factor); also have "... <= 1 / (real (Suc i)) * (2 * ln (real (Suc i)) + 1 / (real (Suc i)))"; apply(rule mult_mono); apply (rule ln_factor_minus_ubound); apply (rule ln_factor_plus_ubound); apply force; apply (subst ln_mult [THEN sym]); apply auto; apply (rule ln_ge_zero); apply(subgoal_tac "1 = 1 * (1::real)", erule ssubst); apply(rule mult_mono); apply auto; done; also have "... = 2 * ln (real (Suc i)) / (real (Suc i)) + 1 / (real (Suc i) * (real (Suc i)))"; by(simp add: ring_eq_simps); finally show ?thesis;.; qed; lemma ln_sq_diff_all_bounds: "ALL n. (%i. 2 * ln (real (Suc i)) / (real (Suc i)) - 2 * ((ln (real (Suc i)) + 1) / (real (Suc i)) * (1 / (real (Suc i))))) n <= (%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i)))) n & (%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i)))) n <= (%i. 2 * ln (real (Suc i)) / (real (Suc i)) - 2 * ((ln (real (Suc i)) + 1) / (real (Suc i)) * (1 / (real (Suc i))))) n + (%i. 3 * ((ln (real (Suc i)) + 1) / (real (Suc i)) * (1 / (real (Suc i))))) n"; apply(rule allI); apply(rule conjI); apply(subgoal_tac " 2 * ln (real (Suc n)) / real (Suc n) - 2 * ((ln (real (Suc n)) + 1)/ real (Suc n) * (1 / real (Suc n))) <= 2 * ln (real (Suc n)) / real (Suc n) - 2 * ln (real (Suc n)) / real (Suc n) * (1 / real (Suc n))"); apply(erule order_trans); apply(simp only: ln_sq_diff_lbound); apply(simp add: real_divide_def); apply(subgoal_tac "2 * ln (real (Suc n)) / real (Suc n) - 2 * ((ln (real (Suc n)) + 1)/ real (Suc n) * (1 / real (Suc n))) + 3 * ((ln (real (Suc n)) + 1)/ real (Suc n) * (1 / real (Suc n))) = 2 * ln (real (Suc n)) / real (Suc n) + ((ln (real (Suc n)) + 1)/ real (Suc n) * (1 / real (Suc n)))", erule ssubst); apply(subgoal_tac "ln (real (Suc (Suc n))) * (ln (real (Suc (Suc n)))) - ln (real (Suc n)) * (ln (real (Suc n))) <= 2 * ln (real (Suc n)) / (real (Suc n)) + 1 / (real (Suc n) * (real (Suc n)))"); apply(erule order_trans); apply(simp); apply(rule real_div_pos_le_mono); apply force; apply (rule mult_pos); apply force; apply force; apply (rule ln_sq_diff_ubound); apply (auto simp add: ring_eq_simps add_divide_distrib [THEN sym]); done; (* declare ring_abs_pos [simp del]; declare ring_abs_neg [simp del]; *) lemma ln_sq_diff_bigo: "(%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i)))) : (%i. 2 * ln (real (Suc i)) / (real (Suc i)) - 2 * ((ln (real (Suc i)) + 1) / (real (Suc i)) * (1 / (real (Suc i))))) +o O(%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i))))"; proof -; have "(%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i))) : (%i. 2 * ln (real (Suc i)) / real (Suc i) - 2 * ((ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i)))) +o O(%i. 3 * ((ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i))))"; apply (rule bigo_bounded3); apply (rule ln_sq_diff_all_bounds); done; also have "O(%i. 3 * ((ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i)))) = O(%i. (ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i)))"; apply (rule bigo_const_mult); apply simp; done; also have "... = O(%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i))))"; by simp; finally show ?thesis;.; qed; (* declare ring_abs_pos [simp]; declare ring_abs_neg [simp]; *) lemma ln_sq_diff_bigo_subset: "(%i. 2 * ln (real (Suc i)) / (real (Suc i)) - 2 * ((ln (real (Suc i)) + 1) / (real (Suc i)) * (1 / (real (Suc i))))) +o O(%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i)))) <= (%i. 2 * ln (real (Suc i)) / (real (Suc i))) +o O(%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i))))"; apply(simp add: bigo_def elt_set_plus_def func_plus); apply(clarify); apply(rule_tac x = "(%x. (- 2) * (ln (real (Suc x)) + 1) / (real (Suc x) * real (Suc x)) + b x)" in exI); apply(rule conjI); apply(rule_tac x = "2 + c" in exI); apply(rule allI); apply(simp only: abs_mult left_distrib); apply(subgoal_tac "abs ((- 2) * (ln (real (Suc xa)) + 1) / (real (Suc xa) * real (Suc xa)) + b xa) <= abs ((- 2) * (ln (real (Suc xa)) + 1) / (real (Suc xa) * real (Suc xa))) + abs ( b xa)"); apply(erule order_trans); apply(rule add_mono); apply(simp only: abs_mult mult_assoc real_divide_def); apply(force); apply(erule_tac x = xa in allE); apply(simp); apply(simp add: abs_triangle_ineq); apply(rule ext); apply(simp add: real_divide_def); apply(simp only: minus_mult_left minus_add_distrib); apply simp; done; lemma ln_sq_diff_bigo2: "(%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i)))) : (%i. 2 * ln (real (Suc i)) / (real (Suc i))) +o O(%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i))))"; apply(insert ln_sq_diff_bigo_subset); apply(erule subsetD); by(simp only: ln_sq_diff_bigo); lemma ln_sq_sum_bigo: "(%n. ln (real (Suc n)) * (ln (real (Suc n)))) : (%n. 2 * sumr 0 n (%i. ln (real (Suc i)) / (real (Suc i)))) +o O(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i)))))"; apply(subgoal_tac "(%n. 2 * sumr 0 n (%i. ln (real (Suc i)) / real (Suc i))) +o O(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))) = (%n. sumr 0 n (%i. 2 * (ln (real (Suc i)) / real (Suc i)))) +o O(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i))))"); apply(erule ssubst); apply(subgoal_tac "(%n. ln (real (Suc n)) * ln (real (Suc n))) = (%n. sumr 0 n (%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i))))"); apply(erule ssubst); apply(rule bigo_sumr_pos2); apply(rule allI); apply(simp add: real_divide_def); apply(simp only: order_le_less); apply(clarify); apply(rule real_mult_order); apply(subgoal_tac "0 <= ln (real (Suc n))"); apply arith; apply (rule ln_ge_zero); apply force; apply (rule mult_pos); apply force; apply force; apply(insert ln_sq_diff_bigo2); apply(simp); apply(rule ext); apply(subst ln_sq_sum); apply(simp); by(simp only: sumr_mult); lemma calc2: assumes a: "0 < x" shows "ln x - ln (x + 1) = ln (1 - 1 / (x + 1))"; proof -; have b: "0 < x + 1" by (auto simp only: real_add_order a); from a have c: "x ~= 0" by auto; from b have d: "x + 1 ~= 0" by auto; have "ln x - ln (x + 1) = ln (x / (x + 1))"; by (rule ln_div [THEN sym], rule a, rule b); also have "x / (x + 1) = 1 - 1/(x + 1)"; proof -; have "x = x + 1 - 1"; by auto; then have "x / (x + 1) = (x + 1 - 1) / (x + 1)"; by simp; also have "... = (x + 1) / (x + 1) - 1 / (x + 1)"; by (rule real_minus_divide_distrib); also have "(x + 1) / (x + 1) = 1"; by (rule divide_self, rule d); finally show ?thesis;.; qed; finally show ?thesis;.; qed; lemma calc3: assumes a: "0 < x" shows "(ln x / x) - (ln (x + 1) / (x + 1)) = ln (1 - (1/(x+1))) / (x + 1) + ln x / (x * (x + 1))"; proof -; have b: "0 < x + 1" by (auto simp only: real_add_order a); from a have c: "x ~= 0" by auto; from b have d: "x + 1 ~= 0" by auto; have "ln x / x = ((x + 1) * ln x) / ((x + 1) * x)"; by (subst mult_divide_cancel_left, rule d, rule refl); also have "(x + 1) * x = x * (x + 1)"; by auto; finally; have "ln x / x = (x + 1) * ln x / (x * (x + 1))";.; then have "ln x / x - (ln (x + 1) / (x + 1)) = (x + 1) * ln x / (x * (x + 1)) - (ln (x + 1) / (x + 1))"; by simp; also have "... = (x + 1) * ln x / (x * (x + 1)) - (x * ln (x + 1) / (x *(x + 1)))"; by (subst mult_divide_cancel_left, rule c, rule refl); also have "... = ((x + 1) * ln x - x * ln(x + 1)) / (x * (x + 1))"; by (rule real_minus_divide_distrib [THEN sym]); also have "(x + 1) * ln x = x * ln x + ln x"; by (auto simp add: real_add_mult_distrib); also; have "x * ln x + ln x - x * ln (x + 1) = x * ln x - x * ln (x + 1) + ln x"; by simp; also have "x * ln x - x * ln (x + 1) = x * (ln x - ln (x + 1))"; by (rule right_diff_distrib [THEN sym]); also have "ln x - ln (x + 1) = ln (1 - 1/(x + 1))"; by (rule calc2, rule a); finally; have "ln x / x - ln (x + 1) / (x + 1) = (x * ln (1 - 1 / (x + 1)) + ln x) / (x * (x + 1))";.; also have "... = x * ln (1 - 1 / (x + 1)) / (x * (x + 1)) + ln x / (x * (x + 1))"; by (rule add_divide_distrib); also; have "x * ln (1 - 1 / (x + 1)) / (x * (x + 1)) = ln (1 - 1 / (x + 1)) / (x + 1)"; by (subst mult_divide_cancel_left, rule c, rule refl); finally show ?thesis;.; qed; lemma ln_one_minus_small_pos_lower_bound2: "0 <= x ==> x <= (1 / 2) ==> - 2 * x <= ln (1 - x)"; proof -; assume a: "0 <= (x::real)"; assume b: "x <= (1 / 2)"; then have c: "x < 1"; by auto; have d: "2 * x^2 <= x"; proof -; have "x^2 = x * x"; by (rule realpow_two2 [THEN sym]); also have "... <= (1 / 2) * x"; by (rule mult_right_mono); finally have "x^2 <= (1 / 2) * x";.; then have "2 * x^2 <= 2 * ((1 / 2) * x)"; by auto; also have "... = x"; by simp; finally show ?thesis;.; qed; then have "- x - x <= - x - 2 * x^2"; by auto; also have "... <= ln(1 - x)"; apply (rule ln_one_plus_neg_lower_bound); by (rule a, rule b, rule c); also have "-x - x = - 2 * x"; by simp; finally show ?thesis;.; qed; lemma aux_calc4: "1 <= x ==> - (2 / ((x + 1) * (x + 1))) <= ln (1 - 1 / (x + 1)) / (x + 1)"; apply(insert ln_one_minus_small_pos_lower_bound2[of "1 / (x + 1)"]); apply(simp); apply(subgoal_tac "2 / (x + 1) <= 1"); apply(simp); apply(subgoal_tac "- (2 / ((x + 1) * (x + 1))) = -2 / (x + 1) / (x + 1)"); apply(erule ssubst); apply(simp only: real_divide_def); apply(force); apply (simp add: divide_divide_eq_left nonzero_minus_divide_left); apply (rule real_le_mult_imp_div_pos_le); apply arith; apply simp; done; lemma aux_calc4_neg: "1 <= x ==> - (ln (1 - 1 / (x + 1)) / (x + 1)) <= 2 / ((x + 1) * (x + 1))"; apply(insert aux_calc4[of x]); apply simp; done; lemma calc4: "ln (real (Suc n)) / (real (Suc n) * (real (Suc n))) <= 2 * (ln (real (Suc n)) / (real (Suc n)) - (ln (real (Suc (Suc n))) / (real (Suc (Suc n))))) + 4 / (real (Suc (Suc n)) * (real (Suc (Suc n))))"; proof -; have "ln (real (Suc n)) / (real (Suc n) * (real (Suc n))) <= 2 * ln (real (Suc n)) / (real (Suc n) * (real (Suc (Suc n))))"; apply(subgoal_tac "(ln (real (Suc n)) / (real (Suc n) * real (Suc n)) <= 2 * ln (real (Suc n)) / (real (Suc n) * real (Suc (Suc n)))) = ((ln (real (Suc n)) / (real (Suc n) * real (Suc n))) / 2 <= ln (real (Suc n)) / (real (Suc n) * real (Suc (Suc n))))"); apply(erule ssubst); apply(simp); apply(subgoal_tac "real (Suc (Suc n)) = real (Suc n) + 1"); apply(erule ssubst); apply(simp only: left_distrib real_divide_def); apply(rule mult_left_mono); apply(rule real_inverse_le_swap); apply(simp only: real_of_nat_ge_zero real_of_nat_Suc); apply (rule mult_pos); apply force; apply force; apply (subst mult_assoc); apply (rule mult_left_mono); apply (simp_all); apply (subgoal_tac "ln (real (Suc n)) / (real (Suc n) * real (Suc n)) = 2 * ((ln (real (Suc n)) / (real (Suc n) * real (Suc n) * 2)))"); apply (erule ssubst); apply (subgoal_tac "2 * ln (real (Suc n)) / (real (Suc n) * real (Suc (Suc n))) = 2 * ((ln (real (Suc n)) / (real (Suc n) * real (Suc (Suc n)))))"); apply (erule ssubst); apply (subst mult_le_cancel_left); apply auto; done; also have "... = 2 * (ln (real (Suc n))/(real (Suc n)) - (ln (real (Suc (Suc n))) / (real (Suc (Suc n))))) - 2 * (ln (1 - 1 / (real (Suc (Suc n)))) / (real (Suc (Suc n))))"; apply(subgoal_tac "ln (real (Suc (Suc n))) / real (Suc (Suc n)) = ln (real (Suc n) + 1) / (real (Suc n) + 1)"); apply(erule ssubst); apply(subgoal_tac "ln (real (Suc n)) / real (Suc n) - ln (real (Suc n) + 1) / (real (Suc n) + 1) = ln (1 - (1/((real (Suc n))+1))) / ((real (Suc n)) + 1) + ln (real (Suc n)) / ((real (Suc n)) * ((real (Suc n)) + 1))"); apply(erule ssubst); apply(simp add: real_of_nat_Suc); apply(rule calc3); apply(simp add: real_of_nat_ge_zero); by(simp add: real_of_nat_Suc); also have "... <= 2 * (ln (real (Suc n))/(real (Suc n)) - (ln (real (Suc (Suc n))) / (real (Suc (Suc n))))) + 4 / (real (Suc (Suc n)) * (real (Suc (Suc n))))"; apply(simp); apply(subgoal_tac "- (2 * ln (1 - 1 / real (Suc (Suc n))) / real (Suc (Suc n))) = 2 * (- (ln (1 - 1 / (real (Suc n) + 1)) / (real (Suc n) + 1)))"); apply(erule ssubst); apply(subgoal_tac "4 / (real (Suc (Suc n)) * real (Suc (Suc n))) = 2 * (2 / ((real (Suc n) + 1) * (real (Suc n) + 1)))"); apply(erule ssubst); apply(simp only: real_mult_le_cancel_iff2); apply(rule aux_calc4_neg); apply(simp add: real_of_nat_Suc); apply(simp add: real_of_nat_Suc); by(simp add: real_of_nat_Suc); finally;show ?thesis;.; qed; lemma aux_bigo_calc[rule_format]: "sumr 0 x (%i. ln (real (Suc i)) / (real (Suc i) * real (Suc i))) <= 8"; proof -; have "sumr 0 x (%i. ln (real (Suc i)) / (real (Suc i) * real (Suc i))) <= sumr 0 x (%n. 2 * (ln (real (Suc n)) / (real (Suc n)) - (ln (real (Suc (Suc n))) / (real (Suc (Suc n))))) + 4 / (real (Suc (Suc n)) * (real (Suc (Suc n)))))"; apply(rule sumr_le2); apply(rule allI); apply(simp only: calc4); by(simp); also have "... <= sumr 0 x (%n. 2 * (ln (real (Suc n)) / (real (Suc n)) - (ln (real (Suc (Suc n))) / (real (Suc (Suc n)))))) + sumr 0 x (%n. 4 / (real (Suc (Suc n)) * (real (Suc (Suc n)))))"; apply (subst sumr_add); apply (rule order_refl); done; also have "sumr 0 x (%n. 2 * (ln (real (Suc n)) / real (Suc n) - ln (real (Suc (Suc n))) / real (Suc (Suc n)))) + sumr 0 x (%n. 4 / (real (Suc (Suc n)) * real (Suc (Suc n)))) <= sumr 0 x (%n. 4 / (real (Suc (Suc n)) * real (Suc (Suc n))))"; apply(simp); apply(subgoal_tac "sumr 0 x (%n. 2 * ln (real (Suc n)) / real (Suc n) - 2 * ln (real (Suc (Suc n))) / real (Suc (Suc n))) = 2 * (ln (real (Suc 0)) / real (Suc 0) - ln (real (Suc x))/ (real (Suc x)))"); apply(simp add: real_divide_def); apply (rule nonneg_times_nonneg); apply auto; apply(induct_tac x); apply(simp); by(simp (no_asm_simp)); also have "sumr 0 x (%n. 4 / (real (Suc (Suc n)) * real (Suc (Suc n)))) = 4 * sumr 0 x (%n. 1 / (real (Suc (Suc n))) * (1 / real (Suc (Suc n))))"; by(simp add: sumr_mult); also have "... <= 4 * sumr 0 x (%n. 1 / (real (Suc n)) * (1 / real (Suc n)))"; apply(simp); apply(rule sumr_le2); apply(rule allI); apply(auto simp add: real_divide_def); apply (rule mult_mono); apply auto; done; also have "... <= 8"; apply(insert lnsum_inv_sq_2[of x]); apply(simp); apply(erule order_trans); by(simp add: real_divide_def); finally; show "sumr 0 x (%i. ln (real (Suc i)) / (real (Suc i) * real (Suc i))) <= 8";.; qed; lemma aux2_bigo_calc[rule_format]: "sumr 0 x (%i. 1 / (real (Suc i) * real (Suc i))) <= 2"; apply(insert lnsum_inv_sq_2[of x]); apply(simp); apply(erule order_trans); by(simp add: real_divide_def); lemma ln_sq_diff_part_bigo_1: "(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i))))) : O(%x. 1)"; apply(auto simp add: bigo_def); apply(rule_tac x = "8 + 2" in exI); apply(rule allI); apply(subgoal_tac "abs (sumr 0 x (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))) <= sumr 0 x (%i. (ln (real (Suc i)))/ (real (Suc i) * real (Suc i))) + sumr 0 x (%i. 1 / (real (Suc i) * real (Suc i)))"); apply(erule order_trans); apply(subgoal_tac "sumr 0 x (%i. 1 / (real (Suc i) * real (Suc i))) <= 2"); apply(rule add_mono); apply(rule aux_bigo_calc); apply(simp); apply(rule aux2_bigo_calc); apply(subgoal_tac "0 <= sumr 0 x (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))"); apply(auto simp add: real_abs_def); apply(simp add: sumr_add real_abs_def add_divide_distrib); apply(rule sumr_ge_zero); apply(rule allI); apply(simp add: real_divide_def); apply(rule nonneg_times_nonneg); apply(rule nonneg_plus_nonneg); apply auto; done; declare subsetI [rule del, intro]; lemma ln_sq_diff_bigo3: "(%x. sumr 0 x (%i. ln (real (Suc (Suc i))) * (ln (real (Suc (Suc i)))) - ln (real (Suc i)) * (ln (real (Suc i))))) : (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / (real (Suc i)))) +o O(%x. 1)"; proof -; have "(%x. sumr 0 x (%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)))) : (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i))) +o O(%x. sumr 0 x (%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i)))))"; apply(rule bigo_sumr_pos2); apply(rule allI); apply(simp add: real_divide_def); apply (rule nonneg_times_nonneg); apply (rule nonneg_plus_nonneg); apply force; apply force; apply force; by(simp only: ln_sq_diff_bigo2); moreover have "O((%x. sumr 0 x (%i. (ln (real (Suc i)) + 1)/ (real (Suc i) * (real (Suc i)))))) <= O(%x. 1)"; apply (rule bigo_elt_subset); by(simp only: ln_sq_diff_part_bigo_1); ultimately have "(%x. sumr 0 x (%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)))) : (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i))) +o O(%x. 1)"; by (elim set_plus_mono_b); then show ?thesis;.; qed; lemma lnxdivx_bigo: "(%x. ln (real (Suc x)) * (ln (real (Suc x)))) : (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / (real (Suc i)))) +o O(%x. 1)"; apply(insert ln_sq_diff_bigo3); by(simp only: ln_sq_sum[THEN sym]); lemma lnxdivx2_bigo: "(%x. ln (real (Suc x)) * (ln (real (Suc x))) / 2) : (%x. sumr 0 x (%i. ln (real (Suc i)) / (real (Suc i)))) +o O(%x. 1)"; apply(insert lnxdivx_bigo); apply(simp add: bigo_def elt_set_plus_def func_plus); apply(erule exE); apply(rule_tac x = "(%x. 1 / 2 * b x)" in exI); apply(clarify); apply(rule conjI); apply(rule_tac x = c in exI); apply(simp); apply(rule allI); apply(erule_tac x = x in allE); apply(subgoal_tac "abs(b x / 2) <= abs(b x)"); apply(erule order_trans); apply(simp); apply(simp add: real_abs_def); apply(rule ext); apply(simp add: ext); apply(subgoal_tac "(%x. ln (real (Suc x)) * ln (real (Suc x))) x = (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i)) + b x) x"); apply(simp); apply(simp only: mult_commute sumr_mult); apply(rule sumr_fun_eq); apply(clarify); apply(simp add: mult_commute); by(erule ssubst,simp); lemma lnxdivx_bigo_final: "(%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / (real (Suc i)))) : (%x. ln (real (Suc x)) * (ln (real (Suc x)))) +o O(%x. 1)"; by(simp add: bigo_add_commute lnxdivx_bigo); end
lemma lndivxsum_minus:
sumr 0 (Suc n) (%m. ln (real (Suc n) / real (Suc m))) = sumr 0 (Suc n) (%m. ln (real (Suc n))) - sumr 0 (Suc n) (%m. ln (real (Suc m)))
lemma lndivxsum_minus2:
sumr 0 (Suc n) (%m. ln (real (Suc n) / real (Suc m))) = real (Suc n) * ln (real (Suc n)) - sumr 0 (Suc n) (%m. ln (real (Suc m)))
lemma lndivxsum_eq_x_bigo_ln:
(%n. sumr 0 (Suc n) (%m. ln (real (Suc n) / real (Suc m)))) ∈ real + O(%n. ln (real (Suc n)))
lemma ln_sq_sum:
ln (real (Suc n)) * ln (real (Suc n)) = sumr 0 n (%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)))
lemma ln_sq_diff_factor:
ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)) = (ln (real (Suc (Suc i))) - ln (real (Suc i))) * (ln (real (Suc (Suc i))) + ln (real (Suc i)))
lemma ln_factor_minus_1:
ln (real (Suc (Suc i))) - ln (real (Suc i)) = ln (1 + 1 / real (Suc i))
lemma ln_factor_minus_lbound:
1 / real (Suc i) - 1 / real (Suc i) * (1 / real (Suc i)) ≤ ln (real (Suc (Suc i))) - ln (real (Suc i))
lemma ln_factor_minus_ubound:
ln (real (Suc (Suc i))) - ln (real (Suc i)) ≤ 1 / real (Suc i)
lemma ln_factor_plus_lbound:
2 * ln (real (Suc i)) ≤ ln (real (Suc (Suc i))) + ln (real (Suc i))
lemma ln_factor_plus_ubound:
ln (real (Suc (Suc i))) + ln (real (Suc i)) ≤ 2 * ln (real (Suc i)) + 1 / real (Suc i)
lemma ln_sq_diff_lbound:
2 * ln (real (Suc i)) / real (Suc i) - 2 * ln (real (Suc i)) / real (Suc i) * (1 / real (Suc i)) ≤ ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i))
lemma ln_sq_diff_ubound:
ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)) ≤ 2 * ln (real (Suc i)) / real (Suc i) + 1 / (real (Suc i) * real (Suc i))
lemma ln_sq_diff_all_bounds:
∀n. 2 * ln (real (Suc n)) / real (Suc n) - 2 * ((ln (real (Suc n)) + 1) / real (Suc n) * (1 / real (Suc n))) ≤ ln (real (Suc (Suc n))) * ln (real (Suc (Suc n))) - ln (real (Suc n)) * ln (real (Suc n)) ∧ ln (real (Suc (Suc n))) * ln (real (Suc (Suc n))) - ln (real (Suc n)) * ln (real (Suc n)) ≤ 2 * ln (real (Suc n)) / real (Suc n) - 2 * ((ln (real (Suc n)) + 1) / real (Suc n) * (1 / real (Suc n))) + 3 * ((ln (real (Suc n)) + 1) / real (Suc n) * (1 / real (Suc n)))
lemma ln_sq_diff_bigo:
(%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i))) ∈ (%i. 2 * ln (real (Suc i)) / real (Suc i) - 2 * ((ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i)))) + O(%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))
lemma ln_sq_diff_bigo_subset:
(%i. 2 * ln (real (Suc i)) / real (Suc i) - 2 * ((ln (real (Suc i)) + 1) / real (Suc i) * (1 / real (Suc i)))) + O(%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i))) ⊆ (%i. 2 * ln (real (Suc i)) / real (Suc i)) + O(%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))
lemma ln_sq_diff_bigo2:
(%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i))) ∈ (%i. 2 * ln (real (Suc i)) / real (Suc i)) + O(%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))
lemma ln_sq_sum_bigo:
(%n. ln (real (Suc n)) * ln (real (Suc n))) ∈ (%n. 2 * sumr 0 n (%i. ln (real (Suc i)) / real (Suc i))) + O(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i))))
lemma
0 < x ==> ln x - ln (x + 1) = ln (1 - 1 / (x + 1))
lemma
0 < x ==> ln x / x - ln (x + 1) / (x + 1) = ln (1 - 1 / (x + 1)) / (x + 1) + ln x / (x * (x + 1))
lemma ln_one_minus_small_pos_lower_bound2:
[| 0 ≤ x; x ≤ 1 / 2 |] ==> - 2 * x ≤ ln (1 - x)
lemma aux_calc4:
1 ≤ x ==> - (2 / ((x + 1) * (x + 1))) ≤ ln (1 - 1 / (x + 1)) / (x + 1)
lemma aux_calc4_neg:
1 ≤ x ==> - (ln (1 - 1 / (x + 1)) / (x + 1)) ≤ 2 / ((x + 1) * (x + 1))
lemma calc4:
ln (real (Suc n)) / (real (Suc n) * real (Suc n)) ≤ 2 * (ln (real (Suc n)) / real (Suc n) - ln (real (Suc (Suc n))) / real (Suc (Suc n))) + 4 / (real (Suc (Suc n)) * real (Suc (Suc n)))
lemma aux_bigo_calc:
sumr 0 x (%i. ln (real (Suc i)) / (real (Suc i) * real (Suc i))) ≤ 8
lemma aux2_bigo_calc:
sumr 0 x (%i. 1 / (real (Suc i) * real (Suc i))) ≤ 2
lemma ln_sq_diff_part_bigo_1:
(%n. sumr 0 n (%i. (ln (real (Suc i)) + 1) / (real (Suc i) * real (Suc i)))) ∈ O(%x. 1)
lemma ln_sq_diff_bigo3:
(%x. sumr 0 x (%i. ln (real (Suc (Suc i))) * ln (real (Suc (Suc i))) - ln (real (Suc i)) * ln (real (Suc i)))) ∈ (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i))) + O(%x. 1)
lemma lnxdivx_bigo:
(%x. ln (real (Suc x)) * ln (real (Suc x))) ∈ (%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i))) + O(%x. 1)
lemma lnxdivx2_bigo:
(%x. ln (real (Suc x)) * ln (real (Suc x)) / 2) ∈ (%x. sumr 0 x (%i. ln (real (Suc i)) / real (Suc i))) + O(%x. 1)
lemma lnxdivx_bigo_final:
(%x. sumr 0 x (%i. 2 * ln (real (Suc i)) / real (Suc i))) ∈ (%x. ln (real (Suc x)) * ln (real (Suc x))) + O(%x. 1)