Theory Error

Up to index of Isabelle/HOL/HOL-Complex/NumberTheory

theory Error = Selberg:

(*  Title:      Error.thy
    Author:     Jeremy Avigad
*)

header {* Estimates on the error term *}

theory Error = Selberg:;

declare One_nat_def [simp del];

constdefs
  R :: "real => real"
  "R x == psi (natfloor x) - x";

lemma R_alt_def: "psi (natfloor x) = x + R x";
  by (simp add: R_def);

lemma R_alt_def2: "psi (natfloor x) = R x + x";
  by (simp add: R_def);

lemma R_alt_def3: "psi n = real n + R (real n)";
  by (simp add: R_def);

lemma R_alt_def4: "psi n = R (real n) + real n"; 
  by (simp add: R_def);

lemma R_bound_imp_PNT: "ALL epsilon. (0 < epsilon --> 
    (EX z. ALL x. (z <= x --> abs (R x) < epsilon * x))) ==> 
      (%x. psi x / (real x)) ----> 1";
  apply (unfold LIMSEQ_def);
  apply clarsimp;
  apply (drule_tac x = r in spec);
  apply clarsimp;
  apply (rule_tac x = "natfloor z + 1" in exI);
  apply clarify;
  apply (drule_tac x = "real n" in spec);
  apply (unfold R_def);
  apply (subgoal_tac "z <= real n");
  apply (clarsimp simp del: One_nat_def);
  apply (subgoal_tac "abs (psi n - real n) / real n < r");
  prefer 2;
  apply (subst pos_divide_less_eq);
  apply arith;
  apply assumption;
  apply (subgoal_tac "abs (psi n - real n) / real n = 
      abs(psi n / real n + -1)");
  apply (erule subst);
  apply assumption;
  apply (subst abs_div_pos);
  apply force;
  apply (rule arg_cong);back;
  apply (simp add: ring_eq_simps diff_divide_distrib);
  apply (rule order_less_imp_le);
  apply (erule ge_natfloor_plus_one_imp_gt);
done;

lemma aux: "f + g =o h +o O(k::'a=>'b::ordered_ring) ==>
    g =o l +o O(k) ==> f + l =o h +o O(k)";
  apply (rule set_minus_imp_plus);
  apply (drule set_plus_imp_minus)+;
  apply (drule bigo_minus);back;
  apply (drule bigo_add_useful);
  apply assumption;
  apply (subgoal_tac "f + g - h + - (g - l) = f + l - h");
  apply (erule subst);
  apply assumption;
  apply (simp add: ring_eq_simps compare_rls minus_diff_eq);
done;

lemma error0: "R =o O(%x. abs x)";
  apply (subgoal_tac "R = (%x. psi (natfloor x)) + (%x. - x)"); 
  apply (erule ssubst);
  apply (subst bigo_plus_idemp [THEN sym]);
  apply (rule set_plus_intro);
  apply (rule subsetD);
  apply (subgoal_tac "O(%x. real(natfloor x)) <= O(%x. abs x)");
  apply assumption;
  apply (rule bigo_elt_subset);
  apply (rule bigo_bounded);
  apply force;
  apply (rule allI);
  apply (case_tac "0 <= x");
  apply simp;
  apply (erule real_natfloor_le);
  apply (rule order_trans);
  prefer 2;
  apply (rule abs_ge_zero);
  apply (subst natfloor_neg);
  apply simp;
  apply simp;
  apply (rule bigo_compose1);
  apply (rule psi_bigo);
  apply (unfold bigo_def);
  apply auto;
  apply (rule_tac x = 1 in exI);
  apply auto;
  apply (rule ext);
  apply (subst func_plus);
  apply (subst diff_minus [THEN sym]);
  apply (simp add: R_def);
done;

lemma R_zero [simp]: "R 0 = 0";
  apply (unfold R_def);
  apply (simp add: psi_zero);
done;

lemma error1: "(%x. ∑ n = 1..natfloor (abs x). 
    R (real n) / (real n * real (n + 1))) =o O(%x. 1)";
proof -;
  have "(%x. ∑n = 1..natfloor (abs x) + 1. Lambda n / (real n)) = 
    (%x.∑n=1..natfloor(abs x) + 1. (1 / real n) * (psi n - psi (n - 1)))";
    apply (rule ext);
    apply (rule setsum_cong2);
    apply (subst psi_diff2);
    apply force;
    apply simp;
    done;
  also have "... = (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n) + 
      (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n * 
        (R(real n) - R(real (n - 1))))";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst R_alt_def3)+;
    apply (subst real_of_nat_diff);
    apply force;
    apply (simp add: ring_eq_simps);
    done;
  also have "(%x. ∑ n = 1..natfloor (abs x) + 1.
       1 / real n * (R (real n) - R (real (n - 1))))
     = (%x. R (real (natfloor (abs x) + 1)) / real (natfloor (abs x) + 1)) +
       (%x. (∑ n = 1..natfloor (abs x).
          R (real n) * (1 / real n - 1 / real (n + 1))))";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst another_partial_sum);
    apply simp;
    done;
  also have "(%x. ∑ n = 1..natfloor (abs x).
          R (real n) * (1 / real n - 1 / real (n + 1))) = 
       (%x. ∑ n = 1..natfloor (abs x).
          R (real n) / ((real n) * (real (n + 1))))";
    apply (rule ext);
    apply (rule setsum_cong2);
    apply (simp add: right_diff_distrib);
    apply (subst diff_frac_eq);
    apply (auto simp add: ring_eq_simps);
    done;
  also have "
    (%x. R (real (natfloor (abs x) + 1)) / real (natfloor (abs x) + 1)) =
    (%x. 1 / (real (natfloor (abs x) + 1))) * 
      (%x. R(real(natfloor(abs x) + 1)))";
    by (simp add: func_times);
  finally have "(%x. ∑ n = 1..natfloor (abs x).
        R (real n) / (real n * real (n + 1))) = 
    (%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n) +
    - (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n) + 
    - ((%x. 1 / (real (natfloor (abs x) + 1))) * 
        (%x. R(real(natfloor(abs x) + 1))))";
    by (simp add: compare_rls);
  also have "... =o 
    ((%x. ln(abs x + 1)) +o O(%x. 1)) +
    (- 1) *o ((%x. ln(abs x + 1)) +o O(%x. 1)) + 
    (- 1) *o (O(%x. 1 / (abs x + 1)) * (O(%x. abs x + 1) + O(%x. abs x + 1)))";
    apply (rule set_plus_intro);
    apply (rule set_plus_intro);
    apply (rule Mertens_theorem_real2);
    apply (rule set_neg_intro2);
    apply (rule bigo_add_commute_imp);
    apply (rule ln_sum_real2);
    apply (rule set_neg_intro2);
    apply (rule set_times_intro);
    apply (rule one_over_natfloor_one_over_bigo);
    apply (unfold R_def);
    apply (subgoal_tac "(%x. psi (natfloor (real (natfloor (abs x) + 1))) -
         real (natfloor (abs x) + 1)) = (%x. psi(natfloor (abs x) + 1)) +
         - (%x. real(natfloor(abs x) + 1))");
    apply (erule ssubst);
    apply (rule set_plus_intro);
    apply (rule set_mp);
    prefer 2;
    apply (rule bigo_compose1);back;
    apply (rule psi_bigo);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply clarsimp;
    apply (rule real_natfloor_le);
    apply force;
    apply (rule bigo_minus);
    apply (rule bigo_bounded);
    apply force;
    apply clarsimp;
    apply (rule real_natfloor_le);
    apply force;
    apply (simp add: func_minus func_plus); 
    apply (rule ext);
    apply (simp add: ring_eq_simps compare_rls);
    done;
  also have "... <= O(%x. 1)"; 
    apply (simp add: set_times_plus_distribs set_plus_rearranges);
    apply (rule subset_trans);
    prefer 2;
    apply (subgoal_tac "O(%x. 1) + O(%x. 1) + O(%x. 1) <= O(%x. 1)");
    apply assumption;
    apply simp;
    apply (rule set_plus_mono2)+;
    apply simp;
    apply (simp add: func_one func_minus);
    apply (rule subset_trans);
    apply (subgoal_tac "?t <= (- 1) *o O(%x. 1)");
    apply assumption;
    apply (rule set_times_mono);
    apply (rule subset_trans);
    apply (rule bigo_mult);
    apply (simp add: func_times);
    apply (rule bigo_elt_subset);
    apply (subgoal_tac "(%x. (abs x + 1) / (abs x + 1)) = (%x. 1)");
    apply (erule ssubst);
    apply (rule bigo_refl);
    apply (rule ext);
    apply simp;
    apply arith;
    apply (simp add: func_one func_minus);
    done;
  finally show ?thesis;.;
qed;

lemma sum_lambda_n_ln_n_over_n_bigo: 
    "(%x. ∑ n = 1..natfloor (abs x) + 1.
         Lambda n * ln (real n) / real n) =o 
     (%x. ln (abs x + 1) ^ 2 / 2) +o O(%x. 1 + ln (abs x + 1))";
