src/HOL/Number_Theory/UniqueFactorization.thy
author wenzelm
Wed, 04 Nov 2015 23:27:00 +0100
changeset 61578 6623c81cb15a
parent 60981 e1159bd15982
child 61714 7c1ad030f0c9
permissions -rw-r--r--
avoid ligatures;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41959
b460124855b8 tuned headers;
wenzelm
parents: 41541
diff changeset
     1
(*  Title:      HOL/Number_Theory/UniqueFactorization.thy
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     2
    Author:     Jeremy Avigad
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     3
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
     4
Note: there were previous Isabelle formalizations of unique
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
     5
factorization due to Thomas Marthedal Rasmussen, and, building on
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
     6
that, by Jeremy Avigad and David Gray.
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     7
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
     8
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
     9
section \<open>Unique factorization for the natural numbers and the integers\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    10
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    11
theory UniqueFactorization
41413
64cd30d6b0b8 explicit file specifications -- avoid secondary load path;
wenzelm
parents: 40461
diff changeset
    12
imports Cong "~~/src/HOL/Library/Multiset"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    13
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    14
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    15
(* As a simp or intro rule,
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    16
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    17
     prime p \<Longrightarrow> p > 0
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    18
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    19
   wreaks havoc here. When the premise includes \<forall>x \<in># M. prime x, it
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    20
   leads to the backchaining
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    21
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    22
     x > 0
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    23
     prime x
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    24
     x \<in># M   which is, unfortunately,
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    25
     count M x > 0
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    26
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    27
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    28
(* Here is a version of set product for multisets. Is it worth moving
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    29
   to multiset.thy? If so, one should similarly define msetsum for abelian
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    30
   semirings, using of_nat. Also, is it worth developing bounded quantifiers
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    31
   "\<forall>i \<in># M. P i"?
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    32
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    33
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    34
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    35
subsection \<open>Unique factorization: multiset version\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    36
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    37
lemma multiset_prime_factorization_exists:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    38
  "n > 0 \<Longrightarrow> (\<exists>M. (\<forall>p::nat \<in> set_mset M. prime p) \<and> n = (\<Prod>i \<in># M. i))"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    39
proof (induct n rule: nat_less_induct)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    40
  fix n :: nat
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    41
  assume ih: "\<forall>m < n. 0 < m \<longrightarrow> (\<exists>M. (\<forall>p\<in>set_mset M. prime p) \<and> m = (\<Prod>i \<in># M. i))"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    42
  assume "n > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    43
  then consider "n = 1" | "n > 1" "prime n" | "n > 1" "\<not> prime n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    44
    by arith
60567
19c277ea65ae tuned proofs -- less digits;
wenzelm
parents: 60527
diff changeset
    45
  then show "\<exists>M. (\<forall>p \<in> set_mset M. prime p) \<and> n = (\<Prod>i\<in>#M. i)"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    46
  proof cases
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    47
    case 1
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    48
    then have "(\<forall>p\<in>set_mset {#}. prime p) \<and> n = (\<Prod>i \<in># {#}. i)"
49824
c26665a197dc msetprod based directly on Multiset.fold;
haftmann
parents: 49719
diff changeset
    49
      by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    50
    then show ?thesis ..
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    51
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    52
    case 2
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    53
    then have "(\<forall>p\<in>set_mset {#n#}. prime p) \<and> n = (\<Prod>i \<in># {#n#}. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    54
      by auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    55
    then show ?thesis ..
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    56
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    57
    case 3
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    58
    with not_prime_eq_prod_nat
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    59
    obtain m k where n: "n = m * k" "1 < m" "m < n" "1 < k" "k < n"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    60
      by blast
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    61
    with ih obtain Q R where "(\<forall>p \<in> set_mset Q. prime p) \<and> m = (\<Prod>i\<in>#Q. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    62
        and "(\<forall>p\<in>set_mset R. prime p) \<and> k = (\<Prod>i\<in>#R. i)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    63
      by blast
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    64
    then have "(\<forall>p\<in>set_mset (Q + R). prime p) \<and> n = (\<Prod>i \<in># Q + R. i)"
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
    65
      by (auto simp add: n msetprod_Un)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    66
    then show ?thesis ..
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    67
  qed
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    68
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    69
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    70
lemma multiset_prime_factorization_unique_aux:
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
    71
  fixes a :: nat
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    72
  assumes "\<forall>p\<in>set_mset M. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    73
    and "\<forall>p\<in>set_mset N. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    74
    and "(\<Prod>i \<in># M. i) dvd (\<Prod>i \<in># N. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    75
  shows "count M a \<le> count N a"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    76
proof (cases "a \<in> set_mset M")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    77
  case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    78
  with assms have a: "prime a"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    79
    by auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    80
  with True have "a ^ count M a dvd (\<Prod>i \<in># M. i)"
59010
ec2b4270a502 generalized lemmas and tuned proofs
haftmann
parents: 58889
diff changeset
    81
    by (auto simp add: msetprod_multiplicity)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    82
  also have "\<dots> dvd (\<Prod>i \<in># N. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    83
    by (rule assms)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    84
  also have "\<dots> = (\<Prod>i \<in> set_mset N. i ^ count N i)"
49824
c26665a197dc msetprod based directly on Multiset.fold;
haftmann
parents: 49719
diff changeset
    85
    by (simp add: msetprod_multiplicity)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    86
  also have "\<dots> = a ^ count N a * (\<Prod>i \<in> (set_mset N - {a}). i ^ count N i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    87
  proof (cases "a \<in> set_mset N")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    88
    case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    89
    then have b: "set_mset N = {a} \<union> (set_mset N - {a})"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    90
      by auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    91
    then show ?thesis
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
    92
      by (subst (1) b, subst setprod.union_disjoint, auto)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    93
  next
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    94
    case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    95
    then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    96
      by auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    97
  qed
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
    98
  finally have "a ^ count M a dvd a ^ count N a * (\<Prod>i \<in> (set_mset N - {a}). i ^ count N i)" .
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
    99
  moreover
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   100
  have "coprime (a ^ count M a) (\<Prod>i \<in> (set_mset N - {a}). i ^ count N i)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   101
    apply (subst gcd_commute_nat)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   102
    apply (rule setprod_coprime_nat)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   103
    apply (rule primes_imp_powers_coprime_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   104
    using assms True
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   105
    apply auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   106
    done
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   107
  ultimately have "a ^ count M a dvd a ^ count N a"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   108
    by (elim coprime_dvd_mult_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   109
  with a show ?thesis
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   110
    apply (intro power_dvd_imp_le)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   111
    apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   112
    done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   113
next
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   114
  case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   115
  then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   116
    by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   117
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   118
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   119
lemma multiset_prime_factorization_unique:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   120
  assumes "\<forall>p::nat \<in> set_mset M. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   121
    and "\<forall>p \<in> set_mset N. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   122
    and "(\<Prod>i \<in># M. i) = (\<Prod>i \<in># N. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   123
  shows "M = N"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   124
proof -
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   125
  have "count M a = count N a" for a
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   126
  proof -
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   127
    from assms have "count M a \<le> count N a"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   128
      by (intro multiset_prime_factorization_unique_aux, auto)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   129
    moreover from assms have "count N a \<le> count M a"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   130
      by (intro multiset_prime_factorization_unique_aux, auto)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   131
    ultimately show ?thesis
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   132
      by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   133
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   134
  then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   135
    by (simp add: multiset_eq_iff)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   136
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   137
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   138
definition multiset_prime_factorization :: "nat \<Rightarrow> nat multiset"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   139
where
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   140
  "multiset_prime_factorization n =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   141
    (if n > 0
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   142
     then THE M. (\<forall>p \<in> set_mset M. prime p) \<and> n = (\<Prod>i \<in># M. i)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   143
     else {#})"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   144
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   145
lemma multiset_prime_factorization: "n > 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   146
    (\<forall>p \<in> set_mset (multiset_prime_factorization n). prime p) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   147
       n = (\<Prod>i \<in># (multiset_prime_factorization n). i)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   148
  apply (unfold multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   149
  apply clarsimp
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   150
  apply (frule multiset_prime_factorization_exists)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   151
  apply clarify
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   152
  apply (rule theI)
49719
b2135b2730e8 simplified type of msetprod;
haftmann
parents: 49718
diff changeset
   153
  apply (insert multiset_prime_factorization_unique)
b2135b2730e8 simplified type of msetprod;
haftmann
parents: 49718
diff changeset
   154
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   155
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   156
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   157
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   158
subsection \<open>Prime factors and multiplicity for nat and int\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   159
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   160
class unique_factorization =
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   161
  fixes multiplicity :: "'a \<Rightarrow> 'a \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   162
    and prime_factors :: "'a \<Rightarrow> 'a set"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   163
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   164
text \<open>Definitions for the natural numbers.\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   165
instantiation nat :: unique_factorization
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   166
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   167
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   168
definition multiplicity_nat :: "nat \<Rightarrow> nat \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   169
  where "multiplicity_nat p n = count (multiset_prime_factorization n) p"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   170
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   171
definition prime_factors_nat :: "nat \<Rightarrow> nat set"
60495
d7ff0a1df90a renamed Multiset.set_of to the canonical set_mset
nipkow
parents: 59010
diff changeset
   172
  where "prime_factors_nat n = set_mset (multiset_prime_factorization n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   173
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   174
instance ..
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   175
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   176
end
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   177
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   178
text \<open>Definitions for the integers.\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   179
instantiation int :: unique_factorization
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   180
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   181
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   182
definition multiplicity_int :: "int \<Rightarrow> int \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   183
  where "multiplicity_int p n = multiplicity (nat p) (nat n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   184
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   185
definition prime_factors_int :: "int \<Rightarrow> int set"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   186
  where "prime_factors_int n = int ` (prime_factors (nat n))"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   187
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   188
instance ..
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   189
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   190
end
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   191
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   192
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   193
subsection \<open>Set up transfer\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   194
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   195
lemma transfer_nat_int_prime_factors: "prime_factors (nat n) = nat ` prime_factors n"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   196
  unfolding prime_factors_int_def
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   197
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   198
  apply (subst transfer_int_nat_set_return_embed)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   199
  apply assumption
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   200
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   201
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   202
lemma transfer_nat_int_prime_factors_closure: "n \<ge> 0 \<Longrightarrow> nat_set (prime_factors n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   203
  by (auto simp add: nat_set_def prime_factors_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   204
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   205
lemma transfer_nat_int_multiplicity:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   206
  "p \<ge> 0 \<Longrightarrow> n \<ge> 0 \<Longrightarrow> multiplicity (nat p) (nat n) = multiplicity p n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   207
  by (auto simp add: multiplicity_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   208
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   209
declare transfer_morphism_nat_int[transfer add return:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   210
  transfer_nat_int_prime_factors transfer_nat_int_prime_factors_closure
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   211
  transfer_nat_int_multiplicity]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   212
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   213
lemma transfer_int_nat_prime_factors: "prime_factors (int n) = int ` prime_factors n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   214
  unfolding prime_factors_int_def by auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   215
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   216
lemma transfer_int_nat_prime_factors_closure: "is_nat n \<Longrightarrow> nat_set (prime_factors n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   217
  by (simp only: transfer_nat_int_prime_factors_closure is_nat_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   218
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   219
lemma transfer_int_nat_multiplicity: "multiplicity (int p) (int n) = multiplicity p n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   220
  by (auto simp add: multiplicity_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   221
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   222
declare transfer_morphism_int_nat[transfer add return:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   223
  transfer_int_nat_prime_factors transfer_int_nat_prime_factors_closure
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   224
  transfer_int_nat_multiplicity]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   225
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   226
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   227
subsection \<open>Properties of prime factors and multiplicity for nat and int\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   228
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   229
lemma prime_factors_ge_0_int [elim]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   230
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   231
  shows "p \<in> prime_factors n \<Longrightarrow> p \<ge> 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   232
  unfolding prime_factors_int_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   233
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   234
lemma prime_factors_prime_nat [intro]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   235
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   236
  shows "p \<in> prime_factors n \<Longrightarrow> prime p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   237
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   238
  apply (simp add: prime_factors_nat_def multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   239
  apply (auto simp add: prime_factors_nat_def multiset_prime_factorization)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   240
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   241
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   242
lemma prime_factors_prime_int [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   243
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   244
  assumes "n \<ge> 0" and "p \<in> prime_factors n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   245
  shows "prime p"
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   246
  apply (rule prime_factors_prime_nat [transferred, of n p, simplified])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   247
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   248
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   249
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   250
lemma prime_factors_gt_0_nat [elim]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   251
  fixes p :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   252
  shows "p \<in> prime_factors x \<Longrightarrow> p > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   253
  by (auto dest!: prime_factors_prime_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   254
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   255
lemma prime_factors_gt_0_int [elim]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   256
  shows "x \<ge> 0 \<Longrightarrow> p \<in> prime_factors x \<Longrightarrow> int p > (0::int)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   257
  by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   258
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   259
lemma prime_factors_finite_nat [iff]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   260
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   261
  shows "finite (prime_factors n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   262
  unfolding prime_factors_nat_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   263
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   264
lemma prime_factors_finite_int [iff]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   265
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   266
  shows "finite (prime_factors n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   267
  unfolding prime_factors_int_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   268
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   269
lemma prime_factors_altdef_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   270
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   271
  shows "prime_factors n = {p. multiplicity p n > 0}"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   272
  by (force simp add: prime_factors_nat_def multiplicity_nat_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   273
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   274
lemma prime_factors_altdef_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   275
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   276
  shows "prime_factors n = {p. p \<ge> 0 \<and> multiplicity p n > 0}"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   277
  apply (unfold prime_factors_int_def multiplicity_int_def)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   278
  apply (subst prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   279
  apply (auto simp add: image_def)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   280
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   281
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   282
lemma prime_factorization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   283
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   284
  shows "n > 0 \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   285
  apply (frule multiset_prime_factorization)
49824
c26665a197dc msetprod based directly on Multiset.fold;
haftmann
parents: 49719
diff changeset
   286
  apply (simp add: prime_factors_nat_def multiplicity_nat_def msetprod_multiplicity)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   287
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   288
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   289
lemma prime_factorization_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   290
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   291
  assumes "n > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   292
  shows "n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   293
  apply (rule prime_factorization_nat [transferred, of n])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   294
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   295
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   296
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   297
lemma prime_factorization_unique_nat:
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   298
  fixes f :: "nat \<Rightarrow> _"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   299
  assumes S_eq: "S = {p. 0 < f p}"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   300
    and "finite S"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   301
    and "\<forall>p\<in>S. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   302
    and "n = (\<Prod>p\<in>S. p ^ f p)"
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   303
  shows "S = prime_factors n \<and> (\<forall>p. f p = multiplicity p n)"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   304
proof -
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   305
  from assms have "f \<in> multiset"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   306
    by (auto simp add: multiset_def)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   307
  moreover from assms have "n > 0" by force
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   308
  ultimately have "multiset_prime_factorization n = Abs_multiset f"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   309
    apply (unfold multiset_prime_factorization_def)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   310
    apply (subst if_P, assumption)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   311
    apply (rule the1_equality)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   312
    apply (rule ex_ex1I)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   313
    apply (rule multiset_prime_factorization_exists, assumption)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   314
    apply (rule multiset_prime_factorization_unique)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   315
    apply force
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   316
    apply force
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   317
    apply force
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   318
    using assms apply (simp add: set_mset_def msetprod_multiplicity)
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   319
    done
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   320
  with \<open>f \<in> multiset\<close> have "count (multiset_prime_factorization n) = f"
59010
ec2b4270a502 generalized lemmas and tuned proofs
haftmann
parents: 58889
diff changeset
   321
    by simp
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   322
  with S_eq show ?thesis
60495
d7ff0a1df90a renamed Multiset.set_of to the canonical set_mset
nipkow
parents: 59010
diff changeset
   323
    by (simp add: set_mset_def multiset_def prime_factors_nat_def multiplicity_nat_def)
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   324
qed
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   325
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   326
lemma prime_factors_characterization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   327
  "S = {p. 0 < f (p::nat)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   328
    finite S \<Longrightarrow> \<forall>p\<in>S. prime p \<Longrightarrow> n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> prime_factors n = S"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   329
  by (rule prime_factorization_unique_nat [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   330
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   331
lemma prime_factors_characterization'_nat:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   332
  "finite {p. 0 < f (p::nat)} \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   333
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   334
      prime_factors (\<Prod>p | 0 < f p. p ^ f p) = {p. 0 < f p}"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   335
  by (rule prime_factors_characterization_nat) auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   336
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   337
(* A minor glitch:*)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   338
thm prime_factors_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   339
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   340
      transferred direction: nat "op \<le> (0::int)", rule_format]
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   341
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   342
(*
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   343
  Transfer isn't smart enough to know that the "0 < f p" should
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   344
  remain a comparison between nats. But the transfer still works.
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   345
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   346
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   347
lemma primes_characterization'_int [rule_format]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   348
  "finite {p. p \<ge> 0 \<and> 0 < f (p::int)} \<Longrightarrow> \<forall>p. 0 < f p \<longrightarrow> prime p \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   349
      prime_factors (\<Prod>p | p \<ge> 0 \<and> 0 < f p. p ^ f p) = {p. p \<ge> 0 \<and> 0 < f p}"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   350
  using prime_factors_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   351
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   352
    transferred direction: nat "op \<le> (0::int)"]
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   353
  by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   354
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   355
lemma prime_factors_characterization_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   356
  "S = {p. 0 < f (p::int)} \<Longrightarrow> finite S \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   357
    \<forall>p\<in>S. prime (nat p) \<Longrightarrow> n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> prime_factors n = S"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   358
  apply simp
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   359
  apply (subgoal_tac "{p. 0 < f p} = {p. 0 \<le> p \<and> 0 < f p}")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   360
  apply (simp only:)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   361
  apply (subst primes_characterization'_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   362
  apply auto
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   363
  apply (metis nat_int)
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   364
  apply (metis le_cases nat_le_0 zero_not_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   365
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   366
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   367
lemma multiplicity_characterization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   368
  "S = {p. 0 < f (p::nat)} \<Longrightarrow> finite S \<Longrightarrow> \<forall>p\<in>S. prime p \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   369
    n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> multiplicity p n = f p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   370
  apply (frule prime_factorization_unique_nat [THEN conjunct2, rule_format, symmetric])
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   371
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   372
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   373
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   374
lemma multiplicity_characterization'_nat: "finite {p. 0 < f (p::nat)} \<longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   375
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   376
      multiplicity p (\<Prod>p | 0 < f p. p ^ f p) = f p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   377
  apply (intro impI)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   378
  apply (rule multiplicity_characterization_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   379
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   380
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   381
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   382
lemma multiplicity_characterization'_int [rule_format]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   383
  "finite {p. p \<ge> 0 \<and> 0 < f (p::int)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   384
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow> p \<ge> 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   385
      multiplicity p (\<Prod>p | p \<ge> 0 \<and> 0 < f p. p ^ f p) = f p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   386
  apply (insert multiplicity_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   387
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   388
      transferred direction: nat "op \<le> (0::int)", rule_format])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   389
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   390
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   391
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   392
lemma multiplicity_characterization_int: "S = {p. 0 < f (p::int)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   393
    finite S \<Longrightarrow> \<forall>p\<in>S. prime (nat p) \<Longrightarrow> n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   394
      p \<ge> 0 \<Longrightarrow> multiplicity p n = f p"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   395
  apply simp
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   396
  apply (subgoal_tac "{p. 0 < f p} = {p. 0 \<le> p \<and> 0 < f p}")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   397
  apply (simp only:)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   398
  apply (subst multiplicity_characterization'_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   399
  apply auto
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   400
  apply (metis nat_int)
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   401
  apply (metis le_cases nat_le_0 zero_not_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   402
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   403
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   404
lemma multiplicity_zero_nat [simp]: "multiplicity (p::nat) 0 = 0"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   405
  by (simp add: multiplicity_nat_def multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   406
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   407
lemma multiplicity_zero_int [simp]: "multiplicity (p::int) 0 = 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   408
  by (simp add: multiplicity_int_def)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   409
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   410
lemma multiplicity_one_nat': "multiplicity p (1::nat) = 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   411
  by (subst multiplicity_characterization_nat [where f = "\<lambda>x. 0"], auto)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   412
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   413
lemma multiplicity_one_nat [simp]: "multiplicity p (Suc 0) = 0"
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   414
  by (metis One_nat_def multiplicity_one_nat')
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   415
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   416
lemma multiplicity_one_int [simp]: "multiplicity p (1::int) = 0"
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   417
  by (metis multiplicity_int_def multiplicity_one_nat' transfer_nat_int_numerals(2))
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   418
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   419
lemma multiplicity_prime_nat [simp]: "prime p \<Longrightarrow> multiplicity p p = 1"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   420
  apply (subst multiplicity_characterization_nat [where f = "\<lambda>q. if q = p then 1 else 0"])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   421
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   422
  apply (metis (full_types) less_not_refl)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   423
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   424
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   425
lemma multiplicity_prime_power_nat [simp]: "prime p \<Longrightarrow> multiplicity p (p ^ n) = n"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   426
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   427
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   428
  apply (subst multiplicity_characterization_nat [where f = "\<lambda>q. if q = p then n else 0"])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   429
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   430
  apply (metis (full_types) less_not_refl)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   431
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   432
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   433
lemma multiplicity_prime_power_int [simp]: "prime p \<Longrightarrow> multiplicity p (int p ^ n) = n"
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   434
  by (metis multiplicity_prime_power_nat of_nat_power transfer_int_nat_multiplicity)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   435
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   436
lemma multiplicity_nonprime_nat [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   437
  fixes p n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   438
  shows "\<not> prime p \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   439
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   440
  apply auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   441
  apply (frule multiset_prime_factorization)
60495
d7ff0a1df90a renamed Multiset.set_of to the canonical set_mset
nipkow
parents: 59010
diff changeset
   442
  apply (auto simp add: set_mset_def multiplicity_nat_def)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   443
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   444
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   445
lemma multiplicity_not_factor_nat [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   446
  fixes p n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   447
  shows "p \<notin> prime_factors n \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   448
  apply (subst (asm) prime_factors_altdef_nat)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   449
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   450
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   451
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   452
lemma multiplicity_not_factor_int [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   453
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   454
  shows "p \<ge> 0 \<Longrightarrow> p \<notin> prime_factors n \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   455
  apply (subst (asm) prime_factors_altdef_int)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   456
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   457
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   458
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   459
(*FIXME: messy*)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   460
lemma multiplicity_product_aux_nat: "(k::nat) > 0 \<Longrightarrow> l > 0 \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   461
    (prime_factors k) \<union> (prime_factors l) = prime_factors (k * l) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   462
    (\<forall>p. multiplicity p k + multiplicity p l = multiplicity p (k * l))"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   463
  apply (rule prime_factorization_unique_nat)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   464
  apply (simp only: prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   465
  apply auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   466
  apply (subst power_add)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   467
  apply (subst setprod.distrib)
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   468
  apply (rule arg_cong2 [where f = "\<lambda>x y. x*y"])
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   469
  apply (subgoal_tac "prime_factors k \<union> prime_factors l = prime_factors k \<union>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   470
      (prime_factors l - prime_factors k)")
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   471
  apply (erule ssubst)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   472
  apply (subst setprod.union_disjoint)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   473
  apply auto
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   474
  apply (metis One_nat_def nat_mult_1_right prime_factorization_nat setprod.neutral_const)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   475
  apply (subgoal_tac "prime_factors k \<union> prime_factors l = prime_factors l \<union>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   476
      (prime_factors k - prime_factors l)")
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   477
  apply (erule ssubst)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   478
  apply (subst setprod.union_disjoint)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   479
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   480
  apply (subgoal_tac "(\<Prod>p\<in>prime_factors k - prime_factors l. p ^ multiplicity p l) =
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   481
      (\<Prod>p\<in>prime_factors k - prime_factors l. 1)")
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   482
  apply auto
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   483
  apply (metis One_nat_def nat_mult_1_right prime_factorization_nat setprod.neutral_const)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   484
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   485
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   486
(* transfer doesn't have the same problem here with the right
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   487
   choice of rules. *)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   488
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   489
lemma multiplicity_product_aux_int:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   490
  assumes "(k::int) > 0" and "l > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   491
  shows "prime_factors k \<union> prime_factors l = prime_factors (k * l) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   492
    (\<forall>p \<ge> 0. multiplicity p k + multiplicity p l = multiplicity p (k * l))"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   493
  apply (rule multiplicity_product_aux_nat [transferred, of l k])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   494
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   495
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   496
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   497
lemma prime_factors_product_nat: "(k::nat) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> prime_factors (k * l) =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   498
    prime_factors k \<union> prime_factors l"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   499
  by (rule multiplicity_product_aux_nat [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   500
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   501
lemma prime_factors_product_int: "(k::int) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> prime_factors (k * l) =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   502
    prime_factors k \<union> prime_factors l"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   503
  by (rule multiplicity_product_aux_int [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   504
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   505
lemma multiplicity_product_nat: "(k::nat) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> multiplicity p (k * l) =
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   506
    multiplicity p k + multiplicity p l"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   507
  by (rule multiplicity_product_aux_nat [THEN conjunct2, rule_format, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   508
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   509
lemma multiplicity_product_int: "(k::int) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> p \<ge> 0 \<Longrightarrow>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   510
    multiplicity p (k * l) = multiplicity p k + multiplicity p l"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   511
  by (rule multiplicity_product_aux_int [THEN conjunct2, rule_format, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   512
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   513
lemma multiplicity_setprod_nat: "finite S \<Longrightarrow> \<forall>x\<in>S. f x > 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   514
    multiplicity (p::nat) (\<Prod>x \<in> S. f x) = (\<Sum>x \<in> S. multiplicity p (f x))"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   515
  apply (induct set: finite)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   516
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   517
  apply (subst multiplicity_product_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   518
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   519
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   520
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   521
(* Transfer is delicate here for two reasons: first, because there is
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   522
   an implicit quantifier over functions (f), and, second, because the
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   523
   product over the multiplicity should not be translated to an integer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   524
   product.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   525
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   526
   The way to handle the first is to use quantifier rules for functions.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   527
   The way to handle the second is to turn off the offending rule.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   528
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   529
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   530
lemma transfer_nat_int_sum_prod_closure3: "(\<Sum>x \<in> A. int (f x)) \<ge> 0" "(\<Prod>x \<in> A. int (f x)) \<ge> 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   531
  apply (rule setsum_nonneg; auto)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   532
  apply (rule setprod_nonneg; auto)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   533
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   534
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   535
declare transfer_morphism_nat_int[transfer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   536
  add return: transfer_nat_int_sum_prod_closure3
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   537
  del: transfer_nat_int_sum_prod2 (1)]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   538
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   539
lemma multiplicity_setprod_int: "p \<ge> 0 \<Longrightarrow> finite S \<Longrightarrow> \<forall>x\<in>S. f x > 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   540
    multiplicity (p::int) (\<Prod>x \<in> S. f x) = (\<Sum>x \<in> S. multiplicity p (f x))"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   541
  apply (frule multiplicity_setprod_nat
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   542
    [where f = "\<lambda>x. nat(int(nat(f x)))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   543
      transferred direction: nat "op \<le> (0::int)"])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   544
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   545
  apply (subst (asm) setprod.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   546
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   547
  apply (rule if_P)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   548
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   549
  apply (rule setsum.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   550
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   551
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   552
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   553
declare transfer_morphism_nat_int[transfer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   554
  add return: transfer_nat_int_sum_prod2 (1)]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   555
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   556
lemma multiplicity_prod_prime_powers_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   557
    "finite S \<Longrightarrow> \<forall>p\<in>S. prime (p::nat) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   558
       multiplicity p (\<Prod>p \<in> S. p ^ f p) = (if p \<in> S then f p else 0)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   559
  apply (subgoal_tac "(\<Prod>p \<in> S. p ^ f p) = (\<Prod>p \<in> S. p ^ (\<lambda>x. if x \<in> S then f x else 0) p)")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   560
  apply (erule ssubst)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   561
  apply (subst multiplicity_characterization_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   562
  prefer 5 apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   563
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   564
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   565
  apply (subst setprod.mono_neutral_right)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   566
  apply assumption
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   567
  prefer 3
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   568
  apply (rule setprod.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   569
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   570
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   571
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   572
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   573
(* Here the issue with transfer is the implicit quantifier over S *)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   574
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   575
lemma multiplicity_prod_prime_powers_int:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   576
    "(p::int) \<ge> 0 \<Longrightarrow> finite S \<Longrightarrow> \<forall>p\<in>S. prime (nat p) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   577
       multiplicity p (\<Prod>p \<in> S. p ^ f p) = (if p \<in> S then f p else 0)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   578
  apply (subgoal_tac "int ` nat ` S = S")
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   579
  apply (frule multiplicity_prod_prime_powers_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   580
    [where f = "\<lambda>x. f(int x)" and S = "nat ` S", transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   581
  apply auto
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   582
  apply (metis linear nat_0_iff zero_not_prime_nat)
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   583
  apply (metis (full_types) image_iff int_nat_eq less_le less_linear nat_0_iff zero_not_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   584
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   585
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   586
lemma multiplicity_distinct_prime_power_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   587
    "prime p \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> multiplicity p (q ^ n) = 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   588
  apply (subgoal_tac "q ^ n = setprod (\<lambda>x. x ^ n) {q}")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   589
  apply (erule ssubst)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   590
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   591
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   592
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   593
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   594
lemma multiplicity_distinct_prime_power_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   595
    "prime p \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> multiplicity p (int q ^ n) = 0"
55242
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   596
  by (metis multiplicity_distinct_prime_power_nat of_nat_power transfer_int_nat_multiplicity)
413ec965f95d Number_Theory: prime is no longer overloaded, but only for nat. Automatic coercion to int enabled.
paulson <lp15@cam.ac.uk>
parents: 55130
diff changeset
   597
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   598
lemma dvd_multiplicity_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   599
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   600
  shows "0 < y \<Longrightarrow> x dvd y \<Longrightarrow> multiplicity p x \<le> multiplicity p y"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   601
  apply (cases "x = 0")
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   602
  apply (auto simp add: dvd_def multiplicity_product_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   603
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   604
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   605
lemma dvd_multiplicity_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   606
  fixes p x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   607
  shows "0 < y \<Longrightarrow> 0 \<le> x \<Longrightarrow> x dvd y \<Longrightarrow> p \<ge> 0 \<Longrightarrow> multiplicity p x \<le> multiplicity p y"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   608
  apply (cases "x = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   609
  apply (auto simp add: dvd_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   610
  apply (subgoal_tac "0 < k")
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   611
  apply (auto simp add: multiplicity_product_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   612
  apply (erule zero_less_mult_pos)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   613
  apply arith
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   614
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   615
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   616
lemma dvd_prime_factors_nat [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   617
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   618
  shows "0 < y \<Longrightarrow> x dvd y \<Longrightarrow> prime_factors x \<le> prime_factors y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   619
  apply (simp only: prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   620
  apply auto
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   621
  apply (metis dvd_multiplicity_nat le_0_eq neq0_conv)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   622
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   623
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   624
lemma dvd_prime_factors_int [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   625
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   626
  shows "0 < y \<Longrightarrow> 0 \<le> x \<Longrightarrow> x dvd y \<Longrightarrow> prime_factors x \<le> prime_factors y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   627
  apply (auto simp add: prime_factors_altdef_int)
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   628
  apply (metis dvd_multiplicity_int le_0_eq neq0_conv)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   629
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   630
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   631
lemma multiplicity_dvd_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   632
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   633
  shows "0 < x \<Longrightarrow> 0 < y \<Longrightarrow> \<forall>p. multiplicity p x \<le> multiplicity p y \<Longrightarrow> x dvd y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   634
  apply (subst prime_factorization_nat [of x], assumption)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   635
  apply (subst prime_factorization_nat [of y], assumption)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   636
  apply (rule setprod_dvd_setprod_subset2)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   637
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   638
  apply (subst prime_factors_altdef_nat)+
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   639
  apply auto
40461
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   640
  apply (metis gr0I le_0_eq less_not_refl)
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   641
  apply (metis le_imp_power_dvd)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   642
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   643
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   644
lemma multiplicity_dvd_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   645
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   646
  shows "0 < x \<Longrightarrow> 0 < y \<Longrightarrow> \<forall>p\<ge>0. multiplicity p x \<le> multiplicity p y \<Longrightarrow> x dvd y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   647
  apply (subst prime_factorization_int [of x], assumption)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   648
  apply (subst prime_factorization_int [of y], assumption)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   649
  apply (rule setprod_dvd_setprod_subset2)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   650
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   651
  apply (subst prime_factors_altdef_int)+
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   652
  apply auto
40461
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   653
  apply (metis le_imp_power_dvd prime_factors_ge_0_int)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   654
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   655
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   656
lemma multiplicity_dvd'_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   657
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   658
  shows "0 < x \<Longrightarrow> \<forall>p. prime p \<longrightarrow> multiplicity p x \<le> multiplicity p y \<Longrightarrow> x dvd y"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   659
  by (metis gcd_lcm_complete_lattice_nat.top_greatest le_refl multiplicity_dvd_nat
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   660
      multiplicity_nonprime_nat neq0_conv)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   661
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   662
lemma multiplicity_dvd'_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   663
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   664
  shows "0 < x \<Longrightarrow> 0 \<le> y \<Longrightarrow>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   665
    \<forall>p. prime p \<longrightarrow> multiplicity p x \<le> multiplicity p y \<Longrightarrow> x dvd y"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   666
  by (metis GCD.dvd_int_iff abs_int_eq multiplicity_dvd'_nat multiplicity_int_def nat_int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   667
    zero_le_imp_eq_int zero_less_imp_eq_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   668
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   669
lemma dvd_multiplicity_eq_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   670
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   671
  shows "0 < x \<Longrightarrow> 0 < y \<Longrightarrow> x dvd y \<longleftrightarrow> (\<forall>p. multiplicity p x \<le> multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   672
  by (auto intro: dvd_multiplicity_nat multiplicity_dvd_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   673
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   674
lemma dvd_multiplicity_eq_int: "0 < (x::int) \<Longrightarrow> 0 < y \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   675
    (x dvd y) = (\<forall>p\<ge>0. multiplicity p x \<le> multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   676
  by (auto intro: dvd_multiplicity_int multiplicity_dvd_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   677
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   678
lemma prime_factors_altdef2_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   679
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   680
  shows "n > 0 \<Longrightarrow> p \<in> prime_factors n \<longleftrightarrow> prime p \<and> p dvd n"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   681
  apply (cases "prime p")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   682
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   683
  apply (subst prime_factorization_nat [where n = n], assumption)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   684
  apply (rule dvd_trans)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   685
  apply (rule dvd_power [where x = p and n = "multiplicity p n"])
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   686
  apply (subst (asm) prime_factors_altdef_nat, force)
59010
ec2b4270a502 generalized lemmas and tuned proofs
haftmann
parents: 58889
diff changeset
   687
  apply rule
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   688
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   689
  apply (metis One_nat_def Zero_not_Suc dvd_multiplicity_nat le0
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   690
    le_antisym multiplicity_not_factor_nat multiplicity_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   691
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   692
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   693
lemma prime_factors_altdef2_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   694
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   695
  assumes "n > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   696
  shows "p \<in> prime_factors n \<longleftrightarrow> prime p \<and> p dvd n"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   697
  using assms by (simp add:  prime_factors_altdef2_nat [transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   698
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   699
lemma multiplicity_eq_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   700
  fixes x and y::nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   701
  assumes [arith]: "x > 0" "y > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   702
    and mult_eq [simp]: "\<And>p. prime p \<Longrightarrow> multiplicity p x = multiplicity p y"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   703
  shows "x = y"
33657
a4179bf442d1 renamed lemmas "anti_sym" -> "antisym"
nipkow
parents: 32479
diff changeset
   704
  apply (rule dvd_antisym)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   705
  apply (auto intro: multiplicity_dvd'_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   706
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   707
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   708
lemma multiplicity_eq_int:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   709
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   710
  assumes [arith]: "x > 0" "y > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   711
    and mult_eq [simp]: "\<And>p. prime p \<Longrightarrow> multiplicity p x = multiplicity p y"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   712
  shows "x = y"
33657
a4179bf442d1 renamed lemmas "anti_sym" -> "antisym"
nipkow
parents: 32479
diff changeset
   713
  apply (rule dvd_antisym [transferred])
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   714
  apply (auto intro: multiplicity_dvd'_int)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   715
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   716
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   717
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   718
subsection \<open>An application\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   719
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   720
lemma gcd_eq_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   721
  fixes x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   722
  assumes pos [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   723
  shows "gcd x y =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   724
    (\<Prod>p \<in> prime_factors x \<union> prime_factors y. p ^ min (multiplicity p x) (multiplicity p y))"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   725
  (is "_ = ?z")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   726
proof -
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   727
  have [arith]: "?z > 0"
60981
e1159bd15982 repaired proofs after 6a6f15d8fbc4;
wenzelm
parents: 60567
diff changeset
   728
    by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   729
  have aux: "\<And>p. prime p \<Longrightarrow> multiplicity p ?z = min (multiplicity p x) (multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   730
    apply (subst multiplicity_prod_prime_powers_nat)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   731
    apply auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   732
    done
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   733
  have "?z dvd x"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   734
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   735
  moreover have "?z dvd y"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   736
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   737
  moreover have "w dvd x \<and> w dvd y \<longrightarrow> w dvd ?z" for w
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   738
  proof (cases "w = 0")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   739
    case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   740
    then show ?thesis by simp
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   741
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   742
    case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   743
    then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   744
      apply auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   745
      apply (erule multiplicity_dvd'_nat)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   746
      apply (auto intro: dvd_multiplicity_nat simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   747
      done
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   748
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   749
  ultimately have "?z = gcd x y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   750
    by (subst gcd_unique_nat [symmetric], blast)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   751
  then show ?thesis
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   752
    by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   753
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   754
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   755
lemma lcm_eq_nat:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   756
  assumes pos [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   757
  shows "lcm (x::nat) y =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   758
    (\<Prod>p \<in> prime_factors x \<union> prime_factors y. p ^ max (multiplicity p x) (multiplicity p y))"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   759
  (is "_ = ?z")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   760
proof -
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   761
  have [arith]: "?z > 0"
60981
e1159bd15982 repaired proofs after 6a6f15d8fbc4;
wenzelm
parents: 60567
diff changeset
   762
    by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   763
  have aux: "\<And>p. prime p \<Longrightarrow> multiplicity p ?z = max (multiplicity p x) (multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   764
    apply (subst multiplicity_prod_prime_powers_nat)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   765
    apply auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   766
    done
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   767
  have "x dvd ?z"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   768
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   769
  moreover have "y dvd ?z"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   770
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   771
  moreover have "x dvd w \<and> y dvd w \<longrightarrow> ?z dvd w" for w
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   772
  proof (cases "w = 0")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   773
    case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   774
    then show ?thesis by auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   775
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   776
    case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   777
    then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   778
      apply auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   779
      apply (rule multiplicity_dvd'_nat)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   780
      apply (auto intro: dvd_multiplicity_nat simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   781
      done
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   782
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   783
  ultimately have "?z = lcm x y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   784
    by (subst lcm_unique_nat [symmetric], blast)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   785
  then show ?thesis
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   786
    by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   787
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   788
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   789
lemma multiplicity_gcd_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   790
  fixes p x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   791
  assumes [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   792
  shows "multiplicity p (gcd x y) = min (multiplicity p x) (multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   793
  apply (subst gcd_eq_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   794
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   795
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   796
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   797
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   798
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   799
lemma multiplicity_lcm_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   800
  fixes p x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   801
  assumes [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   802
  shows "multiplicity p (lcm x y) = max (multiplicity p x) (multiplicity p y)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   803
  apply (subst lcm_eq_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   804
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   805
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   806
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   807
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   808
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   809
lemma gcd_lcm_distrib_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   810
  fixes x y z :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   811
  shows "gcd x (lcm y z) = lcm (gcd x y) (gcd x z)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   812
  apply (cases "x = 0 | y = 0 | z = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   813
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   814
  apply (rule multiplicity_eq_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   815
  apply (auto simp add: multiplicity_gcd_nat multiplicity_lcm_nat lcm_pos_nat)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   816
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   817
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   818
lemma gcd_lcm_distrib_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   819
  fixes x y z :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   820
  shows "gcd x (lcm y z) = lcm (gcd x y) (gcd x z)"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   821
  apply (subst (1 2 3) gcd_abs_int)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   822
  apply (subst lcm_abs_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   823
  apply (subst (2) abs_of_nonneg)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   824
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   825
  apply (rule gcd_lcm_distrib_nat [transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   826
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   827
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   828
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   829
end