src/HOL/Number_Theory/UniqueFactorization.thy
author haftmann
Fri, 26 Feb 2016 22:44:11 +0100
changeset 62430 9527ff088c15
parent 62429 25271ff79171
child 63534 523b488b15c9
permissions -rw-r--r--
more succint formulation of membership for multisets, similar to lists; discontinued ASCII notation for multiset membership; more theorems on multisets, dropping redundant interpretation; modernized notation; some annotations concerning future work
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
62430
9527ff088c15 more succint formulation of membership for multisets, similar to lists;
haftmann
parents: 62429
diff changeset
    96
      by (auto simp add: not_in_iff)
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)"
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61762
diff changeset
   101
    apply (subst gcd.commute)
62429
25271ff79171 Tuned Euclidean Rings/GCD rings
Manuel Eberl <eberlm@in.tum.de>
parents: 62349
diff changeset
   102
    apply (rule setprod_coprime)
31952
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"
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61762
diff changeset
   108
    by (elim coprime_dvd_mult)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   109
  with a show ?thesis
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   110
    using power_dvd_imp_le prime_def by blast
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   111
next
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   112
  case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   113
  then show ?thesis
62430
9527ff088c15 more succint formulation of membership for multisets, similar to lists;
haftmann
parents: 62429
diff changeset
   114
    by (auto simp add: not_in_iff)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   115
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   116
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   117
lemma multiset_prime_factorization_unique:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   118
  assumes "\<forall>p::nat \<in> set_mset M. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   119
    and "\<forall>p \<in> set_mset N. prime p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   120
    and "(\<Prod>i \<in># M. i) = (\<Prod>i \<in># N. i)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   121
  shows "M = N"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   122