proof -;
  have "(%x. ∑ n = 1..natfloor (abs x) + 1.
         Lambda n * ln (real n) / real n) = 
      ((%x. (ln (abs x + 1))) * (%x. (∑ n = 1..natfloor (abs x) + 1.
           Lambda n / real n))) + 
      ((%x. - 1) * (%x. ∑ n = 1..natfloor (abs x) + 1.
           Lambda n / real n * ln((abs x + 1) / real n)))";
    apply (simp add: func_plus func_times);
    apply (rule ext);
    apply (subst setsum_const_times [THEN sym]);
    apply (subst setsum_negf' [THEN sym]);
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst ln_div);
    apply arith;
    apply force;
    apply (simp add: ring_eq_simps diff_divide_distrib);
    done;
  also have "... =o 
      ((%x. ln(abs x + 1)) *o ((%x. ln (abs x + 1)) +o O(%x. 1))) + 
      ((%x. - 1) *o 
        ((%x. ln (abs x + 1) ^ 2 / 2) +o O(%x. 1 + ln (abs x + 1))))";
    apply (rule set_plus_intro);
    apply (rule set_times_intro2);
    apply (rule Mertens_theorem_real2);
    apply (rule set_times_intro2);
    apply (rule sum_lambda_m_over_m_ln_x_over_m_bigo);
    done;
  also have "... =
      (%x. ln(abs x + 1)^2 / 2) +o ((%x. ln(abs x + 1)) *o O(%x. 1) + 
        O(%x. 1 + ln(abs x + 1)))";
    by (simp add: set_plus_rearranges plus_ac0 set_times_plus_distribs
       func_times func_plus power2_eq_square ring_eq_simps
       compare_rls);
  also have "... <= (%x. ln(abs x + 1)^2 / 2) +o O(%x. 1 + ln(abs x + 1))";
    apply (rule set_plus_mono);
    apply (subst bigo_plus_idemp [THEN sym]);back;
    apply (rule set_plus_mono2);
    apply (rule order_trans);
    apply (rule bigo_mult2);
    apply (simp add: func_times);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply auto;
    done;
  finally show ?thesis;.;
qed;

