Up to index of Isabelle/HOL/HOL-Complex/NumberTheory
theory Chebyshev1 = Complex + PrimeFactorsList + RealLib:(* Title: Chebyshev1.thy Author: Paul Raff and Jeremy Avigad *) header {* Chebycheff's functions *} theory Chebyshev1 = Complex + PrimeFactorsList + RealLib:; consts lprime :: "nat => real" Lambda :: "nat => real" theta :: "nat => real" psi :: "nat => real" char_prime :: "nat => real" pi :: "nat => real" nmult :: "nat => nat => nat" defs lprime_def: "lprime(x) == (if (x : prime) then (ln(real(x))) else 0)" theta_def: "theta(x) == sumr 0 (x+1) lprime" Lambda_def: "Lambda(x) == if (EX p a. (p:prime) & (p^a = x) & 0 < a) then ln(real(THE p. (EX a. (p:prime) & (p^a = x)))) else 0" psi_def: "psi(x) == sumr 0 (x+1) Lambda" char_prime_def: "char_prime(x) == if (x:prime) then 1 else 0" pi_def: "pi(x) == real(card({y. y<=x & y:prime}))" nmult_def: "nmult x y == multiplicity (int x) (int y)"; locale l = fixes x::"nat" and A::"nat set" and B::"nat set" and C::"(nat*nat) set" and D::"(nat*nat) set" and E::"(nat*nat) set" and F::"nat set" and f::"nat*nat => nat" and g:: "nat => (nat*nat)" and G::"nat set" and H::"nat => nat set" and J::"nat set" defines A_def:"A == {y. (y:{0..x} & (EX p a. (p:prime & 0<a & p^a=y)))}" and B_def:"B == {y. (y:{0..x} & ~(EX p a. (p:prime & 0<a & p^a=y)))}" and C_def:"C == {(p,a). (p:prime & 0<a & p^a:{0..x})}" and D_def:"D == {(p,a). (p:prime & a = 1 & p^a:{0..x})}" and E_def:"E == {(p,a). (p:prime & 1 < a & p^a:{0..x})}" and F_def:"F == {p. p:prime & p:{0..x}}" and f_def:"f y == (fst y)^(snd y)" and g_def:"g z == (z,1)" and G_def:"G == {d. 0 < d & d dvd x}" and H_def:"H(p) == {y. y:{0..x} & (EX a. (0 < a & p^a = y))}" and J_def:"J == {p. p : prime & p dvd x}"; subsection {* Miscellaneaous *} lemma prime_prop2: "a:prime ==> b:prime ==> (0<n) ==> a dvd b^n ==> a=b"; apply (frule prime_dvd_power); apply (assumption); by (auto simp add: prime_def); lemma dvd_self_exp [rule_format]: "0 < n --> (m::nat) dvd m^n"; apply (induct_tac n); by auto; lemma prime_prop: "a:prime ==> b:prime ==> 0<c ==> 0<d ==> a^c = b^d ==> a=b"; apply (subgoal_tac "a dvd b^d"); apply (erule prime_prop2); prefer 3; apply (assumption)+; apply (subgoal_tac "a dvd a^c"); apply simp; by (erule dvd_self_exp); lemma power_lemma [rule_format]: "(1::nat) < a --> (0::nat) < c --> 1 < a^c"; apply (induct_tac c); apply force; apply auto; apply (subgoal_tac "1 < a * a^n"); apply force; apply (subgoal_tac "1 < a"); apply (simp only: power_gt1_lemma); apply auto; done; lemma prime_prop_lzero: "a:prime ==> b:prime ==> 0<c ==> a^c = b^d ==> a=b"; apply (case_tac "0=d"); apply auto; apply (subgoal_tac "1 < a"); apply (subgoal_tac "1 < a^c"); apply (force); apply (rule power_lemma); apply force; apply force; apply (subgoal_tac "2 <= a"); apply force; apply (rule prime_ge_2); apply force; apply (rule prime_prop); apply auto; done; lemma prime_prop_rzero: "a:prime ==> b:prime ==> 0<d ==> a^c = b^d ==> a=b"; apply (subgoal_tac "b^d = a^c"); apply (subgoal_tac "b=a"); apply force; apply (rule prime_prop_lzero); apply auto; done; lemma prime_prop2: "a:prime ==> b:prime ==> (0<c) ==> (0<d) ==> a^c = b^d ==> c=d"; apply (frule prime_prop); prefer 4; apply (assumption)+; apply simp; by (auto simp add:prime_def); lemma prime_prop_pair: "(fst x):prime ==> (fst y):prime ==> 0<(snd x) ==> 0<(snd y) ==> (fst x)^(snd x) = (fst y)^(snd y) ==> x=y"; apply (frule prime_prop2); apply auto; apply (subgoal_tac "fst x = fst y"); apply (subgoal_tac "snd x = snd y"); apply (auto simp add: prime_prop prime_prop2); apply (simp add: prod_eqI); done; lemma real_addition: "(c::real) * real(Suc x) = c + c * real(x)"; by (simp add: real_of_nat_Suc right_distrib); lemma setsum_bound_real: "finite A ==> ALL x:A. (f(x) <= (c::real)) ==> setsum f A <= c * real(card A)"; apply (induct set: Finites, auto); apply (simp add: real_addition); done; lemma sumr_suc: "sumr 0 x f + f x = sumr 0 (x+1) f"; apply auto; done; lemma real_power: "((a::nat)^b <= x) = ((real a) ^ b <= real(x))"; apply (simp only: real_of_nat_le_iff [THEN sym]); apply (simp add: realpow_real_of_nat); done; lemma zprime_pos: "x : zprime ==> 0 < x"; apply (auto simp add: zprime_def); done; lemma int_nat_inj: "nat x = nat y ==> 0 < x ==> 0 < y ==> x = y"; apply (subgoal_tac "int (nat x) = int (nat y)"); apply auto; done; lemma setprod_multiplicity_real: "0 < n ==> real n = setprod (%p. (real p)^(multiplicity p n)) {p. p : zprime & p dvd n}"; apply (frule n_eq_setprod_multiplicity); apply (subgoal_tac "real (∏p∈{p. p ∈ zprime ∧ p dvd n}. p ^ multiplicity p n) = (∏p∈{p. p ∈ zprime ∧ p dvd n}. (real p) ^ multiplicity p n)"); apply force; apply (subst setprod_real_of_int); apply (rule setprod_cong); apply (rule refl); apply (subst real_of_int_power); apply (rule refl); done; lemma multiplicity_nmult_eq: "multiplicity x y = nmult (nat x) (nat y)"; apply (auto simp add: nmult_def); apply (simp add: multiplicity_def pfactors_le_1); apply (subgoal_tac "x ~: zprime"); apply (subgoal_tac "0 ~: zprime"); apply (auto simp add: not_zprime_multiplicity_eq_0 zprime_def); done; subsection {* Basic properties *} lemma Lambda_eq_aux: "[|p ∈ prime; 0 < a|] ==> (THE pa. pa ∈ prime ∧ (∃aa. pa ^ aa = p ^ a)) = p"; apply (rule the_equality); apply auto; apply (erule prime_prop); apply assumption; prefer 3; apply assumption; apply (subgoal_tac "aa ~= 0"); apply force; apply (subgoal_tac "p^a ~= 1"); apply (rule notI2); apply assumption; apply simp; apply (subgoal_tac "1 < p^a"); apply force; apply (rule power_lemma); apply (force simp add: prime_def); apply assumption+; done; lemma Lambda_eq: "p:prime ==> 0 < a ==> Lambda(p^a) = ln(real p)"; apply (unfold Lambda_def); apply auto; apply (subst Lambda_eq_aux); apply auto; done; lemma Lambda_eq2: "~ (EX p a. p : prime & p ^ a = x & 0 < a) ==> Lambda x = 0"; apply (unfold Lambda_def); apply auto; done; lemma Lambda_zero: "Lambda 0 = 0"; apply (subst Lambda_eq2); apply (auto simp add: prime_def); done; lemma Lambda_ge_zero: "0 <= Lambda x"; apply (case_tac "EX p a. p : prime & p ^ a = x & 0 < a"); apply (auto simp add: Lambda_eq Lambda_eq2); apply (rule ln_ge_zero); apply (auto simp add: prime_def); done; lemma psi_diff1: "psi (x + 1) - psi x = Lambda (x+1)"; by (simp add: psi_def); lemma psi_diff2: "1 <= x ==> Lambda x = psi x - psi (x - 1)"; apply (subgoal_tac "x = (x - 1) + 1"); apply (erule ssubst); apply (subst psi_diff1 [THEN sym]); apply simp; apply simp; done; lemma psi_zero: "psi 0 = 0"; by (simp add: psi_def Lambda_zero); lemma psi_plus_one: "psi(x + 1) = psi x + Lambda(x + 1)"; apply (unfold psi_def); apply auto; done; lemma psi_def_alt: "psi x = (∑i=1..x. Lambda i)"; apply (induct x); apply (simp add: psi_zero); apply (subgoal_tac "Suc n = n + 1"); apply (erule ssubst);back; apply (subst psi_plus_one); apply (case_tac "n = 0"); apply simp; apply (subst setsum_range_plus_one_nat); apply auto; done; lemma psi_mono: "x <= y ==> psi x <= psi y"; apply (unfold psi_def); apply (case_tac "x = y"); apply simp; apply (rule sumr_le); apply clarify; apply (rule Lambda_ge_zero); apply simp; done; lemma psi_ge_zero: "0 <= psi x"; apply (unfold psi_def); apply (rule sumr_ge_zero); apply (rule allI); apply (rule Lambda_ge_zero); done; lemma theta_geq_zero: "0 <= theta n"; apply (unfold theta_def); apply (rule sumr_ge_zero); apply (unfold lprime_def); apply auto; apply (rule ln_ge_zero); apply (auto simp add: prime_def); done; lemma theta_zero: "theta 0 = 0"; apply (unfold theta_def); apply simp; apply (unfold lprime_def); apply (simp add: prime_def); done; lemma theta_1_is_0: "theta(1) = 0"; by (simp add: theta_def lprime_def prime_def); lemma big_lemma1: "pi(2) = 1"; apply (simp add: pi_def); apply (subgoal_tac "{y::nat. y <= (2::nat) & y : prime} = {2}"); apply (erule ssubst); apply (simp add: real_of_nat_inject); apply auto; apply (case_tac "x=0"); apply simp; apply (simp add: zero_not_prime); apply (case_tac "x=1"); apply (simp add: one_not_prime); apply auto; apply (simp add: two_is_prime); done; subsection {* Comparing psi and theta *} lemma theta_setsum_eq1: "theta(x) = setsum lprime {0..x}"; apply (simp only: theta_def); apply (auto simp add: setsum_sumr2); done; lemma prime_partition: "{p. p<x} = {p. p<x & p:prime} Un {p. p<x & p~:prime}"; apply auto; done; lemma prime_partition_le: "{p. p<=x} = {p. p<=x & p:prime} Un {p. p<=x & p~:prime}"; by auto; lemma all_nonprime_set_l: "[| finite A; ALL x:A. x ~: prime |] ==> setsum lprime A = 0"; apply (rule setsum_0'); apply (auto simp add: lprime_def); done; lemma (in l) finite_A: "finite A"; apply (auto simp add: A_def); apply (rule finite_subset [of "{y. y <= x & (EX p. p : prime & (EX a. 0 < a & p ^ a = y))}" "{..x}"]); apply auto; done; lemma (in l) finite_B: "finite B"; apply (auto simp add: B_def); apply (rule finite_subset [of "{y. y <= x & ( ALL p. p : prime --> (ALL a. a = 0 | p ^ a ~= y))}" "{..x}"]); apply auto; done; lemma (in l) A_B_disjoint: "A Int B = {}"; apply (unfold A_def B_def); apply blast; done; lemma (in l) A_B_all: "A Un B = {y. y<=x}"; apply (unfold A_def B_def); apply auto; done; lemma (in l) cor_psi_sum: "psi(x) = setsum Lambda A + setsum Lambda B"; apply (unfold psi_def); apply (subst setsum_sumr2 [THEN sym]); apply (subst setsum_Un_disjoint [THEN sym]); apply (rule finite_A, rule finite_B, rule A_B_disjoint); apply (subgoal_tac "{0..x} = A Un B"); apply force; apply (unfold A_def B_def); apply blast; done; lemma (in l) B_kernel_for_Lambda: "y:B ==> Lambda(y) = 0"; apply (auto simp add: B_def Lambda_def); apply (drule_tac x = p in spec); apply (clarify); apply (drule_tac x = a in spec); by auto; lemma (in l) sum_over_B_of_Lambda_zero: "setsum Lambda B = 0"; apply (rule setsum_0'); apply (rule ballI); apply (rule B_kernel_for_Lambda); apply assumption; done; lemma (in l) inj_on_C: "inj_on f C"; apply (rule inj_onI); apply (unfold C_def f_def); apply (subgoal_tac "(fst xa):prime"); apply (subgoal_tac "(fst y):prime" "0<(snd xa)" "0<snd y"); apply (auto simp add: prime_prop_pair); done; lemma (in l) range_of_C_is_A: "f`C = A"; apply (auto simp add: C_def A_def f_def image_def); done; lemma (in l) finite_C: "finite C"; apply (rule finite_imageD); apply (subst range_of_C_is_A); apply (rule finite_A, rule inj_on_C); done; lemma (in l) D_subset_C: "D <= C"; by (auto simp add: D_def C_def); lemma (in l) E_subset_C: "E <= C"; by (auto simp add: E_def C_def); lemma (in l) Lambda_reindex_1: "setsum Lambda (f`C) = setsum (Lambda o f) C"; apply (rule setsum_reindex); apply (simp add: finite_C); apply (simp add: inj_on_C); done; lemma (in l) psi_Lambda_eq_over_C: "psi(x) = setsum (Lambda o f) C"; apply (simp add: Lambda_reindex_1 [THEN sym]); apply (subst range_of_C_is_A); apply (subst cor_psi_sum); apply (subst sum_over_B_of_Lambda_zero); apply simp; done; lemma psi_alt_def: "psi(x) = (∑u:{(p,a). (p:prime & 0<a & p^a:{0..x})}. Lambda((fst u)^(snd u)))"; apply (subst l.psi_Lambda_eq_over_C); apply (unfold o_def); apply (rule refl); done; lemma (in l) C_eq_D_Un_E: "C = D Un E"; apply (auto simp add: C_def D_def E_def); done; lemma (in l) D_Int_E_empty: "D Int E = {}"; by (auto simp add: D_def E_def); lemma (in l) finite_D: "finite D"; apply (rule finite_subset); apply (rule D_subset_C); apply (rule finite_C); done; lemma (in l) finite_E: "finite E"; apply (rule finite_subset); apply (rule E_subset_C); apply (rule finite_C); done; lemma (in l) setsum_C_D_E: "setsum (Lambda o f) C = setsum (Lambda o f) D + setsum (Lambda o f) E"; apply (subgoal_tac "C = D Un E"); apply simp; apply (rule setsum_Un_disjoint); apply (rule finite_D, rule finite_E, rule D_Int_E_empty, rule C_eq_D_Un_E); done; lemma (in l) psi_Lambda_eq: "psi(x) = setsum (Lambda o f) D + setsum (Lambda o f) E"; apply (subst setsum_C_D_E [THEN sym]); apply (rule psi_Lambda_eq_over_C); done; lemma (in l) inj_on_g_F: "inj_on g F"; apply (auto simp add: inj_on_def F_def g_def); done; lemma (in l) g_image_F_is_D: "g`F = D"; apply (auto simp add: g_def F_def D_def); done; lemma (in l) finite_F: "finite F"; apply (unfold F_def); apply (subgoal_tac "finite {..x}"); apply (rule finite_subset); prefer 2; apply assumption; apply auto; done; lemma (in l) reindex_Lambda_f_g: "setsum (Lambda o f) D = setsum (Lambda o f o g) F"; apply (insert g_image_F_is_D [THEN sym] inj_on_g_F finite_F); apply (simp add: setsum_reindex); done; lemma aux1 [rule_format]: "1 < (a::nat) --> 0 < b --> Suc 0 < a^b"; apply (induct_tac b); apply force; apply clarsimp; apply (case_tac "n = 0"); apply auto; apply (rule one_less_mult); apply auto; done; lemma aux2 [rule_format]: "1 < (a::nat) & 1 < b --> a < a^b"; apply (induct_tac "b"); apply force; apply clarify; apply simp; apply (rule aux1); apply auto; done; lemma aux3: "p:prime ==> 1 < a ==> ~ (p^a : prime)"; apply (unfold prime_def); apply (clarsimp); apply (rule_tac x = "p" in exI) apply (rule conjI); apply (rule dvd_self_exp); apply force; apply (rule conjI); apply force; apply (subgoal_tac "p < p^a"); apply force; apply (rule aux2); by auto; lemma prime_power_must_be_one: "p:prime ==> p^a:prime ==> a=1"; apply auto; apply (case_tac "a=0"); apply simp; apply (simp add: prime_def); apply (case_tac "a=1"); apply (simp_all add: aux3); done; lemma (in l) F_prop: "p:F --> (Lambda(f(g(p)))) = ln(real(p))"; apply (unfold F_def f_def g_def); apply clarify; apply simp; apply (unfold Lambda_def); apply auto; apply (subgoal_tac "(THE pa::nat. pa : prime & (EX aa::nat. pa ^ aa = p ^ a)) = p^a"); apply (erule ssubst); apply (simp); apply (rule the_equality); apply (auto simp add: if_splits); apply (rule_tac x = "1" in exI); apply simp; apply (subgoal_tac "a=1"); apply simp; apply (subgoal_tac "aa=1"); apply simp; apply (subgoal_tac "pa^aa : prime"); prefer 2; apply simp; apply (simp only: prime_power_must_be_one); apply (simp only: prime_power_must_be_one); apply (drule_tac x = "p" in spec); apply simp; apply (drule_tac x = "1" in spec); apply auto; done; lemma (in l) sum_over_F: "setsum (Lambda o f o g) F = setsum (ln o real) F"; apply (rule setsum_cong); apply (auto simp add: F_prop); done; lemma (in l) sum_over_F2_lemma1: "setsum lprime {0..x} = setsum lprime ({p. p<=x & p:prime} Un {p. p<=x & p~:prime})"; apply (subgoal_tac "{0..x} = {p. p<=x}"); apply (erule ssubst); apply (subgoal_tac "{p. p<=x} = ({p::nat. p <= x & p : prime} Un {p::nat. p <= x & p ~: prime})"); apply (erule ssubst); apply simp; apply (auto simp add: prime_partition); done; lemma (in l) sum_over_F2_lemma2: "setsum lprime ({p. p<=x & p:prime} Un {p. p<=x & p~:prime}) = setsum lprime {p. p<=x & p:prime} + setsum lprime {p. p<=x & p~:prime}"; apply (rule setsum_Un_disjoint); apply auto; apply (rule finite_subset_AtMost_nat); apply force; apply (rule finite_subset_AtMost_nat); apply force; done; lemma (in l) l_set_of_primes: "ALL x:P. x:prime ==> setsum lprime P = setsum (ln o real) P"; apply (rule setsum_cong); apply (auto simp add: lprime_def); done; lemma (in l) sum_over_F2: "setsum (ln o real) F = theta(x)"; apply (unfold F_def theta_def); apply (subst setsum_sumr2 [THEN sym]); apply (subst l_set_of_primes [THEN sym]); apply force; apply (subgoal_tac "setsum lprime {0..x} = setsum lprime ({p. p:prime & p<=x} Un {p. p~:prime & p<=x})"); apply (erule ssubst); apply (subst setsum_Un_disjoint); apply (rule finite_subset_AtMost_nat); apply auto; apply (rule finite_subset_AtMost_nat); apply auto; apply (subst all_nonprime_set_l); apply (rule finite_subset_AtMost_nat); apply auto; apply (subgoal_tac "{0..x} = {p. p:prime & p<=x} Un {p. p~:prime & p<=x}"); apply auto; done; lemma (in l) psi_theta_sum: "psi(x) = theta(x) + setsum (Lambda o f) E"; apply (subst sum_over_F2 [THEN sym]); apply (subst sum_over_F [THEN sym]); apply (subst reindex_Lambda_f_g [THEN sym]); apply (rule psi_Lambda_eq); done; lemma exponent_eq_0_iff: "2 <= p ==> Suc 0 = p^a ==> a = 0"; apply (case_tac a); apply (auto simp add: power_Suc); done; lemma (in l) Lambda_positive: "ALL x:E. 0 <= Lambda(f(x))"; apply (auto simp add: E_def Lambda_def f_def); apply (subgoal_tac "0 = ln 1"); apply (erule ssubst [of "(0::real)" "ln (1::real)" _]); apply (subgoal_tac "0 < real((THE p::nat. p : prime & (EX aa::nat. p ^ aa = a ^ b)))"); apply (simp only: ln_le_cancel_iff); apply (subgoal_tac "(1 :: real) = real(1::nat)"); apply (erule ssubst [of "(1::real)" "real (1::nat)" _]); apply (simp only: real_of_nat_le_iff); apply (auto); apply (rule Suc_leI); apply simp; apply (rule theI2); apply auto; prefer 2; apply (simp add: prime_pos); apply (case_tac "aaa = 0"); prefer 2; apply (subgoal_tac "0 < aaa"); prefer 2; apply simp; apply (subgoal_tac "p^aa = pa^aaa"); apply (simp only: prime_prop); apply simp; apply auto; apply (subgoal_tac "Suc 0 = p^aa"); prefer 2; apply simp; apply (subgoal_tac "2 <= p"); apply (subgoal_tac "0 = aa"); prefer 2; apply (simp add: exponent_eq_0_iff); prefer 2; apply (simp add: prime_ge_2); apply (simp only: order_less_imp_not_eq [of "0" "aa"]); done lemma real_power_ln: "1 < a ==> 0<x ==> ((a::nat)^b <= x) = (real(b) <= ln(real x)/ln(real a))"; apply (simp only: real_power); apply (subgoal_tac "0 < real a ^ b"); apply (subgoal_tac "0 < real(x)"); apply (simp only: ln_le_cancel_iff [THEN sym]); apply (simp add: ln_realpow); apply (subgoal_tac "0 < ln (real a)"); apply (simp add: pos_le_divide_eq); apply (subgoal_tac "1 < real a"); apply (simp add: ln_gt_zero); apply force; apply force; apply (subgoal_tac "0 < a"); apply (subgoal_tac "0 < a^b"); apply (simp add: real_of_nat_less_iff); apply (simp add: zero_less_power); apply force; done; (* lemma (in l) extent_of_E: "E <= {1..x} <*> {1..nat(floor(ln(real x)/ln(2)))}"; apply (auto simp add: E_def); apply (subgoal_tac "2 <=a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "2 <= a"); apply (subgoal_tac "2 <= b"); apply (subgoal_tac "a <= a^2"); apply (subgoal_tac "a^2 <= a^b"); apply force; apply (simp add: power_increasing); apply (subgoal_tac "0 <= a"); apply (subgoal_tac "(a <= a^2) = (a^1 <= a^2)"); apply (erule ssubst); apply (simp only: power_increasing); apply force; apply force; apply force; apply (simp add: prime_ge_2); apply (subst real_of_nat_le_iff [THEN sym]); apply (subgoal_tac "2^b <= x"); apply (subgoal_tac "0 < x"); apply (subgoal_tac "1 < a"); apply (simp only: real_power_ln); apply (subgoal_tac "real(2::nat) = 2"); apply (erule ssubst); apply (auto simp add: floor_bound); apply (subgoal_tac "2 <= a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "0 < a"); apply (subgoal_tac "0 < a^b"); apply (simp only: less_le_trans [of "0" "a^b" "x"]); apply (simp add: zero_less_power); apply (subgoal_tac "2 <= a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "2 <= a"); apply (subgoal_tac "2^b <= a^b"); apply force; apply (auto simp add: power_mono prime_ge_2); done; *) lemma (in l) extent_of_E2: "E <= {1..nat(floor(real(x) powr (1/2)))} <*> {1..nat(floor(ln(real x)/ln(2)))}"; apply (auto simp add: E_def); apply (subgoal_tac "2 <=a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "a <= natfloor(real x powr (1/2))"); apply (simp add: natfloor_def); apply (subgoal_tac "a^2 <= x"); apply (subgoal_tac "(real a) powr (real (2::nat)) <= real x"); apply (subgoal_tac "((real a) powr (real (2::nat))) powr (1/2) <= (real x) powr (1/2)"); apply (simp add: powr_powr); apply auto; apply (subgoal_tac "real a <= real x powr (1/2)"); apply (rule real_le_natfloor); apply auto; apply (subgoal_tac "real a powr 1 = real a"); apply force; apply (subst powr_one_gt_zero_iff); apply (subgoal_tac "2 <= a"); apply arith; apply (simp add: prime_ge_2); apply (rule power_mono2); apply force+; apply (subgoal_tac "(2::real) = real (2::nat)"); apply (erule ssubst); apply (subst powr_realpow); apply (subgoal_tac "2 <= a"); apply arith; apply (simp add: prime_ge_2); apply (subgoal_tac "real a ^ 2 = real (a^2)"); apply force; apply (rule realpow_real_of_nat); apply force+; apply (subgoal_tac "a^2 <= a^b"); apply force; apply (rule power_increasing); apply force; apply (frule prime_ge_2); apply arith; (* FIRST PART DONE! YAY! *) apply (subgoal_tac "2^b <= x"); apply (subgoal_tac "0 < x"); apply (subgoal_tac "1 < a"); apply (simp only: real_power_ln); apply (subgoal_tac "real(2::nat) = 2"); apply (erule ssubst); apply (auto simp add: floor_bound); apply (subgoal_tac "2 <= a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "0 < a"); apply (subgoal_tac "0 < a^b"); apply (simp only: less_le_trans [of "0" "a^b" "x"]); apply (simp add: zero_less_power); apply (subgoal_tac "2 <= a"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "2 <= a"); apply (subgoal_tac "2^b <= a^b"); apply force; apply (auto simp add: power_mono prime_ge_2); done; (* lemma (in l) card_E_lemma: "card E <= card ({1..x} <*> {1..nat(floor(ln(real x)/ln(2)))})"; apply (rule card_mono); prefer 2; apply (rule extent_of_E); apply simp; done; *) lemma (in l) card_E2_lemma: "card E <= card ({1..nat(floor(real(x) powr (1/2)))} <*> {1..nat(floor(ln(real x)/ln(2)))})"; apply (rule card_mono); prefer 2; apply (rule extent_of_E2); apply simp; done; (* lemma (in l) card_E_lemma2: "card ({1..x} <*> {1..nat(floor(ln(real x)/ln(2)))}) = card {1..x} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply simp; done; *) lemma (in l) card_E2_lemma2: "card ({1..nat(floor(real(x) powr (1/2)))} <*> {1..nat(floor(ln(real x)/ln(2)))}) = card {1..nat(floor(real(x) powr (1/2)))} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply simp; done; (* lemma (in l) card_E_lemma3: "card ({1..x} <*> {1..nat(floor(ln(real x)/ln(2)))}) <= card {1..x} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply (auto simp add: card_E_lemma2); done; *) lemma (in l) card_E2_lemma3: "card ({1..nat(floor(real(x) powr (1/2)))} <*> {1..nat(floor(ln(real x)/ln(2)))}) <= card {1..nat(floor(real(x) powr (1/2)))} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply (auto simp add: card_E2_lemma2); done; (* lemma (in l) card_E: "card E <= card {1..x} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply (insert card_E_lemma3); apply (insert card_E_lemma); apply (erule le_trans); apply assumption; done; *) lemma (in l) card_E2: "card E <= card {1..nat(floor(real(x) powr (1/2)))} * card {1..nat(floor(ln(real x)/ln(2)))}"; apply (insert card_E2_lemma3); apply (insert card_E2_lemma); apply (erule le_trans); apply assumption; done; (* lemma card_E_real_lemma4: "real(floor(ln(real x)/ln(2))) <= ln(real x)/ln(2)"; apply (simp add: real_of_int_floor_le); done; *) lemma card_E2_real_lemma4: "real(floor(ln(real x)/ln(2))) <= ln(real x)/ln(2)"; apply (simp add: real_of_int_floor_le); done; (* lemma (in l) real_card_E: "real(card E) <= real(card {1..x} * card {1..nat(floor(ln(real x)/ln(2)))})"; apply (simp only: real_of_nat_le_iff); apply (rule card_E); done; *) lemma (in l) real_card_E2: "real(card E) <= real(card {1..nat(floor(real(x) powr (1/2)))} * card {1..nat(floor(ln(real x)/ln(2)))})"; apply (simp only: real_of_nat_le_iff); apply (rule card_E2); done; (* lemma (in l) card_E_real_lemma6: "0 < x ==> real(card {1..nat(floor(ln(real x)/ln(2)))}) <= ln(real x)/ln(2)"; apply simp; apply (subgoal_tac "0 <= ln(real x) / ln 2"); apply (rule real_nat_floor); apply auto; done; *) lemma (in l) card_E2_real_lemma6: "0 < x ==> real(card {1..nat(floor(ln(real x)/ln(2)))}) <= ln(real x)/ln(2)"; apply simp; apply (subgoal_tac "0 <= ln(real x) / ln 2"); apply (rule real_nat_floor); apply auto; done; (* lemma (in l) card_E_real: "0 < x ==> real(card E) <= real(x) * ln(real x)/ln(2)"; proof-; assume pos: "0 < x"; have step1: "real(card E) <= real(card {1..x} * card {1..nat(floor(ln(real x)/ln(2)))})"; by (rule real_card_E); also have step2: "... = real(card {1..x}) * real(card {1..nat(floor(ln(real x)/ln(2)))})"; by (rule real_of_nat_mult); also have step3: "... <= real(x) * ln(real x)/ln(2)"; apply (simp add: card_E_real_lemma6); apply (subgoal_tac "real x * ln (real x) / ln 2 = real x * (ln (real x) / ln 2)"); apply (erule ssubst); apply (rule mult_left_mono); apply (subgoal_tac "0<= ln(real x)/ln 2"); apply (rule real_nat_floor); apply force; apply (subgoal_tac "1<= real x"); apply (drule ln_ge_zero); apply (subgoal_tac "0 < ln 2"); apply (simp add: real_ge_zero_div_gt_zero); apply auto; apply (subgoal_tac "1<=x"); apply (auto simp add: pos); apply (simp add: pos Suc_leI); done; finally show ?thesis;.; qed; *) lemma (in l) card_E2_real: "0 < x ==> real(card E) <= real(nat(floor(real(x) powr (1/2)))) * ln(real x)/ln(2)"; proof-; assume pos: "0 < x"; have step1: "real(card E) <= real(card {1..nat(floor(real(x) powr (1/2)))} * card {1..nat(floor(ln(real x)/ln(2)))})"; by (rule real_card_E2); also have step2: "... = real(card {1..nat(floor(real(x) powr (1/2)))}) * real(card {1..nat(floor(ln(real x)/ln(2)))})"; by (rule real_of_nat_mult); also have step3: "... <= real(nat(floor(real(x) powr (1/2)))) * ln(real x)/ln(2)"; apply (simp add: card_E2_real_lemma6); apply (subgoal_tac "real (nat(floor(real(x) powr (1/2)))) * ln (real x) / ln 2 = real (nat(floor(real(x) powr (1/2)))) * (ln (real x) / ln 2)"); apply (erule ssubst); apply (rule mult_left_mono); apply (subgoal_tac "0<= ln(real x)/ln 2"); apply (rule real_nat_floor); apply force; apply (subgoal_tac "1<= real x"); apply (drule ln_ge_zero); apply (subgoal_tac "0 < ln 2"); apply (simp add: real_ge_zero_div_gt_zero); apply auto; apply (subgoal_tac "1<=x"); apply (auto simp add: pos); apply (simp add: pos Suc_leI); done; finally show ?thesis;.; qed; lemma (in l) E_bound_with_f: "y:E --> f(y) <= x"; apply (auto simp add: E_def); apply (auto simp add: f_def); done; lemma Lambda_prop: "ALL x. (0 < x --> Lambda(x) <= ln(real(x)))"; apply (auto simp add: Lambda_def); apply (rule theI2); apply auto; apply (rule prime_prop_rzero); apply auto; apply (case_tac "aa=0"); apply auto; apply (subgoal_tac "Suc 0 < p^1"); apply (subgoal_tac "p^1 <= p^a"); apply force; apply (rule power_increasing); apply force; apply force; apply (subgoal_tac "2 <= p^1"); apply force; apply (subgoal_tac "2 <= p"); apply (subgoal_tac "p = p^1"); apply force; apply (rule power_one_right [THEN sym]); apply (simp add: prime_ge_2); apply (subgoal_tac "x = p"); apply (subgoal_tac "real(x) = real(p)"); apply auto; apply (subgoal_tac "p^1 <= p^a"); apply force; apply (rule power_increasing); apply force; apply force; apply (rule prime_prop_rzero); apply auto; done; lemma (in l) E_bound: "0 < x ==> y:E ==> (Lambda o f)(y) <= ln(real(x))"; apply (auto simp add: E_def); apply (auto simp add: f_def); apply (subgoal_tac "0 < xa^y"); apply (subgoal_tac "Lambda(xa^y) <= ln(real(xa^y))"); apply (subgoal_tac "ln(real(xa^y)) <= ln(real(x))"); apply force; apply (simp only: ln_le_cancel_iff); apply (simp add: Lambda_prop); apply (subgoal_tac "xa^1 <= xa^y"); apply (subgoal_tac "0 < xa"); apply force; apply (subgoal_tac "2 <= xa"); apply force; apply (simp add: prime_ge_2); apply (subgoal_tac "1 <= y"); apply (rule power_increasing); apply auto; apply (subgoal_tac "2 <= xa"); apply force; apply (auto simp add: prime_ge_2); done; (* lemma (in l) sum_over_E_of_Lambda_o_f: "0 < x ==> setsum (Lambda o f) E <= real(x) * ln(real(x)) * ln(real(x)) / ln 2"; apply (subgoal_tac "setsum (Lambda o f) E <= real(card E) * ln(real(x))"); apply (subgoal_tac "real(card E) <= real(x) * ln(real x)/ln(2)"); apply (subgoal_tac "real(card E) * ln(real(x)) <= real(x) * ln(real x)/ln(2) * ln(real(x))"); apply (subgoal_tac "setsum (Lambda o f) E <= real(x) * ln(real x)/ln(2) * ln(real(x))"); apply force; apply force; apply (subgoal_tac "0 <= ln(real(x))"); apply (rule mult_right_mono); apply force; apply (subgoal_tac "1 <= x"); apply (simp add: ln_ge_zero); apply force; apply (subgoal_tac "1 <= x"); apply (simp add: ln_ge_zero); apply force; apply (simp add: card_E_real); apply (subgoal_tac "real (card E) * ln (real x) = ln (real x) * real (card E)"); apply (erule ssubst); apply (rule setsum_bound_real); apply (simp add: finite_E); apply (rule ballI); apply (rule E_bound); apply auto; done; *) lemma (in l) sum_over_E2_of_Lambda_o_f: "0 < x ==> setsum (Lambda o f) E <= real(nat(floor(real(x) powr (1/2)))) * ln(real(x)) * ln(real(x)) / ln 2"; apply (subgoal_tac "setsum (Lambda o f) E <= real(card E) * ln(real(x))"); apply (subgoal_tac "real(card E) <= real(nat(floor(real(x) powr (1/2)))) * ln(real x)/ln(2)"); apply (subgoal_tac "real(card E) * ln(real(x)) <= real(nat(floor(real(x) powr (1/2)))) * ln(real x)/ln(2) * ln(real(x))"); apply (subgoal_tac "setsum (Lambda o f) E <= real(nat(floor(real(x) powr (1/2)))) * ln(real x)/ln(2) * ln(real(x))"); apply force; apply force; apply (subgoal_tac "0 <= ln(real(x))"); apply (rule mult_right_mono); apply force; apply (subgoal_tac "1 <= x"); apply (simp add: ln_ge_zero); apply force; apply (subgoal_tac "1 <= x"); apply (simp add: ln_ge_zero); apply force; apply (simp add: card_E2_real); apply (subgoal_tac "real (card E) * ln (real x) = ln (real x) * real (card E)"); apply (erule ssubst); apply (rule setsum_bound_real); apply (simp add: finite_E); apply (rule ballI); apply (rule E_bound); apply auto; done; (* lemma (in l) psi_theta_bound: "0 < x ==> psi(x) <= theta(x) + real(x) * ln(real(x)) * ln(real(x)) / ln 2"; apply (subgoal_tac "psi(x) = theta(x) + setsum (Lambda o f) E"); apply (subgoal_tac "setsum (Lambda o f) E <= real(x) * ln(real(x)) * ln(real(x)) / ln 2"); apply auto; apply (auto simp add: psi_theta_sum sum_over_E_of_Lambda_o_f); done; *) lemma (in l) psi_theta_bound_for_real_aux: "0 < x ==> psi(x) <= theta(x) + real(nat(floor(real(x) powr (1/2)))) * ln(real(x)) * ln(real(x)) / ln 2"; apply (subgoal_tac "psi(x) = theta(x) + setsum (Lambda o f) E"); apply (subgoal_tac "setsum (Lambda o f) E <= real(nat(floor(real(x) powr (1/2)))) * ln(real(x)) * ln(real(x)) / ln 2"); apply auto; apply (auto simp add: psi_theta_sum sum_over_E2_of_Lambda_o_f); done; lemma psi_theta_bound_for_real: "0 < x ==> psi(x) <= theta(x) + real(x) powr (1/2) * ln(real(x)) * ln(real(x)) / ln 2"; apply (rule order_trans); apply (erule l.psi_theta_bound_for_real_aux); apply (rule add_left_mono); apply (rule divide_right_mono); apply (rule mult_right_mono)+; apply (subgoal_tac "nat(floor (?t)) = natfloor(?t)"); apply (erule ssubst); apply (rule real_natfloor_le); apply (rule order_less_imp_le); apply (rule powr_gt_zero); apply (simp add: natfloor_def); apply auto; done; subsection {* Comparing pi and theta *} lemma pi_set_zero: "finite A ==> ALL x:A. x~:prime ==> setsum char_prime A = 0"; apply (rule setsum_0'); apply (unfold char_prime_def); apply auto; done; lemma setsum_prime_split: "setsum f {p. p<=x} = setsum f {p. p<=x & p:prime} + setsum f {p. p<=x & p~:prime}"; apply (simp add: prime_partition_le); apply (rule setsum_Un_disjoint); apply auto; apply (auto intro: finite_subset_AtMost_nat); done; lemma setsum_char_prime_zero: "setsum char_prime {p. p<=x & p~:prime} = 0"; apply (rule pi_set_zero); by (auto intro: finite_subset_AtMost_nat); lemma pi_setsum_equiv: "pi(x) = setsum char_prime {p. p<=x}"; apply (auto simp add: pi_def char_prime_def); apply (simp add: setsum_prime_split); apply (simp add: setsum_char_prime_zero); apply (subgoal_tac "setsum char_prime {p::nat. p <= x & p : prime} = setsum (%x. 1) {p::nat. p <= x & p : prime}"); apply (erule ssubst); apply (subst real_card_eq_setsum); apply (force intro: finite_subset_AtMost_nat); apply simp; apply (rule setsum_cong [of "{p::nat. p <= x & p : prime}" "{p::nat. p <= x & p : prime}" "char_prime" "%x. 1"]); apply (auto simp add: char_prime_def); done; lemma pi_sumr_equiv: "pi(x) = sumr 0 (x+1) char_prime"; apply (simp only: pi_setsum_equiv); apply (subgoal_tac "{p::nat. p <= x} = {0..x}"); apply (erule ssubst); apply (auto simp add: setsum_sumr2); done; lemma pi_Suc: "pi(Suc x) = char_prime(Suc x) + pi(x)"; apply (case_tac "(Suc x):prime"); apply (simp add: pi_def char_prime_def); apply (subgoal_tac "{y::nat. y <= Suc x & y : prime} = {y::nat. y <= x & y : prime} Un {Suc x}"); apply (erule ssubst); apply (subst card_Un_disjoint); apply (force intro: finite_subset_AtMost_nat); apply simp; apply force; apply simp; apply auto; apply (simp add: pi_def char_prime_def); apply (rule arg_cong);back; apply auto; apply (case_tac "xa = Suc x"); apply auto; done; lemma char_prime_def_eq: "1 <= n ==> (theta(n+1) - theta(n)) / ln(real(n+1)) = char_prime(n+1)"; apply (auto simp add: theta_def); apply (case_tac "Suc n:prime"); apply (auto simp add: lprime_def char_prime_def real_divide_def); done; lemma nat_int_inj_on: "inj_on (%x. nat x) {p. p:zprime & (p dvd x)}"; apply (rule inj_onI); apply auto; apply (rule int_nat_inj); apply (auto simp add: zprime_pos); done; lemma int_nat_inj_on: "inj_on int {p. p:prime & p dvd x}"; apply (rule inj_onI); apply auto; done; subsection {* Expressing ln in terms of Lambda *} lemma ln_product_sum: "finite A ==> ALL x:A. (0 < f(x)) ==> ln (setprod f A) = setsum (ln o f) A"; apply (induct set: Finites); apply (simp add: setprod_def setsum_def); apply (simp add: setprod_insert setsum_insert); apply (subst ln_mult); apply (auto simp add: setprod_pos o_def); done; lemma multiplicity_eq_1: "1 < n ==> ln(real n) = ln(setprod (%p. (real p)^(multiplicity p n)) {p. 0 < p & p : zprime & p dvd n})"; apply (subst ln_inj_iff); apply force; apply (rule setprod_pos); apply auto; apply (subgoal_tac "{p. 0 < p ∧ p ∈ zprime ∧ p dvd n} = {p. p ∈ zprime ∧ p dvd n}"); apply (erule ssubst); apply (rule setprod_multiplicity_real); apply (auto simp add: zprime_def); done; lemma divisor_set_fact: "1 < n ==> {p::int. 0 < p & p : zprime & p dvd n} <= {-n..n}"; apply auto; apply (subgoal_tac "(-n <= x) = (-x <= n)"); apply (erule ssubst); apply (simp add: zdvd_imp_le); apply auto; done; lemma multiplicity_eq_2: "1 < n ==> ln(real n) = setsum (%p. ln ((real p)^(multiplicity p n))) {p. 0 < p & p : zprime & p dvd n}"; apply (subst multiplicity_eq_1); apply (assumption); apply (subst ln_product_sum); apply (force intro: finite_subset_GreaterThan0AtMost_int zdvd_imp_le); apply force; apply (simp add: o_def); done; lemma multiplicity_eq_3: "1 < n ==> ln(real n) = setsum (%p. real(multiplicity p n) * ln(real p)) {p. 0 < p & p : zprime & p dvd n}"; apply (subst multiplicity_eq_2, assumption); apply (rule setsum_cong); apply (rule refl); apply (subst ln_realpow); apply force; apply (rule refl); done; lemma (in l) finite_G: "0 < x ==> finite G"; apply (unfold G_def); apply (rule finite_subset_GreaterThan0AtMost_nat); apply (auto intro: dvd_imp_le); done; lemma (in l) G_fact: "0 < x ==> G = (G Int A) Un (G Int B)"; by (auto simp add: G_def A_def B_def dvd_def); lemma (in l) Lambda_over_G_lemma1: "0 < x ==> setsum Lambda G = setsum Lambda ((G Int A) Un (G Int B))"; apply (rule setsum_cong); apply (simp only: G_fact [THEN sym]); by auto; lemma (in l) Lambda_over_G_lemma2: "0 < x ==> setsum Lambda G = setsum Lambda (G Int A) + setsum Lambda (G Int B)"; apply (subgoal_tac "setsum Lambda G = setsum Lambda ((G Int A) Un (G Int B))"); apply (erule ssubst); apply (subst setsum_Un_disjoint); apply (simp add: finite_subset finite_G); apply (simp add: finite_subset finite_G); apply (subgoal_tac "G Int A Int (G Int B) = G Int (A Int B)"); apply (erule ssubst); apply (simp add: A_B_disjoint); apply force; apply (rule refl); apply (subst G_fact [THEN sym]); apply assumption; apply (rule refl); done; lemma (in l) Lambda_over_G_lemma3: "0 < x ==> setsum Lambda (G Int B) = 0"; apply (rule setsum_0'); apply (insert B_kernel_for_Lambda, blast); done; lemma (in l) Lambda_over_G_lemma4: "0 < x ==> setsum Lambda G = setsum Lambda (G Int A)"; apply (auto simp add: Lambda_over_G_lemma2 Lambda_over_G_lemma3); done; lemma (in l) G_Int_A_Un_over_J: "G Int A = UNION J (%p. H(p) Int G)"; apply (auto simp add: G_def A_def J_def H_def); apply (rule_tac x = "p" in exI); apply auto; apply (subgoal_tac "p dvd p^a"); prefer 2; apply (case_tac a); apply auto; apply (rule dvd_trans); apply auto; done; lemma (in l) finite_J: "0 < x ==> finite J"; apply (simp add: J_def); apply (rule finite_subset_GreaterThan0AtMost_nat); apply auto; apply (erule prime_pos); apply (erule dvd_imp_le); apply assumption; done; lemma (in l) finite_H_p: "0 < x ==> finite (H(p))"; apply (simp add: H_def); apply (rule finite_subset_AtMost_nat); apply auto; done; lemma (in l) different_H: "0 < x ==> p1:prime ==> p2:prime ==> p1 ~= p2 ==> H(p1) Int H(p2) = {}"; apply (auto simp add: H_def); apply (simp add: prime_prop); done; lemma (in l) setsum_Lambda_G_lemma1: "0 < x ==> setsum Lambda G = setsum (%p. setsum Lambda (H(p) Int G)) J"; apply (simp add: Lambda_over_G_lemma4); apply (simp only: G_Int_A_Un_over_J); apply (rule setsum_UN_disjoint [of "J" "(%p. H(p) Int G)" "Lambda"]); apply (rule finite_J); apply (assumption); apply (force intro: finite_H_p); apply auto; apply (subgoal_tac "xa: H p Int H j"); apply (subgoal_tac "H p Int H j = {}"); apply simp; apply (simp add: J_def different_H); apply (rule IntI); apply auto; done; lemma (in l) inj_on_prime_power: "inj_on (%x. (p::nat)^x) {1..nmult p x}"; apply (auto); apply (rule inj_onI); apply (case_tac "p:prime"); apply (auto simp add: prime_prop2); apply (simp add: nmult_def); apply (subgoal_tac "multiplicity (int p) (int x) = 0"); apply simp; apply (subgoal_tac "(int p)~:zprime"); apply (rule not_zprime_multiplicity_eq_0 [of "int p" "int x"]); apply auto; apply (simp add: int_prime_prop); done; lemma nat_int_dvd: "(int(x) dvd int(y)) = (x dvd y)"; apply (simp only: zdvd_iff_zmod_eq_0); apply (simp only: dvd_eq_mod_eq_0); apply auto; apply (auto simp add: mod_eq_0_iff); apply (case_tac "0 <= q"); apply (rule_tac x = "nat q" in exI); apply (auto simp add: int_eq_iff); apply (auto simp add: nat_mult_distrib); apply (auto simp add: zmod_eq_0_iff); apply (rule_tac x = "int q" in exI); apply (auto simp add: zmult_int); done; lemma nat_zmult_multiplicity_lemma1: "(int p) ^ multiplicity (int p) (int n) dvd (int n)"; apply (auto simp add: multiplicity_zdvd); done; lemma nat_zmult_multiplicity_lemma2: "int (p ^ multiplicity (int p) (int n)) dvd (int n)"; apply (auto simp add: zpow_int nat_zmult_multiplicity_lemma1); done; lemma nat_zmult_multiplicity: "p ^ multiplicity (int p) (int n) dvd n"; apply (auto simp add: nat_int_dvd [THEN sym]); apply (auto simp add: nat_zmult_multiplicity_lemma2); done; lemma power_dvd_prop: "p^b dvd (x::nat) ==> a <= b ==> p^a dvd x"; apply (auto simp add: dvd_def); apply (rule_tac x = "k * (p ^ (b-a))" in exI); apply auto; apply (auto simp add: power_add [THEN sym]); done; lemma power_le_prop1 [rule_format]: "1 <= (p::nat) ==> a <= b --> p^a <= p^b"; apply (induct_tac b); apply auto; apply (subgoal_tac "a = Suc n"); apply auto; apply (subgoal_tac "p^n <= p*p^n"); apply (simp only: le_trans [of "p^a" "p^n" "p*p^n"]); apply auto; done; lemma power_le_prop: "1 < p ==> p^b <= (x::nat) ==> a <= b ==> p^a <= x"; apply (subgoal_tac "p^a <= p^b"); apply auto; apply (auto simp add: power_le_prop1); done; lemma nat_zmult_multiplicity_le: "0<n ==> p ^ multiplicity (int p) (int n) <= n"; apply (subgoal_tac "p^multiplicity (int p) (int n) dvd n"); apply (simp add: dvd_imp_le); apply (simp add: nat_zmult_multiplicity); done; lemma multiplicity_power_dvd: "0<n ==> p:prime ==> (k <= multiplicity (int p) (int n)) = (p^k dvd n)"; apply auto; apply (subgoal_tac "p^multiplicity (int p) (int n) dvd n"); apply (rule power_dvd_prop); apply assumption+; apply (simp add: nat_zmult_multiplicity); apply (subgoal_tac "(int p):zprime"); apply (subgoal_tac "(int p)^k dvd (int n)"); apply (simp add: aux9); apply (subgoal_tac "int p ^ k = int(p^k)"); apply (erule ssubst); apply (simp only: nat_int_dvd [THEN sym]); apply (simp only: zpow_int [THEN sym]); apply (auto simp add: int_prime_prop); done; lemma multiplicity_power_dvd_imp1: "0 < n ==> p : prime ==> p ^ k dvd n ==> k <= multiplicity (int p) (int n)"; apply (subst multiplicity_power_dvd); apply assumption+; done; lemma (in l) G_Int_Hp_eq: "0 < x ==> p:prime ==> (%x. p^x) ` {1..nmult p x} = G Int H(p)"; apply auto; apply (simp add: G_def); apply (simp add: nmult_def); apply auto; apply (subgoal_tac "2 <= p"); apply (simp); apply (simp add: prime_ge_2); apply (subgoal_tac "1 < p"); apply (subgoal_tac "p ^ multiplicity (int p) (int x) dvd x"); apply (rule power_dvd_prop); apply assumption+; apply (simp add: nat_zmult_multiplicity); apply (simp add: prime_ge_2); apply (subgoal_tac "2 <= p"); apply simp; apply (rule prime_ge_2,assumption); apply (unfold H_def nmult_def); apply clarsimp; apply (rule conjI); apply (subgoal_tac "1 < p"); apply (subgoal_tac "p ^ multiplicity (int p) (int x) <= x"); apply (rule power_le_prop); apply assumption+; apply (subgoal_tac "p ^ multiplicity (int p) (int x) <= x"); apply (subgoal_tac "1 < p"); apply (rule power_le_prop); apply assumption+; apply force; apply assumption; apply (simp add: nat_zmult_multiplicity_le); apply (subgoal_tac "2 <= p"); apply simp; apply (erule prime_ge_2); apply (rule_tac x = "xa" in exI); apply simp; apply (unfold G_def image_def); apply simp; apply clarify; apply (rule_tac x = a in bexI); apply (rule refl); apply auto; apply (subst multiplicity_power_dvd); apply auto; apply (subgoal_tac "0 < p ^ a"); apply (erule order_less_le_trans);back;back; apply assumption; apply auto; done; lemma (in l) card_multiplicity_eq: "0 < x ==> p:prime ==> card(G Int H(p)) = multiplicity (int p) (int x)"; apply (subst G_Int_Hp_eq [THEN sym]); apply assumption+; apply (subst card_image); apply simp; apply (rule inj_on_prime_power); apply (simp add: nmult_def); done; lemma (in l) setsum_Lambda_G_int_Hp: "0 < x ==> p:prime ==> setsum Lambda (G Int H(p)) = ln (real p) * real (multiplicity (int p) (int x))"; proof -; assume "0 < x" and "p:prime"; have "ALL x:(G Int H(p)). Lambda x = ln (real p)"; by (auto simp add: G_def H_def prems Lambda_eq); then have "setsum Lambda (G Int H(p)) = setsum (%x. ln (real p)) (G Int H(p))"; apply (intro setsum_cong); apply (rule refl); apply (erule bspec); apply assumption; done; also have "… = real(card (G Int H(p))) * ln (real p)"; apply (subst setsum_constant); apply (rule finite_subset); prefer 2; apply (rule finite_G); apply (rule prems); apply force; apply (simp add: real_eq_of_nat); done; also have "card (G ∩ H p) = multiplicity (int p) (int x)" by (rule card_multiplicity_eq); finally show ?thesis; by simp; qed; lemma (in l) setsum_Lambda_G_lemma2: "0 < x ==> setsum Lambda G = setsum (%p. ln (real p) * real (multiplicity (int p) (int x))) J"; apply (subst setsum_Lambda_G_lemma1); apply assumption; apply (rule setsum_cong); apply (rule refl); apply (subgoal_tac "H xa Int G = G Int H xa"); apply (erule ssubst); apply (erule setsum_Lambda_G_int_Hp); apply (simp add: J_def); apply auto; done; lemma multiplicity_eq_4: "0 < n ==> ln(real n) = setsum (%p. real(multiplicity p n) * ln(real p)) {p. 0 < p & p : zprime & p dvd n}"; apply (subgoal_tac "n = 1 | 1 < n"); apply (erule disjE); apply (simp add: multiplicity_p_1_eq_0 setsum_0); apply (elim multiplicity_eq_3); apply force; done; lemma multiplicity_eq_5: "0 < n ==> ln(real n) = setsum (%p. real(multiplicity (int p) (int n)) * ln(real p)) {p. 0 < p & p : prime & p dvd n}"; apply (subgoal_tac "real n = real (int n)"); apply (erule ssubst); apply (subst multiplicity_eq_4); apply force; apply (rule setsum_reindex_cong); apply (rule finite_subset_AtMost_nat); apply clarify; apply (erule dvd_imp_le); apply assumption; apply (subgoal_tac "inj_on int {p. 0 < p ∧ p ∈ prime ∧ p dvd n}"); apply assumption; apply (force simp add: inj_on_def); apply (unfold image_def); apply auto; apply (rule_tac x = "nat x" in exI); apply (auto simp add: nat_prime_prop); apply (subgoal_tac "nat x dvd nat (int n)"); apply simp; apply (rule nat_int_dvd_prop); apply assumption; apply assumption; apply (simp add: int_nat_dvd_prop); apply (rule ext); apply (unfold o_def); apply (subgoal_tac "real p = real (int p)"); apply (erule subst); apply (rule refl); apply simp; done; lemma ln_eq_setsum_Lambda: "0 < (n::nat) ==> ln (real n) = setsum Lambda {d. d dvd n}"; apply (subgoal_tac "{d. d dvd n} = {d. 0 < d & d dvd n}"); apply (erule ssubst); apply (subst l.setsum_Lambda_G_lemma2); apply assumption; apply (subst multiplicity_eq_5); apply assumption; apply (rule setsum_cong); apply auto; apply (rule prime_pos); apply assumption; apply (erule dvd_pos_pos); apply assumption; done; lemma ln_eq_setsum_Lambda2: "0 < n ==> ln (real n) = (∑x:{(p, a). 0 < a & p : prime & p ^ a dvd n}. ln (real (fst x)))"; proof -; assume "0 < (n::nat)"; have "ln (real n) = (∑d:{d. d dvd n}. Lambda d)"; by (rule ln_eq_setsum_Lambda); also have "... = (∑d:{d. d dvd n & (EX p a. 0 < a & p : prime & d = p ^ a)}. Lambda d) + (∑d:{d. d dvd n & ~(EX p a. 0 < a & p : prime & d = p ^ a)}. Lambda d)" (is "... = ?term1 + ?term2"); apply (subst setsum_Un_disjoint [THEN sym]); apply (rule finite_subset); prefer 2; apply (rule finite_nat_dvd_set); apply (rule prems); apply force; apply (rule finite_subset); prefer 2; apply (rule finite_nat_dvd_set); apply (rule prems); apply force; apply blast; apply (rule setsum_cong); apply blast; apply force; done; also have "?term2 = 0"; apply (rule setsum_0'); apply (rule ballI); apply (rule Lambda_eq2); apply auto; done; also have "?term1 + 0 = ?term1"; by simp; also have "... = (∑x:{(p,a). 0 < a & p : prime & p^a dvd n}. Lambda((%x. (fst x)^(snd x))x))"; apply (subst setsum_reindex' [THEN sym]);back; apply (rule finite_subset); prefer 2; apply (rule l.finite_C [of n]); apply auto; apply (erule dvd_imp_le); apply (rule prems); apply (rule subset_inj_on); prefer 2; apply (rule l.inj_on_C); apply auto; apply (erule dvd_imp_le); apply (rule prems); apply (rule setsum_cong); apply (auto simp add: image_def); done; finally show ?thesis; apply (elim ssubst); apply (rule setsum_cong2); apply (rule Lambda_eq); apply auto; done; qed; end;
lemma prime_prop2:
[| a ∈ prime; b ∈ prime; 0 < n; a dvd b ^ n |] ==> a = b
lemma dvd_self_exp:
0 < n ==> m dvd m ^ n
lemma prime_prop:
[| a ∈ prime; b ∈ prime; 0 < c; 0 < d; a ^ c = b ^ d |] ==> a = b
lemma power_lemma:
[| 1 < a; 0 < c |] ==> 1 < a ^ c
lemma prime_prop_lzero:
[| a ∈ prime; b ∈ prime; 0 < c; a ^ c = b ^ d |] ==> a = b
lemma prime_prop_rzero:
[| a ∈ prime; b ∈ prime; 0 < d; a ^ c = b ^ d |] ==> a = b
lemma prime_prop2:
[| a ∈ prime; b ∈ prime; 0 < c; 0 < d; a ^ c = b ^ d |] ==> c = d
lemma prime_prop_pair:
[| fst x ∈ prime; fst y ∈ prime; 0 < snd x; 0 < snd y; fst x ^ snd x = fst y ^ snd y |] ==> x = y
lemma real_addition:
c * real (Suc x) = c + c * real x
lemma setsum_bound_real:
[| finite A; ∀x∈A. f x ≤ c |] ==> setsum f A ≤ c * real (card A)
lemma sumr_suc:
sumr 0 x f + f x = sumr 0 (x + 1) f
lemma real_power:
(a ^ b ≤ x) = (real a ^ b ≤ real x)
lemma zprime_pos:
x ∈ zprime ==> 0 < x
lemma int_nat_inj:
[| nat x = nat y; 0 < x; 0 < y |] ==> x = y
lemma setprod_multiplicity_real:
0 < n ==> real n = (∏p∈{p. p ∈ zprime ∧ p dvd n}. real p ^ multiplicity p n)
lemma multiplicity_nmult_eq:
multiplicity x y = nmult (nat x) (nat y)
lemma Lambda_eq_aux:
[| p ∈ prime; 0 < a |] ==> (THE pa. pa ∈ prime ∧ (∃aa. pa ^ aa = p ^ a)) = p
lemma Lambda_eq:
[| p ∈ prime; 0 < a |] ==> Lambda (p ^ a) = ln (real p)
lemma Lambda_eq2:
¬ (∃p a. p ∈ prime ∧ p ^ a = x ∧ 0 < a) ==> Lambda x = 0
lemma Lambda_zero:
Lambda 0 = 0
lemma Lambda_ge_zero:
0 ≤ Lambda x
lemma psi_diff1:
psi (x + 1) - psi x = Lambda (x + 1)
lemma psi_diff2:
1 ≤ x ==> Lambda x = psi x - psi (x - 1)
lemma psi_zero:
psi 0 = 0
lemma psi_plus_one:
psi (x + 1) = psi x + Lambda (x + 1)
lemma psi_def_alt:
psi x = setsum Lambda {1..x}
lemma psi_mono:
x ≤ y ==> psi x ≤ psi y
lemma psi_ge_zero:
0 ≤ psi x
lemma theta_geq_zero:
0 ≤ theta n
lemma theta_zero:
theta 0 = 0
lemma theta_1_is_0:
theta 1 = 0
lemma big_lemma1:
Chebyshev1.pi 2 = 1
lemma theta_setsum_eq1:
theta x = setsum lprime {0..x}
lemma prime_partition:
{p. p < x} = {p. p < x ∧ p ∈ prime} ∪ {p. p < x ∧ p ∉ prime}
lemma prime_partition_le:
{p. p ≤ x} = {p. p ≤ x ∧ p ∈ prime} ∪ {p. p ≤ x ∧ p ∉ prime}
lemma all_nonprime_set_l:
[| finite A; ∀x∈A. x ∉ prime |] ==> setsum lprime A = 0
lemma finite_A:
finite {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}
lemma finite_B:
finite {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}
lemma A_B_disjoint:
{y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} ∩ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} = {}
lemma A_B_all:
{y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} ∪ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} = {y. y ≤ x}
lemma cor_psi_sum:
psi x = setsum Lambda {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} + setsum Lambda {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}
lemma B_kernel_for_Lambda:
y ∈ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} ==> Lambda y = 0
lemma sum_over_B_of_Lambda_zero:
setsum Lambda {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} = 0
lemma inj_on_C:
inj_on (%y. fst y ^ snd y) {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma range_of_C_is_A:
(%y. fst y ^ snd y) ` {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}} = {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}
lemma finite_C:
finite {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma D_subset_C:
{(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} ⊆ {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma E_subset_C:
{(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} ⊆ {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma Lambda_reindex_1:
setsum Lambda ((%y. fst y ^ snd y) ` {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}) = setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma psi_Lambda_eq_over_C:
psi x = setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}
lemma psi_alt_def:
psi x = (∑u∈{(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}}. Lambda (fst u ^ snd u))
lemma C_eq_D_Un_E:
{(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}} = {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} ∪ {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}
lemma D_Int_E_empty:
{(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} ∩ {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} = {}
lemma finite_D:
finite {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}}
lemma finite_E:
finite {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}
lemma setsum_C_D_E:
setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 0 < a ∧ p ^ a ∈ {0..x}} = setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} + setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}
lemma psi_Lambda_eq:
psi x = setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} + setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}
lemma inj_on_g_F:
inj_on (%z. (z, 1)) {p. p ∈ prime ∧ p ∈ {0..x}}
lemma g_image_F_is_D:
(%z. (z, 1)) ` {p. p ∈ prime ∧ p ∈ {0..x}} = {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}}
lemma finite_F:
finite {p. p ∈ prime ∧ p ∈ {0..x}}
lemma reindex_Lambda_f_g:
setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ a = 1 ∧ p ^ a ∈ {0..x}} = setsum (Lambda ˆ (%y. fst y ^ snd y) ˆ (%z. (z, 1))) {p. p ∈ prime ∧ p ∈ {0..x}}
lemma aux1:
[| 1 < a; 0 < b |] ==> Suc 0 < a ^ b
lemma aux2:
1 < a ∧ 1 < b ==> a < a ^ b
lemma aux3:
[| p ∈ prime; 1 < a |] ==> p ^ a ∉ prime
lemma prime_power_must_be_one:
[| p ∈ prime; p ^ a ∈ prime |] ==> a = 1
lemma F_prop:
p ∈ {p. p ∈ prime ∧ p ∈ {0..x}} --> Lambda (fst (p, 1) ^ snd (p, 1)) = ln (real p)
lemma sum_over_F:
setsum (Lambda ˆ (%y. fst y ^ snd y) ˆ (%z. (z, 1))) {p. p ∈ prime ∧ p ∈ {0..x}} = setsum (ln ˆ real) {p. p ∈ prime ∧ p ∈ {0..x}}
lemma sum_over_F2_lemma1:
setsum lprime {0..x} = setsum lprime ({p. p ≤ x ∧ p ∈ prime} ∪ {p. p ≤ x ∧ p ∉ prime})
lemma sum_over_F2_lemma2:
setsum lprime ({p. p ≤ x ∧ p ∈ prime} ∪ {p. p ≤ x ∧ p ∉ prime}) = setsum lprime {p. p ≤ x ∧ p ∈ prime} + setsum lprime {p. p ≤ x ∧ p ∉ prime}
lemma l_set_of_primes:
∀x∈P. x ∈ prime ==> setsum lprime P = setsum (ln ˆ real) P
lemma sum_over_F2:
setsum (ln ˆ real) {p. p ∈ prime ∧ p ∈ {0..x}} = theta x
lemma psi_theta_sum:
psi x = theta x + setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}
lemma exponent_eq_0_iff:
[| 2 ≤ p; Suc 0 = p ^ a |] ==> a = 0
lemma Lambda_positive:
∀x∈{(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}. 0 ≤ Lambda (fst x ^ snd x)
lemma real_power_ln:
[| 1 < a; 0 < x |] ==> (a ^ b ≤ x) = (real b ≤ ln (real x) / ln (real a))
lemma extent_of_E2:
{(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} ⊆ {1..nat ⌊real x powr (1 / 2)⌋} × {1..nat ⌊ln (real x) / ln 2⌋}
lemma card_E2_lemma:
card {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} ≤ card ({1..nat ⌊real x powr (1 / 2)⌋} × {1..nat ⌊ln (real x) / ln 2⌋})
lemma card_E2_lemma2:
card ({1..nat ⌊real x powr (1 / 2)⌋} × {1..nat ⌊ln (real x) / ln 2⌋}) = card {1..nat ⌊real x powr (1 / 2)⌋} * card {1..nat ⌊ln (real x) / ln 2⌋}
lemma card_E2_lemma3:
card ({1..nat ⌊real x powr (1 / 2)⌋} × {1..nat ⌊ln (real x) / ln 2⌋}) ≤ card {1..nat ⌊real x powr (1 / 2)⌋} * card {1..nat ⌊ln (real x) / ln 2⌋}
lemma card_E2:
card {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} ≤ card {1..nat ⌊real x powr (1 / 2)⌋} * card {1..nat ⌊ln (real x) / ln 2⌋}
lemma card_E2_real_lemma4:
real ⌊ln (real x) / ln 2⌋ ≤ ln (real x) / ln 2
lemma real_card_E2:
real (card {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}) ≤ real (card {1..nat ⌊real x powr (1 / 2)⌋} * card {1..nat ⌊ln (real x) / ln 2⌋})
lemma card_E2_real_lemma6:
0 < x ==> real (card {1..nat ⌊ln (real x) / ln 2⌋}) ≤ ln (real x) / ln 2
lemma card_E2_real:
0 < x ==> real (card {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}}) ≤ real (nat ⌊real x powr (1 / 2)⌋) * ln (real x) / ln 2
lemma E_bound_with_f:
y ∈ {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} --> fst y ^ snd y ≤ x
lemma Lambda_prop:
∀x. 0 < x --> Lambda x ≤ ln (real x)
lemma E_bound:
[| 0 < x; y ∈ {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} |] ==> (Lambda ˆ (%y. fst y ^ snd y)) y ≤ ln (real x)
lemma sum_over_E2_of_Lambda_o_f:
0 < x ==> setsum (Lambda ˆ (%y. fst y ^ snd y)) {(p, a). p ∈ prime ∧ 1 < a ∧ p ^ a ∈ {0..x}} ≤ real (nat ⌊real x powr (1 / 2)⌋) * ln (real x) * ln (real x) / ln 2
lemma psi_theta_bound_for_real_aux:
0 < x ==> psi x ≤ theta x + real (nat ⌊real x powr (1 / 2)⌋) * ln (real x) * ln (real x) / ln 2
lemma psi_theta_bound_for_real:
0 < x ==> psi x ≤ theta x + real x powr (1 / 2) * ln (real x) * ln (real x) / ln 2
lemma pi_set_zero:
[| finite A; ∀x∈A. x ∉ prime |] ==> setsum char_prime A = 0
lemma setsum_prime_split:
setsum f {p. p ≤ x} = setsum f {p. p ≤ x ∧ p ∈ prime} + setsum f {p. p ≤ x ∧ p ∉ prime}
lemma setsum_char_prime_zero:
setsum char_prime {p. p ≤ x ∧ p ∉ prime} = 0
lemma pi_setsum_equiv:
Chebyshev1.pi x = setsum char_prime {p. p ≤ x}
lemma pi_sumr_equiv:
Chebyshev1.pi x = sumr 0 (x + 1) char_prime
lemma pi_Suc:
Chebyshev1.pi (Suc x) = char_prime (Suc x) + Chebyshev1.pi x
lemma char_prime_def_eq:
1 ≤ n ==> (theta (n + 1) - theta n) / ln (real (n + 1)) = char_prime (n + 1)
lemma nat_int_inj_on:
inj_on nat {p. p ∈ zprime ∧ p dvd x}
lemma int_nat_inj_on:
inj_on int {p. p ∈ prime ∧ p dvd x}
lemma ln_product_sum:
[| finite A; ∀x∈A. 0 < f x |] ==> ln (setprod f A) = setsum (ln ˆ f) A
lemma multiplicity_eq_1:
1 < n ==> ln (real n) = ln (∏p∈{p. 0 < p ∧ p ∈ zprime ∧ p dvd n}. real p ^ multiplicity p n)
lemma divisor_set_fact:
1 < n ==> {p. 0 < p ∧ p ∈ zprime ∧ p dvd n} ⊆ {- n..n}
lemma multiplicity_eq_2:
1 < n ==> ln (real n) = (∑p | 0 < p ∧ p ∈ zprime ∧ p dvd n. ln (real p ^ multiplicity p n))
lemma multiplicity_eq_3:
1 < n ==> ln (real n) = (∑p | 0 < p ∧ p ∈ zprime ∧ p dvd n. real (multiplicity p n) * ln (real p))
lemma finite_G:
0 < x ==> finite {d. 0 < d ∧ d dvd x}
lemma G_fact:
0 < x ==> {d. 0 < d ∧ d dvd x} = {d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} ∪ {d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}
lemma Lambda_over_G_lemma1:
0 < x ==> setsum Lambda {d. 0 < d ∧ d dvd x} = setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} ∪ {d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)})
lemma Lambda_over_G_lemma2:
0 < x ==> setsum Lambda {d. 0 < d ∧ d dvd x} = setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}) + setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)})
lemma Lambda_over_G_lemma3:
0 < x ==> setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ ¬ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)}) = 0
lemma Lambda_over_G_lemma4:
0 < x ==> setsum Lambda {d. 0 < d ∧ d dvd x} = setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)})
lemma G_Int_A_Un_over_J:
{d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃p a. p ∈ prime ∧ 0 < a ∧ p ^ a = y)} = (UN p:{p. p ∈ prime ∧ p dvd x}. {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)} ∩ {d. 0 < d ∧ d dvd x})
lemma finite_J:
0 < x ==> finite {p. p ∈ prime ∧ p dvd x}
lemma finite_H_p:
0 < x ==> finite {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)}
lemma different_H:
[| 0 < x; p1 ∈ prime; p2 ∈ prime; p1 ≠ p2 |] ==> {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p1 ^ a = y)} ∩ {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p2 ^ a = y)} = {}
lemma setsum_Lambda_G_lemma1:
0 < x ==> setsum Lambda {d. 0 < d ∧ d dvd x} = (∑p | p ∈ prime ∧ p dvd x. setsum Lambda ({y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)} ∩ {d. 0 < d ∧ d dvd x}))
lemma inj_on_prime_power:
inj_on (op ^ p) {1..nmult p x}
lemma nat_int_dvd:
(int x dvd int y) = (x dvd y)
lemma nat_zmult_multiplicity_lemma1:
int p ^ multiplicity (int p) (int n) dvd int n
lemma nat_zmult_multiplicity_lemma2:
int (p ^ multiplicity (int p) (int n)) dvd int n
lemma nat_zmult_multiplicity:
p ^ multiplicity (int p) (int n) dvd n
lemma power_dvd_prop:
[| p ^ b dvd x; a ≤ b |] ==> p ^ a dvd x
lemma power_le_prop1:
[| 1 ≤ p; a ≤ b |] ==> p ^ a ≤ p ^ b
lemma power_le_prop:
[| 1 < p; p ^ b ≤ x; a ≤ b |] ==> p ^ a ≤ x
lemma nat_zmult_multiplicity_le:
0 < n ==> p ^ multiplicity (int p) (int n) ≤ n
lemma multiplicity_power_dvd:
[| 0 < n; p ∈ prime |] ==> (k ≤ multiplicity (int p) (int n)) = (p ^ k dvd n)
lemma multiplicity_power_dvd_imp1:
[| 0 < n; p ∈ prime; p ^ k dvd n |] ==> k ≤ multiplicity (int p) (int n)
lemma G_Int_Hp_eq:
[| 0 < x; p ∈ prime |] ==> op ^ p ` {1..nmult p x} = {d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)}
lemma card_multiplicity_eq:
[| 0 < x; p ∈ prime |] ==> card ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)}) = multiplicity (int p) (int x)
lemma setsum_Lambda_G_int_Hp:
[| 0 < x; p ∈ prime |] ==> setsum Lambda ({d. 0 < d ∧ d dvd x} ∩ {y. y ∈ {0..x} ∧ (∃a. 0 < a ∧ p ^ a = y)}) = ln (real p) * real (multiplicity (int p) (int x))
lemma setsum_Lambda_G_lemma2:
0 < x ==> setsum Lambda {d. 0 < d ∧ d dvd x} = (∑p | p ∈ prime ∧ p dvd x. ln (real p) * real (multiplicity (int p) (int x)))
lemma multiplicity_eq_4:
0 < n ==> ln (real n) = (∑p | 0 < p ∧ p ∈ zprime ∧ p dvd n. real (multiplicity p n) * ln (real p))
lemma multiplicity_eq_5:
0 < n ==> ln (real n) = (∑p | 0 < p ∧ p ∈ prime ∧ p dvd n. real (multiplicity (int p) (int n)) * ln (real p))
lemma ln_eq_setsum_Lambda:
0 < n ==> ln (real n) = setsum Lambda {d. d dvd n}
lemma ln_eq_setsum_Lambda2:
0 < n ==> ln (real n) = (∑x∈{(p, a). 0 < a ∧ p ∈ prime ∧ p ^ a dvd n}. ln (real (fst x)))