(* Title: Mu.thy
Author: David Gray
*)
header {* Properties of the mu function *}
theory Mu = Radical:;
(**********************************************)
(* Good lemma -- but can we prove it without *)
(* resorting to using multiplicity stuff??? *)
(**********************************************)
lemma zdvd_zmult_not_zdvd_impl_zdvd: "[| p:zprime; 0 < d; 0 < a; (d::int) dvd a * p ; ~ p dvd d |] ==> d dvd a";
apply (rule_tac multiplicity_le_imp_zdvd, auto);
apply (case_tac "p = pa", auto);
proof-;
assume "~ p dvd d" and "0 < d";
then have "~ p mem pfactors d";
by (insert mem_pfactors_imp_zdvd [of d p], auto);
then have "multiplicity p d = 0";
by (auto simp add: multiplicity_def not_mem_numoccurs_eq_0);
thus "multiplicity p d <= multiplicity p a";
by auto;
next;
fix pa;
assume "p ~= pa";
assume "p:zprime" and "0 < a";
then have "0 < a * p";
by (insert prems, auto simp add: mult_pos zprime_def);
moreover assume "d dvd a * p";
ultimately have "ALL pq. (multiplicity pq d <= multiplicity pq (a * p))";
by (drule_tac zdvd_imp_multiplicity_le, auto);
then have "multiplicity pa d <= multiplicity pa (a * p)";
by auto;
also have "multiplicity pa (a * p) = multiplicity pa a + multiplicity pa p";
by (insert prems, auto simp add: multiplicity_zmult_distrib zprime_def);
also have "multiplicity pa p = 0";
by (insert prems, auto simp add: multiplicity_def pfactors_zprime);
finally show "multiplicity pa d <= multiplicity pa a" by auto;
qed;
(*********************)
(* The Real thing... *)
(*********************)
consts
mu :: "int => int";
defs
mu_def: "mu n ==
(if (n <= 1) then 1
else if (squarefree n) then
(if (even(int(length(pfactors n)))) then 1
else -1)
else 0)";
subsection {* Properties about mu *}
lemma mu_eq_1: "n <= 1 ==> mu (n) = 1";
by (auto simp add: mu_def);
lemma mu_zprime: "p:zprime ==> mu(p) = -1";
by (auto simp add: mu_def squarefree_def pfactors_zprime zprime_def);
lemma mu_squarefree1: "[| 1 <= n; ~squarefree(n) |] ==> mu(n) = 0";
apply (case_tac "~squarefree n");
apply (auto simp add: mu_def);
apply (simp add: squarefree_def);
done;
lemma mu_squarefree2: "[| 1 <= n; mu(n) ~= 0 |] ==> squarefree(n)";
proof-;
assume "1 <= n" and "mu(n) ~= 0";
moreover note mu_squarefree1;
ultimately show ?thesis by auto;
qed;
lemma aux1: "[| p:zprime; 1 < d; squarefree(d * p) |] ==> mu(d * p) = -1 * mu(d)";
apply (subgoal_tac "0 < d"); defer;
apply (force);
apply (subgoal_tac "1 < p"); defer;
apply (simp add: zprime_def);
apply (subgoal_tac "1 < d * p");defer;
apply (insert zmult_eq_1_iff [of d p] zero_less_mult_iff [of d p], force);
apply (subgoal_tac "length (pfactors (d * p)) = length(pfactors d) + 1");defer;
apply (simp add: pfactors_zprime_zmult_length);
apply (frule_tac x = d and y = p in squarefree_distrib1, force, force);
apply (frule_tac x = d and y = p in squarefree_distrib2, force, force);
apply (auto simp add: mu_def);
done;
lemma aux2: "[| p:zprime; 1 = d; squarefree(d * p) |] ==> mu(d * p) = -1 * mu(d)";
apply (auto simp add: mu_def length_pfactors_zprime zprime_def);
done;
lemma squarefree_mu_prop: "[| p:zprime; 1 <= d; squarefree(d * p) |] ==> mu(d * p) = -mu(d)";
apply (case_tac "1 = d");
apply (drule aux2, auto);
apply (subgoal_tac "1 < d");
apply (auto simp add: aux1);
done;
(* Get the parts for the mu property *)
(*******************************************)
(* A useful lemma... move to Finite2?? *)
(*******************************************)
lemma pos_pos_zdvd_finite: "(0::int) < m ==> finite {d. 0 < d & d dvd m}";
proof-;
assume "0 < m";
then have "{d. 0 < d & d dvd m} <= {d. 0 < d & d <= m}";
apply (auto);
apply (drule zdvd_bounds, auto);
done;
moreover have "finite {d. 0 < d & d <= m}";
apply (subgoal_tac "{d. 0 < d & d <= m} = {)0..m}");
apply (erule ssubst, auto);
done;
ultimately show ?thesis by (auto simp add: finite_subset);
qed;
(*********************************************)
(* Don't really know what to do with this... *)
(* It is essential to the proof below though *)
(*********************************************)
lemma zprime_zdvd_existence_rad: "1 < n ==> (hd (pdivisors n)):zprime & (hd (pdivisors n)) dvd (rad n)";
apply (case_tac "pdivisors n");
apply (frule pdivisors_gr_1, force);
apply (insert pdivisors_zprimel [of n]);
apply (subgoal_tac "a mem (pdivisors n)");
apply (auto simp add: mem_pdivisors_dvd_rad zprimel_def);
done;
(***********************)
(* Key Step Number One *)
(***********************)
lemma squarefree_subsets_prop1: "{d. (0::int) < d & d dvd n} =
{d. 0 < d & d dvd n & squarefree d} Un {d. 0 < d & d dvd n & ~squarefree d}";
by (auto);
lemma squarefree_subsets_prop2: "{d. 0 < d & d dvd n & squarefree d} Int {d. 0 < d & d dvd n & ~squarefree d} = {}";
by (auto);
lemma squarefree_subset1_finite: "(0::int) < n ==> finite {d. 0 < d & d dvd n & squarefree d}";
proof-;
assume "0 < n";
then have "finite {d. 0 < d & d dvd n}";
by (auto simp add: pos_pos_zdvd_finite);
moreover have "{d. 0 < d & d dvd n & squarefree d} <= {d. 0 < d & d dvd n}";
by (auto);
ultimately show ?thesis by (auto simp add: finite_subset);
qed;
lemma squarefree_subset2_finite: "(0::int) < n ==> finite {d. 0 < d & d dvd n & ~squarefree d}";
proof-;
assume "0 < n";
then have "finite {d. 0 < d & d dvd n}";
by (auto simp add: pos_pos_zdvd_finite);
moreover have "{d. 0 < d & d dvd n & ~squarefree d} <= {d. 0 < d & d dvd n}";
by (auto);
ultimately show ?thesis by (auto simp add: finite_subset);
qed;
lemma key_step1: "(0::int) < n ==>
setsum mu {d. 0 < d & d dvd n} =
setsum mu {d. 0 < d & d dvd n & squarefree d} + setsum mu {d. 0 < d & d dvd n & ~ squarefree d}";
proof-;
assume "0 < n";
then have "finite {d. 0 < d & d dvd n & squarefree d}" and
"finite {d. 0 < d & d dvd n & ~ squarefree d}";
by (insert squarefree_subset1_finite [of n] squarefree_subset2_finite [of n], auto);
moreover have "{d. (0::int) < d & d dvd n & squarefree d} Int {d. 0 < d & d dvd n & ~squarefree d} = {}";
by (auto simp add: squarefree_subsets_prop2);
ultimately have "setsum mu ({d. 0 < d & d dvd n & squarefree d} Un {d. 0 < d & d dvd n & ~ squarefree d}) =
setsum mu {d. 0 < d & d dvd n & squarefree d} + setsum mu {d. 0 < d & d dvd n & ~ squarefree d}";
by (rule setsum_Un_disjoint);
also have "{d. 0 < d & d dvd n & squarefree d} Un {d. 0 < d & d dvd n & ~ squarefree d} =
{d. 0 < d & d dvd n}"
by (auto simp add: squarefree_subsets_prop1);
finally show ?thesis .;
qed;
(*********************************)
(* Now go to key step number two *)
(*********************************)
lemma not_squarefree_setsum_prop: "0 < n ==> setsum mu {d. (0::int) < d & d dvd n & ~squarefree d} = 0";
proof-;
assume "0 < n";
then have "ALL x:{d. (0::int) < d & d dvd n & ~squarefree d}. mu x = (%x. 0) x";
by (auto simp add: mu_squarefree1);
moreover have p1: "finite {d. (0::int) < d & d dvd n & ~squarefree d}";
by (insert prems, auto simp add: squarefree_subset2_finite);
ultimately have "setsum mu {d. (0::int) < d & d dvd n & ~squarefree d} =
setsum (%x. 0) {d. (0::int) < d & d dvd n & ~squarefree d}";
by (rule_tac setsum_cong, auto);
also have "... = 0"
by (rule finite_induct, auto simp add: p1);
finally show ?thesis .;
qed;
lemma zdvd_squarefree_eq_zdvd_rad: "0 < n ==> {d. (0::int) < d & d dvd n & squarefree d} =
{d. 0 < d & d dvd rad(n)}";
apply (auto);
apply (rule squarefree_zdvd_imp_zdvd_rad, auto);
apply (subgoal_tac "rad n dvd n");
apply (frule zdvd_trans, auto);
apply (auto simp add: rad_zdvd);
apply (subgoal_tac "0 < rad n");
apply (subgoal_tac "squarefree (rad n)");
apply (frule_tac n = "rad n" in squarefree_zdvd_impl_squarefree);
apply (auto simp add: rad_squarefree);
apply (insert rad_min_gre_1 [of n], auto);
done;
lemma key_step2: "(0::int) < n ==>
setsum mu {d. 0 < d & d dvd n & squarefree d} + setsum mu {d. 0 < d & d dvd n & ~ squarefree d} =
setsum mu {d. 0 < d & d dvd (rad n)}";
proof-;
assume "0 < n";
then have "setsum mu {d. 0 < d & d dvd n & squarefree d} + setsum mu {d. 0 < d & d dvd n & ~ squarefree d} =
setsum mu {d. 0 < d & d dvd (rad n)} + 0";
by (auto simp add: not_squarefree_setsum_prop zdvd_squarefree_eq_zdvd_rad);
thus ?thesis by auto;
qed;
(**********************************)
(* Time for Key Step number three *)
(* Note that rad n = m *)
(**********************************)
lemma zdvd_subsets_prop1: "{d. (0::int) < d & d dvd m} =
{d. 0 < d & d dvd m & p dvd d} Un {d. 0 < d & d dvd m & ~p dvd d}";
by (auto);
lemma zdvd_subsets_prop2: "{d. (0::int) < d & d dvd m & p dvd d} Int {d. 0 < d & d dvd m & ~p dvd d} = {}";
by (auto);
lemma subset1_finite: "(0::int) < m ==> finite {d. 0 < d & d dvd m & p dvd d}";
proof-;
assume "0 < m";
then have "finite {d. 0 < d & d dvd m}";
by (auto simp add: pos_pos_zdvd_finite);
moreover have "{d. 0 < d & d dvd m & p dvd d} <= {d. 0 < d & d dvd m}";
by (auto);
ultimately show ?thesis by (auto simp add: finite_subset);
qed;
lemma subset2_finite: "(0::int) < m ==> finite {d. 0 < d & d dvd m & ~ p dvd d}";
proof-;
assume "0 < m";
then have "finite {d. 0 < d & d dvd m}";
by (auto simp add: pos_pos_zdvd_finite);
moreover have "{d. 0 < d & d dvd m & ~p dvd d} <= {d. 0 < d & d dvd m}";
by (auto);
ultimately show ?thesis by (auto simp add: finite_subset);
qed;
lemma key_step3: "(0::int) < m ==>
setsum mu {d. 0 < d & d dvd m} =
setsum mu {d. 0 < d & d dvd m & p dvd d} + setsum mu {d. 0 < d & d dvd m & ~ p dvd d}";
proof-;
assume "0 < m";
then have "finite {d. 0 < d & d dvd m & p dvd d}" and
"finite {d. 0 < d & d dvd m & ~ p dvd d}";
by (insert subset1_finite [of m p] subset2_finite [of m p], auto);
moreover have "{d. (0::int) < d & d dvd m & p dvd d} Int {d. 0 < d & d dvd m & ~p dvd d} = {}"
by (auto simp add: zdvd_subsets_prop2);
ultimately have "setsum mu ({d. 0 < d & d dvd m & p dvd d} Un {d. 0 < d & d dvd m & ~ p dvd d}) =
setsum mu {d. 0 < d & d dvd m & p dvd d} + setsum mu {d. 0 < d & d dvd m & ~ p dvd d}";
by (rule setsum_Un_disjoint);
also have "{d. 0 < d & d dvd m & p dvd d} Un {d. 0 < d & d dvd m & ~ p dvd d} =
{d. (0::int) < d & d dvd m}"
by (auto simp add: zdvd_subsets_prop1);
finally show ?thesis .;
qed;
(**************************)
(* Show Key Step number 4 *)
(**************************)
lemma aux_inject_prop: "p:zprime ==> inj_on (%x. (x::int) * p) {d. (0::int) < d & d dvd (m div p)}";
by (auto simp add: inj_on_def, auto simp add: zprime_def);
lemma aux_finite_prop: "[| p:zprime; 0 < m; p dvd m |] ==> finite {d. (0::int) < d & d dvd (m div p)}";
proof-;
assume "p : zprime" and "0 < m" and "p dvd m";
then have "0 < m div p";
proof-;
have "p <= m" by (insert prems zdvd_bounds [of p m], auto);
then have "p div p <= m div p";
by (insert prems, rule zdiv_mono1, auto simp add: zprime_def);
also have "p div p = 1" by (insert prems, auto simp add: zprime_def);
finally show "0 < m div p" by auto;
qed;
thus ?thesis by (auto simp add: pos_pos_zdvd_finite);
qed;
lemma aux_image_prop: "[| p:zprime; p dvd m |] ==>
((%x. (x::int) * p) ` {d. (0::int) < d & d dvd (m div p)}) =
{d. 0 < d & d dvd m & p dvd d }";
apply (auto simp add: image_def)
apply (clarsimp simp add: zprime_def zero_less_mult_iff); defer;
apply (rule_tac x = "x div p" in exI, auto);
proof-;
fix x;
assume "p:zprime" and "p dvd x" and "0 < x";
then have "p <= x" by (insert zdvd_bounds [of p x], auto);
then have "p div p <= x div p";
by (insert prems, rule zdiv_mono1, auto simp add: zprime_def);
also have "p div p = 1" by (insert prems, auto simp add: zprime_def);
finally show "0 < x div p" by auto;
next;
fix x;
assume "p:zprime";
assume "p dvd x" and p1: "x dvd m";
then have p2: "p dvd m" by (rule zdvd_trans);
note p1;
also have "m = p * (m div p)";
by (insert p2 zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
also have "x = p * (x div p)";
by (insert prems zmod_zdiv_equality [of x p] zdvd_iff_zmod_eq_0 [of p x], auto);
finally have "p * (x div p) dvd p * (m div p)".;
thus "(x div p) dvd (m div p)";
apply (rule_tac a = p in ne_0_zdvd_prop);
apply (insert prems, auto simp add: zprime_def);
done;
next;
fix x;
assume "p dvd x";
thus "x = (x div p) * p";
by (insert zmod_zdiv_equality [of x p] zdvd_iff_zmod_eq_0 [of p x], auto);
next;
fix xa;
assume "p dvd m";
then have p1 :"p * (m div p) = m";
by (insert zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
assume "xa dvd m div p";
then have "p * xa dvd p * (m div p)"
by (insert zdvd_refl [of p], auto simp add: zdvd_zmult_mono);
also note p1;
finally show "xa * p dvd m" by (auto simp add: zmult_ac);
qed;
lemma aux3: "[| p : zprime; 0 < m; p dvd m|] ==>
setsum mu {d. 0 < d & d dvd m & p dvd d} =
setsum (mu ˆ (%x. (x::int) * p)) {d. (0::int) < d & d dvd (m div p)}";
proof-;
assume "p:zprime" and "0 < m" and "p dvd m";
then have "setsum mu ((%x. (x::int) * p) ` {d. (0::int) < d & d dvd (m div p)}) =
setsum (mu ˆ (%x. (x::int) * p)) {d. (0::int) < d & d dvd (m div p)}";
apply (insert prems aux_finite_prop [of p m] aux_inject_prop [of p m]);
apply (rule setsum_reindex, auto);
done;
also have "((%x. (x::int) * p) ` {d. (0::int) < d & d dvd (m div p)}) =
{d. 0 < d & d dvd m & p dvd d }";
by (insert prems, auto simp add: aux_image_prop);
finally show ?thesis .;
qed;
lemma aux4: "[| p:zprime; 0 < m; p dvd m; squarefree m|] ==>
ALL x:{d. (0::int) < d & d dvd (m div p)}.
(mu ˆ (%x. (x::int) * p))x = ((%x. -(x::int)) ˆ mu)x";
apply (auto, rule squarefree_mu_prop, auto);
proof-;
fix x;
assume "x dvd m div p" and "p dvd m";
then have "x * p dvd (m div p) * p";
by (insert zdvd_refl [of p], auto simp add: zdvd_zmult_mono);
also have "(m div p) * p = m";
by (insert prems zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
finally have "x * p dvd m".;
moreover assume "squarefree m" and "0 < m";
ultimately show "squarefree(x * p)"
by (rule_tac squarefree_zdvd_impl_squarefree);
qed;
lemma aux5: "[| p : zprime; 0 < m; p dvd m; squarefree m |] ==>
setsum (mu ˆ (%x. (x::int) * p)) {d. (0::int) < d & d dvd (m div p)} =
setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd (m div p)}";
proof-;
assume "p : zprime" and "0 < m" and "p dvd m" and "squarefree m";
with aux4 have "ALL x:{d. (0::int) < d & d dvd (m div p)}.
(mu ˆ (%x. (x::int) * p))x = ((%x. -(x::int)) ˆ mu)x";
by (auto);
moreover from aux_finite_prop have "finite {d. (0::int) < d & d dvd (m div p)}";
by (insert prems, auto);
ultimately show ?thesis
apply (intro setsum_cong);
apply auto;
done;
qed;
lemma aux6: "[| p:zprime; 0 < m; p dvd m; squarefree m |] ==>
{d. (0::int) < d & d dvd m & ~p dvd d} = {d. 0 < d & d dvd (m div p)}";
apply (auto, rule zdvd_zmult_not_zdvd_impl_zdvd, auto);
proof-;
fix x;
assume "p :zprime" and "0 < m" and "p dvd m";
then have "p <= m" by (insert zdvd_bounds [of p m], auto);
then have "p div p <= m div p";
by (insert prems, rule zdiv_mono1, auto simp add: zprime_def);
also have "p div p = 1" by (insert prems, auto simp add: zprime_def);
finally show "0 < m div p" by auto;
next;
fix x;
assume "p dvd m";
assume "x dvd m";
also have "m = (m div p) * p";
by (insert prems zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
finally show "x dvd m div p * p" .;
next;
fix x;
assume "p dvd m";
assume "x dvd m div p";
then have "x dvd (m div p) * p";
by (auto simp add: zdvd_zmult2);
also have "(m div p) * p = m";
by (insert prems zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
finally show "x dvd m" .;
next;
fix x;
assume "p dvd m" and "p:zprime" and "0 < m";
assume "x dvd m div p" and "p dvd x";
then have "p dvd m div p" by (rule_tac zdvd_trans);
then have "p * p dvd (m div p) * p";
by (insert zdvd_refl [of p], auto simp add: zdvd_zmult_mono);
also have "p * p = p ^ Suc(Suc(0))";
by (auto simp add: power_Suc);
also have "Suc(Suc(0))= 2" by auto;
also have "m div p * p = m";
by (insert prems zmod_zdiv_equality [of m p] zdvd_iff_zmod_eq_0 [of p m], auto);
finally have "p ^ 2 dvd m" .;
then have "2 <= multiplicity p m";
by (insert prems, auto simp add: multiplicity_zpower_zdvd);
moreover assume "squarefree m";
ultimately show "False";
apply (auto simp add: squarefree_prop);
apply (drule_tac x = p in spec, auto);
done;
qed;
lemma aux7: "[| p : zprime; 0 < m; p dvd m; squarefree m |] ==>
setsum mu {d. 0 < d & d dvd m & ~p dvd d} =
setsum mu {d. 0 < d & d dvd (m div p)}";
by (auto simp add: aux6);
lemma key_step4: "[| p : zprime; 0 < m; p dvd m; squarefree m |] ==>
setsum mu {d. 0 < d & d dvd m & p dvd d} + setsum mu {d. 0 < d & d dvd m & ~ p dvd d} =
setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd (m div p)} +
setsum mu {d. 0 < d & d dvd (m div p)}";
proof-;
assume "p : zprime" and "0 < m" and "p dvd m" and "squarefree m";
then have "setsum mu {d. 0 < d & d dvd m & p dvd d} + setsum mu {d. 0 < d & d dvd m & ~ p dvd d} =
setsum (mu ˆ (%x. (x::int) * p)) {d. (0::int) < d & d dvd (m div p)} +
setsum mu {d. 0 < d & d dvd (m div p)}";
by (auto simp add: aux3 aux7);
also have "setsum (mu ˆ (%x. (x::int) * p)) {d. (0::int) < d & d dvd (m div p)} =
setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd (m div p)}";
by (insert prems, auto simp add: aux5);
finally show ?thesis .;
qed;
lemma key_step5: "[| p : zprime; 0 < m; p dvd m |] ==>
setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd (m div p)} +
setsum mu {d. 0 < d & d dvd (m div p)} =
0";
proof-;
assume "p : zprime" and "0 < m" and "p dvd m";
have "setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd (m div p)} +
setsum mu {d. 0 < d & d dvd (m div p)} =
setsum (%x. ((%x. -(x::int)) ˆ mu)(x) + (mu x)) {d. (0::int) < d & d dvd (m div p)}";
by (auto simp add: setsum_addf [THEN sym]);
also have "setsum (%x. ((%x. -(x::int)) ˆ mu)(x) + (mu x)) {d. (0::int) < d & d dvd (m div p)} = 0";
apply (insert prems aux_finite_prop [of p m]);
apply (auto simp add: setsum_constant);
done;
finally show ?thesis .;
qed;
theorem moebius_prop: "[| 1 <= n |] ==> setsum mu {d. 0 < d & d dvd n} = (if n = 1 then 1 else 0)";
apply (case_tac "n = 1");
apply (auto);
apply (subgoal_tac "{d. (0::int) < d & d dvd 1} = {1}");
apply (simp);
apply (simp add: mu_def);
apply (insert ge_0_zdvd_1);
apply (force);
apply (subgoal_tac "1 < n");
apply (auto);
proof-;
assume "1 < n";
then have p1: "1 < rad n" by (auto simp add: rad_min_gr_1);
have p2: "(hd (pdivisors n)):zprime" and p3: "(hd (pdivisors n)) dvd (rad n)";
by (insert prems, auto simp add: zprime_zdvd_existence_rad);
have p4: "squarefree (rad n)";
by (insert prems, auto simp add: rad_squarefree);
have "setsum mu {d. 0 < d & d dvd n} =
setsum mu {d. 0 < d & d dvd n & squarefree d} + setsum mu {d. 0 < d & d dvd n & ~ squarefree d}";
by (insert prems, auto simp add: key_step1);
also have "... = setsum mu {d. 0 < d & d dvd (rad n)}";
by (insert prems, auto simp add: key_step2);
also have "... = setsum mu {d. 0 < d & d dvd (rad n) & (hd (pdivisors n)) dvd d} +
setsum mu {d. 0 < d & d dvd (rad n) & ~ (hd (pdivisors n)) dvd d}";
apply (subgoal_tac "0 < rad n");
apply (drule_tac p = "(hd (pdivisors n))" in key_step3, force);
apply (insert p1, auto);
done;
also have "... = setsum ((%x. -(x::int)) ˆ mu) {d. (0::int) < d & d dvd ((rad n) div (hd (pdivisors n)))} +
setsum mu {d. 0 < d & d dvd ((rad n) div (hd (pdivisors n)))}";
apply (rule_tac key_step4);
apply (insert p1 p2 p3 p4, auto);
done;
also have "... = 0";
apply (rule_tac key_step5);
apply (insert prems p1 p2 p3, auto);
done;
finally show "setsum mu {d. 0 < d & d dvd n} = 0".;
qed;
end;
lemma zdvd_zmult_not_zdvd_impl_zdvd:
[| p ∈ zprime; 0 < d; 0 < a; d dvd a * p; ¬ p dvd d |] ==> d dvd a
lemma mu_eq_1:
n ≤ 1 ==> mu n = 1
lemma mu_zprime:
p ∈ zprime ==> mu p = -1
lemma mu_squarefree1:
[| 1 ≤ n; ¬ squarefree n |] ==> mu n = 0
lemma mu_squarefree2:
[| 1 ≤ n; mu n ≠ 0 |] ==> squarefree n
lemma aux1:
[| p ∈ zprime; 1 < d; squarefree (d * p) |] ==> mu (d * p) = -1 * mu d
lemma aux2:
[| p ∈ zprime; 1 = d; squarefree (d * p) |] ==> mu (d * p) = -1 * mu d
lemma squarefree_mu_prop:
[| p ∈ zprime; 1 ≤ d; squarefree (d * p) |] ==> mu (d * p) = - mu d
lemma pos_pos_zdvd_finite:
0 < m ==> finite {d. 0 < d ∧ d dvd m}
lemma zprime_zdvd_existence_rad:
1 < n ==> hd (pdivisors n) ∈ zprime ∧ hd (pdivisors n) dvd rad n
lemma squarefree_subsets_prop1:
{d. 0 < d ∧ d dvd n} =
{d. 0 < d ∧ d dvd n ∧ squarefree d} ∪ {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d}
lemma squarefree_subsets_prop2:
{d. 0 < d ∧ d dvd n ∧ squarefree d} ∩ {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d} = {}
lemma squarefree_subset1_finite:
0 < n ==> finite {d. 0 < d ∧ d dvd n ∧ squarefree d}
lemma squarefree_subset2_finite:
0 < n ==> finite {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d}
lemma key_step1:
0 < n ==> setsum mu {d. 0 < d ∧ d dvd n} = setsum mu {d. 0 < d ∧ d dvd n ∧ squarefree d} + setsum mu {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d}
lemma not_squarefree_setsum_prop:
0 < n ==> setsum mu {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d} = 0
lemma zdvd_squarefree_eq_zdvd_rad:
0 < n ==> {d. 0 < d ∧ d dvd n ∧ squarefree d} = {d. 0 < d ∧ d dvd rad n}
lemma key_step2:
0 < n ==> setsum mu {d. 0 < d ∧ d dvd n ∧ squarefree d} + setsum mu {d. 0 < d ∧ d dvd n ∧ ¬ squarefree d} = setsum mu {d. 0 < d ∧ d dvd rad n}
lemma zdvd_subsets_prop1:
{d. 0 < d ∧ d dvd m} =
{d. 0 < d ∧ d dvd m ∧ p dvd d} ∪ {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d}
lemma zdvd_subsets_prop2:
{d. 0 < d ∧ d dvd m ∧ p dvd d} ∩ {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d} = {}
lemma subset1_finite:
0 < m ==> finite {d. 0 < d ∧ d dvd m ∧ p dvd d}
lemma subset2_finite:
0 < m ==> finite {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d}
lemma key_step3:
0 < m ==> setsum mu {d. 0 < d ∧ d dvd m} = setsum mu {d. 0 < d ∧ d dvd m ∧ p dvd d} + setsum mu {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d}
lemma aux_inject_prop:
p ∈ zprime ==> inj_on (%x. x * p) {d. 0 < d ∧ d dvd m div p}
lemma aux_finite_prop:
[| p ∈ zprime; 0 < m; p dvd m |] ==> finite {d. 0 < d ∧ d dvd m div p}
lemma aux_image_prop:
[| p ∈ zprime; p dvd m |] ==> (%x. x * p) ` {d. 0 < d ∧ d dvd m div p} = {d. 0 < d ∧ d dvd m ∧ p dvd d}
lemma aux3:
[| p ∈ zprime; 0 < m; p dvd m |] ==> setsum mu {d. 0 < d ∧ d dvd m ∧ p dvd d} = setsum (mu ˆ (%x. x * p)) {d. 0 < d ∧ d dvd m div p}
lemma aux4:
[| p ∈ zprime; 0 < m; p dvd m; squarefree m |] ==> ∀x∈{d. 0 < d ∧ d dvd m div p}. (mu ˆ (%x. x * p)) x = (uminus ˆ mu) x
lemma aux5:
[| p ∈ zprime; 0 < m; p dvd m; squarefree m |] ==> setsum (mu ˆ (%x. x * p)) {d. 0 < d ∧ d dvd m div p} = setsum (uminus ˆ mu) {d. 0 < d ∧ d dvd m div p}
lemma aux6:
[| p ∈ zprime; 0 < m; p dvd m; squarefree m |] ==> {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d} = {d. 0 < d ∧ d dvd m div p}
lemma aux7:
[| p ∈ zprime; 0 < m; p dvd m; squarefree m |] ==> setsum mu {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d} = setsum mu {d. 0 < d ∧ d dvd m div p}
lemma key_step4:
[| p ∈ zprime; 0 < m; p dvd m; squarefree m |] ==> setsum mu {d. 0 < d ∧ d dvd m ∧ p dvd d} + setsum mu {d. 0 < d ∧ d dvd m ∧ ¬ p dvd d} = setsum (uminus ˆ mu) {d. 0 < d ∧ d dvd m div p} + setsum mu {d. 0 < d ∧ d dvd m div p}
lemma key_step5:
[| p ∈ zprime; 0 < m; p dvd m |] ==> setsum (uminus ˆ mu) {d. 0 < d ∧ d dvd m div p} + setsum mu {d. 0 < d ∧ d dvd m div p} = 0
theorem moebius_prop:
1 ≤ n ==> setsum mu {d. 0 < d ∧ d dvd n} = (if n = 1 then 1 else 0)