(* Title: LnSum2.thy
Author: Kevin Donnelly
*)
header {* Identities involving sums and ln, part 2 *}
theory LnSum2 = LnSum1:;
lemma inverse_func_pos: "ALL x::nat. 0 <= 1 / (real (Suc x))";
apply auto;
done;
(*
declare ring_abs_pos [simp del];
declare ring_abs_neg [simp del];
*)
lemma abs_ln_one_plus_pos_minus_x_bound2: "[| 0 <= x; x <= 1 |] ==>
abs (ln (1 + x) - x) <= x ^ 2";
apply (subgoal_tac "x ^ 2 = abs(x ^ 2)");
apply (erule ssubst);
apply (rule abs_ln_one_plus_pos_minus_x_bound);
apply auto;
done;
lemma ln_1_plus_small: "(%n::nat. ln (1 + (1 / (real (n + 1))))) ∈ (%n::nat. 1 / (real (n + 1))) +o
O(%n::nat. 1 / ((real (n + 1)) * (real (n + 1))))";
apply simp;
apply (rule set_minus_imp_plus);
apply (unfold bigo_def);
apply simp;
apply (rule_tac x = 1 in exI);
apply (clarsimp);
apply (subgoal_tac "1 / (real (Suc x) * real (Suc x)) = (1 / real (Suc x))^2");
apply (simp only: func_diff_minus);
apply (rule abs_ln_one_plus_pos_minus_x_bound2);
apply auto;
proof -;
fix x;
show "1 / real(Suc x) <= 1";
proof -;
have "1 <= Suc x";
by auto;
then have "inverse(real(Suc x)) <= 1";
by (rule real_inverse_nat_le_one);
thus "1 / real(Suc x) <= 1";
by (simp add: real_divide_def);
qed;
next;
fix x;
show "1 / (real (Suc x) * real (Suc x)) = (1 / real (Suc x)) ^ 2";
proof -;
have "1 / (real(Suc x) * real (Suc x)) = (1 / real(Suc x)) * (1 / real(Suc x))";
by simp;
also have "... = (1 / real(Suc x))^2";
by (rule realpow_two2);
finally show ?thesis;.;
qed;
qed;
(*
declare ring_abs_pos [simp];
declare ring_abs_neg [simp];
*)
lemma xlnx_sum: "sumr 0 m (%n. (real (n + 2)) * (ln (real (n + 2))) -
(real (n + 1)) * (ln (real (n + 1)))) = ((real (m + 1)) * (ln (real (m + 1))))";
apply(induct_tac m);
by(simp_all);
lemma xlnx_sum_plus: "sumr 0 m (%n. (ln (real (n + 2))) +
(real (n + 1)) * ((ln (real (n + 2))) - (ln (real (n + 1))))) = ((real (m + 1)) * (ln (real (m + 1))))";
apply(subgoal_tac "(%n. ln (real ((n::nat) + 2)) + real (n + 1) * (ln (real (n + 2)) - ln (real (n + 1)))) =
(%n. (real (n + 2)) * (ln (real (n + 2))) - (real (n + 1)) * (ln (real (n + 1))))");
apply(erule ssubst);
apply(simp only: xlnx_sum);
apply(rule ext);
apply(auto simp add: plus_ac0 diff_minus right_distrib left_distrib add_assoc);
apply(subgoal_tac "ln (real (Suc (Suc n))) + real (Suc n) * ln (real (Suc (Suc n))) =
1 * ln (real (Suc (Suc n))) + real (Suc n) * ln (real (Suc (Suc n)))");
apply(erule ssubst);
apply(simp only: real_add_mult_distrib[THEN sym]);
apply(simp add: real_of_nat_Suc);
by(simp);
lemma xlnx_sum_split1: "sumr 0 m (%n. (ln (real (n + 2)))) + sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))))) = ((real (m + 1)) * (ln (real (m + 1))))";
apply(subgoal_tac "sumr 0 m (%n. ln (real (n + 2))) +
sumr 0 m (%n. real (n + 1) * ln (1 + 1 / real (n + 1))) =
sumr 0 m (%n. (ln (real (n + 2))) +
(real (n + 1)) * ((ln (real (n + 2))) - (ln (real (n + 1)))))");
apply(erule ssubst);
apply(simp only: xlnx_sum_plus);
apply(simp add: sumr_add);
apply(subgoal_tac "(%n. ln (real (Suc (Suc n))) + real (Suc n) * ln (1 + 1 / real (Suc n))) =
(%n. ln (real (Suc (Suc n))) +
real (Suc n) * (ln (real (Suc (Suc n))) - ln (real (Suc n))))");
apply(erule ssubst, simp);
apply(rule ext,simp);
apply(subgoal_tac "ln (1 + 1 / real (Suc n)) = (ln (real (Suc (Suc n))) - ln (real (Suc n)))");
apply(erule ssubst, simp);
apply(subgoal_tac "ln (real (Suc (Suc n))) - ln (real (Suc n)) = ln (real (Suc (Suc n)) / (real (Suc n)))");
apply(simp);
apply(subgoal_tac "real (Suc (Suc n)) = real (Suc n) + 1");
apply(simp add: add_divide_distrib);
apply(simp only: real_of_nat_Suc);
by(auto simp add: ln_div);
lemma xlnx_sum_split2: "sumr 0 m (%n. (ln (real (n + 2)))) + sumr 0 m (%n. (real (n + 1)) * (1 / (real (n + 1)) + (ln (1 + 1 / (real (n + 1)))) - 1 / (real (n + 1)))) = ((real (m + 1)) * (ln (real (m + 1))))";
apply(subgoal_tac "sumr 0 m (%n. (ln (real (n + 2)))) + sumr 0 m (%n. (real (n + 1)) * (1 / (real (n + 1)) + (ln (1 + 1 / (real (n + 1)))) - 1 / (real (n + 1)))) =
sumr 0 m (%n. (ln (real (n + 2)))) + sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1)))))");
apply(erule ssubst, simp only: xlnx_sum_split1);
by(simp);
lemma xlnx_sum_split3: "sumr 0 m (%n. (ln (real (n + 2)))) + (real m) + sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))) - 1 / (real (n + 1)))) = ((real (m + 1)) * (ln (real (m + 1))))";
apply(subgoal_tac "sumr 0 m (%n. ln (real (n + 2))) + real m +
sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))) =
sumr 0 m (%n. (ln (real (n + 2)))) + sumr 0 m (%n. (real (n + 1)) * (1 / (real (n + 1)) + (ln (1 + 1 / (real (n + 1)))) - 1 / (real (n + 1))))");
apply(erule ssubst, simp only: xlnx_sum_split2);
apply(simp add: diff_minus right_distrib);
apply(simp only: sumr_add[THEN sym]);
by(simp);
lemma ln_1_plus_small_minus: "(%n::nat. ln (1 + (1 / (real (n + 1)))) - 1 / (real (n + 1))) ∈
O(%n::nat. 1 / ((real (n + 1)) * (real (n + 1))))";
apply(insert ln_1_plus_small);
apply(simp add: bigo_def elt_set_plus_def);
apply(auto);
apply(rule_tac x = c in exI);
apply(rule allI);
apply(erule_tac x = x in allE);
apply(erule ssubst);
apply (auto simp add: func_plus);
apply (subgoal_tac "- b x <= abs (b x)");
apply (erule order_trans);
apply assumption;
apply (rule abs_ge_minus_self);
done;
lemma xln_1_plus_small_minus: "(%n::nat. (real (n + 1)) * (ln (1 + (1 / (real (n + 1)))) -
1 / (real (n + 1)))) \<elteqo> O(%n::nat. 1 / (real (n + 1)))";
apply(subgoal_tac "(%n::nat. (real (n + 1)) * (ln (1 + (1 / (real (n + 1)))) -
1 / (real (n + 1)))) = (%n::nat. (real (n + 1))) * (%n. (ln (1 + (1 / (real (n + 1)))) -
1 / (real (n + 1))))");
apply(erule ssubst);
proof -;
have 1: "(%n::nat. real (n + 1)) \<elteqo> O(%n::nat. real (n + 1))" by (simp add: bigo_refl);
also have "(%n::nat. ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)) \<elteqo> O(%n::nat. 1 / ((real (n + 1)) * (real (n + 1))))"; by (simp only: ln_1_plus_small_minus);
ultimately have "(%n. real (n + 1)) *
(%n. ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)) \<elteqo> O((%n. real (n + 1)) * (%n::nat. 1 / ((real (n + 1)) * (real (n + 1)))))";
by(auto simp add: bigo_mult3);
then show "(%n::nat. real (n + 1)) *
(%n. ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)) \<elteqo> O(%n. 1 / real (n + 1))";
by(simp add: func_times);
next;
show "(%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))) =
(%n. real (n + 1)) * (%n. ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))"
by (simp add: func_times);
qed;
lemma xlnx_sum_snd_bigo: "(%m. sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))) - 1 / (real (n + 1))))) \<elteqo> O(%m. sumr 0 m (%n::nat. 1 / (real (n + 1))))";
apply(simp);
apply(rule bigo_sumr_pos);
apply(simp add: inverse_func_pos);
by(insert xln_1_plus_small_minus,simp);
lemma fn_xlnx_sum_split3: "(%m. sumr 0 m (%n. (ln (real (n + 2))))) + (%m. (real m)) + (%m. sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))) - 1 / (real (n + 1))))) = (%m. ((real (m + 1)) * (ln (real (m + 1)))))";
apply(simp only: func_plus);
by(rule ext, simp only: xlnx_sum_split3);
lemma fn_lnx_sum: "(%m. sumr 0 m (%n. (ln (real (n + 2))))) = (%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m)) - (%m. sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))) - 1 / (real (n + 1)))))";
apply(insert fn_xlnx_sum_split3);
proof -;
assume "(%m. sumr 0 m (%n. ln (real (n + 2)))) + real +
(%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) =
(%m. real (m + 1) * ln (real (m + 1)))";
have "(%m. sumr 0 m (%n. ln (real (n + 2)))) + real +
(%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) + - real =
(%m. real (m + 1) * ln (real (m + 1))) + - real";
apply(subst prems);
by(simp);
then have "(%m. sumr 0 m (%n. ln (real (n + 2)))) + real +
(%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) + - real + - (%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) = (%m. real (m + 1) * ln (real (m + 1))) + - real + - (%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))))";
by(simp);
then show ?thesis;
apply(simp);
apply(simp add: func_plus func_diff_minus);
apply(rule ext);
apply(simp only: expand_fun_eq func_diff_minus);
apply(erule_tac x = m in allE);
by(simp);
qed;
lemma fn_lnx_sum_bigo: "(%m. sumr 0 m (%n. (ln (real (n + 2))))) \<elteqo> ((%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m))) +o O(%m. sumr 0 m (%n::nat. 1 / (real (n + 1))))";
apply(subst fn_lnx_sum);
apply(auto simp add: elt_set_plus_def);
apply(rule_tac x = "- (%m. sumr 0 m (%n. real (Suc n) * (ln (1 + 1 / real (Suc n)) - 1 / real (Suc n))))" in bexI);
apply(rule ext);
apply(simp add: func_diff_minus func_plus func_minus);
apply(insert xlnx_sum_snd_bigo);
by auto;
lemma xlnx_sum_snd_bigo_ln: "(%m. sumr 0 m (%n. (real (n + 1)) * (ln (1 + 1 / (real (n + 1))) - 1 / (real (n + 1))))) \<elteqo> O(%n::nat. ln (real (n + 1)))";
apply(insert xlnx_sum_snd_bigo);
apply(insert sum_inverse_bigo_ln);
apply(simp only: bigo_def bigo_pos_const elt_set_plus_def);
apply(auto simp add: bigo_def bigo_pos_const elt_set_plus_def);
(* apply(simp only: bigo_pos_const[THEN sym]); *)
apply(rule_tac x = "c * ca" in exI);
apply auto;
apply (elim mult_pos);
apply assumption;
apply(erule_tac x = x in allE);
apply(erule order_trans);
apply(erule_tac x = x in allE);
apply(simp only: mult_assoc);
by(simp);
lemma fn_lnx_sum_bigo_ln: "(%m. sumr 0 m (%n. (ln (real (n + 2))))) \<elteqo> ((%m. ((real (m + 1)) * (ln (real (m + 1))))) - (%m. (real m))) +o O(%n::nat. ln (real (n + 1)))";
apply(subst fn_lnx_sum);
apply(auto simp add: elt_set_plus_def);
apply(rule_tac x = "- (%m. sumr 0 m (%n. real (Suc n) * (ln (1 + 1 / real (Suc n)) - 1 / real (Suc n))))" in bexI);
apply(rule ext);
apply(simp add: func_diff_minus func_plus func_minus);
apply(insert xlnx_sum_snd_bigo_ln);
by auto;
lemma fn_lnx_sum_bigo_ln2: "(λm. sumr 0 (Suc m) (λn. ln (real (Suc n))))
\<elteqo> ((λm. ((real (m + 1)) * (ln (real (m + 1))))) - (λm. (real m)))
\<pluso> O(λn::nat. ln (real (n + 1)))";
proof -;
have "(%m. sumr 0 (Suc m) (%n. (ln (real (Suc n))))) =
(%m. sumr 0 m (%n. (ln (real (n + 2)))))";
apply(rule ext);
apply(induct_tac m);
by(auto);
then show ?thesis by (auto simp only: fn_lnx_sum_bigo_ln);
qed;
end
lemma inverse_func_pos:
∀x. 0 ≤ 1 / real (Suc x)
lemma abs_ln_one_plus_pos_minus_x_bound2:
[| 0 ≤ x; x ≤ 1 |] ==> ¦ln (1 + x) - x¦ ≤ x²
lemma ln_1_plus_small:
(%n. ln (1 + 1 / real (n + 1))) ∈ (%n. 1 / real (n + 1)) + O(%n. 1 / (real (n + 1) * real (n + 1)))
lemma xlnx_sum:
sumr 0 m (%n. real (n + 2) * ln (real (n + 2)) - real (n + 1) * ln (real (n + 1))) = real (m + 1) * ln (real (m + 1))
lemma xlnx_sum_plus:
sumr 0 m (%n. ln (real (n + 2)) + real (n + 1) * (ln (real (n + 2)) - ln (real (n + 1)))) = real (m + 1) * ln (real (m + 1))
lemma xlnx_sum_split1:
sumr 0 m (%n. ln (real (n + 2))) + sumr 0 m (%n. real (n + 1) * ln (1 + 1 / real (n + 1))) = real (m + 1) * ln (real (m + 1))
lemma xlnx_sum_split2:
sumr 0 m (%n. ln (real (n + 2))) + sumr 0 m (%n. real (n + 1) * (1 / real (n + 1) + ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))) = real (m + 1) * ln (real (m + 1))
lemma xlnx_sum_split3:
sumr 0 m (%n. ln (real (n + 2))) + real m + sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))) = real (m + 1) * ln (real (m + 1))
lemma ln_1_plus_small_minus:
(%n. ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)) ∈ O(%n. 1 / (real (n + 1) * real (n + 1)))
lemma xln_1_plus_small_minus:
(%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))) ∈ O(%n. 1 / real (n + 1))
lemma xlnx_sum_snd_bigo:
(%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) ∈ O(%m. sumr 0 m (%n. 1 / real (n + 1)))
lemma fn_xlnx_sum_split3:
(%m. sumr 0 m (%n. ln (real (n + 2)))) + real + (%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) = (%m. real (m + 1) * ln (real (m + 1)))
lemma fn_lnx_sum:
(%m. sumr 0 m (%n. ln (real (n + 2)))) = (%m. real (m + 1) * ln (real (m + 1))) - real - (%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1))))
lemma fn_lnx_sum_bigo:
(%m. sumr 0 m (%n. ln (real (n + 2)))) ∈ ((%m. real (m + 1) * ln (real (m + 1))) - real) + O(%m. sumr 0 m (%n. 1 / real (n + 1)))
lemma xlnx_sum_snd_bigo_ln:
(%m. sumr 0 m (%n. real (n + 1) * (ln (1 + 1 / real (n + 1)) - 1 / real (n + 1)))) ∈ O(%n. ln (real (n + 1)))
lemma fn_lnx_sum_bigo_ln:
(%m. sumr 0 m (%n. ln (real (n + 2)))) ∈ ((%m. real (m + 1) * ln (real (m + 1))) - real) + O(%n. ln (real (n + 1)))
lemma fn_lnx_sum_bigo_ln2:
(%m. sumr 0 (Suc m) (%n. ln (real (Suc n)))) ∈ ((%m. real (m + 1) * ln (real (m + 1))) - real) + O(%n. ln (real (n + 1)))