lemma error2: "  (%x. R (abs x + 1) * ln (abs x + 1) ^ 2) +
  (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
    Lambda n * ln (real n) * R ((abs x + 1) / real n))) =o
  O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  have "(%x. psi (natfloor (abs x) + 1) * ln (abs x + 1)) +
    (%x. ∑ n = 1..natfloor (abs x) + 1.
       ∑ u | u dvd n. Lambda u * Lambda (n div u))
    =o (%x. 2 * (abs x + 1) * ln (abs x + 1)) +o O(%x. abs x + 1)"
     (is "?LHS1 + ?LHS2 =o ?RHS1 +o ?RHS2");
    by (rule Selberg4);
  then have "(%x. ln (abs x + 1)) * (?LHS1 + ?LHS2) =o
      (%x. ln(abs x + 1)) *o (?RHS1 +o ?RHS2)";
    by (rule set_times_intro2);
  then have "(%x. ln (abs x + 1)) * ?LHS1 + 
     (%x. ln(abs x + 1)) * ?LHS2 =o 
     (%x. ln (abs x + 1)) * ?RHS1 +o 
     (%x. ln(abs x + 1)) *o ?RHS2";
    by (simp add: ring_distrib set_times_plus_distribs);
  also have "... <= (%x. ln (abs x + 1)) * ?RHS1 +o 
     O(%x. ln(abs x + 1) * (abs x + 1))";
    apply (rule set_plus_mono);
    apply (rule subset_trans);
    apply (rule bigo_mult2);
    apply (simp add: func_times);
    done;
  also have "... <= (%x. ln (abs x + 1)) * ?RHS1 +o 
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (rule set_plus_mono);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply (rule allI);
    apply (rule nonneg_times_nonneg);
    apply force;
    apply arith;
    apply (rule allI);
    apply (simp add: ring_eq_simps compare_rls);
    apply arith;
    done;
  also have "(%x. ln (abs x + 1)) * ?LHS1 = (%x. psi(natfloor(abs x) + 1) *
      (ln (abs x + 1))^2)";
    by (simp add: func_times mult_ac power2_eq_square);
  also have "(%x. ln (abs x + 1)) * ?LHS2 = (%x. ln(abs x + 1) * 
       (∑ n = 1..natfloor (abs x) + 1.
       ∑ u | u dvd n. Lambda u * Lambda (n div u)))";
    by (simp add: func_times);
  also have "(%x. ln (abs x + 1)) * ?RHS1 = (%x. 2 * (abs x + 1) *
      ln(abs x + 1)^2)"; 
    by (simp add: func_times mult_ac power2_eq_square);
  finally have a: "(%x. psi (natfloor (abs x) + 1) * ln (abs x + 1) ^ 2) +
      (%x. ln (abs x + 1) *
         (∑ n = 1..natfloor (abs x) + 1.
          ∑ u | u dvd n. Lambda u * Lambda (n div u))) =o
      (%x. 2 * (abs x + 1) * ln (abs x + 1) ^ 2) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";.;
  note Selberg6a;
  then have "(%x. 2) * (%x. ln (abs x + 1) / 2 *
         (∑ n = 1..natfloor (abs x) + 1.
          ∑ u | u dvd n. Lambda u * Lambda (n div u))) =o
      (%x. 2) *o ((%x. ∑ m = 1..natfloor (abs x) + 1.
         ∑ n = 1..(natfloor (abs x) + 1) div m.
         Lambda m * Lambda n * ln (real n)) +o 
      O(%x. (abs x + 1) * (1 + ln (abs x + 1))))"
       (is "?LHS3 =o ?RHS3");
    apply (intro set_times_intro2);
    apply (erule bigo_add_commute_imp);
    done;
  also have "?LHS3 = (%x. ln (abs x + 1) *
         (∑ n = 1..natfloor (abs x) + 1.
          ∑ u | u dvd n. Lambda u * Lambda (n div u)))";
    by (simp add: func_times);
  also have "?RHS3 =  (%x. 2 * (∑ m = 1..natfloor (abs x) + 1.
         ∑ n = 1..(natfloor (abs x) + 1) div m.
         Lambda m * Lambda n * ln (real n))) +o 
      (%x. 2) *o O(%x. (abs x + 1) * (1 + ln (abs x + 1)))"
        (is "?RHS3 = ?RHS4 +o ?RHS5");
    by (simp add: set_times_plus_distribs func_times);
  also have "... <= ?RHS4 +o O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (rule set_plus_mono);
    apply (rule bigo_const_mult6);
    done;
  finally; have b: "(%x. ln (abs x + 1) *
        (∑ n = 1..natfloor (abs x) + 1.
        ∑ u | u dvd n. Lambda u * Lambda (n div u))) =o 
      (%x. 2 *
        (∑ m = 1..natfloor (abs x) + 1.
        ∑ n = 1..(natfloor (abs x) + 1) div m.
        Lambda m * Lambda n * ln (real n))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";.;
  have "(%x. psi (natfloor (abs x) + 1) * ln (abs x + 1) ^ 2) +
      (%x. 2 *
         (∑ m = 1..natfloor (abs x) + 1.
         ∑ n = 1..(natfloor (abs x) + 1) div m.
         Lambda m * Lambda n * ln (real n))) =o 
      (%x. 2 * (abs x + 1) * ln (abs x + 1) ^ 2) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    by (rule aux [OF a, OF b]);
  also have "(%x. 2 * (∑ m = 1..natfloor (abs x) + 1.
         ∑ n = 1..(natfloor (abs x) + 1) div m.
         Lambda m * Lambda n * ln (real n))) =
      (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
         Lambda n * ln (real n) * psi((natfloor (abs x) + 1) div n)))"; 
    apply (rule ext);
    apply (rule arg_cong);back;
    apply (subst general_inversion_nat2_cor1_modified);
    apply force;
    apply (rule setsum_cong2);
    apply (subst psi_def_alt);
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    done;
  also have "... = 
      (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
         Lambda n * ln (real n) * psi(natfloor ((abs x + 1) / real n))))"; 
    apply (rule ext);
    apply (rule arg_cong);back;
    apply (rule setsum_cong2);
    apply (subst natfloor_div_nat); 
    apply simp;
    apply force;
    apply (subst natfloor_add [THEN sym]);
    apply simp;
    apply simp;
    done;
  also have "... = (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
      Lambda n * ln (real n) * R((abs x + 1) / real n))) + 
    (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
      Lambda n * ln (real n) * ((abs x + 1) / real n)))";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst right_distrib [THEN sym]);
    apply (rule arg_cong);back;
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst R_alt_def);
    apply (simp add: ring_eq_simps);
    done;
  also have "(%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
      Lambda n * ln (real n) * ((abs x + 1) / real n))) = 
    (%x. 2 * (abs x + 1)) * 
      (%x. ∑ n = 1..natfloor (abs x) + 1.
           Lambda n * ln (real n) / real n)";
    apply (subst func_times);
    apply (rule ext);
    apply (subst mult_assoc);
    apply (rule arg_cong);back;
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply (simp add: ring_eq_simps);
    done;
  also have "(%x. psi (natfloor (abs x) + 1) * ln (abs x + 1) ^ 2) = 
      (%x. R(abs x + 1) * ln (abs x + 1) ^ 2) + 
      (%x. (abs x + 1) * ln (abs x + 1) ^ 2)";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst natfloor_add [THEN sym]);
    apply simp;
    apply simp;
    apply (subst R_alt_def);
    apply (simp add: ring_eq_simps);
    done;
  finally have "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) +
      (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +
      ((%x. 2 *
        (∑ n = 1..natfloor (abs x) + 1.
          Lambda n * ln (real n) * R ((abs x + 1) / real n))) +
       (%x. 2 * (abs x + 1)) *
         (%x. ∑ n = 1..natfloor (abs x) + 1.
           Lambda n * ln (real n) / real n)) =o
      (%x. 2 * (abs x + 1) * ln (abs x + 1) ^ 2) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))"
        (is "?LHS =o ?RHS");.;
  then have "- (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +
       - (%x. 2 * (abs x + 1)) *
         (%x. ∑ n = 1..natfloor (abs x) + 1.
           Lambda n * ln (real n) / real n) + ?LHS =o
       (- (%x. (abs x + 1) * ln (abs x + 1) ^ 2) + 
         (- (%x. 2 * (abs x + 1)) *
            (%x. ∑ n = 1..natfloor (abs x) + 1.
            Lambda n * ln (real n) / real n))) +o ?RHS"
          (is "?LHS2 =o ?RHS2");
    by (rule set_plus_intro2);
  also have "?LHS2 = (%x. R (abs x + 1) * ln (abs x + 1) ^ 2) +
      (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
          Lambda n * ln (real n) * R ((abs x + 1) / real n)))";
    by (simp add: func_plus func_minus func_times ring_eq_simps
      compare_rls);
  also have "?RHS2 = (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +o
      ((- (%x. 2 * (abs x + 1)) *
            (%x. ∑ n = 1..natfloor (abs x) + 1.
            Lambda n * ln (real n) / real n)) +o 
       O(%x. (abs x + 1) * (1 + ln (abs x + 1))))";
    by (simp add: set_plus_rearranges func_minus func_plus
      func_times ring_eq_simps compare_rls);
  finally have "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) +
      (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
        Lambda n * ln (real n) * R ((abs x + 1) / real n))) =o
      (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +o
        ((- (%x. 2 * (abs x + 1)) *
          (%x. ∑ n = 1..natfloor (abs x) + 1.
             Lambda n * ln (real n) / real n)) +o
       O(%x. (abs x + 1) * (1 + ln (abs x + 1))))";.;
  also have "... <= (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +o
      (((- (%x. 2 * (abs x + 1))) *o
         ((%x. ln(abs x + 1)^2 / 2) +o O(%x. 1 + ln (abs x + 1)))) + 
       O(%x. (abs x + 1) * (1 + ln (abs x + 1))))";
    apply (rule set_plus_mono);
    apply (rule set_plus_mono5);
    apply (rule set_times_intro2);
    apply (rule sum_lambda_n_ln_n_over_n_bigo);
    apply simp;
    done;
  also have "... = O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (simp only: set_plus_rearranges set_times_plus_distribs 
      func_minus func_plus func_times); 
    apply (subgoal_tac "(%x. (abs x + 1) * ln (abs x + 1) ^ 2 +
         - (2 * (abs x + 1)) * (ln (abs x + 1) ^ 2 / 2)) = 0");
    apply (erule ssubst);
    apply simp;
    apply (subgoal_tac "(%x. - (2 * abs x) + -2) *o O(%x. 1 + ln (abs x + 1))
      = O(%x. (abs x + 1) * (1 + ln (abs x + 1)))");
    apply (erule ssubst);
    apply simp;
    apply (subgoal_tac "(%x. - (2 * abs x) + -2) *o O(%x. 1 + ln (abs x + 1))
      = (%x. (abs x + 1)) *o ((%x. -2) *o 
        O(%x. (1 + ln (abs x + 1))))");
    apply (erule ssubst);
    apply (subst bigo_const_mult5);
    apply simp;
    apply (subst bigo_mult6 [THEN sym]);
    apply (rule allI);
    apply arith;
    apply (simp add: func_times);
    apply (simp only: set_times_rearranges func_times ring_eq_simps);
    apply (subgoal_tac "(%x. -2 + - (abs x * 2)) = (%x. 1 * -2 + abs x * -2)");
    apply (erule ssubst);
    apply (rule refl);
    apply (rule ext);
    apply simp;
    apply (simp add: func_zero);
    apply (rule ext);
    apply (simp add: ring_eq_simps add_divide_distrib);
    done;
  finally show ?thesis;.;
qed;

lemma error3: "(%x. abs(R (abs x + 1)) * ln (abs x + 1) ^ 2) <o
  (%x. 2 * (∑ n = 1..natfloor (abs x) + 1. 
    Lambda n * ln (real n) * abs(R ((abs x + 1) / real n)))) =o
  O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  note error2;
  then have "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) =o 
      - (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
        Lambda n * ln (real n) * R ((abs x + 1) / real n))) +o 
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))"
      (is "?LHS =o ?RHS1 +o ?RHS2");
    by (intro set_minus_imp_plus, simp);
  then have "(%x. abs(?LHS x)) =o (%x. abs(?RHS1 x)) +o ?RHS2";
    by (rule bigo_abs4);
  also have "(%x. abs(?LHS x)) = 
      (%x. abs(R (abs x + 1)) * ln (abs x + 1) ^ 2)";
    apply (rule ext);
    apply (subst abs_times_pos);
    apply force;
    apply (rule refl);
    done;
  also have "(%x. abs(?RHS1 x)) = (%x. 2 * 
      abs (∑ n = 1..natfloor (abs x) + 1.
        Lambda n * ln (real n) * R ((abs x + 1) / real n)))"
    apply (rule ext);
    apply (simp add: func_minus);
    done;
  finally have a: "(%x. abs (R (abs x + 1)) * ln (abs x + 1) ^ 2) =o
      (%x. 2 *
         abs (∑ n = 1..natfloor (abs x) + 1.
              Lambda n * ln (real n) * R ((abs x + 1) / real n))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";.;
  show "(%x. abs (R (abs x + 1)) * ln (abs x + 1) ^ 2) <o
      (%x. 2 *
         (∑ n = 1..natfloor (abs x) + 1.
              Lambda n * ln (real n) * abs(R ((abs x + 1) / real n)))) =o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (rule bigo_lesso3 [OF a]);
    apply (rule allI);
    apply (rule nonneg_times_nonneg);
    apply force;
    apply (rule setsum_nonneg);
    apply force;
    apply clarsimp;
    apply (rule nonneg_times_nonneg);
    apply (rule nonneg_times_nonneg);
    apply (rule Lambda_ge_zero);
    apply force;
    apply force;
    apply (rule allI);
    apply (rule mult_left_mono);
    apply (rule order_trans);
    apply (rule abs_setsum);
    apply (rule setsum_le_cong);
    apply simp;
    apply (rule mult_right_mono);
    apply (subst abs_nonneg);
    apply force;
    apply (subst abs_nonneg);
    apply (rule Lambda_ge_zero);
    apply simp;
    apply auto;
    done;
qed;

lemma error4_aux: "(%x. ∑ n = 1..natfloor (abs x) + 1. 
    Lambda n / real n * 
      (∑ m = 1..(natfloor (abs x) + 1) div n. Lambda m / real m)) =o
    (%x. ln (abs x + 1)^2 / 2) +o O(%x. 1 + ln (abs x + 1))";
