equal
deleted
inserted
replaced
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) |