src/HOL/Old_Number_Theory/Factorization.thy
changeset 61382 efac889fccbc
parent 58889 5b7a9633cfa8
child 62481 b5d8e57826df
equal deleted inserted replaced
61381:ddca85598c65 61382:efac889fccbc
     1 (*  Title:      HOL/Old_Number_Theory/Factorization.thy
     1 (*  Title:      HOL/Old_Number_Theory/Factorization.thy
     2     Author:     Thomas Marthedal Rasmussen
     2     Author:     Thomas Marthedal Rasmussen
     3     Copyright   2000  University of Cambridge
     3     Copyright   2000  University of Cambridge
     4 *)
     4 *)
     5 
     5 
     6 section {* Fundamental Theorem of Arithmetic (unique factorization into primes) *}
     6 section \<open>Fundamental Theorem of Arithmetic (unique factorization into primes)\<close>
     7 
     7 
     8 theory Factorization
     8 theory Factorization
     9 imports Primes "~~/src/HOL/Library/Permutation"
     9 imports Primes "~~/src/HOL/Library/Permutation"
    10 begin
    10 begin
    11 
    11 
    12 
    12 
    13 subsection {* Definitions *}
    13 subsection \<open>Definitions\<close>
    14 
    14 
    15 definition primel :: "nat list => bool"
    15 definition primel :: "nat list => bool"
    16   where "primel xs = (\<forall>p \<in> set xs. prime p)"
    16   where "primel xs = (\<forall>p \<in> set xs. prime p)"
    17 
    17 
    18 primrec nondec :: "nat list => bool"
    18 primrec nondec :: "nat list => bool"
    34 where
    34 where
    35   "sort [] = []"
    35   "sort [] = []"
    36 | "sort (x # xs) = oinsert x (sort xs)"
    36 | "sort (x # xs) = oinsert x (sort xs)"
    37 
    37 
    38 
    38 
    39 subsection {* Arithmetic *}
    39 subsection \<open>Arithmetic\<close>
    40 
    40 
    41 lemma one_less_m: "(m::nat) \<noteq> m * k ==> m \<noteq> Suc 0 ==> Suc 0 < m"
    41 lemma one_less_m: "(m::nat) \<noteq> m * k ==> m \<noteq> Suc 0 ==> Suc 0 < m"
    42   apply (cases m)
    42   apply (cases m)
    43    apply auto
    43    apply auto
    44   done
    44   done
    62   apply (induct m)
    62   apply (induct m)
    63    apply auto
    63    apply auto
    64   done
    64   done
    65 
    65 
    66 
    66 
    67 subsection {* Prime list and product *}
    67 subsection \<open>Prime list and product\<close>
    68 
    68 
    69 lemma prod_append: "prod (xs @ ys) = prod xs * prod ys"
    69 lemma prod_append: "prod (xs @ ys) = prod xs * prod ys"
    70   apply (induct xs)
    70   apply (induct xs)
    71    apply (simp_all add: mult.assoc)
    71    apply (simp_all add: mult.assoc)
    72   done
    72   done
   135   apply (induct xs)
   135   apply (induct xs)
   136    apply (auto simp: primel_def prime_def)
   136    apply (auto simp: primel_def prime_def)
   137   done
   137   done
   138 
   138 
   139 
   139 
   140 subsection {* Sorting *}
   140 subsection \<open>Sorting\<close>
   141 
   141 
   142 lemma nondec_oinsert: "nondec xs \<Longrightarrow> nondec (oinsert x xs)"
   142 lemma nondec_oinsert: "nondec xs \<Longrightarrow> nondec (oinsert x xs)"
   143   apply (induct xs)
   143   apply (induct xs)
   144    apply simp
   144    apply simp
   145    apply (case_tac xs)
   145    apply (case_tac xs)
   172   apply (induct l)
   172   apply (induct l)
   173   apply auto
   173   apply auto
   174   done
   174   done
   175 
   175 
   176 
   176 
   177 subsection {* Permutation *}
   177 subsection \<open>Permutation\<close>
   178 
   178 
   179 lemma perm_primel [rule_format]: "xs <~~> ys ==> primel xs --> primel ys"
   179 lemma perm_primel [rule_format]: "xs <~~> ys ==> primel xs --> primel ys"
   180   apply (unfold primel_def)
   180   apply (unfold primel_def)
   181   apply (induct set: perm)
   181   apply (induct set: perm)
   182      apply simp
   182      apply simp
   210   apply (induct set: perm)
   210   apply (induct set: perm)
   211      apply (simp_all add: oinsert_x_y)
   211      apply (simp_all add: oinsert_x_y)
   212   done
   212   done
   213 
   213 
   214 
   214 
   215 subsection {* Existence *}
   215 subsection \<open>Existence\<close>
   216 
   216 
   217 lemma ex_nondec_lemma:
   217 lemma ex_nondec_lemma:
   218     "primel xs ==> \<exists>ys. primel ys \<and> nondec ys \<and> prod ys = prod xs"
   218     "primel xs ==> \<exists>ys. primel ys \<and> nondec ys \<and> prod ys = prod xs"
   219   apply (blast intro: nondec_sort perm_prod perm_primel perm_sort perm_sym)
   219   apply (blast intro: nondec_sort perm_prod perm_primel perm_sort perm_sym)
   220   done
   220   done
   248   apply (erule factor_exists [THEN exE])
   248   apply (erule factor_exists [THEN exE])
   249   apply (blast intro!: ex_nondec_lemma)
   249   apply (blast intro!: ex_nondec_lemma)
   250   done
   250   done
   251 
   251 
   252 
   252 
   253 subsection {* Uniqueness *}
   253 subsection \<open>Uniqueness\<close>
   254 
   254 
   255 lemma prime_dvd_mult_list [rule_format]:
   255 lemma prime_dvd_mult_list [rule_format]:
   256     "prime p ==> p dvd (prod xs) --> (\<exists>m. m:set xs \<and> p dvd m)"
   256     "prime p ==> p dvd (prod xs) --> (\<exists>m. m:set xs \<and> p dvd m)"
   257   apply (induct xs)
   257   apply (induct xs)
   258    apply (force simp add: prime_def)
   258    apply (force simp add: prime_def)