proof -;
thm bigo_setsum6 [OF Mertens_theorem_real2];
  have "(%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n * 
        (∑ m = 1..(natfloor (abs x) + 1) div n. Lambda m / real m)) =
    (%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n * 
        (∑m=1..natfloor(abs ((abs x + 1) / (real n) - 1)) + 1.
          Lambda m / real m))";
    apply (rule ext);
    apply (rule setsum_cong2);
    apply (rule arg_cong);back;
    apply (subst Selberg.aux);
    apply (rule div_ge_1);
    apply force;
    apply (subgoal_tac "real (natfloor (abs x)) <= abs x"); 
    apply force;
    apply (rule real_natfloor_le);
    apply force;
    apply (subst natfloor_div_nat);
    apply force;
    apply force;
    apply (subst natfloor_add [THEN sym]);
    apply force;
    apply simp;
    done;
  also have "... =o
       (%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n *
           ln (abs ((abs x + 1) / real n - 1) + 1)) +o 
      O(%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n * 1)";
    apply (rule bigo_setsum6 [OF Mertens_theorem_real2]);
    apply (rule allI)+;
    apply (case_tac "n = 0");
    apply simp;
    apply (rule real_ge_zero_div_gt_zero);
    apply (rule Lambda_ge_zero);
    apply force;
    apply force;
    done;
  also have "(%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n *
           ln (abs ((abs x + 1) / real n - 1) + 1)) = 
      (%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n *
           ln ((abs x + 1) / real n))";
    apply (rule ext);
    apply (rule setsum_cong2);
    apply (subst Selberg.aux2);
    apply (rule div_ge_1);
    apply force;
    apply (subgoal_tac "real(natfloor(abs x)) <= abs x");
    apply force;
    apply (rule real_natfloor_le);
    apply simp;
    apply (rule refl);
    done;
  also; have "(%x. ∑ n = 1..natfloor (abs x) + 1.
         Lambda n / real n * ln ((abs x + 1) / real n)) +o
      O(%x. ∑ n = 1..natfloor (abs x) + 1. Lambda n / real n * 1) <=
    (%x. ln (abs x + 1) ^ 2 / 2) +o 
      O(%x. 1 + ln (abs x + 1)) + O(%x. 1 + ln (abs x + 1))";
    apply (rule set_plus_mono5);
    apply (rule sum_lambda_m_over_m_ln_x_over_m_bigo);
    apply (rule bigo_elt_subset);
    apply (rule subsetD);
    prefer 2;
    apply simp;
    apply (rule Mertens_theorem_real2);
    apply (rule bigo_plus_absorb2);
    apply (rule bigo_bounded);
    apply force;
    apply force;
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply force;
    done;
  also have "... = (%x. ln (abs x + 1)^2 / 2) +o O(%x. 1 + ln(abs x + 1))";
    by (simp add: set_plus_rearranges);
  finally show ?thesis;.;
qed;