proof -
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   123
  have "count M a = count N a" for a
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   124
  proof -
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   125
    from assms have "count M a \<le> count N a"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   126
      by (intro multiset_prime_factorization_unique_aux, auto)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   127
    moreover from assms have "count N a \<le> count M 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
    ultimately show ?thesis
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   130
      by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   131
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   132
  then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   133
    by (simp add: multiset_eq_iff)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   134
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   135
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   136
definition multiset_prime_factorization :: "nat \<Rightarrow> nat multiset"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   137
where
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   138
  "multiset_prime_factorization n =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   139
    (if n > 0
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   140
     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
   141
     else {#})"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   142
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   143
lemma multiset_prime_factorization: "n > 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   144
    (\<forall>p \<in> set_mset (multiset_prime_factorization n). prime p) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   145
       n = (\<Prod>i \<in># (multiset_prime_factorization n). i)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   146
  apply (unfold multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   147
  apply clarsimp
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   148
  apply (frule multiset_prime_factorization_exists)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   149
  apply clarify
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   150
  apply (rule theI)
49719
b2135b2730e8 simplified type of msetprod;
haftmann
parents: 49718
diff changeset
   151
  apply (insert multiset_prime_factorization_unique)
b2135b2730e8 simplified type of msetprod;
haftmann
parents: 49718
diff changeset
   152
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   153
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   154
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   155
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   156
subsection \<open>Prime factors and multiplicity for nat and int\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   157
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   158
class unique_factorization =
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   159
  fixes multiplicity :: "'a \<Rightarrow> 'a \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   160
    and prime_factors :: "'a \<Rightarrow> 'a set"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   161
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   162
text \<open>Definitions for the natural numbers.\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   163
instantiation nat :: unique_factorization
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   164
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   165
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   166
definition multiplicity_nat :: "nat \<Rightarrow> nat \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   167
  where "multiplicity_nat p n = count (multiset_prime_factorization n) p"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   168
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   169
definition prime_factors_nat :: "nat \<Rightarrow> nat set"
60495
d7ff0a1df90a renamed Multiset.set_of to the canonical set_mset
nipkow
parents: 59010
diff changeset
   170
  where "prime_factors_nat n = set_mset (multiset_prime_factorization n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   171
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   172
instance ..
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   173
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   174
end
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   175
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   176
text \<open>Definitions for the integers.\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   177
instantiation int :: unique_factorization
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   178
begin
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   179
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   180
definition multiplicity_int :: "int \<Rightarrow> int \<Rightarrow> nat"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   181
  where "multiplicity_int p n = multiplicity (nat p) (nat n)"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   182
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   183
definition prime_factors_int :: "int \<Rightarrow> int set"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   184
  where "prime_factors_int n = int ` (prime_factors (nat n))"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   185
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   186
instance ..
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   187
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   188
end
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   189
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   190
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   191
subsection \<open>Set up transfer\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   192
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   193
lemma transfer_nat_int_prime_factors: "prime_factors (nat n) = nat ` prime_factors n"
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   194
  unfolding prime_factors_int_def
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   195
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   196
  apply (subst transfer_int_nat_set_return_embed)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   197
  apply assumption
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   198
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   199
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   200
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
   201
  by (auto simp add: nat_set_def prime_factors_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   202
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   203
lemma transfer_nat_int_multiplicity:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   204
  "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
   205
  by (auto simp add: multiplicity_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   206
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   207
declare transfer_morphism_nat_int[transfer add return:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   208
  transfer_nat_int_prime_factors transfer_nat_int_prime_factors_closure
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   209
  transfer_nat_int_multiplicity]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   210
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   211
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
   212
  unfolding prime_factors_int_def by auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   213
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   214
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
   215
  by (simp only: transfer_nat_int_prime_factors_closure is_nat_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   216
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   217
lemma transfer_int_nat_multiplicity: "multiplicity (int p) (int n) = multiplicity p n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   218
  by (auto simp add: multiplicity_int_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   219
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   220
declare transfer_morphism_int_nat[transfer add return:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   221
  transfer_int_nat_prime_factors transfer_int_nat_prime_factors_closure
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   222
  transfer_int_nat_multiplicity]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   223
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   224
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   225
subsection \<open>Properties of prime factors and multiplicity for nat and int\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   226
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   227
lemma prime_factors_ge_0_int [elim]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   228
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   229
  shows "p \<in> prime_factors n \<Longrightarrow> p \<ge> 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   230
  unfolding prime_factors_int_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   231
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   232
lemma prime_factors_prime_nat [intro]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   233
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   234
  shows "p \<in> prime_factors n \<Longrightarrow> prime p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   235
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   236
  apply (simp add: prime_factors_nat_def multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   237
  apply (auto simp add: prime_factors_nat_def multiset_prime_factorization)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   238
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   239
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   240
lemma prime_factors_prime_int [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   241
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   242
  assumes "n \<ge> 0" and "p \<in> prime_factors n"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   243
  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
   244
  apply (rule prime_factors_prime_nat [transferred, of n p, simplified])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   245
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   246
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   247
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   248
lemma prime_factors_gt_0_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   249
  fixes p :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   250
  shows "p \<in> prime_factors x \<Longrightarrow> p > 0"
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   251
    using prime_factors_prime_nat by force
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   252
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   253
lemma prime_factors_gt_0_int:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   254
  shows "x \<ge> 0 \<Longrightarrow> p \<in> prime_factors x \<Longrightarrow> int p > (0::int)"
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   255
    by (simp add: prime_factors_gt_0_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   256
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   257
lemma prime_factors_finite_nat [iff]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   258
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   259
  shows "finite (prime_factors n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   260
  unfolding prime_factors_nat_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   261
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   262
lemma prime_factors_finite_int [iff]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   263
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   264
  shows "finite (prime_factors n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   265
  unfolding prime_factors_int_def by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   266
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   267
lemma prime_factors_altdef_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   268
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   269
  shows "prime_factors n = {p. multiplicity p n > 0}"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   270
  by (force simp add: prime_factors_nat_def multiplicity_nat_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   271
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   272
lemma prime_factors_altdef_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   273
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   274
  shows "prime_factors n = {p. p \<ge> 0 \<and> multiplicity p n > 0}"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   275
  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
   276
  apply (subst prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   277
  apply (auto simp add: image_def)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   278
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   279
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   280
lemma prime_factorization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   281
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   282
  shows "n > 0 \<Longrightarrow> n = (\<Prod>p \<in> prime_factors n. p ^ multiplicity p n)"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   283
  apply (frule multiset_prime_factorization)
49824
c26665a197dc msetprod based directly on Multiset.fold;
haftmann
parents: 49719
diff changeset
   284
  apply (simp add: prime_factors_nat_def multiplicity_nat_def msetprod_multiplicity)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   285
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   286
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   287
lemma prime_factorization_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   288
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   289
  assumes "n > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   290
  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
   291
  apply (rule prime_factorization_nat [transferred, of n])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   292
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   293
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   294
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   295
lemma prime_factorization_unique_nat:
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   296
  fixes f :: "nat \<Rightarrow> _"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   297
  assumes S_eq: "S = {p. 0 < f p}"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   298
    and "finite S"
61714
7c1ad030f0c9 Now just a few seconds faster
paulson <lp15@cam.ac.uk>
parents: 60981
diff changeset
   299
    and S: "\<forall>p\<in>S. prime p" "n = (\<Prod>p\<in>S. p ^ f p)"
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   300
  shows "S = prime_factors n \<and> (\<forall>p. f p = multiplicity p n)"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   301
proof -
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   302
  from assms have "f \<in> multiset"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   303
    by (auto simp add: multiset_def)
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   304
  moreover from assms have "n > 0" 
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   305
    by (auto intro: prime_gt_0_nat)
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   306
  ultimately have "multiset_prime_factorization n = Abs_multiset f"
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   307
    apply (unfold multiset_prime_factorization_def)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   308
    apply (subst if_P, assumption)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   309
    apply (rule the1_equality)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   310
    apply (rule ex_ex1I)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   311
    apply (rule multiset_prime_factorization_exists, assumption)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   312
    apply (rule multiset_prime_factorization_unique)
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   313
    apply force
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   314
    apply force
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   315
    apply force
61714
7c1ad030f0c9 Now just a few seconds faster
paulson <lp15@cam.ac.uk>
parents: 60981
diff changeset
   316
    using S S_eq  apply (simp add: set_mset_def msetprod_multiplicity)
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   317
    done
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   318
  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
   319
    by simp
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   320
  with S_eq show ?thesis
60495
d7ff0a1df90a renamed Multiset.set_of to the canonical set_mset
nipkow
parents: 59010
diff changeset
   321
    by (simp add: set_mset_def multiset_def prime_factors_nat_def multiplicity_nat_def)
49718
741dd8efff5b tuned proof
haftmann
parents: 49716
diff changeset
   322
qed
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   323
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   324
lemma prime_factors_characterization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   325
  "S = {p. 0 < f (p::nat)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   326
    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
   327
  by (rule prime_factorization_unique_nat [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   328
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   329
lemma prime_factors_characterization'_nat:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   330
  "finite {p. 0 < f (p::nat)} \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   331
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   332
      prime_factors (\<Prod>p | 0 < f p. p ^ f p) = {p. 0 < f p}"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   333
  by (rule prime_factors_characterization_nat) auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   334
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   335
(* A minor glitch:*)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   336
thm prime_factors_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   337
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   338
      transferred direction: nat "op \<le> (0::int)", rule_format]
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   339
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   340
(*
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   341
  Transfer isn't smart enough to know that the "0 < f p" should
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   342
  remain a comparison between nats. But the transfer still works.
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   343
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   344
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   345
lemma primes_characterization'_int [rule_format]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   346
  "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
   347
      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
   348
  using prime_factors_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   349
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   350
    transferred direction: nat "op \<le> (0::int)"]
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   351
  by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   352
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   353
lemma prime_factors_characterization_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   354
  "S = {p. 0 < f (p::int)} \<Longrightarrow> finite S \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   355
    \<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
   356
  apply simp
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   357
  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
   358
  apply (simp only:)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   359
  apply (subst primes_characterization'_int)
61714
7c1ad030f0c9 Now just a few seconds faster
paulson <lp15@cam.ac.uk>
parents: 60981
diff changeset
   360
  apply simp_all
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
   361
  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
   362
  apply (metis le_cases nat_le_0 zero_not_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   363
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   364
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   365
lemma multiplicity_characterization_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   366
  "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
   367
    n = (\<Prod>p\<in>S. p ^ f p) \<Longrightarrow> multiplicity p n = f p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   368
  apply (frule prime_factorization_unique_nat [THEN conjunct2, rule_format, symmetric])
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   369
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   370
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   371
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   372
lemma multiplicity_characterization'_nat: "finite {p. 0 < f (p::nat)} \<longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   373
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   374
      multiplicity p (\<Prod>p | 0 < f p. p ^ f p) = f p"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   375
  apply (intro impI)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   376
  apply (rule multiplicity_characterization_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   377
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   378
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   379
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   380
lemma multiplicity_characterization'_int [rule_format]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   381
  "finite {p. p \<ge> 0 \<and> 0 < f (p::int)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   382
    (\<forall>p. 0 < f p \<longrightarrow> prime p) \<Longrightarrow> p \<ge> 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   383
      multiplicity p (\<Prod>p | p \<ge> 0 \<and> 0 < f p. p ^ f p) = f p"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   384
  apply (insert multiplicity_characterization'_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   385
    [where f = "\<lambda>x. f (int (x::nat))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   386
      transferred direction: nat "op \<le> (0::int)", rule_format])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   387
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   388
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   389
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   390
lemma multiplicity_characterization_int: "S = {p. 0 < f (p::int)} \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   391
    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
   392
      p \<ge> 0 \<Longrightarrow> multiplicity p n = f p"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   393
  apply simp
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   394
  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
   395
  apply (simp only:)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   396
  apply (subst multiplicity_characterization'_int)
61714
7c1ad030f0c9 Now just a few seconds faster
paulson <lp15@cam.ac.uk>
parents: 60981
diff changeset
   397
  apply simp_all
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
   398
  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
   399
  apply (metis le_cases nat_le_0 zero_not_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   400
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   401
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   402
lemma multiplicity_zero_nat [simp]: "multiplicity (p::nat) 0 = 0"
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   403
  by (simp add: multiplicity_nat_def multiset_prime_factorization_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   404
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   405
lemma multiplicity_zero_int [simp]: "multiplicity (p::int) 0 = 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   406
  by (simp add: multiplicity_int_def)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   407
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   408
lemma multiplicity_one_nat': "multiplicity p (1::nat) = 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   409
  by (subst multiplicity_characterization_nat [where f = "\<lambda>x. 0"], auto)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   410
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   411
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
   412
  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
   413
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   414
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
   415
  by (metis multiplicity_int_def multiplicity_one_nat' transfer_nat_int_numerals(2))
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   416
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
   417
lemma multiplicity_prime_nat [simp]: "prime p \<Longrightarrow> multiplicity p p = 1"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   418
  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
   419
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   420
  apply (metis (full_types) less_not_refl)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   421
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   422
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   423
lemma multiplicity_prime_power_nat [simp]: "prime p \<Longrightarrow> multiplicity p (p ^ n) = n"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   424
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   425
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   426
  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
   427
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   428
  apply (metis (full_types) less_not_refl)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   429
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   430
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   431
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
   432
  by (metis multiplicity_prime_power_nat of_nat_power transfer_int_nat_multiplicity)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   433
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   434
lemma multiplicity_nonprime_nat [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   435
  fixes p n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   436
  shows "\<not> prime p \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   437
  apply (cases "n = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   438
  apply auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   439
  apply (frule multiset_prime_factorization)
62430
9527ff088c15 more succint formulation of membership for multisets, similar to lists;
haftmann
parents: 62429
diff changeset
   440
  apply (auto simp add: multiplicity_nat_def count_eq_zero_iff)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   441
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   442
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   443
lemma multiplicity_not_factor_nat [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   444
  fixes p n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   445
  shows "p \<notin> prime_factors n \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   446
  apply (subst (asm) prime_factors_altdef_nat)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   447
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   448
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   449
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   450
lemma multiplicity_not_factor_int [simp]:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   451
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   452
  shows "p \<ge> 0 \<Longrightarrow> p \<notin> prime_factors n \<Longrightarrow> multiplicity p n = 0"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   453
  apply (subst (asm) prime_factors_altdef_int)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   454
  apply auto
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   455
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   456
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   457
(*FIXME: messy*)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   458
lemma multiplicity_product_aux_nat: "(k::nat) > 0 \<Longrightarrow> l > 0 \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   459
    (prime_factors k) \<union> (prime_factors l) = prime_factors (k * l) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   460
    (\<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
   461
  apply (rule prime_factorization_unique_nat)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   462
  apply (simp only: prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   463
  apply auto
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   464
  apply (subst power_add)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   465
  apply (subst setprod.distrib)
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   466
  apply (rule arg_cong2 [where f = "\<lambda>x y. x*y"])
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   467
  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
   468
      (prime_factors l - prime_factors k)")
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   469
  apply (erule ssubst)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   470
  apply (subst setprod.union_disjoint)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   471
  apply auto
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   472
  apply (metis One_nat_def nat_mult_1_right prime_factorization_nat setprod.neutral_const)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   473
  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
   474
      (prime_factors k - prime_factors l)")
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   475
  apply (erule ssubst)
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   476
  apply (subst setprod.union_disjoint)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   477
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   478
  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
   479
      (\<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
   480
  apply auto
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   481
  apply (metis One_nat_def nat_mult_1_right prime_factorization_nat setprod.neutral_const)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   482
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   483
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   484
(* transfer doesn't have the same problem here with the right
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   485
   choice of rules. *)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   486
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   487
lemma multiplicity_product_aux_int:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   488
  assumes "(k::int) > 0" and "l > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   489
  shows "prime_factors k \<union> prime_factors l = prime_factors (k * l) \<and>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   490
    (\<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
   491
  apply (rule multiplicity_product_aux_nat [transferred, of l k])
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   492
  using assms apply auto
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   493
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   494
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   495
lemma prime_factors_product_nat: "(k::nat) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> prime_factors (k * l) =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   496
    prime_factors k \<union> prime_factors l"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   497
  by (rule multiplicity_product_aux_nat [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   498
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   499
lemma prime_factors_product_int: "(k::int) > 0 \<Longrightarrow> l > 0 \<Longrightarrow> prime_factors (k * l) =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   500
    prime_factors k \<union> prime_factors l"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   501
  by (rule multiplicity_product_aux_int [THEN conjunct1, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   502
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   503
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
   504
    multiplicity p k + multiplicity p l"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   505
  by (rule multiplicity_product_aux_nat [THEN conjunct2, rule_format, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   506
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   507
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
   508
    multiplicity p (k * l) = multiplicity p k + multiplicity p l"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   509
  by (rule multiplicity_product_aux_int [THEN conjunct2, rule_format, symmetric])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   510
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   511
lemma multiplicity_setprod_nat: "finite S \<Longrightarrow> \<forall>x\<in>S. f x > 0 \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   512
    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
   513
  apply (induct set: finite)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   514
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   515
  apply (subst multiplicity_product_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   516
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   517
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   518
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   519
(* Transfer is delicate here for two reasons: first, because there is
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   520
   an implicit quantifier over functions (f), and, second, because the
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   521
   product over the multiplicity should not be translated to an integer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   522
   product.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   523
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   524
   The way to handle the first is to use quantifier rules for functions.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   525
   The way to handle the second is to turn off the offending rule.
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   526
*)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   527
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   528
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
   529
  apply (rule setsum_nonneg; auto)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   530
  apply (rule setprod_nonneg; auto)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   531
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   532
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   533
declare transfer_morphism_nat_int[transfer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   534
  add return: transfer_nat_int_sum_prod_closure3
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   535
  del: transfer_nat_int_sum_prod2 (1)]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   536
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   537
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
   538
    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
   539
  apply (frule multiplicity_setprod_nat
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   540
    [where f = "\<lambda>x. nat(int(nat(f x)))",
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   541
      transferred direction: nat "op \<le> (0::int)"])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   542
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   543
  apply (subst (asm) setprod.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   544
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   545
  apply (rule if_P)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   546
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   547
  apply (rule setsum.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   548
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   549
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   550
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   551
declare transfer_morphism_nat_int[transfer
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   552
  add return: transfer_nat_int_sum_prod2 (1)]
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   553
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   554
lemma multiplicity_prod_prime_powers_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   555
    "finite S \<Longrightarrow> \<forall>p\<in>S. prime (p::nat) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   556
       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
   557
  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
   558
  apply (erule ssubst)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   559
  apply (subst multiplicity_characterization_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   560
  prefer 5 apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   561
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   562
  apply auto
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   563
  apply (subst setprod.mono_neutral_right)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   564
  apply assumption
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   565
  prefer 3
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 55242
diff changeset
   566
  apply (rule setprod.cong)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   567
  apply (rule refl)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   568
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   569
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   570
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   571
(* Here the issue with transfer is the implicit quantifier over S *)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   572
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   573
lemma multiplicity_prod_prime_powers_int:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   574
    "(p::int) \<ge> 0 \<Longrightarrow> finite S \<Longrightarrow> \<forall>p\<in>S. prime (nat p) \<Longrightarrow>
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   575
       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
   576
  apply (subgoal_tac "int ` nat ` S = S")
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   577
  apply (frule multiplicity_prod_prime_powers_nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   578
    [where f = "\<lambda>x. f(int x)" and S = "nat ` S", transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   579
  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
   580
  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
   581
  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
   582
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   583
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   584
lemma multiplicity_distinct_prime_power_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   585
    "prime p \<Longrightarrow> prime q \<Longrightarrow> p \<noteq> q \<Longrightarrow> multiplicity p (q ^ n) = 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   586
  apply (subgoal_tac "q ^ n = setprod (\<lambda>x. x ^ n) {q}")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   587
  apply (erule ssubst)
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   588
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   589
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   590
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   591
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   592
lemma multiplicity_distinct_prime_power_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   593
    "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
   594
  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
   595
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   596
lemma dvd_multiplicity_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   597
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   598
  shows "0 < y \<Longrightarrow> x dvd y \<Longrightarrow> multiplicity p x \<le> multiplicity p y"
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   599
  apply (cases "x = 0")
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   600
  apply (auto simp add: dvd_def multiplicity_product_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   601
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   602
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   603
lemma dvd_multiplicity_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   604
  fixes p x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   605
  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
   606
  apply (cases "x = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   607
  apply (auto simp add: dvd_def)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   608
  apply (subgoal_tac "0 < k")
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   609
  apply (auto simp add: multiplicity_product_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   610
  apply (erule zero_less_mult_pos)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   611
  apply arith
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   612
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   613
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   614
lemma dvd_prime_factors_nat [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   615
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   616
  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
   617
  apply (simp only: prime_factors_altdef_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   618
  apply auto
55130
70db8d380d62 Restored Suc rather than +1, and using Library/Binimial
paulson <lp15@cam.ac.uk>
parents: 54611
diff changeset
   619
  apply (metis dvd_multiplicity_nat le_0_eq neq0_conv)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   620
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   621
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   622
lemma dvd_prime_factors_int [intro]:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   623
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   624
  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
   625
  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
   626
  apply (metis dvd_multiplicity_int le_0_eq neq0_conv)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   627
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   628
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   629
lemma multiplicity_dvd_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   630
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   631
  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
   632
  apply (subst prime_factorization_nat [of x], assumption)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   633
  apply (subst prime_factorization_nat [of y], assumption)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   634
  apply (rule setprod_dvd_setprod_subset2)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   635
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   636
  apply (subst prime_factors_altdef_nat)+
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   637
  apply auto
40461
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   638
  apply (metis gr0I le_0_eq less_not_refl)
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   639
  apply (metis le_imp_power_dvd)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   640
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   641
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   642
lemma multiplicity_dvd_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   643
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   644
  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
   645
  apply (subst prime_factorization_int [of x], assumption)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   646
  apply (subst prime_factorization_int [of y], assumption)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   647
  apply (rule setprod_dvd_setprod_subset2)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   648
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   649
  apply (subst prime_factors_altdef_int)+
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   650
  apply auto
40461
e876e95588ce tidied using metis
paulson
parents: 39302
diff changeset
   651
  apply (metis le_imp_power_dvd prime_factors_ge_0_int)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   652
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   653
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   654
lemma multiplicity_dvd'_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   655
  fixes x y :: nat
62349
7c23469b5118 cleansed junk-producing interpretations for gcd/lcm on nat altogether
haftmann
parents: 62348
diff changeset
   656
  assumes "0 < x"
7c23469b5118 cleansed junk-producing interpretations for gcd/lcm on nat altogether
haftmann
parents: 62348
diff changeset
   657
  assumes "\<forall>p. prime p \<longrightarrow> multiplicity p x \<le> multiplicity p y"
7c23469b5118 cleansed junk-producing interpretations for gcd/lcm on nat altogether
haftmann
parents: 62348
diff changeset
   658
  shows "x dvd y"
7c23469b5118 cleansed junk-producing interpretations for gcd/lcm on nat altogether
haftmann
parents: 62348
diff changeset
   659
  using dvd_0_right assms by (metis (no_types) le0 multiplicity_dvd_nat multiplicity_nonprime_nat not_gr0)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   660
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   661
lemma multiplicity_dvd'_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   662
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   663
  shows "0 < x \<Longrightarrow> 0 \<le> y \<Longrightarrow>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   664
    \<forall>p. prime p \<longrightarrow> multiplicity p x \<le> multiplicity p y \<Longrightarrow> x dvd y"
62348
9a5f43dac883 dropped various legacy fact bindings
haftmann
parents: 61762
diff changeset
   665
  by (metis dvd_int_iff abs_of_nat multiplicity_dvd'_nat multiplicity_int_def nat_int
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   666
    zero_le_imp_eq_int zero_less_imp_eq_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   667
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   668
lemma dvd_multiplicity_eq_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   669
  fixes x y :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   670
  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
   671
  by (auto intro: dvd_multiplicity_nat multiplicity_dvd_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   672
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   673
lemma dvd_multiplicity_eq_int: "0 < (x::int) \<Longrightarrow> 0 < y \<Longrightarrow>
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   674
    (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
   675
  by (auto intro: dvd_multiplicity_int multiplicity_dvd_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   676
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   677
lemma prime_factors_altdef2_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   678
  fixes n :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   679
  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
   680
  apply (cases "prime p")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   681
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   682
  apply (subst prime_factorization_nat [where n = n], assumption)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   683
  apply (rule dvd_trans)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   684
  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
   685
  apply (subst (asm) prime_factors_altdef_nat, force)
59010
ec2b4270a502 generalized lemmas and tuned proofs
haftmann
parents: 58889
diff changeset
   686
  apply rule
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   687
  apply auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   688
  apply (metis One_nat_def Zero_not_Suc dvd_multiplicity_nat le0
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   689
    le_antisym multiplicity_not_factor_nat multiplicity_prime_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   690
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   691
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   692
lemma prime_factors_altdef2_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   693
  fixes n :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   694
  assumes "n > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   695
  shows "p \<in> prime_factors n \<longleftrightarrow> prime p \<and> p dvd n"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   696
  using assms by (simp add:  prime_factors_altdef2_nat [transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   697
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   698
lemma multiplicity_eq_nat:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   699
  fixes x and y::nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   700
  assumes [arith]: "x > 0" "y > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   701
    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
   702
  shows "x = y"
33657
a4179bf442d1 renamed lemmas "anti_sym" -> "antisym"
nipkow
parents: 32479
diff changeset
   703
  apply (rule dvd_antisym)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   704
  apply (auto intro: multiplicity_dvd'_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   705
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   706
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   707
lemma multiplicity_eq_int:
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   708
  fixes x y :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   709
  assumes [arith]: "x > 0" "y > 0"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   710
    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
   711
  shows "x = y"
33657
a4179bf442d1 renamed lemmas "anti_sym" -> "antisym"
nipkow
parents: 32479
diff changeset
   712
  apply (rule dvd_antisym [transferred])
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   713
  apply (auto intro: multiplicity_dvd'_int)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   714
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   715
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   716
60526
fad653acf58f isabelle update_cartouches;
wenzelm
parents: 60495
diff changeset
   717
subsection \<open>An application\<close>
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   718
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   719
lemma gcd_eq_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   720
  fixes x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   721
  assumes pos [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   722
  shows "gcd x y =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   723
    (\<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
   724
  (is "_ = ?z")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   725
proof -
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   726
  have [arith]: "?z > 0" 
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   727
    using prime_factors_gt_0_nat by auto
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   728
  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
   729
    apply (subst multiplicity_prod_prime_powers_nat)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   730
    apply auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   731
    done
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   732
  have "?z dvd x"
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   733
    by (intro multiplicity_dvd'_nat) (auto simp add: aux intro: prime_gt_0_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   734
  moreover have "?z dvd y"
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   735
    by (intro multiplicity_dvd'_nat) (auto simp add: aux intro: prime_gt_0_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   736
  moreover have "w dvd x \<and> w dvd y \<longrightarrow> w dvd ?z" for w
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   737
  proof (cases "w = 0")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   738
    case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   739
    then show ?thesis by simp
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   740
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   741
    case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   742
    then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   743
      apply auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   744
      apply (erule multiplicity_dvd'_nat)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   745
      apply (auto intro: dvd_multiplicity_nat simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   746
      done
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   747
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   748
  ultimately have "?z = gcd x y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   749
    by (subst gcd_unique_nat [symmetric], blast)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   750
  then show ?thesis
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   751
    by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   752
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   753
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   754
lemma lcm_eq_nat:
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   755
  assumes pos [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   756
  shows "lcm (x::nat) y =
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   757
    (\<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
   758
  (is "_ = ?z")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   759
proof -
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   760
  have [arith]: "?z > 0"
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   761
    by (auto intro: prime_gt_0_nat)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   762
  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
   763
    apply (subst multiplicity_prod_prime_powers_nat)
41541
1fa4725c4656 eliminated global prems;
wenzelm
parents: 41413
diff changeset
   764
    apply auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   765
    done
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   766
  have "x dvd ?z"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   767
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   768
  moreover have "y dvd ?z"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   769
    by (intro multiplicity_dvd'_nat) (auto simp add: aux)
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   770
  moreover have "x dvd w \<and> y dvd w \<longrightarrow> ?z dvd w" for w
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   771
  proof (cases "w = 0")
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   772
    case True
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   773
    then show ?thesis by auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   774
  next
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   775
    case False
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   776
    then show ?thesis
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   777
      apply auto
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   778
      apply (rule multiplicity_dvd'_nat)
61762
d50b993b4fb9 Removal of redundant lemmas (diff_less_iff, diff_le_iff) and of the abbreviation Exp. Addition of some new material.
paulson <lp15@cam.ac.uk>
parents: 61714
diff changeset
   779
      apply (auto intro: prime_gt_0_nat dvd_multiplicity_nat simp add: aux)
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   780
      done
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   781
  qed
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   782
  ultimately have "?z = lcm x y"
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   783
    by (subst lcm_unique_nat [symmetric], blast)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   784
  then show ?thesis
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   785
    by auto
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   786
qed
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   787
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   788
lemma multiplicity_gcd_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   789
  fixes p x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   790
  assumes [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   791
  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
   792
  apply (subst gcd_eq_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   793
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   794
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   795
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   796
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   797
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   798
lemma multiplicity_lcm_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   799
  fixes p x y :: nat
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   800
  assumes [arith]: "x > 0" "y > 0"
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   801
  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
   802
  apply (subst lcm_eq_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   803
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   804
  apply (subst multiplicity_prod_prime_powers_nat)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   805
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   806
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   807
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   808
lemma gcd_lcm_distrib_nat:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   809
  fixes x y z :: nat
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   810
  shows "gcd x (lcm y z) = lcm (gcd x y) (gcd x z)"
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   811
  apply (cases "x = 0 | y = 0 | z = 0")
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   812
  apply auto
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   813
  apply (rule multiplicity_eq_nat)
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   814
  apply (auto simp add: multiplicity_gcd_nat multiplicity_lcm_nat lcm_pos_nat)
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   815
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   816
60527
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   817
lemma gcd_lcm_distrib_int:
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   818
  fixes x y z :: int
eb431a5651fe tuned proofs;
wenzelm
parents: 60526
diff changeset
   819
  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
   820
  apply (subst (1 2 3) gcd_abs_int)
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   821
  apply (subst lcm_abs_int)
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   822
  apply (subst (2) abs_of_nonneg)
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   823
  apply force
31952
40501bb2d57c renamed lemmas: nat_xyz/int_xyz -> xyz_nat/xyz_int
nipkow
parents: 31719
diff changeset
   824
  apply (rule gcd_lcm_distrib_nat [transferred])
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   825
  apply auto
44872
a98ef45122f3 misc tuning;
wenzelm
parents: 44821
diff changeset
   826
  done
31719
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   827
29f5b20e8ee8 Added NewNumberTheory by Jeremy Avigad
nipkow
parents:
diff changeset
   828
end