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" |