lemma error4: "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) =o
      (%x. 2 * (∑ c = 1..natfloor (abs x) + 1. ∑ v | v dvd c.
        Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  note Selberg8a;
  also have "(%x. psi (natfloor (abs x) + 1) * ln (abs x + 1) ^ 2) = 
    (%x. R(abs x + 1) * ln(abs x + 1)^2) + 
      (%x. (abs x + 1) * ln (abs x + 1)^2)";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst R_def);
    apply (simp add: ring_eq_simps);
    apply (subst add_commute);back;back;
    apply (subst natfloor_add [THEN sym]);
    apply simp;
    apply (simp add: add_ac);
    done;
  also; have "(%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c. Lambda v * Lambda (c div v) *
             psi ((natfloor (abs x) + 1) div c))) = 
    (%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c. Lambda v * Lambda (c div v) *
             R ((abs x + 1) / real c))) + 
      (%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c. Lambda v * Lambda (c div v) *
             (abs x + 1) / real c))"; 
    apply (simp add: func_plus);
    apply (rule ext);
    apply (subst right_distrib [THEN sym]); 
    apply (rule arg_cong);back;
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst R_def);
    apply (subst natfloor_div_nat);
    apply force;
    apply force;
    apply (simp add: ring_eq_simps);
    apply (subst add_commute);back;
    apply (subst natfloor_add [THEN sym]);
    apply force;
    apply (simp add: add_commute);
    done;
  also have "(%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c. Lambda v * Lambda (c div v) *
             (abs x + 1) / real c)) =
      (%x. 2) * (%x. ∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
           Lambda v * Lambda (c div v) * (abs x + 1) / real ((c div v) * v))";
    apply (subst func_times);
    apply (rule ext);
    apply (rule arg_cong);back;
    apply (rule setsum_cong2)+;
    apply (subst mult_commute);
    apply (subst nat_dvd_mult_div);
    apply clarsimp;
    apply (rule dvd_pos_pos);
    prefer 2;
    apply assumption;
    apply force;
    apply force;
    apply (rule refl);
    done;
  also have "(%x. ∑ c = 1..natfloor (abs x) + 1. ∑ v | v dvd c.
      Lambda v * Lambda (c div v) * (abs x + 1) / real (c div v * v)) = 
    (%x. abs x + 1) * (%x. ∑ n = 1..natfloor (abs x) + 1. 
          Lambda n / (real n) * (∑ m = 1..(natfloor (abs x) + 1) div n.
             Lambda m / (real m)))";
    apply (subst func_times);
    apply (rule ext);
    apply (subst setsum_const_times [THEN sym]);
    apply (subst general_inversion_nat2_modified [THEN sym]);
    apply force;
    apply (rule setsum_cong2);
    apply (subst setsum_const_times [THEN sym])+;
    apply (rule setsum_cong2);
    apply (simp add: mult_ac);
    done;
  also; have "((%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
              Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +
       (%x. 2) * ((%x. abs x + 1) * (%x. ∑ n = 1..natfloor (abs x) + 1.
          Lambda n / real n *
             (∑ m = 1..(natfloor (abs x) + 1) div n.
               Lambda m / real m)))) +o
        O(%x. (abs x + 1) * (1 + ln (abs x + 1))) <=
    ((%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
              Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +o
       (%x. 2) *o ((%x. abs x + 1) *o 
         ((%x. ln (abs x + 1)^2 / 2) +o O(%x. 1 + ln (abs x + 1))) )) +
        O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (rule set_plus_mono3);
    apply (rule set_plus_intro2);
    apply (rule set_times_intro2);
    apply (rule set_times_intro2);
    apply (rule error4_aux);
    done;
  also have "... <=  ((%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
              Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +
       (%x. (abs x + 1) * ln (abs x + 1)^2)) +o 
        O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (simp add: set_times_plus_distribs set_plus_rearranges
      plus_ac0 func_times func_plus);
    apply (rule set_plus_mono);
    apply (rule bigo_plus_subset4);
    apply simp;
    apply (rule subset_trans);
    apply (rule set_times_mono);
    apply (rule bigo_mult2);
    apply (simp add: func_times);
    done;
  finally; have "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) +
      (%x. (abs x + 1) * ln (abs x + 1) ^ 2) =o
    ((%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
           ∑ v | v dvd c.
              Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +
     (%x. (abs x + 1) * ln (abs x + 1) ^ 2)) +o
    O(%x. (abs x + 1) * (1 + ln (abs x + 1)))" 
      (is "?LHS =o ?RHS"); .;
  then have "- (%x. (abs x + 1) * ln (abs x + 1) ^ 2) + ?LHS =o 
      - (%x. (abs x + 1) * ln (abs x + 1) ^ 2) +o ?RHS";
    by (rule set_plus_intro2);
  thus ?thesis
    by (simp add: set_plus_rearranges func_plus func_minus plus_ac0);
qed;

lemma error5: "(%x. abs(R (abs x + 1)) * ln (abs x + 1) ^ 2) <o
  (%x. 2 * (∑ c = 1..natfloor (abs x) + 1. 
     ∑ v | v dvd c.
       Lambda v * Lambda (c div v) * abs(R ((abs x + 1) / real c)))) =o
  O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  have "(%x. R (abs x + 1) * ln (abs x + 1) ^ 2) =o 
      (%x. 2 * (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
          Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +o
    O(%x. (abs x + 1) * (1 + ln (abs x + 1)))"
      (is "?LHS =o ?RHS1 +o ?RHS2");
    by (rule error4);
  then have "(%x. abs(?LHS x)) =o (%x. abs(?RHS1 x)) +o ?RHS2";
    by (rule bigo_abs4);
  also have "(%x. abs(?LHS x)) = 
      (%x. abs(R (abs x + 1)) * ln (abs x + 1) ^ 2)";
    apply (rule ext);
    apply (subst abs_times_pos);
    apply force;
    apply (rule refl);
    done;
  also have "(%x. abs(?RHS1 x)) = (%x. 2 *
      abs (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
          Lambda v * Lambda (c div v) * R ((abs x + 1) / real c)))";
    apply (rule ext);
    apply (simp add: func_minus);
    done;
  finally have a: "  (%x. abs (R (abs x + 1)) * ln (abs x + 1) ^ 2) =o
      (%x. 2 * abs (∑ c = 1..natfloor (abs x) + 1.
        ∑ v | v dvd c.
          Lambda v * Lambda (c div v) * R ((abs x + 1) / real c))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";.;
  show ?thesis;
    apply (rule bigo_lesso3 [OF a]);
    apply (rule allI);
    apply (rule nonneg_times_nonneg);
    apply force;
    apply (rule setsum_nonneg);
    apply force;
    apply clarsimp;
    apply (rule setsum_nonneg);
    apply (rule finite_nat_dvd_set);
    apply force;
    apply clarsimp;
    apply (rule nonneg_times_nonneg);
    apply (rule nonneg_times_nonneg);
    apply (rule Lambda_ge_zero);
    apply (rule Lambda_ge_zero);
    apply force;
    apply (rule allI);
    apply (rule mult_left_mono);
    apply (rule order_trans);
    apply (rule abs_setsum);
    apply (rule setsum_le_cong);
    apply simp;
    apply (rule order_trans);
    apply (rule abs_setsum);
    apply (rule setsum_le_cong);
    apply simp;
    apply (subst abs_nonneg);back;back;back;back;back;back;
    apply (rule Lambda_ge_zero);
    apply (subst abs_nonneg);back;back;back;back;back;back;
    apply (rule Lambda_ge_zero);
    apply (rule mult_right_mono);
    apply auto;
    done;
qed;

(* Generalize to ordered rings! *)

lemma max_zero_add: "max (a + b) 0 <= max (a::real) 0 + max b 0"; 
  by (simp split: split_max);

lemma max_zero_times: "(0::real) <= c ==> max (c * a) 0 = 
    c * (max a 0)";  
  by (auto simp add: max_def mult_le_0_iff); 

lemma aux2: "(f + f) <o ((%x. 2 * g x) + (%x. 2 * h x)) =o O(k::'a=>real) 
   ==> f <o (g + h) =o O(k)";
  apply (simp add: func_plus);
  apply (unfold lesso_def);
  apply (subgoal_tac "(%x. max (2 * f x - (2 * g x + 2 * h x)) 0) = 
    (%x. 2) * (%x. max (f x - (g x + h x)) 0)");
  apply simp;
  apply (rule bigo_useful_const_mult);
  apply (auto simp add: func_times);
  apply (rule ext);
  apply (subgoal_tac "2 * f x - (2 * g x + 2 * h x) = 
      2 * (f x - (g x + h x))");
  apply (erule ssubst);
  apply (rule max_zero_times);
  apply force;
  apply simp;
done;

lemma error_cor1: "(%x. abs (R (abs x + 1)) * ln (abs x + 1) ^ 2) <o
    ((%x. ∑ n = 1..natfloor (abs x) + 1.
      Lambda n * ln (real n) * abs (R ((abs x + 1) / real n))) +
    (%x. ∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c.
         Lambda v * Lambda (c div v) * abs (R ((abs x + 1) / real c)))) =o
    O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
  by (rule aux2 [OF lesso_add [OF error3, OF error5]]);

constdefs
  rho :: "nat => real"
  "rho x == ∑n = 1..x. 
     Lambda n * ln (real n) + 
       (∑ u | u dvd n. Lambda u * Lambda (n div u))";

lemma aux2: "1 <= (n::nat) ==> (∑i=1..n. f i) - 
    (∑i=1..(n - 1). f i) = ((f n)::'a::ordered_ring)";
  apply (subgoal_tac "{1..n} = {1..(n - 1) + 1}");
  apply (erule ssubst);
  apply (subst setsum_range_plus_one_nat');
  apply auto;
done;

lemma rho_zero: "rho 0 = 0";
  by (simp add: rho_def);

lemma aux3: "1 <= n ==> rho n - rho (n - 1) = 
    Lambda n * ln (real n) + 
       (∑ u | u dvd n. Lambda u * Lambda (n div u))";
  apply (unfold rho_def);
  apply (erule aux2);
done;

lemma rho_bigo: "rho =o (%x. 2 * real x * ln (real x)) +o O(%x. real x)";
proof -
  have "(%x. rho(x + 1)) = (%x. (∑ n = 1..natfloor (abs (real x)) + 1.
          Lambda n * ln (real n) +
          (∑ u | u dvd n. Lambda u * Lambda (n div u))))";
    apply (rule ext);
    apply (unfold rho_def);
    apply (subgoal_tac "x + 1 = natfloor(abs (real x)) + 1");
    apply (erule ssubst);
    apply (rule refl);
    apply simp;
    done;
  also have "... =o (%x. 2 * (abs (real x) + 1) * ln (abs (real x) + 1)) +o 
       O(%x. abs (real x) + 1)";
    by (rule bigo_compose2 [OF Selberg2]);
  also have "(%x::nat. 2 * (abs (real x) + 1) * ln (abs (real x) + 1)) = 
      (%x. 2 * (real (x + 1)) * ln (real (x + 1)))";
    apply (rule ext);
    apply (subst abs_nonneg);
    apply force;
    apply simp;
    done;
  also have "(%x::nat. abs (real x) + 1) = (%x. real(x + 1))";
    apply (rule ext);
    apply (subst abs_nonneg);
    apply simp_all;
    done;
  finally have "(%x. rho (x + 1)) =o 
      (%x. 2 * real (x + 1) * ln (real (x + 1))) +o O(%x. real (x + 1))";.;
  thus ?thesis; 
    apply (rule bigo_fix3);
    apply (simp add: rho_zero);
    done;
qed;

lemma R_bigo: "(%x. R(abs x)) =o O(%x. abs x)";
  apply (subgoal_tac "(%x. R(abs x)) = (%x. psi(natfloor(abs x))) + 
      - (%x. abs x)");  
  apply (erule ssubst);
  apply (rule subsetD);
  apply (subgoal_tac "O(%x. real(natfloor (abs x))) + O(%x. abs x) <= 
      O(%x. abs x)");
  apply assumption;
  apply (rule bigo_plus_subset4);
  apply (rule bigo_elt_subset);
  apply (rule bigo_bounded);
  apply force;
  apply (rule allI);
  apply (rule real_natfloor_le);
  apply force;
  apply simp;
  apply (rule set_plus_intro);
  apply (rule bigo_compose1 [OF psi_bigo]);
  apply (rule bigo_minus);
  apply (rule bigo_refl);
  apply (rule ext);
  apply (unfold R_def);
  apply (simp add: func_plus func_minus);
done;

lemma error6_aux: "(%x. abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1))))
    =o O(%x. 1)";
  apply (rule subsetD);
  prefer 2;
  apply (rule bigo_abs);
  apply (rule bigo_elt_subset);
  apply (subgoal_tac 
    "(%x. R ((abs x + 1) / (real (natfloor (abs x)) + 1))) = 
    (%x. R (abs((abs x + 1) / (real (natfloor (abs x)) + 1))))");
  apply (erule ssubst);
  apply (rule subsetD);
  prefer 2;
  apply (rule bigo_compose1 [OF R_bigo]);
  apply (rule bigo_elt_subset);
  apply (rule subsetD);
  prefer 2;
  apply (rule bigo_abs);
  apply (rule bigo_elt_subset);
  apply (rule_tac c = 2 in bigo_bounded_alt);
  apply (rule allI);
  apply (rule real_ge_zero_div_gt_zero);
  apply arith;
  apply force;
  apply (rule allI);
  apply simp;
  apply (rule real_le_mult_imp_div_pos_le);
  apply force;
  apply simp;
  apply (subst mult_commute);
  apply (subgoal_tac "abs x <= real(natfloor(abs x)) + 1");
  apply force;
  apply (rule real_natfloor_plus_one_ge);
  apply (rule ext);
  apply (subst abs_nonneg);
  apply (rule real_ge_zero_div_gt_zero);
  apply arith;
  apply force;
  apply (rule refl);
done;

lemma error6_aux2: "(%n::nat. real (n + 1) * ln (real (n + 1)) - 
    (real n) * ln (real n)) =o (%n. ln (real (n + 1))) +o O(%n. 1)";
  apply (rule set_minus_imp_plus);
  apply (subst func_diff);
  apply (rule bigo_bounded);
  apply (rule allI);
  apply (case_tac "x = 0");
  apply simp;
  apply (simp add: left_distrib);
  apply (rule allI);
  apply (case_tac "x = 0");
  apply simp;
  apply (simp add: left_distrib);
  apply (subgoal_tac "real x * (ln(real x + 1) - ln(real x)) <= 1");
  apply (simp add: diff_minus right_distrib);
  apply (subst ln_div [THEN sym]);
  apply force;
  apply force;
  apply (subst mult_commute);
  apply (subst pos_le_divide_eq [THEN sym]);
  apply force;
  apply (subst add_divide_distrib);
  apply simp;
done;

lemma error6: "(%x. ∑ n = 1..natfloor (abs x) + 1.
       Lambda n * ln (real n) * abs (R ((abs x + 1) / real n))) +
    (%x. ∑ c = 1..natfloor (abs x) + 1. ∑ v | v dvd c.
       Lambda v * Lambda (c div v) * abs (R ((abs x + 1) / real c))) =o
    (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
       abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))) +o
    O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  have "((%x. ∑ n = 1..natfloor (abs x) + 1.
      Lambda n * ln (real n) * abs (R ((abs x + 1) / real n))) +
    (%x. ∑ c = 1..natfloor (abs x) + 1.
      ∑ v | v dvd c.
         Lambda v * Lambda (c div v) * abs (R ((abs x + 1) / real c)))) =
    (%x. ∑n = 1..natfloor (abs x) + 1.
      abs(R ((abs x + 1) / real n)) * (rho n - rho (n - 1)))";
    apply (subst func_plus);
    apply (rule ext);
    apply (subst setsum_addf [THEN sym]);
    apply (rule setsum_cong2);
    apply (subst aux3);
    apply force;
    apply (simp add: ring_eq_simps);
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    done;
  also have "... = 
    (%x. abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1))) *
           rho (natfloor (abs x) + 1) +
       (∑ n = 1..natfloor (abs x). rho n *
         (abs (R ((abs x + 1) / real n)) - 
           abs (R ((abs x + 1) / (real n + 1))))))";
    apply (rule ext);
    apply (subst another_partial_sum);
    apply (simp add: rho_zero);
    done;
  also have "... =  
      (%x. abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1)))) *
           (%x. rho (natfloor (abs x) + 1)) +
      (%x. ∑ n = 1..natfloor (abs x).
         (abs (R ((abs x + 1) / real n)) - 
           abs (R ((abs x + 1) / (real n + 1)))) * rho n)";
    apply (subst func_times); 
    apply (subst func_plus);
    apply (rule ext);
    apply (simp add: mult_ac);
    done;
  also have "... =o 
    ((%x. abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1)))) *o
      ((%x. 2 * real (natfloor (abs x) + 1) * 
        ln (real (natfloor (abs x) + 1))) +o 
          O(%x. real (natfloor(abs x) + 1)))) +
    ((%x. ∑ n = 1..natfloor (abs x).
         (abs (R ((abs x + 1) / real n)) - 
           abs (R ((abs x + 1) / (real n + 1)))) * 
             (2 * (real n) * ln(real n))) +o
        O(%x. ∑ n = 1..natfloor (abs x).
         abs((abs (R ((abs x + 1) / real n)) - 
           abs (R ((abs x + 1) / (real n + 1)))) * real n)))"
      (is "?LHS =o ?term1 + (?term2 +o ?term3)");
    apply (rule set_plus_intro);
    apply (rule set_times_intro2);
    apply (rule bigo_compose2 [OF rho_bigo]);
    apply (rule bigo_setsum4 [OF rho_bigo]);
    done;
  also have "... <= (O(%x. 1) * O(%x. (abs x + 1) * (1 + ln (abs x + 1)))) + 
       (?term2 +o ?term3)";
    apply (rule set_plus_mono2);
    apply (rule set_times_mono5);
    apply (rule error6_aux);
    apply (rule bigo_plus_absorb2);
    apply (rule_tac c = 2 in bigo_bounded_alt);
    apply (rule allI);
    apply (rule nonneg_times_nonneg);
    apply force;
    apply (rule ln_ge_zero);
    apply force;
    apply (rule allI);
    apply (subst mult_assoc);
    apply (rule mult_left_mono);
    apply (rule mult_mono);
    apply simp;
    apply (rule real_natfloor_le);
    apply force;
    apply (subgoal_tac 
      "ln (real (natfloor (abs x) + 1)) <= ln (abs x + 1)");
    apply arith;
    apply (subst ln_le_cancel_iff);
    apply force;
    apply arith;
    apply simp;
    apply (rule real_natfloor_le);
    apply force;
    apply arith;
    apply force;
    apply force;
    apply (rule subset_trans);
    apply (subgoal_tac "?t <= O(%x. abs x + 1)");
    apply assumption;
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply clarsimp;
    apply (rule real_natfloor_le);
    apply force;
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply (rule allI);
    apply arith;
    apply (rule allI);
    apply (subst right_distrib);
    apply simp;
    apply (rule nonneg_times_nonneg);
    apply arith;
    apply force;
    apply (rule order_refl);
    done;
  also have "... <= O(%x. (abs x + 1) * (1 + ln (abs x + 1))) + 
       (?term2 +o ?term3)";
    apply (rule set_plus_mono2);
    apply (rule subset_trans);
    apply (rule bigo_mult);
    apply (simp add: func_times);
    apply (rule order_refl);
    done;
  also have "... = ?term2 +o (?term3 + 
       O(%x. (abs x + 1) * (1 + ln (abs x + 1))))"
      (is "?temp = ?term2 +o (?term3 + ?term4)");
    by (simp only: set_plus_rearranges plus_ac0);
  also have "?term2 = (%x. 2) * (
    (- (%x. (abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1)))))) *
          (%x. ((real (natfloor (abs x)) + 1) *
           ln (real (natfloor (abs x)) + 1))) + 
    (%x. ∑n=1..natfloor (abs x) + 1. 
      abs (R ((abs x + 1) / real n)) * ((real n) * ln (real n) - 
        (real (n - 1) * ln (real (n - 1))))))"
      (is "?term2 = (%x. 2) * ?term2a");
    apply (simp only: func_minus func_plus func_times);
    apply (rule ext);
    apply (subst another_partial_sum); 
    apply simp;
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    done;
  also have "?term2a =
    (- (%x. (abs (R ((abs x + 1) / (real (natfloor (abs x)) + 1)))))) *
          (%x. ((real (natfloor (abs x)) + 1) *
           ln (real (natfloor (abs x)) + 1))) + 
    (%x. ∑n=1..natfloor (abs x) + 1. 
      abs (R ((abs x + 1) / real n)) * ((real ((n - 1) + 1)) * 
        ln (real ((n - 1)+1)) - 
          (real (n - 1) * ln (real (n - 1)))))"
      (is "?term2a = ?term2b");
    apply (simp only: func_times func_minus func_plus);
    apply (rule ext);
    apply (rule arg_cong);back;
    apply (rule setsum_cong2);
    apply (subgoal_tac "xa - 1 + 1 = xa"); 
    apply (erule ssubst);
    apply (rule refl);
    apply simp;
    done;
  also have "(%x. 2) * ?term2b +o (?term3 + ?term4) <= 
    (%x. 2) *o (O(%x. 1) * ?term4 + 
      ((%x. ∑ n = 1..natfloor (abs x) + 1. 
         abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))
       +o O(%x. ∑ n = 1..natfloor (abs x) + 1. 
         abs (R ((abs x + 1) / real n)) * 1))) + (?term3 + ?term4)";
    apply (rule set_plus_mono3);
    apply (rule set_times_intro2);
    apply (rule set_plus_intro);
    apply (rule set_times_intro);
    apply (rule bigo_minus);
    apply (rule error6_aux);
    apply (rule bigo_bounded);
    apply (rule allI);
    apply (rule nonneg_times_nonneg);
    apply force;
    apply force;
    apply (rule allI);
    apply (rule mult_mono);
    apply (force intro: real_natfloor_le);
    apply (subgoal_tac "ln (real (natfloor (abs x)) + 1) <= ln (abs x + 1)");
    apply arith;
    apply (subst ln_le_cancel_iff);
    apply force;
    apply arith;
    apply (force intro: real_natfloor_le);
    apply arith;
    apply force;
    apply (rule bigo_setsum6);
    apply (rule bigo_compose2 [OF error6_aux2]);
    apply force;
    apply force;
    done;
  also have "... <= (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
          abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1))) +      
      (O(%x. (abs x + 1) * (1 + ln (abs x + 1))) +
      (O(%x. (abs x + 1) * (1 + ln (abs x + 1))) + ?term3))";
    apply (simp only: set_times_plus_distribs func_times
      set_plus_rearranges plus_ac0);
    apply (rule set_plus_mono);
    apply (rule set_plus_mono2);
    apply (rule order_refl);
    apply (rule set_plus_mono2);
    apply (rule subset_trans);
    prefer 2;
    apply (subgoal_tac "(%x. 2) *o ?t <= ?t");
    apply assumption;
    apply (rule bigo_const_mult6);
    apply (rule set_times_mono);
    apply (rule order_trans);
    apply (rule bigo_mult);
    apply (simp add: func_times);
    apply (subst bigo_const_mult5);
    apply force;
    apply (rule set_plus_mono2);
    apply simp;
    apply (rule bigo_elt_subset);
    apply (subgoal_tac "(%x. ∑ n = 1..1 + natfloor (abs x). 
        abs (R ((1 + abs x) / real n))) = 
      (%x. ∑ n = 1..natfloor (abs x) + 1. 
        1 * abs (R (abs((abs x + 1) / real n))))");
    apply (erule ssubst);
    apply (rule subsetD);
    prefer 2;
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1. 
        1 * abs (R (abs((abs x + 1) / real n)))) =o
      O(%x. ∑ n = 1..natfloor (abs x) + 1. 
        1 * abs((abs x + 1) / real n))");
    apply assumption;
    apply (rule bigo_setsum5);back;
    apply (rule subsetD);
    prefer 2;
    apply (rule bigo_abs);
    apply (rule bigo_elt_subset);
    apply (rule R_bigo);
    apply force;
    apply force;
    apply (rule bigo_elt_subset);
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1. 
         1 * abs ((abs x + 1) / real n)) = 
       (%x. abs x + 1) * 
         (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n)");
    apply (erule ssubst);
    apply (rule subsetD);
    apply (subgoal_tac "(%x. abs x + 1) *o O(%x. 1 + ln (1 + abs x)) <= 
      O(%x. (abs x + 1) * (1 + ln (1 + abs x)))");
    apply (simp add: add_ac);
    apply (rule subset_trans);
    apply (rule bigo_mult2);
    apply (simp add: func_times);
    apply (simp add: add_ac);
    apply (rule set_times_intro2);
    apply (subgoal_tac "(%x. ∑ n = 1..1 + natfloor (abs x). 1 / real n)
       = (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n)");
    apply (erule ssubst);
    apply (rule subsetD);
    prefer 2;
    apply (rule bigo_add_commute_imp [OF ln_sum_real2]);
    apply (rule bigo_plus_absorb2);
    apply (rule bigo_bounded);
    apply force;
    apply (rule allI);
    apply (simp add: add_commute);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply force;
    apply (simp add: add_ac);
    apply (rule ext);
    apply (subst func_times);
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    apply (rule abs_nonneg);
    apply (rule real_ge_zero_div_gt_zero);
    apply arith;
    apply force;
    apply (rule ext);
    apply (simp add: add_ac);
    apply (rule setsum_cong2);
    apply (subst abs_nonneg);back;
    apply (rule real_ge_zero_div_gt_zero);
    apply arith;
    apply force;
    apply (rule refl);
    apply (rule order_refl);
    done;
  also have "... = (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
          abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))) +o
       (O(%x. (abs x + 1) * (1 + ln (abs x + 1))) + ?term3)";
    apply (simp only: set_plus_rearranges); 
    apply (subst plus_ac0.assoc [THEN sym]);
    apply (subst bigo_plus_idemp);
    apply (subst plus_ac0.assoc [THEN sym]);
    apply (subst bigo_plus_idemp);
    apply (rule refl);
    done;
  also have "... <= (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
          abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))) +o
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (rule set_plus_mono);
    apply (rule bigo_plus_subset4);
    apply (rule order_refl);
    apply (rule bigo_elt_subset);
    apply (rule bigo_lesseq3);
    prefer 2;
    apply (rule allI);
    apply (rule setsum_nonneg);
    apply force;
    apply clarify;
    apply (rule abs_ge_zero);
    prefer 2;
    proof -;
    show "ALL x. (∑ n = 1..natfloor (abs x). 
        abs ((abs (R ((abs x + 1) / real n)) -
              abs (R ((abs x + 1) / (real n + 1)))) * real n)) <= 
      (abs x + 1) * 
            (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
         (∑ n = 1..natfloor (abs x) + 1.
            psi (natfloor ((abs x + 1) / real n)))";
    proof;
      fix x;
      have "(∑ n = 1..natfloor (abs x).
          abs ((abs (R ((abs x + 1) / real n)) -
                abs (R ((abs x + 1) / (real n + 1)))) * real n)) <= 
          (∑ n = 1..natfloor (abs x).
          abs ((R ((abs x + 1) / real n) -
                R ((abs x + 1) / (real n + 1)))) * real n)";
        apply (rule setsum_le_cong);
        apply (subst abs_mult)+;
        apply (subgoal_tac "abs(real x) = real x");
        apply (erule ssubst);
        apply (rule mult_right_mono);
        apply (rule abs_triangle_ineq3);
        apply force;
        apply force;
        done;
      also have "... = (∑ n = 1..natfloor (abs x).
          abs (
           (((abs x + 1) / real (n + 1)) - ((abs x + 1) / (real n))) + 
           (psi(natfloor((abs x + 1) / real n)) - 
             psi(natfloor((abs x + 1) / (real (n + 1)))))) * real n)";
        apply (rule setsum_cong2);
        apply (unfold R_def);
        apply (simp add: ring_eq_simps compare_rls);
        done;
      also have "... <= (∑ n = 1..natfloor (abs x). abs (
          (((abs x + 1) / real (n + 1)) - ((abs x + 1) / (real n)))) * 
            real n) + 
        (∑ n = 1..natfloor (abs x). abs (
           (psi(natfloor((abs x + 1) / real n)) - 
             psi(natfloor((abs x + 1) / (real (n + 1)))))) * real n)";
        apply (subst setsum_addf [THEN sym]);
        apply (rule setsum_le_cong);
        apply (subst left_distrib [THEN sym]);
        apply (rule mult_right_mono);
        apply (rule abs_triangle_ineq);
        apply force;
        done;
      also have "... = (∑ n = 1..natfloor (abs x). (real n) *
          (((abs x + 1) / real n) - (abs x + 1) / real (n + 1))) + 
        (∑ n = 1..natfloor (abs x). (real n) * 
           (psi(natfloor((abs x + 1) / real n)) - 
             psi(natfloor((abs x + 1) / (real (n + 1))))))";
        apply (simp only: setsum_addf [THEN sym]);
        apply (rule setsum_cong2);
        apply (subgoal_tac 
          "abs ((abs ?y + 1) / real (x + 1) - (abs ?y + 1) / real x) = 
          -((abs ?y + 1) / real (x + 1) - (abs ?y + 1) / real x)");
        apply (erule ssubst);
        apply (subgoal_tac "abs (psi (natfloor ((abs ?y + 1) / real x)) -
                  psi (natfloor ((abs ?y + 1) / real (x + 1)))) = 
              (psi (natfloor ((abs ?y + 1) / real x)) -
                  psi (natfloor ((abs ?y + 1) / real (x + 1))))");
        apply (erule ssubst);
        apply (simp add: ring_eq_simps);
        apply (rule abs_nonneg);
        apply (simp add: compare_rls);
        apply (rule psi_mono);
        apply (rule natfloor_mono);
        apply (rule divide_left_mono);
        apply force;
        apply arith;
        apply (rule mult_pos);
        apply force;
        apply force;
        apply (rule abs_nonpos);
        apply (simp add: compare_rls);
        apply (rule divide_left_mono);
        apply force;
        apply arith;
        apply (rule mult_pos);
        apply force;
        apply force;
        done;
      also have "... = (∑ n = 1..natfloor (abs x) + 1.
         (abs x + 1) * (real n - real (n - 1)) / real n) -
           (abs x + 1) +
         ((∑ n = 1..natfloor (abs x) + 1.
           psi (natfloor ((abs x + 1) / real n)) * (real n - real (n - 1))) -
           psi (natfloor ((abs x + 1) / (real (natfloor (abs x)) + 1))) *
           (real (natfloor (abs x)) + 1))";
        apply (subst another_partial_sum2);
        apply (subst another_partial_sum2);
        apply simp;
        done;
      also have "... = (abs x + 1) * 
            (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
         (∑ n = 1..natfloor (abs x) + 1.
            psi (natfloor ((abs x + 1) / real n))) -
         ((abs x + 1) +
             psi (natfloor ((abs x + 1) / (real (natfloor (abs x)) + 1))) *
               (real (natfloor (abs x)) + 1))";
        apply (simp add: compare_rls);
        apply (simp add: setsum_addf [THEN sym] setsum_const_times [THEN sym]);
        apply (rule setsum_cong2);
        apply (subgoal_tac "real x - real (x - 1) = 1");
        apply (erule ssubst);
        apply simp;
        apply (subgoal_tac "real (x - 1) = real x - real (1::nat)");
        apply simp;
        apply (rule real_of_nat_diff);
        apply force;
        done;
      also have "... <= (abs x + 1) * 
            (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
         (∑ n = 1..natfloor (abs x) + 1.
            psi (natfloor ((abs x + 1) / real n)))";
        apply (simp only: compare_rls);
        apply (subst add_commute);
        apply (rule add_increasing);
        apply (rule nonneg_plus_nonneg);
        apply arith;
        apply (rule nonneg_times_nonneg);        
        apply (rule psi_ge_zero);
        apply force;
        apply (rule order_refl);
        done;
      finally; show "(∑ n = 1..natfloor (abs x).
         abs ((abs (R ((abs x + 1) / real n)) -
           abs (R ((abs x + 1) / (real n + 1)))) * real n))
         <= (abs x + 1) * (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
           (∑ n = 1..natfloor (abs x) + 1.
             psi (natfloor ((abs x + 1) / real n)))";.;
    qed;
  next show "(%x. (abs x + 1) * 
      (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
         (∑ n = 1..natfloor (abs x) + 1.
          psi (natfloor ((abs x + 1) / real n)))) =o 
      O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
    apply (subst bigo_plus_idemp [THEN sym]);
    apply (subgoal_tac 
      "(%x. (abs x + 1) * (∑ n = 1..natfloor (abs x) + 1. 1 / real n) +
         (∑ n = 1..natfloor (abs x) + 1.
           psi (natfloor ((abs x + 1) / real n)))) = 
       (%x. (abs x + 1) * (∑ n = 1..natfloor (abs x) + 1. 1 / real n)) +
       (%x. (∑ n = 1..natfloor (abs x) + 1.
          psi (natfloor ((abs x + 1) / real n))))");
    apply (erule ssubst);
    apply (rule set_plus_intro);
    apply (rule subsetD);
    apply (subgoal_tac "(%x. (abs x + 1)) *o O(%x. 1 + ln(abs x + 1)) <= ?t");
    apply assumption;
    apply (rule subset_trans);
    apply (rule bigo_mult2);
    apply (simp add: func_times);
    apply (subgoal_tac 
      "(%x. (abs x + 1) * (∑ n = 1..natfloor (abs x) + 1. 1 / real n)) =
       (%x. (abs x + 1)) * 
         (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n)");    
    apply (erule ssubst);
    apply (rule set_times_intro2);
    apply (rule subsetD);
    prefer 2;
    apply (rule bigo_add_commute_imp [OF ln_sum_real2]);
    apply (rule bigo_plus_absorb2);
    apply (rule bigo_bounded);
    apply force;
    apply (rule allI);
    apply (simp add: add_commute);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply force;
    apply (simp add: add_ac);
    apply (rule ext);
    apply (subst func_times);
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    apply (rule subsetD);
    prefer 2;
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1.
         1 * psi (natfloor ((abs x + 1) / real n))) =o 
      O(%x. ∑ n = 1..natfloor (abs x) + 1. 
          abs(1 * real(natfloor ((abs x + 1) / real n))))");
    apply simp;
    apply (rule bigo_setsum3 [OF psi_bigo]);
    apply (rule bigo_elt_subset);
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1.
         real (natfloor ((abs x + 1) / real n))) =
      (%x. ∑ n = 1..natfloor (abs x) + 1.
         real (natfloor (abs x + 1) div n))"); 
    apply (erule ssubst);
    apply (rule bigo_lesseq3);
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1.
         real (natfloor (abs x + 1)) / (real n)) =o ?t");
    apply assumption;
    apply (rule subsetD);
    apply (subgoal_tac "O(%x. (abs x + 1)) * O(%x. (1 + ln (abs x + 1))) <= 
       ?t");
    apply assumption;
    apply (rule subset_trans);
    apply (rule bigo_mult);
    apply (simp add: func_times);
    apply (subgoal_tac "(%x. ∑ n = 1..natfloor (abs x) + 1.
         real (natfloor (abs x + 1)) / real n) = 
      (%x. real (natfloor (abs x + 1))) * 
        (%x. ∑ n = 1..natfloor (abs x) + 1. 1 / real n)"); 
    apply (erule ssubst);
    apply (rule set_times_intro);
    apply (rule bigo_bounded);
    apply force;
    apply (rule allI);
    apply (rule real_natfloor_le);
    apply arith;
    apply (rule subsetD);
    prefer 2;
    apply (rule bigo_add_commute_imp [OF ln_sum_real2]);
    apply (rule bigo_plus_absorb2);
    apply (rule bigo_bounded);
    apply force;
    apply (rule allI);
    apply (simp add: add_commute);
    apply (rule bigo_elt_subset);
    apply (rule bigo_bounded);
    apply force;
    apply force;
    apply (subst func_times);
    apply (rule ext);
    apply (subst setsum_const_times [THEN sym]);
    apply (rule setsum_cong2);
    apply simp;
    apply (rule allI);
    apply (rule setsum_nonneg');
    apply force;
    apply (rule allI);
    apply (rule setsum_le_cong);
    apply (rule real_nat_div_le_real_div);
    apply (rule ext);
    apply (rule setsum_cong2);
    apply (subst natfloor_div_nat);
    apply force+;
    apply (subst func_plus);
    apply (rule refl);
    done;
  qed;
  finally show ?thesis;.;
qed;

lemma error7: "(%x. abs (R (abs x + 1)) * ln (abs x + 1) ^ 2) <o
  (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
      abs (R ((abs x + 1) / real n)) * ln (real n))) =o 
    O(%x. (abs x + 1) * (1 + ln (abs x + 1)))";
proof -;
  note bigo_lesso4 [OF error_cor1, OF error6];
  also have "(%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
      abs (R ((abs x + 1) / real n)) * ln (real (n - 1 + 1)))) =
    (%x. 2 * (∑ n = 1..natfloor (abs x) + 1.
        abs (R ((abs x + 1) / real n)) * ln (real n)))";
    apply (rule ext);
    apply (rule arg_cong);back;
    apply (rule setsum_cong2);
    apply (subgoal_tac "xa - 1 + 1 = xa");
    apply (erule ssubst);
    apply (rule refl);
    apply simp;
    done;
  finally show ?thesis;.;
