src/HOL/Number_Theory/Primes.thy
changeset 63830 2ea3725a34bd
parent 63766 695d60817cb1
child 63904 b8482e12a2a8
equal deleted inserted replaced
63829:6a05c8cbf7de 63830:2ea3725a34bd
   468   fixes n :: int
   468   fixes n :: int
   469   shows "p \<in> prime_factors n \<Longrightarrow> p \<ge> 0"
   469   shows "p \<in> prime_factors n \<Longrightarrow> p \<ge> 0"
   470   unfolding prime_factors_def 
   470   unfolding prime_factors_def 
   471   by (auto split: if_splits simp: prime_def dest!: in_prime_factorization_imp_prime)
   471   by (auto split: if_splits simp: prime_def dest!: in_prime_factorization_imp_prime)
   472 
   472 
   473 lemma msetprod_prime_factorization_int:
   473 lemma prod_mset_prime_factorization_int:
   474   fixes n :: int
   474   fixes n :: int
   475   assumes "n > 0"
   475   assumes "n > 0"
   476   shows   "msetprod (prime_factorization n) = n"
   476   shows   "prod_mset (prime_factorization n) = n"
   477   using assms by (simp add: msetprod_prime_factorization)
   477   using assms by (simp add: prod_mset_prime_factorization)
   478 
   478 
   479 lemma prime_factorization_exists_nat:
   479 lemma prime_factorization_exists_nat:
   480   "n > 0 \<Longrightarrow> (\<exists>M. (\<forall>p::nat \<in> set_mset M. prime p) \<and> n = (\<Prod>i \<in># M. i))"
   480   "n > 0 \<Longrightarrow> (\<exists>M. (\<forall>p::nat \<in> set_mset M. prime p) \<and> n = (\<Prod>i \<in># M. i))"
   481   using prime_factorization_exists[of n] by (auto simp: prime_def)
   481   using prime_factorization_exists[of n] by (auto simp: prime_def)
   482 
   482 
   483 lemma msetprod_prime_factorization_nat [simp]: 
   483 lemma prod_mset_prime_factorization_nat [simp]: 
   484   "(n::nat) > 0 \<Longrightarrow> msetprod (prime_factorization n) = n"
   484   "(n::nat) > 0 \<Longrightarrow> prod_mset (prime_factorization n) = n"
   485   by (subst msetprod_prime_factorization) simp_all
   485   by (subst prod_mset_prime_factorization) simp_all
   486 
   486 
   487 lemma prime_factorization_nat:
   487 lemma prime_factorization_nat:
   488     "n > (0::nat) \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)"
   488     "n > (0::nat) \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)"
   489   by (simp add: setprod_prime_factors)
   489   by (simp add: setprod_prime_factors)
   490 
   490 
   585   with assms have prime: "prime x" if "x \<in># A" for x using that by auto
   585   with assms have prime: "prime x" if "x \<in># A" for x using that by auto
   586   from set_mset_A assms have "(\<Prod>p \<in> S. p ^ f p) = (\<Prod>p \<in> S. p ^ g p) "
   586   from set_mset_A assms have "(\<Prod>p \<in> S. p ^ f p) = (\<Prod>p \<in> S. p ^ g p) "
   587     by (intro setprod.cong) (auto simp: g_def)
   587     by (intro setprod.cong) (auto simp: g_def)
   588   also from set_mset_A assms have "\<dots> = (\<Prod>p \<in> set_mset A. p ^ g p)"
   588   also from set_mset_A assms have "\<dots> = (\<Prod>p \<in> set_mset A. p ^ g p)"
   589     by (intro setprod.mono_neutral_right) (auto simp: g_def set_mset_A)
   589     by (intro setprod.mono_neutral_right) (auto simp: g_def set_mset_A)
   590   also have "\<dots> = msetprod A"
   590   also have "\<dots> = prod_mset A"
   591     by (auto simp: msetprod_multiplicity count_A set_mset_A intro!: setprod.cong)
   591     by (auto simp: prod_mset_multiplicity count_A set_mset_A intro!: setprod.cong)
   592   also from assms have "multiplicity p \<dots> = msetsum (image_mset (multiplicity p) A)"
   592   also from assms have "multiplicity p \<dots> = sum_mset (image_mset (multiplicity p) A)"
   593     by (subst prime_elem_multiplicity_msetprod_distrib) (auto dest: prime)
   593     by (subst prime_elem_multiplicity_prod_mset_distrib) (auto dest: prime)
   594   also from assms have "image_mset (multiplicity p) A = image_mset (\<lambda>x. if x = p then 1 else 0) A"
   594   also from assms have "image_mset (multiplicity p) A = image_mset (\<lambda>x. if x = p then 1 else 0) A"
   595     by (intro image_mset_cong) (auto simp: prime_multiplicity_other dest: prime)
   595     by (intro image_mset_cong) (auto simp: prime_multiplicity_other dest: prime)
   596   also have "msetsum \<dots> = (if p \<in> S then f p else 0)" by (simp add: msetsum_delta count_A g_def)
   596   also have "sum_mset \<dots> = (if p \<in> S then f p else 0)" by (simp add: sum_mset_delta count_A g_def)
   597   finally show ?thesis .
   597   finally show ?thesis .
   598 qed
   598 qed
   599 
   599 
   600 lemma prime_dvd_fact_iff:
   600 lemma prime_dvd_fact_iff:
   601   assumes "prime p"
   601   assumes "prime p"