(* File: HOL/Number_Theory/Prime_Powers.thy Author: Manuel Eberl 🚫pruvisto.org> Prime powers and the Mangoldt function *) section‹Prime powers› theory Prime_Powers imports Complex_Main "HOL-Computational_Algebra.Primes""HOL-Library.FuncSet" begin
definition aprimedivisor :: "'a :: normalization_semidom ==> 'a"where "aprimedivisor q = (SOME p. prime p ∧ p dvd q)"
definition primepow :: "'a :: normalization_semidom ==> bool"where "primepow n ⟷ (∃p k. prime p ∧ k > 0 ∧ n = p ^ k)"
definition primepow_factors :: "'a :: normalization_semidom ==> 'a set"where "primepow_factors n = {x. primepow x ∧ x dvd n}"
lemma primepow_gt_Suc_0: "primepow n ==> n > Suc 0" using one_less_power[of "p::nat"for p] by (auto simp: primepow_def prime_nat_iff)
lemma assumes"prime p""p dvd n" shows prime_aprimedivisor: "prime (aprimedivisor n)" and aprimedivisor_dvd: "aprimedivisor n dvd n" proof - from assms have"∃p. prime p ∧ p dvd n"by auto from someI_ex[OF this] show"prime (aprimedivisor n)""aprimedivisor n dvd n" unfolding aprimedivisor_def by (simp_all add: conj_commute) qed
lemma assumes"n ≠ 0""¬is_unit (n :: 'a :: factorial_semiring)" shows prime_aprimedivisor': "prime (aprimedivisor n)" and aprimedivisor_dvd': "aprimedivisor n dvd n" proof - from someI_ex[OF prime_divisor_exists[OF assms]] show"prime (aprimedivisor n)""aprimedivisor n dvd n" unfolding aprimedivisor_def by (simp_all add: conj_commute) qed
lemma aprimedivisor_of_prime [simp]: assumes"prime p" shows"aprimedivisor p = p" proof - from assms have"∃q. prime q ∧ q dvd p"by auto from someI_ex[OF this, folded aprimedivisor_def] assms show ?thesis by (auto intro: primes_dvd_imp_eq) qed
lemma aprimedivisor_pos_nat: "(n::nat) > 1 ==> aprimedivisor n > 0" using aprimedivisor_dvd'[of n] by (auto elim: dvdE intro!: Nat.gr0I)
lemma aprimedivisor_primepow_power: assumes"primepow n""k > 0" shows"aprimedivisor (n ^ k) = aprimedivisor n" proof - from assms obtain p l where l: "prime p""l > 0""n = p ^ l" by (auto simp: primepow_def) from l assms have *: "prime (aprimedivisor (n ^ k))""aprimedivisor (n ^ k) dvd n ^ k" by (intro prime_aprimedivisor[of p] aprimedivisor_dvd[of p] dvd_power;
simp add: power_mult [symmetric])+ from * l have"aprimedivisor (n ^ k) dvd p ^ (l * k)"by (simp add: power_mult) with assms * l have"aprimedivisor (n ^ k) dvd p" by (subst (asm) prime_dvd_power_iff) simp_all with l assms have"aprimedivisor (n ^ k) = p" by (intro primes_dvd_imp_eq prime_aprimedivisor l) (auto simp: power_mult [symmetric]) moreoverfrom l have"aprimedivisor n dvd p ^ l" by (auto intro: aprimedivisor_dvd simp: prime_gt_0_nat) with assms l have"aprimedivisor n dvd p" by (subst (asm) prime_dvd_power_iff) (auto intro!: prime_aprimedivisor simp: prime_gt_0_nat) with l assms have"aprimedivisor n = p" by (intro primes_dvd_imp_eq prime_aprimedivisor l) auto ultimatelyshow ?thesis by simp qed
lemma aprimedivisor_prime_power: assumes"prime p""k > 0" shows"aprimedivisor (p ^ k) = p" proof - from assms have *: "prime (aprimedivisor (p ^ k))""aprimedivisor (p ^ k) dvd p ^ k" by (intro prime_aprimedivisor[of p] aprimedivisor_dvd[of p]; simp add: prime_nat_iff)+ from assms * have"aprimedivisor (p ^ k) dvd p" by (subst (asm) prime_dvd_power_iff) simp_all with assms * show"aprimedivisor (p ^ k) = p"by (intro primes_dvd_imp_eq) qed
lemma prime_factorization_primepow: assumes"primepow n" shows"prime_factorization n = replicate_mset (multiplicity (aprimedivisor n) n) (aprimedivisor n)" using assms by (auto simp: primepow_def aprimedivisor_prime_power prime_factorization_prime_power)
lemma primepow_decompose: fixes n :: "'a :: factorial_semiring_multiplicative" assumes"primepow n" shows"aprimedivisor n ^ multiplicity (aprimedivisor n) n = n" proof - from assms have"n ≠ 0"by (intro notI) (auto simp: primepow_def) hence"n = unit_factor n * prod_mset (prime_factorization n)" by (subst prod_mset_prime_factorization) simp_all alsofrom assms have"unit_factor n = 1"by (auto simp: primepow_def unit_factor_power) alsohave"prime_factorization n = replicate_mset (multiplicity (aprimedivisor n) n) (aprimedivisor n)" by (intro prime_factorization_primepow assms) alsohave"prod_mset … = aprimedivisor n ^ multiplicity (aprimedivisor n) n"by simp finallyshow ?thesis by simp qed
lemma prime_power_not_one: assumes"prime p""k > 0" shows"p ^ k ≠ 1" proof assume"p ^ k = 1" hence"is_unit (p ^ k)"by simp thus False using assms by (simp add: is_unit_power_iff) qed
lemma zero_not_primepow [simp]: "¬primepow 0" by (auto simp: primepow_def)
lemma one_not_primepow [simp]: "¬primepow 1" by (auto simp: primepow_def prime_power_not_one)
lemma primepow_not_unit [simp]: "primepow p ==>¬is_unit p" by (auto simp: primepow_def is_unit_power_iff)
lemma not_primepow_Suc_0_nat [simp]: "¬primepow (Suc 0)" using primepow_gt_Suc_0[of "Suc 0"] by auto
lemma primepow_gt_0_nat: "primepow n ==> n > (0::nat)" using primepow_gt_Suc_0[of n] by simp
lemma unit_factor_primepow: fixes p :: "'a :: factorial_semiring_multiplicative" shows"primepow p ==> unit_factor p = 1" by (auto simp: primepow_def unit_factor_power)
lemma aprimedivisor_primepow: assumes"prime p""p dvd n""primepow (n :: 'a :: factorial_semiring_multiplicative)" shows"aprimedivisor (p * n) = p""aprimedivisor n = p" proof - from assms have [simp]: "n ≠ 0"by auto
define q where"q = aprimedivisor n" with assms have q: "prime q"by (auto simp: q_def intro!: prime_aprimedivisor) from‹primepow n›have n: "n = q ^ multiplicity q n" by (simp add: primepow_decompose q_def) have nz: "multiplicity q n ≠ 0" proof assume"multiplicity q n = 0" with n have n': "n = unit_factor n"by simp have"is_unit n"by (subst n', rule unit_factor_is_unit) (insert assms, auto) with assms show False by auto qed with‹prime p›‹p dvd n› q have"p dvd q" by (subst (asm) n) (auto intro: prime_dvd_power) with‹prime p› q have"p = q"by (intro primes_dvd_imp_eq) thus"aprimedivisor n = p"by (simp add: q_def)
define r where"r = aprimedivisor (p * n)" with assms have r: "r dvd (p * n)""prime r"unfolding r_def by (intro aprimedivisor_dvd[of p] prime_aprimedivisor[of p]; simp)+ hence"r dvd q ^ Suc (multiplicity q n)" by (subst (asm) n) (auto simp: ‹p = q› dest: dvd_unit_imp_unit) with r have"r dvd q" by (auto intro: prime_dvd_power_nat simp: prime_dvd_mult_iff dest: prime_dvd_power) with r q have"r = q"by (intro primes_dvd_imp_eq) thus"aprimedivisor (p * n) = p"by (simp add: r_def ‹p = q›) qed
lemma power_eq_prime_powerD: fixes p :: "'a :: factorial_semiring" assumes"prime p""n > 0""x ^ n = p ^ k" shows"∃i. normalize x = normalize (p ^ i)" proof - have"normalize x = normalize (p ^ multiplicity p x)" proof (rule multiplicity_eq_imp_eq) fix q :: 'a assume"prime q" from assms have"multiplicity q (x ^ n) = multiplicity q (p ^ k)"by simp with‹prime q›and assms have"n * multiplicity q x = k * multiplicity q p" by (subst (asm) (1 2) prime_elem_multiplicity_power_distrib) (auto simp: power_0_left) with assms and‹prime q›show"multiplicity q x = multiplicity q (p ^ multiplicity p x)" by (cases "p = q") (auto simp: multiplicity_distinct_prime_power prime_multiplicity_other) qed (insert assms, auto simp: power_0_left) thus ?thesis by auto qed
lemma primepow_power_iff: fixes p :: "'a :: factorial_semiring_multiplicative" assumes"unit_factor p = 1" shows"primepow (p ^ n) ⟷ primepow p ∧ n > 0" proof safe assume"primepow (p ^ n)" hence n: "n ≠ 0"by (auto intro!: Nat.gr0I) thus"n > 0"by simp from assms have [simp]: "normalize p = p" using normalize_mult_unit_factor[of p] by (simp only: mult.right_neutral) from‹primepow (p ^ n)›obtain q k where *: "k > 0""prime q""p ^ n = q ^ k" by (auto simp: primepow_def) with power_eq_prime_powerD[of q n p k] n obtain i where eq: "normalize p = normalize (q ^ i)"by auto with primepow_not_unit[OF ‹primepow (p ^ n)›] have"i ≠ 0" by (intro notI) (simp add: normalize_1_iff is_unit_power_iff del: primepow_not_unit) with‹normalize p = normalize (q ^ i)›‹prime q›show"primepow p" by (auto simp: normalize_power primepow_def intro!: exI[of _ q] exI[of _ i]) next assume"primepow p""n > 0" thenobtain q k where *: "k > 0""prime q""p = q ^ k"by (auto simp: primepow_def) with‹n > 0›show"primepow (p ^ n)" by (auto simp: primepow_def power_mult intro!: exI[of _ q] exI[of _ "k * n"]) qed
lemma primepow_prime [simp]: "prime n ==> primepow n" by (auto simp: primepow_def intro!: exI[of _ n] exI[of _ "1::nat"])
lemma primepow_prime_power [simp]: "prime (p :: 'a :: factorial_semiring_multiplicative) ==> primepow (p ^ n) ⟷ n > 0" by (subst primepow_power_iff) auto
lemma aprimedivisor_vimage: assumes"prime (p :: 'a :: factorial_semiring_multiplicative)" shows"aprimedivisor -` {p} ∩ primepow_factors n = {p ^ k |k. k > 0 ∧ p ^ k dvd n}" proof safe fix q assume q: "q ∈ primepow_factors n" hence q': "q ≠ 0""q ≠ 1"by (auto simp: primepow_def primepow_factors_def prime_power_not_one) let ?n = "multiplicity (aprimedivisor q) q" from q q' have"q = aprimedivisor q ^ ?n ∧ ?n > 0 ∧ aprimedivisor q ^ ?n dvd n" by (auto simp: primepow_decompose primepow_factors_def prime_multiplicity_gt_zero_iff
prime_aprimedivisor' prime_imp_prime_elem aprimedivisor_dvd') thus"∃k. q = aprimedivisor q ^ k ∧ k > 0 ∧ aprimedivisor q ^ k dvd n" .. next fix k :: nat assume k: "p ^ k dvd n""k > 0" with assms show"p ^ k ∈ aprimedivisor -` {p}" by (auto simp: aprimedivisor_prime_power) with assms k show"p ^ k ∈ primepow_factors n" by (auto simp: primepow_factors_def primepow_def aprimedivisor_prime_power intro: Suc_leI) qed
lemma aprimedivisor_nat: assumes"n ≠ (Suc 0::nat)" shows"prime (aprimedivisor n)""aprimedivisor n dvd n" proof - from assms have"∃p. prime p ∧ p dvd n"by (intro prime_factor_nat) auto from someI_ex[OF this, folded aprimedivisor_def] show"prime (aprimedivisor n)""aprimedivisor n dvd n"by blast+ qed
lemma aprimedivisor_gt_Suc_0: assumes"n ≠ Suc 0" shows"aprimedivisor n > Suc 0" proof - from assms have"prime (aprimedivisor n)"by (rule aprimedivisor_nat) thus"aprimedivisor n > Suc 0"by (simp add: prime_nat_iff) qed
lemma aprimedivisor_le_nat: assumes"n > Suc 0" shows"aprimedivisor n ≤ n" proof - from assms have"aprimedivisor n dvd n"by (intro aprimedivisor_nat) simp_all with assms show"aprimedivisor n ≤ n" by (intro dvd_imp_le) simp_all qed
lemma bij_betw_primepows: "bij_betw (λ(p,k). p ^ Suc k :: 'a :: factorial_semiring_multiplicative) (Collect prime × UNIV) (Collect primepow)" proof (rule bij_betwI [where ?g = "(λn. (aprimedivisor n, multiplicity (aprimedivisor n) n - 1))"],
goal_cases) case 1 show"(λ(p, k). p ^ Suc k :: 'a) ∈ Collect prime × UNIV → Collect primepow" by (auto intro!: primepow_prime_power simp del: power_Suc ) next case 2 show ?case by (auto simp: primepow_def prime_aprimedivisor) next case (3 n) thus ?case by (auto simp: aprimedivisor_prime_power simp del: power_Suc) next case (4 n) hence *: "0 < multiplicity (aprimedivisor n) n" by (subst prime_multiplicity_gt_zero_iff)
(auto intro!: prime_imp_prime_elem aprimedivisor_dvd simp: primepow_def prime_aprimedivisor) have"aprimedivisor n * aprimedivisor n ^ (multiplicity (aprimedivisor n) n - Suc 0) = aprimedivisor n ^ Suc (multiplicity (aprimedivisor n) n - Suc 0)"by simp alsofrom * have"Suc (multiplicity (aprimedivisor n) n - Suc 0) = multiplicity (aprimedivisor n) n" by (subst Suc_diff_Suc) (auto simp: prime_multiplicity_gt_zero_iff) alsohave"aprimedivisor n ^ … = n" using 4 by (subst primepow_decompose) auto finallyshow ?caseby auto qed
(* TODO Generalise *) lemma primepow_multD: assumes"primepow (a * b :: nat)" shows"a = 1 ∨ primepow a""b = 1 ∨ primepow b" proof - from assms obtain p k where k: "k > 0""a * b = p ^ k""prime p" unfolding primepow_def by auto thenobtain i j where"a = p ^ i""b = p ^ j" using prime_power_mult_nat[of p a b] by blast with‹prime p›show"a = 1 ∨ primepow a""b = 1 ∨ primepow b"by auto qed
lemma primepow_mult_aprimedivisorI: assumes"primepow (n :: 'a :: factorial_semiring_multiplicative)" shows"primepow (aprimedivisor n * n)" by (subst (2) primepow_decompose[OF assms, symmetric], subst power_Suc [symmetric],
subst primepow_prime_power)
(insert assms, auto intro!: prime_aprimedivisor' dest: primepow_gt_Suc_0)
lemma primepow_factors_altdef: fixes x :: "'a :: factorial_semiring_multiplicative" assumes"x ≠ 0" shows"primepow_factors x = {p ^ k |p k. p ∈ prime_factors x ∧ k ∈ {0<.. multiplicity p x}}" proof (intro equalityI subsetI) fix q assume"q ∈ primepow_factors x" thenobtain p k where pk: "prime p""k > 0""q = p ^ k""q dvd x" unfolding primepow_factors_def primepow_def by blast moreoverhave"k ≤ multiplicity p x"using pk assms by (intro multiplicity_geI) auto ultimatelyshow"q ∈ {p ^ k |p k. p ∈ prime_factors x ∧ k ∈ {0<.. multiplicity p x}}" by (auto simp: prime_factors_multiplicity intro!: exI[of _ p] exI[of _ k]) qed (auto simp: primepow_factors_def prime_factors_multiplicity multiplicity_dvd')
lemma finite_primepow_factors: assumes"x ≠ (0 :: 'a :: factorial_semiring_multiplicative)" shows"finite (primepow_factors x)" proof - have"finite (SIGMA p:prime_factors x. {0<..multiplicity p x})" by (intro finite_SigmaI) simp_all hence"finite ((λ(p,k). p ^ k) ` …)" (is"finite ?A") by (rule finite_imageI) alsohave"?A = primepow_factors x" using assms by (subst primepow_factors_altdef) fast+ finallyshow ?thesis . qed
lemma aprimedivisor_primepow_factors_conv_prime_factorization: assumes [simp]: "n ≠ (0 :: 'a :: factorial_semiring_multiplicative)" shows"image_mset aprimedivisor (mset_set (primepow_factors n)) = prime_factorization n"
(is"?lhs = ?rhs") proof (intro multiset_eqI) fix p :: 'a show"count ?lhs p = count ?rhs p" proof (cases "prime p") case False have"p ∉# image_mset aprimedivisor (mset_set (primepow_factors n))" proof assume"p ∈# image_mset aprimedivisor (mset_set (primepow_factors n))" thenobtain q where"p = aprimedivisor q""q ∈ primepow_factors n" by (auto simp: finite_primepow_factors) with False prime_aprimedivisor'[of q] have"q = 0 ∨ is_unit q"by auto with‹q ∈ primepow_factors n›show False by (auto simp: primepow_factors_def primepow_def) qed hence"count ?lhs p = 0"by (simp only: Multiset.not_in_iff) with False show ?thesis by (simp add: count_prime_factorization) next case True hence p: "p ≠ 0""¬is_unit p"by auto have"count ?lhs p = card (aprimedivisor -` {p} ∩ primepow_factors n)" by (simp add: count_image_mset finite_primepow_factors) alsohave"aprimedivisor -` {p} ∩ primepow_factors n = {p^k |k. k > 0 ∧ p ^ k dvd n}" using True by (rule aprimedivisor_vimage) alsofrom True have"… = (λk. p ^ k) ` {0<..multiplicity p n}" by (subst power_dvd_iff_le_multiplicity) auto alsofrom p True have"card … = multiplicity p n" by (subst card_image) (auto intro!: inj_onI dest: prime_power_inj) alsofrom True have"… = count (prime_factorization n) p" by (simp add: count_prime_factorization) finallyshow ?thesis . qed qed
lemma prime_elem_aprimedivisor_nat: "d > Suc 0 ==> prime_elem (aprimedivisor d)" using prime_aprimedivisor'[of d] by simp
lemma aprimedivisor_gt_0_nat [simp]: "d > Suc 0 ==> aprimedivisor d > 0" using prime_aprimedivisor'[of d] by (simp add: prime_gt_0_nat)
lemma aprimedivisor_gt_Suc_0_nat [simp]: "d > Suc 0 ==> aprimedivisor d > Suc 0" using prime_aprimedivisor'[of d] by (simp add: prime_gt_Suc_0_nat)
lemma aprimedivisor_not_Suc_0_nat [simp]: "d > Suc 0 ==> aprimedivisor d ≠ Suc 0" using aprimedivisor_gt_Suc_0[of d] by (intro notI) auto
lemma multiplicity_aprimedivisor_gt_0_nat [simp]: "d > Suc 0 ==> multiplicity (aprimedivisor d) d > 0" by (subst multiplicity_gt_zero_iff) (auto intro: aprimedivisor_dvd')
lemma primepowI: "prime p ==> k > 0 ==> p ^ k = n ==> primepow n ∧ aprimedivisor n = p" unfolding primepow_def by (auto simp: aprimedivisor_prime_power)
lemma not_primepowI: assumes"prime p""prime q""p ≠ q""p dvd n""q dvd n" shows"¬primepow n" using assms by (auto simp: primepow_def dest!: prime_dvd_power[rotated] dest: primes_dvd_imp_eq)
lemma sum_prime_factorization_conv_sum_primepow_factors: fixes n :: "'a :: factorial_semiring_multiplicative" assumes"n ≠ 0" shows"(∑q∈primepow_factors n. f (aprimedivisor q)) = (∑p∈#prime_factorization n. f p)" proof - from assms have"prime_factorization n = image_mset aprimedivisor (mset_set (primepow_factors n))" by (rule aprimedivisor_primepow_factors_conv_prime_factorization [symmetric]) alsohave"(∑p∈#…. f p) = (∑q∈primepow_factors n. f (aprimedivisor q))" by (simp add: image_mset.compositionality sum_unfold_sum_mset o_def) finallyshow ?thesis .. qed
lemma multiplicity_aprimedivisor_Suc_0_iff: assumes"primepow (n :: 'a :: factorial_semiring_multiplicative)" shows"multiplicity (aprimedivisor n) n = Suc 0 ⟷ prime n" by (subst (3) primepow_decompose [OF assms, symmetric])
(insert assms, auto simp add: prime_power_iff intro!: prime_aprimedivisor')
definition mangoldt :: "nat ==> 'a :: real_algebra_1"where "mangoldt n = (if primepow n then of_real (ln (real (aprimedivisor n))) else 0)"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.