qed;

end;
 

lemma R_alt_def:

  psi (natfloor x) = x + R x

lemma R_alt_def2:

  psi (natfloor x) = R x + x

lemma R_alt_def3:

  psi n = real n + R (real n)

lemma R_alt_def4:

  psi n = R (real n) + real n

lemma R_bound_imp_PNT:

epsilon. 0 < epsilon --> (∃z. ∀x. zx --> ¦R x¦ < epsilon * x)
  ==> (%x. psi x / real x) ----> 1

lemma aux:

  [| f + gh + O(k); gl + O(k) |] ==> f + lh + O(k)

lemma error0:

  R ∈ O(abs)

lemma R_zero:

  R 0 = 0

lemma error1:

  (%x. ∑n = 1..natfloor ¦x¦. R (real n) / (real n * real (n + 1))) ∈ O(%x. 1)

lemma sum_lambda_n_ln_n_over_n_bigo:

  (%x. ∑n = 1..natfloor ¦x¦ + 1. Lambda n * ln (real n) / real n)
  ∈ (%x. (ln (¦x¦ + 1))² / 2) + O(%x. 1 + ln (¦x¦ + 1))

lemma error2:

  (%x. R (¦x¦ + 1) * (ln (¦x¦ + 1))²) +
  (%x. 2 * (∑n = 1..natfloor ¦x¦ + 1.
               Lambda n * ln (real n) * R ((¦x¦ + 1) / real n)))
  ∈ O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma error3:

  (%x. ¦R (¦x¦ + 1)¦ * (ln (¦x¦ + 1))²) <o
  (%x. 2 * (∑n = 1..natfloor ¦x¦ + 1.
               Lambda n * ln (real n) * ¦R ((¦x¦ + 1) / real n)¦))
  ∈ O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma error4_aux:

  (%x. ∑n = 1..natfloor ¦x¦ + 1.
          Lambda n / real n *
          (∑m = 1..(natfloor ¦x¦ + 1) div n. Lambda m / real m))
  ∈ (%x. (ln (¦x¦ + 1))² / 2) + O(%x. 1 + ln (¦x¦ + 1))

lemma error4:

  (%x. R (¦x¦ + 1) * (ln (¦x¦ + 1))²)
  ∈ (%x. 2 * (∑c = 1..natfloor ¦x¦ + 1.
                 ∑v | v dvd c.
                    Lambda v * Lambda (c div v) * R ((¦x¦ + 1) / real c))) +
    O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma error5:

  (%x. ¦R (¦x¦ + 1)¦ * (ln (¦x¦ + 1))²) <o
  (%x. 2 * (∑c = 1..natfloor ¦x¦ + 1.
               ∑v | v dvd c.
                  Lambda v * Lambda (c div v) * ¦R ((¦x¦ + 1) / real c)¦))
  ∈ O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma max_zero_add:

  max (a + b) 0 ≤ max a 0 + max b 0

lemma max_zero_times:

  0 ≤ c ==> max (c * a) 0 = c * max a 0

lemma aux2:

  (f + f) <o ((%x. 2 * g x) + (%x. 2 * h x)) ∈ O(k) ==> f <o (g + h) ∈ O(k)

lemma error_cor1:

  (%x. ¦R (¦x¦ + 1)¦ * (ln (¦x¦ + 1))²) <o
  ((%x. ∑n = 1..natfloor ¦x¦ + 1.
           Lambda n * ln (real n) * ¦R ((¦x¦ + 1) / real n)¦) +
   (%x. ∑c = 1..natfloor ¦x¦ + 1.
           ∑v | v dvd c. Lambda v * Lambda (c div v) * ¦R ((¦x¦ + 1) / real c)¦))
  ∈ O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma aux2:

  1 ≤ n ==> setsum f {1..n} - setsum f {1..n - 1} = f n

lemma rho_zero:

  rho 0 = 0

lemma aux3:

  1 ≤ n
  ==> rho n - rho (n - 1) =
      Lambda n * ln (real n) + (∑u | u dvd n. Lambda u * Lambda (n div u))

lemma rho_bigo:

  rho ∈ (%x. 2 * real x * ln (real x)) + O(real)

lemma R_bigo:

  (%x. R ¦x¦) ∈ O(abs)

lemma error6_aux:

  (%x. ¦R ((¦x¦ + 1) / (real (natfloor ¦x¦) + 1))¦) ∈ O(%x. 1)

lemma error6_aux2:

  (%n. real (n + 1) * ln (real (n + 1)) - real n * ln (real n))
  ∈ (%n. ln (real (n + 1))) + O(%n. 1)

lemma error6:

  (%x. ∑n = 1..natfloor ¦x¦ + 1.
          Lambda n * ln (real n) * ¦R ((¦x¦ + 1) / real n)¦) +
  (%x. ∑c = 1..natfloor ¦x¦ + 1.
          ∑v | v dvd c. Lambda v * Lambda (c div v) * ¦R ((¦x¦ + 1) / real c)¦)
  ∈ (%x. 2 * (∑n = 1..natfloor ¦x¦ + 1.
                 ¦R ((¦x¦ + 1) / real n)¦ * ln (real (n - 1 + 1)))) +
    O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))

lemma error7:

  (%x. ¦R (¦x¦ + 1)¦ * (ln (¦x¦ + 1))²) <o
  (%x. 2 * (∑n = 1..natfloor ¦x¦ + 1. ¦R ((¦x¦ + 1) / real n)¦ * ln (real n)))
  ∈ O(%x. (¦x¦ + 1) * (1 + ln (¦x¦ + 1)))