| author | Fabian Huch <huch@in.tum.de> | 
| Fri, 24 Nov 2023 17:24:22 +0100 | |
| changeset 79039 | 322bcfce2b37 | 
| parent 70160 | 8e9100dcde52 | 
| child 80914 | d97fdabd9e2b | 
| permissions | -rw-r--r-- | 
| 68582 | 1  | 
(* Title: HOL/Algebra/Polynomials.thy  | 
2  | 
Author: Paulo EmÃlio de Vilhena  | 
|
3  | 
*)  | 
|
| 68578 | 4  | 
|
5  | 
theory Polynomials  | 
|
6  | 
imports Ring Ring_Divisibility Subrings  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
7  | 
|
| 68578 | 8  | 
begin  | 
9  | 
||
10  | 
section \<open>Polynomials\<close>  | 
|
11  | 
||
12  | 
subsection \<open>Definitions\<close>  | 
|
13  | 
||
14  | 
abbreviation lead_coeff :: "'a list \<Rightarrow> 'a"  | 
|
15  | 
where "lead_coeff \<equiv> hd"  | 
|
16  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
17  | 
abbreviation degree :: "'a list \<Rightarrow> nat"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
18  | 
where "degree p \<equiv> length p - 1"  | 
| 68578 | 19  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
20  | 
definition polynomial :: "_ \<Rightarrow> 'a set \<Rightarrow> 'a list \<Rightarrow> bool" ("polynomial\<index>")
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
21  | 
where "polynomial\<^bsub>R\<^esub> K p \<longleftrightarrow> p = [] \<or> (set p \<subseteq> K \<and> lead_coeff p \<noteq> \<zero>\<^bsub>R\<^esub>)"  | 
| 68578 | 22  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
23  | 
definition (in ring) monom :: "'a \<Rightarrow> nat \<Rightarrow> 'a list"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
24  | 
where "monom a n = a # (replicate n \<zero>\<^bsub>R\<^esub>)"  | 
| 68578 | 25  | 
|
26  | 
fun (in ring) eval :: "'a list \<Rightarrow> 'a \<Rightarrow> 'a"  | 
|
27  | 
where  | 
|
28  | 
"eval [] = (\<lambda>_. \<zero>)"  | 
|
29  | 
| "eval p = (\<lambda>x. ((lead_coeff p) \<otimes> (x [^] (degree p))) \<oplus> (eval (tl p) x))"  | 
|
30  | 
||
31  | 
fun (in ring) coeff :: "'a list \<Rightarrow> nat \<Rightarrow> 'a"  | 
|
32  | 
where  | 
|
33  | 
"coeff [] = (\<lambda>_. \<zero>)"  | 
|
34  | 
| "coeff p = (\<lambda>i. if i = degree p then lead_coeff p else (coeff (tl p)) i)"  | 
|
35  | 
||
36  | 
fun (in ring) normalize :: "'a list \<Rightarrow> 'a list"  | 
|
37  | 
where  | 
|
38  | 
"normalize [] = []"  | 
|
39  | 
| "normalize p = (if lead_coeff p \<noteq> \<zero> then p else normalize (tl p))"  | 
|
40  | 
||
41  | 
fun (in ring) poly_add :: "'a list \<Rightarrow> 'a list \<Rightarrow> 'a list"  | 
|
42  | 
where "poly_add p1 p2 =  | 
|
43  | 
(if length p1 \<ge> length p2  | 
|
44  | 
then normalize (map2 (\<oplus>) p1 ((replicate (length p1 - length p2) \<zero>) @ p2))  | 
|
45  | 
else poly_add p2 p1)"  | 
|
46  | 
||
47  | 
fun (in ring) poly_mult :: "'a list \<Rightarrow> 'a list \<Rightarrow> 'a list"  | 
|
48  | 
where  | 
|
49  | 
"poly_mult [] p2 = []"  | 
|
50  | 
| "poly_mult p1 p2 =  | 
|
51  | 
poly_add ((map (\<lambda>a. lead_coeff p1 \<otimes> a) p2) @ (replicate (degree p1) \<zero>)) (poly_mult (tl p1) p2)"  | 
|
52  | 
||
53  | 
fun (in ring) dense_repr :: "'a list \<Rightarrow> ('a \<times> nat) list"
 | 
|
54  | 
where  | 
|
55  | 
"dense_repr [] = []"  | 
|
56  | 
| "dense_repr p = (if lead_coeff p \<noteq> \<zero>  | 
|
57  | 
then (lead_coeff p, degree p) # (dense_repr (tl p))  | 
|
58  | 
else (dense_repr (tl p)))"  | 
|
59  | 
||
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
60  | 
fun (in ring) poly_of_dense :: "('a \<times> nat) list \<Rightarrow> 'a list"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
61  | 
where "poly_of_dense dl = foldr (\<lambda>(a, n) l. poly_add (monom a n) l) dl []"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
62  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
63  | 
definition (in ring) poly_of_const :: "'a \<Rightarrow> 'a list"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
64  | 
where "poly_of_const = (\<lambda>k. normalize [ k ])"  | 
| 68578 | 65  | 
|
66  | 
||
67  | 
subsection \<open>Basic Properties\<close>  | 
|
68  | 
||
69  | 
context ring  | 
|
70  | 
begin  | 
|
71  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
72  | 
lemma polynomialI [intro]: "\<lbrakk> set p \<subseteq> K; lead_coeff p \<noteq> \<zero> \<rbrakk> \<Longrightarrow> polynomial K p"  | 
| 68578 | 73  | 
unfolding polynomial_def by auto  | 
74  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
75  | 
lemma polynomial_incl: "polynomial K p \<Longrightarrow> set p \<subseteq> K"  | 
| 68578 | 76  | 
unfolding polynomial_def by auto  | 
77  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
78  | 
lemma monom_in_carrier [intro]: "a \<in> carrier R \<Longrightarrow> set (monom a n) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
79  | 
unfolding monom_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
80  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
81  | 
lemma lead_coeff_not_zero: "polynomial K (a # p) \<Longrightarrow> a \<in> K - { \<zero> }"
 | 
| 68578 | 82  | 
unfolding polynomial_def by simp  | 
83  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
84  | 
lemma zero_is_polynomial [intro]: "polynomial K []"  | 
| 68578 | 85  | 
unfolding polynomial_def by simp  | 
86  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
87  | 
lemma const_is_polynomial [intro]: "a \<in> K - { \<zero> } \<Longrightarrow> polynomial K [ a ]"
 | 
| 68578 | 88  | 
unfolding polynomial_def by auto  | 
89  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
90  | 
lemma normalize_gives_polynomial: "set p \<subseteq> K \<Longrightarrow> polynomial K (normalize p)"  | 
| 68578 | 91  | 
by (induction p) (auto simp add: polynomial_def)  | 
92  | 
||
93  | 
lemma normalize_in_carrier: "set p \<subseteq> carrier R \<Longrightarrow> set (normalize p) \<subseteq> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
94  | 
by (induction p) (auto)  | 
| 68578 | 95  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
96  | 
lemma normalize_polynomial: "polynomial K p \<Longrightarrow> normalize p = p"  | 
| 68578 | 97  | 
unfolding polynomial_def by (cases p) (auto)  | 
98  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
99  | 
lemma normalize_idem: "normalize ((normalize p) @ q) = normalize (p @ q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
100  | 
by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
101  | 
|
| 68578 | 102  | 
lemma normalize_length_le: "length (normalize p) \<le> length p"  | 
103  | 
by (induction p) (auto)  | 
|
104  | 
||
105  | 
lemma eval_in_carrier: "\<lbrakk> set p \<subseteq> carrier R; x \<in> carrier R \<rbrakk> \<Longrightarrow> (eval p) x \<in> carrier R"  | 
|
106  | 
by (induction p) (auto)  | 
|
107  | 
||
108  | 
lemma coeff_in_carrier [simp]: "set p \<subseteq> carrier R \<Longrightarrow> (coeff p) i \<in> carrier R"  | 
|
109  | 
by (induction p) (auto)  | 
|
110  | 
||
111  | 
lemma lead_coeff_simp [simp]: "p \<noteq> [] \<Longrightarrow> (coeff p) (degree p) = lead_coeff p"  | 
|
112  | 
by (metis coeff.simps(2) list.exhaust_sel)  | 
|
113  | 
||
114  | 
lemma coeff_list: "map (coeff p) (rev [0..< length p]) = p"  | 
|
115  | 
proof (induction p)  | 
|
116  | 
case Nil thus ?case by simp  | 
|
117  | 
next  | 
|
118  | 
case (Cons a p)  | 
|
119  | 
have "map (coeff (a # p)) (rev [0..<length (a # p)]) =  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
120  | 
a # (map (coeff p) (rev [0..<length p]))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
121  | 
by auto  | 
| 68578 | 122  | 
also have " ... = a # p"  | 
123  | 
using Cons by simp  | 
|
124  | 
finally show ?case .  | 
|
125  | 
qed  | 
|
126  | 
||
127  | 
lemma coeff_nth: "i < length p \<Longrightarrow> (coeff p) i = p ! (length p - 1 - i)"  | 
|
128  | 
proof -  | 
|
129  | 
assume i_lt: "i < length p"  | 
|
130  | 
hence "(coeff p) i = (map (coeff p) [0..< length p]) ! i"  | 
|
131  | 
by simp  | 
|
132  | 
also have " ... = (rev (map (coeff p) (rev [0..< length p]))) ! i"  | 
|
133  | 
by (simp add: rev_map)  | 
|
134  | 
also have " ... = (map (coeff p) (rev [0..< length p])) ! (length p - 1 - i)"  | 
|
135  | 
using coeff_list i_lt rev_nth by auto  | 
|
136  | 
also have " ... = p ! (length p - 1 - i)"  | 
|
137  | 
using coeff_list[of p] by simp  | 
|
138  | 
finally show "(coeff p) i = p ! (length p - 1 - i)" .  | 
|
139  | 
qed  | 
|
140  | 
||
141  | 
lemma coeff_iff_length_cond:  | 
|
142  | 
assumes "length p1 = length p2"  | 
|
143  | 
shows "p1 = p2 \<longleftrightarrow> coeff p1 = coeff p2"  | 
|
144  | 
proof  | 
|
145  | 
show "p1 = p2 \<Longrightarrow> coeff p1 = coeff p2"  | 
|
146  | 
by simp  | 
|
147  | 
next  | 
|
148  | 
assume A: "coeff p1 = coeff p2"  | 
|
149  | 
have "p1 = map (coeff p1) (rev [0..< length p1])"  | 
|
150  | 
using coeff_list[of p1] by simp  | 
|
151  | 
also have " ... = map (coeff p2) (rev [0..< length p2])"  | 
|
152  | 
using A assms by simp  | 
|
153  | 
also have " ... = p2"  | 
|
154  | 
using coeff_list[of p2] by simp  | 
|
155  | 
finally show "p1 = p2" .  | 
|
156  | 
qed  | 
|
157  | 
||
158  | 
lemma coeff_img_restrict: "(coeff p) ` {..< length p} = set p"
 | 
|
159  | 
using coeff_list[of p] by (metis atLeast_upt image_set set_rev)  | 
|
160  | 
||
161  | 
lemma coeff_length: "\<And>i. i \<ge> length p \<Longrightarrow> (coeff p) i = \<zero>"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
162  | 
by (induction p) (auto)  | 
| 68578 | 163  | 
|
164  | 
lemma coeff_degree: "\<And>i. i > degree p \<Longrightarrow> (coeff p) i = \<zero>"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
165  | 
using coeff_length by (simp)  | 
| 68578 | 166  | 
|
167  | 
lemma replicate_zero_coeff [simp]: "coeff (replicate n \<zero>) = (\<lambda>_. \<zero>)"  | 
|
168  | 
by (induction n) (auto)  | 
|
169  | 
||
170  | 
lemma scalar_coeff: "a \<in> carrier R \<Longrightarrow> coeff (map (\<lambda>b. a \<otimes> b) p) = (\<lambda>i. a \<otimes> (coeff p) i)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
171  | 
by (induction p) (auto)  | 
| 68578 | 172  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
173  | 
lemma monom_coeff: "coeff (monom a n) = (\<lambda>i. if i = n then a else \<zero>)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
174  | 
unfolding monom_def by (induction n) (auto)  | 
| 68578 | 175  | 
|
176  | 
lemma coeff_img:  | 
|
177  | 
  "(coeff p) ` {..< length p} = set p"
 | 
|
178  | 
  "(coeff p) ` { length p ..} = { \<zero> }"
 | 
|
179  | 
  "(coeff p) ` UNIV = (set p) \<union> { \<zero> }"
 | 
|
180  | 
using coeff_img_restrict  | 
|
181  | 
proof (simp)  | 
|
182  | 
  show coeff_img_up: "(coeff p) ` { length p ..} = { \<zero> }"
 | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
183  | 
using coeff_length[of p] by force  | 
| 68578 | 184  | 
from coeff_img_up and coeff_img_restrict[of p]  | 
185  | 
  show "(coeff p) ` UNIV = (set p) \<union> { \<zero> }"
 | 
|
186  | 
by force  | 
|
187  | 
qed  | 
|
188  | 
||
189  | 
lemma degree_def':  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
190  | 
assumes "polynomial K p"  | 
| 68578 | 191  | 
shows "degree p = (LEAST n. \<forall>i. i > n \<longrightarrow> (coeff p) i = \<zero>)"  | 
192  | 
proof (cases p)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
193  | 
case Nil thus ?thesis by auto  | 
| 68578 | 194  | 
next  | 
195  | 
define P where "P = (\<lambda>n. \<forall>i. i > n \<longrightarrow> (coeff p) i = \<zero>)"  | 
|
196  | 
||
197  | 
case (Cons a ps)  | 
|
198  | 
hence "(coeff p) (degree p) \<noteq> \<zero>"  | 
|
199  | 
using assms unfolding polynomial_def by auto  | 
|
200  | 
hence "\<And>n. n < degree p \<Longrightarrow> \<not> P n"  | 
|
201  | 
unfolding P_def by auto  | 
|
202  | 
moreover have "P (degree p)"  | 
|
203  | 
unfolding P_def using coeff_degree[of p] by simp  | 
|
204  | 
ultimately have "degree p = (LEAST n. P n)"  | 
|
205  | 
by (meson LeastI nat_neq_iff not_less_Least)  | 
|
206  | 
thus ?thesis unfolding P_def .  | 
|
207  | 
qed  | 
|
208  | 
||
209  | 
lemma coeff_iff_polynomial_cond:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
210  | 
assumes "polynomial K p1" and "polynomial K p2"  | 
| 68578 | 211  | 
shows "p1 = p2 \<longleftrightarrow> coeff p1 = coeff p2"  | 
212  | 
proof  | 
|
213  | 
show "p1 = p2 \<Longrightarrow> coeff p1 = coeff p2"  | 
|
214  | 
by simp  | 
|
215  | 
next  | 
|
216  | 
assume coeff_eq: "coeff p1 = coeff p2"  | 
|
217  | 
hence deg_eq: "degree p1 = degree p2"  | 
|
218  | 
using degree_def'[OF assms(1)] degree_def'[OF assms(2)] by auto  | 
|
219  | 
thus "p1 = p2"  | 
|
220  | 
proof (cases)  | 
|
221  | 
assume "p1 \<noteq> [] \<and> p2 \<noteq> []"  | 
|
222  | 
hence "length p1 = length p2"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
223  | 
using deg_eq by (simp add: Nitpick.size_list_simp(2))  | 
| 68578 | 224  | 
thus ?thesis  | 
225  | 
using coeff_iff_length_cond[of p1 p2] coeff_eq by simp  | 
|
226  | 
next  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
227  | 
    { fix p1 p2 assume A: "p1 = []" "coeff p1 = coeff p2" "polynomial K p2"
 | 
| 68578 | 228  | 
have "p2 = []"  | 
229  | 
proof (rule ccontr)  | 
|
230  | 
assume "p2 \<noteq> []"  | 
|
231  | 
hence "(coeff p2) (degree p2) \<noteq> \<zero>"  | 
|
232  | 
using A(3) unfolding polynomial_def  | 
|
233  | 
by (metis coeff.simps(2) list.collapse)  | 
|
234  | 
        moreover have "(coeff p1) ` UNIV = { \<zero> }"
 | 
|
235  | 
using A(1) by auto  | 
|
236  | 
        hence "(coeff p2) ` UNIV = { \<zero> }"
 | 
|
237  | 
using A(2) by simp  | 
|
238  | 
ultimately show False  | 
|
239  | 
by blast  | 
|
240  | 
qed } note aux_lemma = this  | 
|
241  | 
assume "\<not> (p1 \<noteq> [] \<and> p2 \<noteq> [])"  | 
|
242  | 
hence "p1 = [] \<or> p2 = []" by simp  | 
|
243  | 
thus ?thesis  | 
|
244  | 
using assms coeff_eq aux_lemma[of p1 p2] aux_lemma[of p2 p1] by auto  | 
|
245  | 
qed  | 
|
246  | 
qed  | 
|
247  | 
||
248  | 
lemma normalize_lead_coeff:  | 
|
249  | 
assumes "length (normalize p) < length p"  | 
|
250  | 
shows "lead_coeff p = \<zero>"  | 
|
251  | 
proof (cases p)  | 
|
252  | 
case Nil thus ?thesis  | 
|
253  | 
using assms by simp  | 
|
254  | 
next  | 
|
255  | 
case (Cons a ps) thus ?thesis  | 
|
256  | 
using assms by (cases "a = \<zero>") (auto)  | 
|
257  | 
qed  | 
|
258  | 
||
259  | 
lemma normalize_length_lt:  | 
|
260  | 
assumes "lead_coeff p = \<zero>" and "length p > 0"  | 
|
261  | 
shows "length (normalize p) < length p"  | 
|
262  | 
proof (cases p)  | 
|
263  | 
case Nil thus ?thesis  | 
|
264  | 
using assms by simp  | 
|
265  | 
next  | 
|
266  | 
case (Cons a ps) thus ?thesis  | 
|
267  | 
using normalize_length_le[of ps] assms by simp  | 
|
268  | 
qed  | 
|
269  | 
||
270  | 
lemma normalize_length_eq:  | 
|
271  | 
assumes "lead_coeff p \<noteq> \<zero>"  | 
|
272  | 
shows "length (normalize p) = length p"  | 
|
273  | 
using normalize_length_le[of p] assms nat_less_le normalize_lead_coeff by auto  | 
|
274  | 
||
275  | 
lemma normalize_replicate_zero: "normalize ((replicate n \<zero>) @ p) = normalize p"  | 
|
276  | 
by (induction n) (auto)  | 
|
277  | 
||
278  | 
lemma normalize_def':  | 
|
279  | 
shows "p = (replicate (length p - length (normalize p)) \<zero>) @  | 
|
280  | 
(drop (length p - length (normalize p)) p)" (is ?statement1)  | 
|
281  | 
and "normalize p = drop (length p - length (normalize p)) p" (is ?statement2)  | 
|
282  | 
proof -  | 
|
283  | 
show ?statement1  | 
|
284  | 
proof (induction p)  | 
|
285  | 
case Nil thus ?case by simp  | 
|
286  | 
next  | 
|
287  | 
case (Cons a p) thus ?case  | 
|
288  | 
proof (cases "a = \<zero>")  | 
|
289  | 
assume "a \<noteq> \<zero>" thus ?case  | 
|
290  | 
using Cons by simp  | 
|
291  | 
next  | 
|
292  | 
assume eq_zero: "a = \<zero>"  | 
|
293  | 
hence len_eq:  | 
|
294  | 
"Suc (length p - length (normalize p)) = length (a # p) - length (normalize (a # p))"  | 
|
295  | 
by (simp add: Suc_diff_le normalize_length_le)  | 
|
296  | 
have "a # p = \<zero> # (replicate (length p - length (normalize p)) \<zero> @  | 
|
297  | 
drop (length p - length (normalize p)) p)"  | 
|
298  | 
using eq_zero Cons by simp  | 
|
299  | 
also have " ... = (replicate (Suc (length p - length (normalize p))) \<zero> @  | 
|
300  | 
drop (Suc (length p - length (normalize p))) (a # p))"  | 
|
301  | 
by simp  | 
|
302  | 
also have " ... = (replicate (length (a # p) - length (normalize (a # p))) \<zero> @  | 
|
303  | 
drop (length (a # p) - length (normalize (a # p))) (a # p))"  | 
|
304  | 
using len_eq by simp  | 
|
305  | 
finally show ?case .  | 
|
306  | 
qed  | 
|
307  | 
qed  | 
|
308  | 
next  | 
|
309  | 
show ?statement2  | 
|
310  | 
proof -  | 
|
311  | 
have "\<exists>m. normalize p = drop m p"  | 
|
312  | 
proof (induction p)  | 
|
313  | 
case Nil thus ?case by simp  | 
|
314  | 
next  | 
|
315  | 
case (Cons a p) thus ?case  | 
|
316  | 
apply (cases "a = \<zero>")  | 
|
317  | 
apply (auto)  | 
|
318  | 
apply (metis drop_Suc_Cons)  | 
|
319  | 
apply (metis drop0)  | 
|
320  | 
done  | 
|
321  | 
qed  | 
|
322  | 
then obtain m where m: "normalize p = drop m p" by auto  | 
|
323  | 
hence "length (normalize p) = length p - m" by simp  | 
|
324  | 
thus ?thesis  | 
|
325  | 
using m by (metis rev_drop rev_rev_ident take_rev)  | 
|
326  | 
qed  | 
|
327  | 
qed  | 
|
328  | 
||
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
329  | 
corollary normalize_trick:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
330  | 
shows "p = (replicate (length p - length (normalize p)) \<zero>) @ (normalize p)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
331  | 
using normalize_def'(1)[of p] unfolding sym[OF normalize_def'(2)] .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
332  | 
|
| 68578 | 333  | 
lemma normalize_coeff: "coeff p = coeff (normalize p)"  | 
334  | 
proof (induction p)  | 
|
335  | 
case Nil thus ?case by simp  | 
|
336  | 
next  | 
|
337  | 
case (Cons a p)  | 
|
338  | 
have "coeff (normalize p) (length p) = \<zero>"  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
339  | 
using normalize_length_le[of p] coeff_degree[of "normalize p"] coeff_length by blast  | 
| 68578 | 340  | 
then show ?case  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
341  | 
using Cons by (cases "a = \<zero>") (auto)  | 
| 68578 | 342  | 
qed  | 
343  | 
||
344  | 
lemma append_coeff:  | 
|
345  | 
"coeff (p @ q) = (\<lambda>i. if i < length q then (coeff q) i else (coeff p) (i - length q))"  | 
|
346  | 
proof (induction p)  | 
|
347  | 
case Nil thus ?case  | 
|
348  | 
using coeff_length[of q] by auto  | 
|
349  | 
next  | 
|
350  | 
case (Cons a p)  | 
|
351  | 
have "coeff ((a # p) @ q) = (\<lambda>i. if i = length p + length q then a else (coeff (p @ q)) i)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
352  | 
by auto  | 
| 68578 | 353  | 
also have " ... = (\<lambda>i. if i = length p + length q then a  | 
354  | 
else if i < length q then (coeff q) i  | 
|
355  | 
else (coeff p) (i - length q))"  | 
|
356  | 
using Cons by auto  | 
|
357  | 
also have " ... = (\<lambda>i. if i < length q then (coeff q) i  | 
|
358  | 
else if i = length p + length q then a else (coeff p) (i - length q))"  | 
|
359  | 
by auto  | 
|
360  | 
also have " ... = (\<lambda>i. if i < length q then (coeff q) i  | 
|
361  | 
else if i - length q = length p then a else (coeff p) (i - length q))"  | 
|
362  | 
by fastforce  | 
|
363  | 
also have " ... = (\<lambda>i. if i < length q then (coeff q) i else (coeff (a # p)) (i - length q))"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
364  | 
by auto  | 
| 68578 | 365  | 
finally show ?case .  | 
366  | 
qed  | 
|
367  | 
||
368  | 
lemma prefix_replicate_zero_coeff: "coeff p = coeff ((replicate n \<zero>) @ p)"  | 
|
369  | 
using append_coeff[of "replicate n \<zero>" p] replicate_zero_coeff[of n] coeff_length[of p] by auto  | 
|
370  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
371  | 
(* ========================================================================== *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
372  | 
context  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
373  | 
fixes K :: "'a set" assumes K: "subring K R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
374  | 
begin  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
375  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
376  | 
lemma polynomial_in_carrier [intro]: "polynomial K p \<Longrightarrow> set p \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
377  | 
unfolding polynomial_def using subringE(1)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
378  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
379  | 
lemma carrier_polynomial [intro]: "polynomial K p \<Longrightarrow> polynomial (carrier R) p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
380  | 
unfolding polynomial_def using subringE(1)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
381  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
382  | 
lemma append_is_polynomial: "\<lbrakk> polynomial K p; p \<noteq> [] \<rbrakk> \<Longrightarrow> polynomial K (p @ (replicate n \<zero>))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
383  | 
unfolding polynomial_def using subringE(2)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
384  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
385  | 
lemma lead_coeff_in_carrier: "polynomial K (a # p) \<Longrightarrow> a \<in> carrier R - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
386  | 
unfolding polynomial_def using subringE(1)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
387  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
388  | 
lemma monom_is_polynomial [intro]: "a \<in> K - { \<zero> } \<Longrightarrow> polynomial K (monom a n)"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
389  | 
unfolding polynomial_def monom_def using subringE(2)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
390  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
391  | 
lemma eval_poly_in_carrier: "\<lbrakk> polynomial K p; x \<in> carrier R \<rbrakk> \<Longrightarrow> (eval p) x \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
392  | 
using eval_in_carrier[OF polynomial_in_carrier] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
393  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
394  | 
lemma poly_coeff_in_carrier [simp]: "polynomial K p \<Longrightarrow> coeff p i \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
395  | 
using coeff_in_carrier[OF polynomial_in_carrier] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
396  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
397  | 
end (* of fixed K context. *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
398  | 
(* ========================================================================== *)  | 
| 68578 | 399  | 
|
400  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
401  | 
subsection \<open>Polynomial Addition\<close>  | 
| 68578 | 402  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
403  | 
(* ========================================================================== *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
404  | 
context  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
405  | 
fixes K :: "'a set" assumes K: "subring K R"  | 
| 68578 | 406  | 
begin  | 
407  | 
||
408  | 
lemma poly_add_is_polynomial:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
409  | 
assumes "set p1 \<subseteq> K" and "set p2 \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
410  | 
shows "polynomial K (poly_add p1 p2)"  | 
| 68578 | 411  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
412  | 
  { fix p1 p2 assume A: "set p1 \<subseteq> K" "set p2 \<subseteq> K" "length p1 \<ge> length p2"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
413  | 
hence "polynomial K (poly_add p1 p2)"  | 
| 68578 | 414  | 
proof -  | 
415  | 
define p2' where "p2' = (replicate (length p1 - length p2) \<zero>) @ p2"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
416  | 
hence "set p2' \<subseteq> K" and "length p1 = length p2'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
417  | 
using A(2-3) subringE(2)[OF K] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
418  | 
hence "set (map2 (\<oplus>) p1 p2') \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
419  | 
using A(1) subringE(7)[OF K]  | 
| 69712 | 420  | 
by (induct p1) (auto, metis set_ConsD subsetD set_zip_leftD set_zip_rightD)  | 
| 68578 | 421  | 
thus ?thesis  | 
422  | 
unfolding p2'_def using normalize_gives_polynomial A(3) by simp  | 
|
423  | 
qed }  | 
|
424  | 
thus ?thesis  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
425  | 
using assms by auto  | 
| 68578 | 426  | 
qed  | 
427  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
428  | 
lemma poly_add_closed: "\<lbrakk> polynomial K p1; polynomial K p2 \<rbrakk> \<Longrightarrow> polynomial K (poly_add p1 p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
429  | 
using poly_add_is_polynomial polynomial_incl by simp  | 
| 68578 | 430  | 
|
431  | 
lemma poly_add_length_eq:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
432  | 
assumes "polynomial K p1" "polynomial K p2" and "length p1 \<noteq> length p2"  | 
| 68578 | 433  | 
shows "length (poly_add p1 p2) = max (length p1) (length p2)"  | 
434  | 
proof -  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
435  | 
  { fix p1 p2 assume A: "polynomial K p1" "polynomial K p2" "length p1 > length p2"
 | 
| 68578 | 436  | 
hence "length (poly_add p1 p2) = max (length p1) (length p2)"  | 
437  | 
proof -  | 
|
438  | 
let ?p2 = "(replicate (length p1 - length p2) \<zero>) @ p2"  | 
|
439  | 
have p1: "p1 \<noteq> []" and p2: "?p2 \<noteq> []"  | 
|
440  | 
using A(3) by auto  | 
|
| 68605 | 441  | 
then have "zip p1 (replicate (length p1 - length p2) \<zero> @ p2) = zip (lead_coeff p1 # tl p1) (lead_coeff (replicate (length p1 - length p2) \<zero> @ p2) # tl (replicate (length p1 - length p2) \<zero> @ p2))"  | 
442  | 
by auto  | 
|
| 68578 | 443  | 
hence "lead_coeff (map2 (\<oplus>) p1 ?p2) = lead_coeff p1 \<oplus> lead_coeff ?p2"  | 
| 68605 | 444  | 
by simp  | 
| 68578 | 445  | 
moreover have "lead_coeff p1 \<in> carrier R"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
446  | 
using p1 A(1) lead_coeff_in_carrier[OF K, of "hd p1" "tl p1"] by auto  | 
| 68578 | 447  | 
ultimately have "lead_coeff (map2 (\<oplus>) p1 ?p2) = lead_coeff p1"  | 
448  | 
using A(3) by auto  | 
|
449  | 
moreover have "lead_coeff p1 \<noteq> \<zero>"  | 
|
450  | 
using p1 A(1) unfolding polynomial_def by simp  | 
|
451  | 
ultimately have "length (normalize (map2 (\<oplus>) p1 ?p2)) = length p1"  | 
|
452  | 
using normalize_length_eq by auto  | 
|
453  | 
thus ?thesis  | 
|
454  | 
using A(3) by auto  | 
|
455  | 
qed }  | 
|
456  | 
thus ?thesis  | 
|
457  | 
using assms by auto  | 
|
458  | 
qed  | 
|
459  | 
||
460  | 
lemma poly_add_degree_eq:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
461  | 
assumes "polynomial K p1" "polynomial K p2" and "degree p1 \<noteq> degree p2"  | 
| 68578 | 462  | 
shows "degree (poly_add p1 p2) = max (degree p1) (degree p2)"  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
463  | 
using poly_add_length_eq[OF assms(1-2)] assms(3) by simp  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
464  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
465  | 
end (* of fixed K context. *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
466  | 
(* ========================================================================== *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
467  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
468  | 
lemma poly_add_in_carrier:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
469  | 
"\<lbrakk> set p1 \<subseteq> carrier R; set p2 \<subseteq> carrier R \<rbrakk> \<Longrightarrow> set (poly_add p1 p2) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
470  | 
using polynomial_incl[OF poly_add_is_polynomial[OF carrier_is_subring]] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
471  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
472  | 
lemma poly_add_length_le: "length (poly_add p1 p2) \<le> max (length p1) (length p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
473  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
474  | 
  { fix p1 p2 :: "'a list" assume A: "length p1 \<ge> length p2"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
475  | 
let ?p2 = "(replicate (length p1 - length p2) \<zero>) @ p2"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
476  | 
have "length (poly_add p1 p2) \<le> max (length p1) (length p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
477  | 
using normalize_length_le[of "map2 (\<oplus>) p1 ?p2"] A by auto }  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
478  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
479  | 
by (metis le_cases max.commute poly_add.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
480  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
481  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
482  | 
lemma poly_add_degree: "degree (poly_add p1 p2) \<le> max (degree p1) (degree p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
483  | 
using poly_add_length_le by (meson diff_le_mono le_max_iff_disj)  | 
| 68578 | 484  | 
|
485  | 
lemma poly_add_coeff_aux:  | 
|
486  | 
assumes "length p1 \<ge> length p2"  | 
|
487  | 
shows "coeff (poly_add p1 p2) = (\<lambda>i. ((coeff p1) i) \<oplus> ((coeff p2) i))"  | 
|
488  | 
proof  | 
|
489  | 
fix i  | 
|
490  | 
have "i < length p1 \<Longrightarrow> (coeff (poly_add p1 p2)) i = ((coeff p1) i) \<oplus> ((coeff p2) i)"  | 
|
491  | 
proof -  | 
|
492  | 
let ?p2 = "(replicate (length p1 - length p2) \<zero>) @ p2"  | 
|
493  | 
have len_eqs: "length p1 = length ?p2" "length (map2 (\<oplus>) p1 ?p2) = length p1"  | 
|
494  | 
using assms by auto  | 
|
495  | 
assume i_lt: "i < length p1"  | 
|
496  | 
have "(coeff (poly_add p1 p2)) i = (coeff (map2 (\<oplus>) p1 ?p2)) i"  | 
|
497  | 
using normalize_coeff[of "map2 (\<oplus>) p1 ?p2"] assms by auto  | 
|
498  | 
also have " ... = (map2 (\<oplus>) p1 ?p2) ! (length p1 - 1 - i)"  | 
|
499  | 
using coeff_nth[of i "map2 (\<oplus>) p1 ?p2"] len_eqs(2) i_lt by auto  | 
|
500  | 
also have " ... = (p1 ! (length p1 - 1 - i)) \<oplus> (?p2 ! (length ?p2 - 1 - i))"  | 
|
501  | 
using len_eqs i_lt by auto  | 
|
502  | 
also have " ... = ((coeff p1) i) \<oplus> ((coeff ?p2) i)"  | 
|
503  | 
using coeff_nth[of i p1] coeff_nth[of i ?p2] i_lt len_eqs(1) by auto  | 
|
504  | 
also have " ... = ((coeff p1) i) \<oplus> ((coeff p2) i)"  | 
|
505  | 
using prefix_replicate_zero_coeff by simp  | 
|
506  | 
finally show "(coeff (poly_add p1 p2)) i = ((coeff p1) i) \<oplus> ((coeff p2) i)" .  | 
|
507  | 
qed  | 
|
508  | 
moreover  | 
|
509  | 
have "i \<ge> length p1 \<Longrightarrow> (coeff (poly_add p1 p2)) i = ((coeff p1) i) \<oplus> ((coeff p2) i)"  | 
|
510  | 
using coeff_length[of "poly_add p1 p2"] coeff_length[of p1] coeff_length[of p2]  | 
|
511  | 
poly_add_length_le[of p1 p2] assms by auto  | 
|
512  | 
ultimately show "(coeff (poly_add p1 p2)) i = ((coeff p1) i) \<oplus> ((coeff p2) i)"  | 
|
513  | 
using not_le by blast  | 
|
514  | 
qed  | 
|
515  | 
||
516  | 
lemma poly_add_coeff:  | 
|
517  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
518  | 
shows "coeff (poly_add p1 p2) = (\<lambda>i. ((coeff p1) i) \<oplus> ((coeff p2) i))"  | 
|
519  | 
proof -  | 
|
520  | 
have "length p1 \<ge> length p2 \<or> length p2 > length p1"  | 
|
521  | 
by auto  | 
|
522  | 
thus ?thesis  | 
|
523  | 
proof  | 
|
524  | 
assume "length p1 \<ge> length p2" thus ?thesis  | 
|
525  | 
using poly_add_coeff_aux by simp  | 
|
526  | 
next  | 
|
527  | 
assume "length p2 > length p1"  | 
|
528  | 
hence "coeff (poly_add p1 p2) = (\<lambda>i. ((coeff p2) i) \<oplus> ((coeff p1) i))"  | 
|
529  | 
using poly_add_coeff_aux by simp  | 
|
530  | 
thus ?thesis  | 
|
531  | 
using assms by (simp add: add.m_comm)  | 
|
532  | 
qed  | 
|
533  | 
qed  | 
|
534  | 
||
535  | 
lemma poly_add_comm:  | 
|
536  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
537  | 
shows "poly_add p1 p2 = poly_add p2 p1"  | 
|
538  | 
proof -  | 
|
539  | 
have "coeff (poly_add p1 p2) = coeff (poly_add p2 p1)"  | 
|
540  | 
using poly_add_coeff[OF assms] poly_add_coeff[OF assms(2) assms(1)]  | 
|
541  | 
coeff_in_carrier[OF assms(1)] coeff_in_carrier[OF assms(2)] add.m_comm by auto  | 
|
542  | 
thus ?thesis  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
543  | 
using coeff_iff_polynomial_cond[OF  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
544  | 
poly_add_is_polynomial[OF carrier_is_subring assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
545  | 
poly_add_is_polynomial[OF carrier_is_subring assms(2,1)]] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
546  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
547  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
548  | 
lemma poly_add_monom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
549  | 
  assumes "set p \<subseteq> carrier R" and "a \<in> carrier R - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
550  | 
shows "poly_add (monom a (length p)) p = a # p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
551  | 
unfolding monom_def using assms by (induction p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
552  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
553  | 
lemma poly_add_append_replicate:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
554  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
555  | 
shows "poly_add (p @ (replicate (length q) \<zero>)) q = normalize (p @ q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
556  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
557  | 
have "map2 (\<oplus>) (p @ (replicate (length q) \<zero>)) ((replicate (length p) \<zero>) @ q) = p @ q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
558  | 
using assms by (induct p) (induct q, auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
559  | 
thus ?thesis by simp  | 
| 68578 | 560  | 
qed  | 
561  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
562  | 
lemma poly_add_append_zero:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
563  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
564  | 
shows "poly_add (p @ [ \<zero> ]) (q @ [ \<zero> ]) = normalize ((poly_add p q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
565  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
566  | 
have in_carrier: "set (p @ [ \<zero> ]) \<subseteq> carrier R" "set (q @ [ \<zero> ]) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
567  | 
using assms by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
568  | 
have "coeff (poly_add (p @ [ \<zero> ]) (q @ [ \<zero> ])) = coeff ((poly_add p q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
569  | 
using append_coeff[of p "[ \<zero> ]"] poly_add_coeff[OF in_carrier]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
570  | 
append_coeff[of q "[ \<zero> ]"] append_coeff[of "poly_add p q" "[ \<zero> ]"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
571  | 
poly_add_coeff[OF assms] assms[THEN coeff_in_carrier] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
572  | 
hence "coeff (poly_add (p @ [ \<zero> ]) (q @ [ \<zero> ])) = coeff (normalize ((poly_add p q) @ [ \<zero> ]))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
573  | 
using normalize_coeff by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
574  | 
moreover have "set ((poly_add p q) @ [ \<zero> ]) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
575  | 
using poly_add_in_carrier[OF assms] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
576  | 
ultimately show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
577  | 
using coeff_iff_polynomial_cond[OF poly_add_is_polynomial[OF carrier_is_subring in_carrier]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
578  | 
normalize_gives_polynomial] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
579  | 
qed  | 
| 68578 | 580  | 
|
581  | 
lemma poly_add_normalize_aux:  | 
|
582  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
583  | 
shows "poly_add p1 p2 = poly_add (normalize p1) p2"  | 
|
584  | 
proof -  | 
|
585  | 
  { fix n p1 p2 assume "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"
 | 
|
586  | 
hence "poly_add p1 p2 = poly_add ((replicate n \<zero>) @ p1) p2"  | 
|
587  | 
proof (induction n)  | 
|
588  | 
case 0 thus ?case by simp  | 
|
589  | 
next  | 
|
590  | 
      { fix p1 p2 :: "'a list"
 | 
|
591  | 
assume in_carrier: "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
592  | 
have "poly_add p1 p2 = poly_add (\<zero> # p1) p2"  | 
|
593  | 
proof -  | 
|
594  | 
have "length p1 \<ge> length p2 \<Longrightarrow> ?thesis"  | 
|
595  | 
proof -  | 
|
596  | 
assume A: "length p1 \<ge> length p2"  | 
|
597  | 
let ?p2 = "\<lambda>n. (replicate n \<zero>) @ p2"  | 
|
598  | 
have "poly_add p1 p2 = normalize (map2 (\<oplus>) (\<zero> # p1) (\<zero> # ?p2 (length p1 - length p2)))"  | 
|
599  | 
using A by simp  | 
|
600  | 
also have " ... = normalize (map2 (\<oplus>) (\<zero> # p1) (?p2 (length (\<zero> # p1) - length p2)))"  | 
|
601  | 
by (simp add: A Suc_diff_le)  | 
|
602  | 
also have " ... = poly_add (\<zero> # p1) p2"  | 
|
603  | 
using A by simp  | 
|
604  | 
finally show ?thesis .  | 
|
605  | 
qed  | 
|
606  | 
||
607  | 
moreover have "length p2 > length p1 \<Longrightarrow> ?thesis"  | 
|
608  | 
proof -  | 
|
609  | 
assume A: "length p2 > length p1"  | 
|
610  | 
let ?f = "\<lambda>n p. (replicate n \<zero>) @ p"  | 
|
611  | 
have "poly_add p1 p2 = poly_add p2 p1"  | 
|
612  | 
using A by simp  | 
|
613  | 
also have " ... = normalize (map2 (\<oplus>) p2 (?f (length p2 - length p1) p1))"  | 
|
614  | 
using A by simp  | 
|
615  | 
also have " ... = normalize (map2 (\<oplus>) p2 (?f (length p2 - Suc (length p1)) (\<zero> # p1)))"  | 
|
616  | 
by (metis A Suc_diff_Suc append_Cons replicate_Suc replicate_app_Cons_same)  | 
|
617  | 
also have " ... = poly_add p2 (\<zero> # p1)"  | 
|
618  | 
using A by simp  | 
|
619  | 
also have " ... = poly_add (\<zero> # p1) p2"  | 
|
620  | 
using poly_add_comm[of p2 "\<zero> # p1"] in_carrier by auto  | 
|
621  | 
finally show ?thesis .  | 
|
622  | 
qed  | 
|
623  | 
||
624  | 
ultimately show ?thesis by auto  | 
|
625  | 
qed } note aux_lemma = this  | 
|
626  | 
||
627  | 
case (Suc n)  | 
|
628  | 
hence in_carrier: "set (replicate n \<zero> @ p1) \<subseteq> carrier R"  | 
|
629  | 
by auto  | 
|
630  | 
have "poly_add p1 p2 = poly_add (replicate n \<zero> @ p1) p2"  | 
|
631  | 
using Suc by simp  | 
|
632  | 
also have " ... = poly_add (replicate (Suc n) \<zero> @ p1) p2"  | 
|
633  | 
using aux_lemma[OF in_carrier Suc(3)] by simp  | 
|
634  | 
finally show ?case .  | 
|
635  | 
qed } note aux_lemma = this  | 
|
636  | 
||
637  | 
have "poly_add p1 p2 =  | 
|
638  | 
poly_add ((replicate (length p1 - length (normalize p1)) \<zero>) @ normalize p1) p2"  | 
|
639  | 
using normalize_def'[of p1] by simp  | 
|
640  | 
also have " ... = poly_add (normalize p1) p2"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
641  | 
using aux_lemma[OF normalize_in_carrier[OF assms(1)] assms(2)] by simp  | 
| 68578 | 642  | 
finally show ?thesis .  | 
643  | 
qed  | 
|
644  | 
||
645  | 
lemma poly_add_normalize:  | 
|
646  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
647  | 
shows "poly_add p1 p2 = poly_add (normalize p1) p2"  | 
|
648  | 
and "poly_add p1 p2 = poly_add p1 (normalize p2)"  | 
|
649  | 
and "poly_add p1 p2 = poly_add (normalize p1) (normalize p2)"  | 
|
650  | 
proof -  | 
|
651  | 
show "poly_add p1 p2 = poly_add p1 (normalize p2)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
652  | 
unfolding poly_add_comm[OF assms] poly_add_normalize_aux[OF assms(2) assms(1)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
653  | 
poly_add_comm[OF normalize_in_carrier[OF assms(2)] assms(1)] by simp  | 
| 68578 | 654  | 
next  | 
655  | 
show "poly_add p1 p2 = poly_add (normalize p1) p2"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
656  | 
using poly_add_normalize_aux[OF assms] .  | 
| 68578 | 657  | 
also have " ... = poly_add (normalize p2) (normalize p1)"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
658  | 
unfolding poly_add_comm[OF normalize_in_carrier[OF assms(1)] assms(2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
659  | 
poly_add_normalize_aux[OF assms(2) normalize_in_carrier[OF assms(1)]] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
660  | 
finally show "poly_add p1 p2 = poly_add (normalize p1) (normalize p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
661  | 
unfolding poly_add_comm[OF assms[THEN normalize_in_carrier]] .  | 
| 68578 | 662  | 
qed  | 
663  | 
||
664  | 
lemma poly_add_zero':  | 
|
665  | 
assumes "set p \<subseteq> carrier R"  | 
|
666  | 
shows "poly_add p [] = normalize p" and "poly_add [] p = normalize p"  | 
|
667  | 
proof -  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
668  | 
have "map2 (\<oplus>) p (replicate (length p) \<zero>) = p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
669  | 
using assms by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
670  | 
thus "poly_add p [] = normalize p" and "poly_add [] p = normalize p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
671  | 
using poly_add_comm[OF assms, of "[]"] by simp+  | 
| 68578 | 672  | 
qed  | 
673  | 
||
674  | 
lemma poly_add_zero:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
675  | 
assumes "subring K R" "polynomial K p"  | 
| 68578 | 676  | 
shows "poly_add p [] = p" and "poly_add [] p = p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
677  | 
using poly_add_zero' normalize_polynomial polynomial_in_carrier assms by auto  | 
| 68578 | 678  | 
|
679  | 
lemma poly_add_replicate_zero':  | 
|
680  | 
assumes "set p \<subseteq> carrier R"  | 
|
681  | 
shows "poly_add p (replicate n \<zero>) = normalize p" and "poly_add (replicate n \<zero>) p = normalize p"  | 
|
682  | 
proof -  | 
|
683  | 
have "poly_add p (replicate n \<zero>) = poly_add p []"  | 
|
684  | 
using poly_add_normalize(2)[OF assms, of "replicate n \<zero>"]  | 
|
685  | 
normalize_replicate_zero[of n "[]"] by force  | 
|
686  | 
also have " ... = normalize p"  | 
|
687  | 
using poly_add_zero'[OF assms] by simp  | 
|
688  | 
finally show "poly_add p (replicate n \<zero>) = normalize p" .  | 
|
689  | 
thus "poly_add (replicate n \<zero>) p = normalize p"  | 
|
690  | 
using poly_add_comm[OF assms, of "replicate n \<zero>"] by force  | 
|
691  | 
qed  | 
|
692  | 
||
693  | 
lemma poly_add_replicate_zero:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
694  | 
assumes "subring K R" "polynomial K p"  | 
| 68578 | 695  | 
shows "poly_add p (replicate n \<zero>) = p" and "poly_add (replicate n \<zero>) p = p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
696  | 
using poly_add_replicate_zero' normalize_polynomial polynomial_in_carrier assms by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
697  | 
|
| 68578 | 698  | 
|
699  | 
||
700  | 
subsection \<open>Dense Representation\<close>  | 
|
701  | 
||
702  | 
lemma dense_repr_replicate_zero: "dense_repr ((replicate n \<zero>) @ p) = dense_repr p"  | 
|
703  | 
by (induction n) (auto)  | 
|
704  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
705  | 
lemma dense_repr_normalize: "dense_repr (normalize p) = dense_repr p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
706  | 
by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
707  | 
|
| 68578 | 708  | 
lemma polynomial_dense_repr:  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
709  | 
assumes "polynomial K p" and "p \<noteq> []"  | 
| 68578 | 710  | 
shows "dense_repr p = (lead_coeff p, degree p) # dense_repr (normalize (tl p))"  | 
711  | 
proof -  | 
|
712  | 
let ?len = length and ?norm = normalize  | 
|
713  | 
obtain a p' where p: "p = a # p'"  | 
|
714  | 
using assms(2) list.exhaust_sel by blast  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
715  | 
  hence a: "a \<in> K - { \<zero> }" and p': "set p' \<subseteq> K"
 | 
| 68578 | 716  | 
using assms(1) unfolding p by (auto simp add: polynomial_def)  | 
717  | 
hence "dense_repr p = (lead_coeff p, degree p) # dense_repr p'"  | 
|
718  | 
unfolding p by simp  | 
|
719  | 
also have " ... =  | 
|
720  | 
(lead_coeff p, degree p) # dense_repr ((replicate (?len p' - ?len (?norm p')) \<zero>) @ ?norm p')"  | 
|
721  | 
using normalize_def' dense_repr_replicate_zero by simp  | 
|
722  | 
also have " ... = (lead_coeff p, degree p) # dense_repr (?norm p')"  | 
|
723  | 
using dense_repr_replicate_zero by simp  | 
|
724  | 
finally show ?thesis  | 
|
725  | 
unfolding p by simp  | 
|
726  | 
qed  | 
|
727  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
728  | 
lemma monom_decomp:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
729  | 
assumes "subring K R" "polynomial K p"  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
730  | 
shows "p = poly_of_dense (dense_repr p)"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
731  | 
using assms(2)  | 
| 68578 | 732  | 
proof (induct "length p" arbitrary: p rule: less_induct)  | 
733  | 
case less thus ?case  | 
|
734  | 
proof (cases p)  | 
|
735  | 
case Nil thus ?thesis by simp  | 
|
736  | 
next  | 
|
737  | 
case (Cons a l)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
738  | 
    hence a: "a \<in> carrier R - { \<zero> }" and l: "set l \<subseteq> carrier R"  "set l \<subseteq> K"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
739  | 
using less(2) subringE(1)[OF assms(1)] by (auto simp add: polynomial_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
740  | 
hence "a # l = poly_add (monom a (degree (a # l))) l"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
741  | 
using poly_add_monom[of l a] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
742  | 
also have " ... = poly_add (monom a (degree (a # l))) (normalize l)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
743  | 
using poly_add_normalize(2)[of "monom a (degree (a # l))", OF _ l(1)] a  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
744  | 
unfolding monom_def by force  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
745  | 
also have " ... = poly_add (monom a (degree (a # l))) (poly_of_dense (dense_repr (normalize l)))"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
746  | 
using less(1)[OF _ normalize_gives_polynomial[OF l(2)]] normalize_length_le[of l]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
747  | 
unfolding Cons by simp  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
748  | 
also have " ... = poly_of_dense ((a, degree (a # l)) # dense_repr (normalize l))"  | 
| 68578 | 749  | 
by simp  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
750  | 
also have " ... = poly_of_dense (dense_repr (a # l))"  | 
| 68578 | 751  | 
using polynomial_dense_repr[OF less(2)] unfolding Cons by simp  | 
752  | 
finally show ?thesis  | 
|
753  | 
unfolding Cons by simp  | 
|
754  | 
qed  | 
|
755  | 
qed  | 
|
756  | 
||
757  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
758  | 
subsection \<open>Polynomial Multiplication\<close>  | 
| 68578 | 759  | 
|
760  | 
lemma poly_mult_is_polynomial:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
761  | 
assumes "subring K R" "set p1 \<subseteq> K" and "set p2 \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
762  | 
shows "polynomial K (poly_mult p1 p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
763  | 
using assms(2-3)  | 
| 68578 | 764  | 
proof (induction p1)  | 
765  | 
case Nil thus ?case  | 
|
766  | 
by (simp add: polynomial_def)  | 
|
767  | 
next  | 
|
768  | 
case (Cons a p1)  | 
|
769  | 
let ?a_p2 = "(map (\<lambda>b. a \<otimes> b) p2) @ (replicate (degree (a # p1)) \<zero>)"  | 
|
770  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
771  | 
have "set (poly_mult p1 p2) \<subseteq> K"  | 
| 68578 | 772  | 
using Cons unfolding polynomial_def by auto  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
773  | 
moreover have "set ?a_p2 \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
774  | 
using assms(3) Cons(2) subringE(1-2,6)[OF assms(1)] by(induct p2) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
775  | 
ultimately have "polynomial K (poly_add ?a_p2 (poly_mult p1 p2))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
776  | 
using poly_add_is_polynomial[OF assms(1)] by blast  | 
| 68578 | 777  | 
thus ?case by simp  | 
778  | 
qed  | 
|
779  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
780  | 
lemma poly_mult_closed:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
781  | 
assumes "subring K R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
782  | 
shows "\<lbrakk> polynomial K p1; polynomial K p2 \<rbrakk> \<Longrightarrow> polynomial K (poly_mult p1 p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
783  | 
using poly_mult_is_polynomial polynomial_incl assms by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
784  | 
|
| 68578 | 785  | 
lemma poly_mult_in_carrier:  | 
786  | 
"\<lbrakk> set p1 \<subseteq> carrier R; set p2 \<subseteq> carrier R \<rbrakk> \<Longrightarrow> set (poly_mult p1 p2) \<subseteq> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
787  | 
using poly_mult_is_polynomial polynomial_in_carrier carrier_is_subring by simp  | 
| 68578 | 788  | 
|
789  | 
lemma poly_mult_coeff:  | 
|
790  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
791  | 
  shows "coeff (poly_mult p1 p2) = (\<lambda>i. \<Oplus> k \<in> {..i}. (coeff p1) k \<otimes> (coeff p2) (i - k))"
 | 
|
792  | 
using assms(1)  | 
|
793  | 
proof (induction p1)  | 
|
794  | 
case Nil thus ?case using assms(2) by auto  | 
|
795  | 
next  | 
|
796  | 
case (Cons a p1)  | 
|
797  | 
hence in_carrier:  | 
|
798  | 
"a \<in> carrier R" "\<And>i. (coeff p1) i \<in> carrier R" "\<And>i. (coeff p2) i \<in> carrier R"  | 
|
799  | 
using coeff_in_carrier assms(2) by auto  | 
|
800  | 
||
801  | 
let ?a_p2 = "(map (\<lambda>b. a \<otimes> b) p2) @ (replicate (degree (a # p1)) \<zero>)"  | 
|
802  | 
have "coeff (replicate (degree (a # p1)) \<zero>) = (\<lambda>_. \<zero>)"  | 
|
803  | 
and "length (replicate (degree (a # p1)) \<zero>) = length p1"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
804  | 
using prefix_replicate_zero_coeff[of "[]" "length p1"] by auto  | 
| 68578 | 805  | 
hence "coeff ?a_p2 = (\<lambda>i. if i < length p1 then \<zero> else (coeff (map (\<lambda>b. a \<otimes> b) p2)) (i - length p1))"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
806  | 
using append_coeff[of "map (\<lambda>b. a \<otimes> b) p2" "replicate (length p1) \<zero>"] by auto  | 
| 68578 | 807  | 
also have " ... = (\<lambda>i. if i < length p1 then \<zero> else a \<otimes> ((coeff p2) (i - length p1)))"  | 
808  | 
proof -  | 
|
809  | 
have "\<And>i. i < length p2 \<Longrightarrow> (coeff (map (\<lambda>b. a \<otimes> b) p2)) i = a \<otimes> ((coeff p2) i)"  | 
|
810  | 
proof -  | 
|
811  | 
fix i assume i_lt: "i < length p2"  | 
|
812  | 
hence "(coeff (map (\<lambda>b. a \<otimes> b) p2)) i = (map (\<lambda>b. a \<otimes> b) p2) ! (length p2 - 1 - i)"  | 
|
813  | 
using coeff_nth[of i "map (\<lambda>b. a \<otimes> b) p2"] by auto  | 
|
814  | 
also have " ... = a \<otimes> (p2 ! (length p2 - 1 - i))"  | 
|
815  | 
using i_lt by auto  | 
|
816  | 
also have " ... = a \<otimes> ((coeff p2) i)"  | 
|
817  | 
using coeff_nth[OF i_lt] by simp  | 
|
818  | 
finally show "(coeff (map (\<lambda>b. a \<otimes> b) p2)) i = a \<otimes> ((coeff p2) i)" .  | 
|
819  | 
qed  | 
|
820  | 
moreover have "\<And>i. i \<ge> length p2 \<Longrightarrow> (coeff (map (\<lambda>b. a \<otimes> b) p2)) i = a \<otimes> ((coeff p2) i)"  | 
|
821  | 
using coeff_length[of p2] coeff_length[of "map (\<lambda>b. a \<otimes> b) p2"] in_carrier by auto  | 
|
822  | 
ultimately show ?thesis by (meson not_le)  | 
|
823  | 
qed  | 
|
824  | 
  also have " ... = (\<lambda>i. \<Oplus> k \<in> {..i}. (if k = length p1 then a else \<zero>) \<otimes> (coeff p2) (i - k))"
 | 
|
825  | 
  (is "?f1 = (\<lambda>i. (\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k)))")
 | 
|
826  | 
proof  | 
|
827  | 
fix i  | 
|
828  | 
    have "\<And>k. k \<in> {..i} \<Longrightarrow> ?f2 k \<otimes> ?f3 (i - k) = \<zero>" if "i < length p1"
 | 
|
829  | 
using in_carrier that by auto  | 
|
830  | 
    hence "(\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k)) = \<zero>" if "i < length p1"
 | 
|
831  | 
using that in_carrier  | 
|
832  | 
            add.finprod_cong'[of "{..i}" "{..i}" "\<lambda>k. ?f2 k \<otimes> ?f3 (i - k)" "\<lambda>i. \<zero>"]
 | 
|
833  | 
by auto  | 
|
834  | 
    hence eq_lt: "?f1 i = (\<lambda>i. (\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k))) i" if "i < length p1"
 | 
|
835  | 
using that by auto  | 
|
836  | 
||
837  | 
    have "\<And>k. k \<in> {..i} \<Longrightarrow>
 | 
|
838  | 
?f2 k \<otimes>\<^bsub>R\<^esub> ?f3 (i - k) = (if length p1 = k then a \<otimes> coeff p2 (i - k) else \<zero>)"  | 
|
839  | 
using in_carrier by auto  | 
|
840  | 
    hence "(\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k)) = 
 | 
|
841  | 
           (\<Oplus> k \<in> {..i}. (if length p1 = k then a \<otimes> coeff p2 (i - k) else \<zero>))"
 | 
|
842  | 
using in_carrier  | 
|
843  | 
            add.finprod_cong'[of "{..i}" "{..i}" "\<lambda>k. ?f2 k \<otimes> ?f3 (i - k)"
 | 
|
844  | 
"\<lambda>k. (if length p1 = k then a \<otimes> coeff p2 (i - k) else \<zero>)"]  | 
|
845  | 
by fastforce  | 
|
846  | 
also have " ... = a \<otimes> (coeff p2) (i - length p1)" if "i \<ge> length p1"  | 
|
847  | 
      using add.finprod_singleton[of "length p1" "{..i}" "\<lambda>j. a \<otimes> (coeff p2) (i - j)"]
 | 
|
848  | 
in_carrier that by auto  | 
|
849  | 
finally  | 
|
850  | 
    have "(\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k)) =  a \<otimes> (coeff p2) (i - length p1)" if "i \<ge> length p1"
 | 
|
851  | 
using that by simp  | 
|
852  | 
    hence eq_ge: "?f1 i = (\<lambda>i. (\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k))) i" if "i \<ge> length p1"
 | 
|
853  | 
using that by auto  | 
|
854  | 
||
855  | 
    from eq_lt eq_ge show "?f1 i = (\<lambda>i. (\<Oplus> k \<in> {..i}. ?f2 k \<otimes> ?f3 (i - k))) i" by auto
 | 
|
856  | 
qed  | 
|
857  | 
||
858  | 
finally have coeff_a_p2:  | 
|
859  | 
    "coeff ?a_p2 = (\<lambda>i. \<Oplus> k \<in> {..i}. (if k = length p1 then a else \<zero>) \<otimes> (coeff p2) (i - k))" .
 | 
|
860  | 
||
861  | 
have "set ?a_p2 \<subseteq> carrier R"  | 
|
862  | 
using in_carrier(1) assms(2) by auto  | 
|
863  | 
||
864  | 
moreover have "set (poly_mult p1 p2) \<subseteq> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
865  | 
using poly_mult_in_carrier[OF _ assms(2)] Cons(2) by simp  | 
| 68578 | 866  | 
|
867  | 
ultimately  | 
|
868  | 
have "coeff (poly_mult (a # p1) p2) = (\<lambda>i. ((coeff ?a_p2) i) \<oplus> ((coeff (poly_mult p1 p2)) i))"  | 
|
869  | 
using poly_add_coeff[of ?a_p2 "poly_mult p1 p2"] by simp  | 
|
870  | 
  also have " ... = (\<lambda>i. (\<Oplus> k \<in> {..i}. (if k = length p1 then a else \<zero>) \<otimes> (coeff p2) (i - k)) \<oplus>
 | 
|
871  | 
                         (\<Oplus> k \<in> {..i}. (coeff p1) k \<otimes> (coeff p2) (i - k)))"
 | 
|
872  | 
using Cons coeff_a_p2 by simp  | 
|
873  | 
  also have " ... = (\<lambda>i. (\<Oplus> k \<in> {..i}. ((if k = length p1 then a else \<zero>) \<otimes> (coeff p2) (i - k)) \<oplus>
 | 
|
874  | 
((coeff p1) k \<otimes> (coeff p2) (i - k))))"  | 
|
875  | 
using add.finprod_multf in_carrier by auto  | 
|
876  | 
  also have " ... = (\<lambda>i. (\<Oplus> k \<in> {..i}. (coeff (a # p1) k) \<otimes> (coeff p2) (i - k)))"
 | 
|
877  | 
   (is "(\<lambda>i. (\<Oplus> k \<in> {..i}. ?f i k)) = (\<lambda>i. (\<Oplus> k \<in> {..i}. ?g i k))")
 | 
|
878  | 
proof  | 
|
879  | 
fix i  | 
|
880  | 
have "\<And>k. ?f i k = ?g i k"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
881  | 
using in_carrier coeff_length[of p1] by auto  | 
| 68578 | 882  | 
    thus "(\<Oplus> k \<in> {..i}. ?f i k) = (\<Oplus> k \<in> {..i}. ?g i k)" by simp
 | 
883  | 
qed  | 
|
884  | 
finally show ?case .  | 
|
885  | 
qed  | 
|
886  | 
||
887  | 
lemma poly_mult_zero:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
888  | 
assumes "set p \<subseteq> carrier R"  | 
| 68578 | 889  | 
shows "poly_mult [] p = []" and "poly_mult p [] = []"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
890  | 
proof (simp)  | 
| 68578 | 891  | 
have "coeff (poly_mult p []) = (\<lambda>_. \<zero>)"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
892  | 
using poly_mult_coeff[OF assms, of "[]"] coeff_in_carrier[OF assms] by auto  | 
| 68578 | 893  | 
thus "poly_mult p [] = []"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
894  | 
using coeff_iff_polynomial_cond[OF  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
895  | 
poly_mult_is_polynomial[OF carrier_is_subring assms] zero_is_polynomial] by simp  | 
| 68578 | 896  | 
qed  | 
897  | 
||
898  | 
lemma poly_mult_l_distr':  | 
|
899  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R" "set p3 \<subseteq> carrier R"  | 
|
900  | 
shows "poly_mult (poly_add p1 p2) p3 = poly_add (poly_mult p1 p3) (poly_mult p2 p3)"  | 
|
901  | 
proof -  | 
|
902  | 
let ?c1 = "coeff p1" and ?c2 = "coeff p2" and ?c3 = "coeff p3"  | 
|
903  | 
have in_carrier:  | 
|
904  | 
"\<And>i. ?c1 i \<in> carrier R" "\<And>i. ?c2 i \<in> carrier R" "\<And>i. ?c3 i \<in> carrier R"  | 
|
905  | 
using assms coeff_in_carrier by auto  | 
|
906  | 
||
907  | 
  have "coeff (poly_mult (poly_add p1 p2) p3) = (\<lambda>n. \<Oplus>i \<in> {..n}. (?c1 i \<oplus> ?c2 i) \<otimes> ?c3 (n - i))"
 | 
|
908  | 
using poly_mult_coeff[of "poly_add p1 p2" p3] poly_add_coeff[OF assms(1-2)]  | 
|
909  | 
poly_add_in_carrier[OF assms(1-2)] assms by auto  | 
|
910  | 
  also have " ... = (\<lambda>n. \<Oplus>i \<in> {..n}. (?c1 i \<otimes> ?c3 (n - i)) \<oplus> (?c2 i \<otimes> ?c3 (n - i)))"
 | 
|
911  | 
using in_carrier l_distr by auto  | 
|
912  | 
also  | 
|
913  | 
  have " ... = (\<lambda>n. (\<Oplus>i \<in> {..n}. (?c1 i \<otimes> ?c3 (n - i))) \<oplus> (\<Oplus>i \<in> {..n}. (?c2 i \<otimes> ?c3 (n - i))))"
 | 
|
914  | 
using add.finprod_multf in_carrier by auto  | 
|
915  | 
also have " ... = coeff (poly_add (poly_mult p1 p3) (poly_mult p2 p3))"  | 
|
916  | 
using poly_mult_coeff[OF assms(1) assms(3)] poly_mult_coeff[OF assms(2-3)]  | 
|
917  | 
poly_add_coeff[OF poly_mult_in_carrier[OF assms(1) assms(3)]]  | 
|
918  | 
poly_mult_in_carrier[OF assms(2-3)] by simp  | 
|
919  | 
finally have "coeff (poly_mult (poly_add p1 p2) p3) =  | 
|
920  | 
coeff (poly_add (poly_mult p1 p3) (poly_mult p2 p3))" .  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
921  | 
moreover have "polynomial (carrier R) (poly_mult (poly_add p1 p2) p3)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
922  | 
and "polynomial (carrier R) (poly_add (poly_mult p1 p3) (poly_mult p2 p3))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
923  | 
using assms poly_add_is_polynomial poly_mult_is_polynomial polynomial_in_carrier  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
924  | 
carrier_is_subring by auto  | 
| 68578 | 925  | 
ultimately show ?thesis  | 
926  | 
using coeff_iff_polynomial_cond by auto  | 
|
927  | 
qed  | 
|
928  | 
||
929  | 
lemma poly_mult_l_distr:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
930  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2" "polynomial K p3"  | 
| 68578 | 931  | 
shows "poly_mult (poly_add p1 p2) p3 = poly_add (poly_mult p1 p3) (poly_mult p2 p3)"  | 
932  | 
using poly_mult_l_distr' polynomial_in_carrier assms by auto  | 
|
933  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
934  | 
lemma poly_mult_prepend_replicate_zero:  | 
| 68578 | 935  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
936  | 
shows "poly_mult p1 p2 = poly_mult ((replicate n \<zero>) @ p1) p2"  | 
|
937  | 
proof -  | 
|
938  | 
  { fix p1 p2 assume A: "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"
 | 
|
939  | 
hence "poly_mult p1 p2 = poly_mult (\<zero> # p1) p2"  | 
|
940  | 
proof -  | 
|
941  | 
let ?a_p2 = "(map ((\<otimes>) \<zero>) p2) @ (replicate (length p1) \<zero>)"  | 
|
942  | 
have "?a_p2 = replicate (length p2 + length p1) \<zero>"  | 
|
943  | 
using A(2) by (induction p2) (auto)  | 
|
944  | 
hence "poly_mult (\<zero> # p1) p2 = poly_add (replicate (length p2 + length p1) \<zero>) (poly_mult p1 p2)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
945  | 
by simp  | 
| 68578 | 946  | 
also have " ... = poly_add (normalize (replicate (length p2 + length p1) \<zero>)) (poly_mult p1 p2)"  | 
947  | 
using poly_add_normalize(1)[of "replicate (length p2 + length p1) \<zero>" "poly_mult p1 p2"]  | 
|
948  | 
poly_mult_in_carrier[OF A] by force  | 
|
949  | 
also have " ... = poly_mult p1 p2"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
950  | 
using poly_add_zero(2)[OF _ poly_mult_is_polynomial[OF _ A]] carrier_is_subring  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
951  | 
normalize_replicate_zero[of "length p2 + length p1" "[]"] by simp  | 
| 68578 | 952  | 
finally show ?thesis by auto  | 
953  | 
qed } note aux_lemma = this  | 
|
954  | 
||
955  | 
from assms show ?thesis  | 
|
956  | 
proof (induction n)  | 
|
957  | 
case 0 thus ?case by simp  | 
|
958  | 
next  | 
|
959  | 
case (Suc n) thus ?case  | 
|
960  | 
using aux_lemma[of "replicate n \<zero> @ p1" p2] by force  | 
|
961  | 
qed  | 
|
962  | 
qed  | 
|
963  | 
||
964  | 
lemma poly_mult_normalize:  | 
|
965  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
966  | 
shows "poly_mult p1 p2 = poly_mult (normalize p1) p2"  | 
|
967  | 
proof -  | 
|
968  | 
let ?replicate = "replicate (length p1 - length (normalize p1)) \<zero>"  | 
|
969  | 
have "poly_mult p1 p2 = poly_mult (?replicate @ (normalize p1)) p2"  | 
|
970  | 
using normalize_def'[of p1] by simp  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
971  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
972  | 
using poly_mult_prepend_replicate_zero normalize_in_carrier assms by auto  | 
| 68578 | 973  | 
qed  | 
974  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
975  | 
lemma poly_mult_append_zero:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
976  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
977  | 
shows "poly_mult (p @ [ \<zero> ]) q = normalize ((poly_mult p q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
978  | 
using assms(1)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
979  | 
proof (induct p)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
980  | 
case Nil thus ?case  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
981  | 
using poly_mult_normalize[OF _ assms(2), of "[] @ [ \<zero> ]"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
982  | 
poly_mult_zero(1) poly_mult_zero(1)[of "q @ [ \<zero> ]"] assms(2) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
983  | 
next  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
984  | 
case (Cons a p)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
985  | 
let ?q_a = "\<lambda>n. (map ((\<otimes>) a) q) @ (replicate n \<zero>)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
986  | 
have set_q_a: "\<And>n. set (?q_a n) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
987  | 
using Cons(2) assms(2) by (induct q) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
988  | 
have set_poly_mult: "set ((poly_mult p q) @ [ \<zero> ]) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
989  | 
using poly_mult_in_carrier[OF _ assms(2)] Cons(2) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
990  | 
have "poly_mult ((a # p) @ [\<zero>]) q = poly_add (?q_a (Suc (length p))) (poly_mult (p @ [\<zero>]) q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
991  | 
by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
992  | 
also have " ... = poly_add (?q_a (Suc (length p))) (normalize ((poly_mult p q) @ [ \<zero> ]))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
993  | 
using Cons by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
994  | 
also have " ... = poly_add ((?q_a (length p)) @ [ \<zero> ]) ((poly_mult p q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
995  | 
using poly_add_normalize(2)[OF set_q_a[of "Suc (length p)"] set_poly_mult]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
996  | 
by (simp add: replicate_append_same)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
997  | 
also have " ... = normalize ((poly_add (?q_a (length p)) (poly_mult p q)) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
998  | 
using poly_add_append_zero[OF set_q_a[of "length p"] poly_mult_in_carrier[OF _ assms(2)]] Cons(2) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
999  | 
also have " ... = normalize ((poly_mult (a # p) q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1000  | 
by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1001  | 
finally show ?case .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1002  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1003  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1004  | 
end (* of ring context. *)  | 
| 68578 | 1005  | 
|
1006  | 
||
1007  | 
subsection \<open>Properties Within a Domain\<close>  | 
|
1008  | 
||
1009  | 
context domain  | 
|
1010  | 
begin  | 
|
1011  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1012  | 
lemma one_is_polynomial [intro]: "subring K R \<Longrightarrow> polynomial K [ \<one> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1013  | 
unfolding polynomial_def using subringE(3) by auto  | 
| 68578 | 1014  | 
|
1015  | 
lemma poly_mult_comm:  | 
|
1016  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R"  | 
|
1017  | 
shows "poly_mult p1 p2 = poly_mult p2 p1"  | 
|
1018  | 
proof -  | 
|
1019  | 
let ?c1 = "coeff p1" and ?c2 = "coeff p2"  | 
|
1020  | 
  have "\<And>i. (\<Oplus>k \<in> {..i}. ?c1 k \<otimes> ?c2 (i - k)) = (\<Oplus>k \<in> {..i}. ?c2 k \<otimes> ?c1 (i - k))"
 | 
|
1021  | 
proof -  | 
|
1022  | 
fix i :: nat  | 
|
1023  | 
let ?f = "\<lambda>k. ?c1 k \<otimes> ?c2 (i - k)"  | 
|
1024  | 
have in_carrier: "\<And>i. ?c1 i \<in> carrier R" "\<And>i. ?c2 i \<in> carrier R"  | 
|
1025  | 
using coeff_in_carrier[OF assms(1)] coeff_in_carrier[OF assms(2)] by auto  | 
|
1026  | 
||
1027  | 
    have reindex_inj: "inj_on (\<lambda>k. i - k) {..i}"
 | 
|
1028  | 
using inj_on_def by force  | 
|
1029  | 
    moreover have "(\<lambda>k. i - k) ` {..i} \<subseteq> {..i}" by auto
 | 
|
1030  | 
    hence "(\<lambda>k. i - k) ` {..i} = {..i}"
 | 
|
1031  | 
      using reindex_inj endo_inj_surj[of "{..i}" "\<lambda>k. i - k"] by simp 
 | 
|
1032  | 
    ultimately have "(\<Oplus>k \<in> {..i}. ?f k) = (\<Oplus>k \<in> {..i}. ?f (i - k))"
 | 
|
1033  | 
      using add.finprod_reindex[of ?f "\<lambda>k. i - k" "{..i}"] in_carrier by auto
 | 
|
1034  | 
||
1035  | 
    moreover have "\<And>k. k \<in> {..i} \<Longrightarrow> ?f (i - k) = ?c2 k \<otimes> ?c1 (i - k)"
 | 
|
1036  | 
using in_carrier m_comm by auto  | 
|
1037  | 
    hence "(\<Oplus>k \<in> {..i}. ?f (i - k)) = (\<Oplus>k \<in> {..i}. ?c2 k \<otimes> ?c1 (i - k))"
 | 
|
1038  | 
      using add.finprod_cong'[of "{..i}" "{..i}"] in_carrier by auto
 | 
|
1039  | 
    ultimately show "(\<Oplus>k \<in> {..i}. ?f k) = (\<Oplus>k \<in> {..i}. ?c2 k \<otimes> ?c1 (i - k))"
 | 
|
1040  | 
by simp  | 
|
1041  | 
qed  | 
|
1042  | 
hence "coeff (poly_mult p1 p2) = coeff (poly_mult p2 p1)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1043  | 
using poly_mult_coeff[OF assms] poly_mult_coeff[OF assms(2,1)] by simp  | 
| 68578 | 1044  | 
thus ?thesis  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1045  | 
using coeff_iff_polynomial_cond[OF poly_mult_is_polynomial[OF _ assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1046  | 
poly_mult_is_polynomial[OF _ assms(2,1)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1047  | 
carrier_is_subring by simp  | 
| 68578 | 1048  | 
qed  | 
1049  | 
||
1050  | 
lemma poly_mult_r_distr':  | 
|
1051  | 
assumes "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R" "set p3 \<subseteq> carrier R"  | 
|
1052  | 
shows "poly_mult p1 (poly_add p2 p3) = poly_add (poly_mult p1 p2) (poly_mult p1 p3)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1053  | 
unfolding poly_mult_comm[OF assms(1) poly_add_in_carrier[OF assms(2-3)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1054  | 
poly_mult_l_distr'[OF assms(2-3,1)] assms(2-3)[THEN poly_mult_comm[OF _ assms(1)]] ..  | 
| 68578 | 1055  | 
|
1056  | 
lemma poly_mult_r_distr:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1057  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2" "polynomial K p3"  | 
| 68578 | 1058  | 
shows "poly_mult p1 (poly_add p2 p3) = poly_add (poly_mult p1 p2) (poly_mult p1 p3)"  | 
1059  | 
using poly_mult_r_distr' polynomial_in_carrier assms by auto  | 
|
1060  | 
||
1061  | 
lemma poly_mult_replicate_zero:  | 
|
1062  | 
assumes "set p \<subseteq> carrier R"  | 
|
1063  | 
shows "poly_mult (replicate n \<zero>) p = []"  | 
|
1064  | 
and "poly_mult p (replicate n \<zero>) = []"  | 
|
1065  | 
proof -  | 
|
1066  | 
have in_carrier: "\<And>n. set (replicate n \<zero>) \<subseteq> carrier R" by auto  | 
|
1067  | 
show "poly_mult (replicate n \<zero>) p = []" using assms  | 
|
1068  | 
proof (induction n)  | 
|
1069  | 
case 0 thus ?case by simp  | 
|
1070  | 
next  | 
|
1071  | 
case (Suc n)  | 
|
1072  | 
hence "poly_mult (replicate (Suc n) \<zero>) p = poly_mult (\<zero> # (replicate n \<zero>)) p"  | 
|
1073  | 
by simp  | 
|
1074  | 
also have " ... = poly_add ((map (\<lambda>a. \<zero> \<otimes> a) p) @ (replicate n \<zero>)) []"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1075  | 
using Suc by simp  | 
| 68578 | 1076  | 
also have " ... = poly_add ((map (\<lambda>a. \<zero>) p) @ (replicate n \<zero>)) []"  | 
| 68605 | 1077  | 
proof -  | 
1078  | 
have "map ((\<otimes>) \<zero>) p = map (\<lambda>a. \<zero>) p"  | 
|
1079  | 
using Suc.prems by auto  | 
|
1080  | 
then show ?thesis  | 
|
1081  | 
by presburger  | 
|
1082  | 
qed  | 
|
| 68578 | 1083  | 
also have " ... = poly_add (replicate (length p + n) \<zero>) []"  | 
1084  | 
by (simp add: map_replicate_const replicate_add)  | 
|
1085  | 
also have " ... = poly_add [] []"  | 
|
1086  | 
using poly_add_normalize(1)[of "replicate (length p + n) \<zero>" "[]"]  | 
|
1087  | 
normalize_replicate_zero[of "length p + n" "[]"] by auto  | 
|
1088  | 
also have " ... = []" by simp  | 
|
1089  | 
finally show ?case .  | 
|
1090  | 
qed  | 
|
1091  | 
thus "poly_mult p (replicate n \<zero>) = []"  | 
|
1092  | 
using poly_mult_comm[OF assms in_carrier] by simp  | 
|
1093  | 
qed  | 
|
1094  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1095  | 
lemma poly_mult_const':  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1096  | 
assumes "set p \<subseteq> carrier R" "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1097  | 
shows "poly_mult [ a ] p = normalize (map (\<lambda>b. a \<otimes> b) p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1098  | 
and "poly_mult p [ a ] = normalize (map (\<lambda>b. a \<otimes> b) p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1099  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1100  | 
have "map2 (\<oplus>) (map ((\<otimes>) a) p) (replicate (length p) \<zero>) = map ((\<otimes>) a) p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1101  | 
using assms by (induction p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1102  | 
thus "poly_mult [ a ] p = normalize (map (\<lambda>b. a \<otimes> b) p)" by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1103  | 
thus "poly_mult p [ a ] = normalize (map (\<lambda>b. a \<otimes> b) p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1104  | 
using poly_mult_comm[OF assms(1), of "[ a ]"] assms(2) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1105  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1106  | 
|
| 68578 | 1107  | 
lemma poly_mult_const:  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1108  | 
  assumes "subring K R" "polynomial K p" "a \<in> K - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1109  | 
shows "poly_mult [ a ] p = map (\<lambda>b. a \<otimes> b) p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1110  | 
and "poly_mult p [ a ] = map (\<lambda>b. a \<otimes> b) p"  | 
| 68578 | 1111  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1112  | 
have in_carrier: "set p \<subseteq> carrier R" "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1113  | 
using polynomial_in_carrier[OF assms(1-2)] assms(3) subringE(1)[OF assms(1)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1114  | 
|
| 68578 | 1115  | 
show "poly_mult [ a ] p = map (\<lambda>b. a \<otimes> b) p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1116  | 
proof (cases p)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1117  | 
case Nil thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1118  | 
using poly_mult_const'(1) in_carrier by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1119  | 
next  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1120  | 
case (Cons b q)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1121  | 
have "lead_coeff (map (\<lambda>b. a \<otimes> b) p) \<noteq> \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1122  | 
using assms subringE(1)[OF assms(1)] integral[of a b] Cons lead_coeff_in_carrier by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1123  | 
hence "normalize (map (\<lambda>b. a \<otimes> b) p) = (map (\<lambda>b. a \<otimes> b) p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1124  | 
unfolding Cons by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1125  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1126  | 
using poly_mult_const'(1) in_carrier by auto  | 
| 68578 | 1127  | 
qed  | 
1128  | 
thus "poly_mult p [ a ] = map (\<lambda>b. a \<otimes> b) p"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1129  | 
using poly_mult_comm[OF in_carrier(1)] in_carrier(2) by auto  | 
| 68578 | 1130  | 
qed  | 
1131  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1132  | 
lemma poly_mult_semiassoc:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1133  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1134  | 
shows "poly_mult (poly_mult [ a ] p) q = poly_mult [ a ] (poly_mult p q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1135  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1136  | 
let ?cp = "coeff p" and ?cq = "coeff q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1137  | 
have "coeff (poly_mult [ a ] p) = (\<lambda>i. (a \<otimes> ?cp i))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1138  | 
using poly_mult_const'(1)[OF assms(1,3)] normalize_coeff scalar_coeff[OF assms(3)] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1139  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1140  | 
  hence "coeff (poly_mult (poly_mult [ a ] p) q) = (\<lambda>i. (\<Oplus>j \<in> {..i}. (a \<otimes> ?cp j) \<otimes> ?cq (i - j)))"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1141  | 
using poly_mult_coeff[OF poly_mult_in_carrier[OF _ assms(1)] assms(2), of "[ a ]"] assms(3) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1142  | 
  also have " ... = (\<lambda>i. a \<otimes> (\<Oplus>j \<in> {..i}. ?cp j \<otimes> ?cq (i - j)))"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1143  | 
proof  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1144  | 
    fix i show "(\<Oplus>j \<in> {..i}. (a \<otimes> ?cp j) \<otimes> ?cq (i - j)) = a \<otimes> (\<Oplus>j \<in> {..i}. ?cp j \<otimes> ?cq (i - j))"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1145  | 
using finsum_rdistr[OF _ assms(3), of _ "\<lambda>j. ?cp j \<otimes> ?cq (i - j)"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1146  | 
assms(1-2)[THEN coeff_in_carrier] by (simp add: assms(3) m_assoc)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1147  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1148  | 
also have " ... = coeff (poly_mult [ a ] (poly_mult p q))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1149  | 
unfolding poly_mult_const'(1)[OF poly_mult_in_carrier[OF assms(1-2)] assms(3)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1150  | 
using scalar_coeff[OF assms(3), of "poly_mult p q"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1151  | 
poly_mult_coeff[OF assms(1-2)] normalize_coeff by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1152  | 
finally have "coeff (poly_mult (poly_mult [ a ] p) q) = coeff (poly_mult [ a ] (poly_mult p q))" .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1153  | 
moreover have "polynomial (carrier R) (poly_mult (poly_mult [ a ] p) q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1154  | 
and "polynomial (carrier R) (poly_mult [ a ] (poly_mult p q))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1155  | 
using poly_mult_is_polynomial[OF _ poly_mult_in_carrier[OF _ assms(1)] assms(2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1156  | 
poly_mult_is_polynomial[OF _ _ poly_mult_in_carrier[OF assms(1-2)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1157  | 
carrier_is_subring assms(3) by (auto simp del: poly_mult.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1158  | 
ultimately show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1159  | 
using coeff_iff_polynomial_cond by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1160  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1161  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1162  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1163  | 
text \<open>Note that "polynomial (carrier R) p" and "subring K p; polynomial K p" are "equivalent"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1164  | 
assumptions for any lemma in ring which the result doesn't depend on K, because carrier  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1165  | 
is a subring and a polynomial for a subset of the carrier is a carrier polynomial. The  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1166  | 
decision between one of them should be based on how the lemma is going to be used and  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1167  | 
proved. These are some tips:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1168  | 
(a) Lemmas about the algebraic structure of polynomials should use the latter option.  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1169  | 
(b) Also, if the lemma deals with lots of polynomials, then the latter option is preferred.  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1170  | 
(c) If the proof is going to be much easier with the first option, do not hesitate. \<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1171  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1172  | 
lemma poly_mult_monom':  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1173  | 
assumes "set p \<subseteq> carrier R" "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1174  | 
shows "poly_mult (monom a n) p = normalize ((map ((\<otimes>) a) p) @ (replicate n \<zero>))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1175  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1176  | 
have set_map: "set ((map ((\<otimes>) a) p) @ (replicate n \<zero>)) \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1177  | 
using assms by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1178  | 
show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1179  | 
using poly_mult_replicate_zero(1)[OF assms(1), of n]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1180  | 
poly_add_zero'(1)[OF set_map]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1181  | 
unfolding monom_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1182  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1183  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1184  | 
lemma poly_mult_monom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1185  | 
  assumes "polynomial (carrier R) p" "a \<in> carrier R - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1186  | 
shows "poly_mult (monom a n) p =  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1187  | 
(if p = [] then [] else (poly_mult [ a ] p) @ (replicate n \<zero>))"  | 
| 68578 | 1188  | 
proof (cases p)  | 
1189  | 
case Nil thus ?thesis  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1190  | 
using poly_mult_zero(2)[of "monom a n"] assms(2) monom_def by fastforce  | 
| 68578 | 1191  | 
next  | 
1192  | 
case (Cons b ps)  | 
|
1193  | 
hence "lead_coeff ((map (\<lambda>b. a \<otimes> b) p) @ (replicate n \<zero>)) \<noteq> \<zero>"  | 
|
1194  | 
using Cons assms integral[of a b] unfolding polynomial_def by auto  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1195  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1196  | 
using poly_mult_monom'[OF polynomial_incl[OF assms(1)], of a n] assms(2) Cons  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1197  | 
unfolding poly_mult_const(1)[OF carrier_is_subring assms] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1198  | 
qed  | 
| 68578 | 1199  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1200  | 
lemma poly_mult_one':  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1201  | 
assumes "set p \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1202  | 
shows "poly_mult [ \<one> ] p = normalize p" and "poly_mult p [ \<one> ] = normalize p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1203  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1204  | 
have "map2 (\<oplus>) (map ((\<otimes>) \<one>) p) (replicate (length p) \<zero>) = p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1205  | 
using assms by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1206  | 
thus "poly_mult [ \<one> ] p = normalize p" and "poly_mult p [ \<one> ] = normalize p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1207  | 
using poly_mult_comm[OF assms, of "[ \<one> ]"] by auto  | 
| 68578 | 1208  | 
qed  | 
1209  | 
||
1210  | 
lemma poly_mult_one:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1211  | 
assumes "subring K R" "polynomial K p"  | 
| 68578 | 1212  | 
shows "poly_mult [ \<one> ] p = p" and "poly_mult p [ \<one> ] = p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1213  | 
using poly_mult_one'[OF polynomial_in_carrier[OF assms]] normalize_polynomial[OF assms(2)] by auto  | 
| 68578 | 1214  | 
|
1215  | 
lemma poly_mult_lead_coeff_aux:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1216  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2" and "p1 \<noteq> []" and "p2 \<noteq> []"  | 
| 68578 | 1217  | 
shows "(coeff (poly_mult p1 p2)) (degree p1 + degree p2) = (lead_coeff p1) \<otimes> (lead_coeff p2)"  | 
1218  | 
proof -  | 
|
1219  | 
  have p1: "lead_coeff p1 \<in> carrier R - { \<zero> }" and p2: "lead_coeff p2 \<in> carrier R - { \<zero> }"
 | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1220  | 
using assms(2-5) lead_coeff_in_carrier[OF assms(1)] by (metis list.collapse)+  | 
| 68578 | 1221  | 
|
1222  | 
have "(coeff (poly_mult p1 p2)) (degree p1 + degree p2) =  | 
|
1223  | 
        (\<Oplus> k \<in> {..((degree p1) + (degree p2))}.
 | 
|
1224  | 
(coeff p1) k \<otimes> (coeff p2) ((degree p1) + (degree p2) - k))"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1225  | 
using poly_mult_coeff[OF assms(2-3)[THEN polynomial_in_carrier[OF assms(1)]]] by simp  | 
| 68578 | 1226  | 
also have " ... = (lead_coeff p1) \<otimes> (lead_coeff p2)"  | 
1227  | 
proof -  | 
|
1228  | 
let ?f = "\<lambda>i. (coeff p1) i \<otimes> (coeff p2) ((degree p1) + (degree p2) - i)"  | 
|
1229  | 
have in_carrier: "\<And>i. (coeff p1) i \<in> carrier R" "\<And>i. (coeff p2) i \<in> carrier R"  | 
|
1230  | 
using coeff_in_carrier assms by auto  | 
|
1231  | 
have "\<And>i. i < degree p1 \<Longrightarrow> ?f i = \<zero>"  | 
|
1232  | 
using coeff_degree[of p2] in_carrier by auto  | 
|
1233  | 
moreover have "\<And>i. i > degree p1 \<Longrightarrow> ?f i = \<zero>"  | 
|
1234  | 
using coeff_degree[of p1] in_carrier by auto  | 
|
1235  | 
moreover have "?f (degree p1) = (lead_coeff p1) \<otimes> (lead_coeff p2)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1236  | 
using assms(4-5) lead_coeff_simp by simp  | 
| 68578 | 1237  | 
ultimately have "?f = (\<lambda>i. if degree p1 = i then (lead_coeff p1) \<otimes> (lead_coeff p2) else \<zero>)"  | 
1238  | 
using nat_neq_iff by auto  | 
|
1239  | 
thus ?thesis  | 
|
1240  | 
      using add.finprod_singleton[of "degree p1" "{..((degree p1) + (degree p2))}"
 | 
|
1241  | 
"\<lambda>i. (lead_coeff p1) \<otimes> (lead_coeff p2)"] p1 p2 by auto  | 
|
1242  | 
qed  | 
|
1243  | 
finally show ?thesis .  | 
|
1244  | 
qed  | 
|
1245  | 
||
1246  | 
lemma poly_mult_degree_eq:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1247  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2"  | 
| 68578 | 1248  | 
shows "degree (poly_mult p1 p2) = (if p1 = [] \<or> p2 = [] then 0 else (degree p1) + (degree p2))"  | 
1249  | 
proof (cases p1)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1250  | 
case Nil thus ?thesis by simp  | 
| 68578 | 1251  | 
next  | 
1252  | 
case (Cons a p1') note p1 = Cons  | 
|
1253  | 
show ?thesis  | 
|
1254  | 
proof (cases p2)  | 
|
1255  | 
case Nil thus ?thesis  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1256  | 
using poly_mult_zero(2)[OF polynomial_in_carrier[OF assms(1-2)]] by simp  | 
| 68578 | 1257  | 
next  | 
1258  | 
case (Cons b p2') note p2 = Cons  | 
|
1259  | 
have a: "a \<in> carrier R" and b: "b \<in> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1260  | 
using p1 p2 polynomial_in_carrier[OF assms(1-2)] polynomial_in_carrier[OF assms(1,3)] by auto  | 
| 68578 | 1261  | 
have "(coeff (poly_mult p1 p2)) ((degree p1) + (degree p2)) = a \<otimes> b"  | 
1262  | 
using poly_mult_lead_coeff_aux[OF assms] p1 p2 by simp  | 
|
| 68605 | 1263  | 
hence neq0: "(coeff (poly_mult p1 p2)) ((degree p1) + (degree p2)) \<noteq> \<zero>"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1264  | 
using assms(2-3) integral[of a b] lead_coeff_in_carrier[OF assms(1)] p1 p2 by auto  | 
| 68605 | 1265  | 
moreover have eq0: "\<And>i. i > (degree p1) + (degree p2) \<Longrightarrow> (coeff (poly_mult p1 p2)) i = \<zero>"  | 
| 68578 | 1266  | 
proof -  | 
1267  | 
have aux_lemma: "degree (poly_mult p1 p2) \<le> (degree p1) + (degree p2)"  | 
|
1268  | 
proof (induct p1)  | 
|
1269  | 
case Nil  | 
|
1270  | 
then show ?case by simp  | 
|
1271  | 
next  | 
|
1272  | 
case (Cons a p1)  | 
|
1273  | 
let ?a_p2 = "(map (\<lambda>b. a \<otimes> b) p2) @ (replicate (degree (a # p1)) \<zero>)"  | 
|
1274  | 
have "poly_mult (a # p1) p2 = poly_add ?a_p2 (poly_mult p1 p2)" by simp  | 
|
1275  | 
hence "degree (poly_mult (a # p1) p2) \<le> max (degree ?a_p2) (degree (poly_mult p1 p2))"  | 
|
1276  | 
using poly_add_degree[of ?a_p2 "poly_mult p1 p2"] by simp  | 
|
1277  | 
also have " ... \<le> max ((degree (a # p1)) + (degree p2)) (degree (poly_mult p1 p2))"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1278  | 
by auto  | 
| 68578 | 1279  | 
also have " ... \<le> max ((degree (a # p1)) + (degree p2)) ((degree p1) + (degree p2))"  | 
1280  | 
using Cons by simp  | 
|
1281  | 
also have " ... \<le> (degree (a # p1)) + (degree p2)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1282  | 
by auto  | 
| 68578 | 1283  | 
finally show ?case .  | 
1284  | 
qed  | 
|
1285  | 
fix i show "i > (degree p1) + (degree p2) \<Longrightarrow> (coeff (poly_mult p1 p2)) i = \<zero>"  | 
|
1286  | 
using coeff_degree aux_lemma by simp  | 
|
1287  | 
qed  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1288  | 
moreover have "polynomial K (poly_mult p1 p2)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1289  | 
by (simp add: assms poly_mult_closed)  | 
| 68578 | 1290  | 
ultimately have "degree (poly_mult p1 p2) = degree p1 + degree p2"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1291  | 
by (metis (no_types) assms(1) coeff.simps(1) coeff_degree domain.poly_mult_one(1) domain_axioms eq0 lead_coeff_simp length_greater_0_conv neq0 normalize_length_lt not_less_iff_gr_or_eq poly_mult_one'(1) polynomial_in_carrier)  | 
| 68578 | 1292  | 
thus ?thesis  | 
1293  | 
using p1 p2 by auto  | 
|
1294  | 
qed  | 
|
1295  | 
qed  | 
|
1296  | 
||
1297  | 
lemma poly_mult_integral:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1298  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2"  | 
| 68578 | 1299  | 
shows "poly_mult p1 p2 = [] \<Longrightarrow> p1 = [] \<or> p2 = []"  | 
1300  | 
proof (rule ccontr)  | 
|
1301  | 
assume A: "poly_mult p1 p2 = []" "\<not> (p1 = [] \<or> p2 = [])"  | 
|
1302  | 
hence "degree (poly_mult p1 p2) = degree p1 + degree p2"  | 
|
1303  | 
using poly_mult_degree_eq[OF assms] by simp  | 
|
1304  | 
hence "length p1 = 1 \<and> length p2 = 1"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1305  | 
using A Suc_diff_Suc by fastforce  | 
| 68578 | 1306  | 
then obtain a b where p1: "p1 = [ a ]" and p2: "p2 = [ b ]"  | 
1307  | 
by (metis One_nat_def length_0_conv length_Suc_conv)  | 
|
1308  | 
  hence "a \<in> carrier R - { \<zero> }" and "b \<in> carrier R - { \<zero> }"
 | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1309  | 
using assms lead_coeff_in_carrier by auto  | 
| 68578 | 1310  | 
hence "poly_mult [ a ] [ b ] = [ a \<otimes> b ]"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1311  | 
using integral by auto  | 
| 68578 | 1312  | 
thus False using A(1) p1 p2 by simp  | 
1313  | 
qed  | 
|
1314  | 
||
1315  | 
lemma poly_mult_lead_coeff:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1316  | 
assumes "subring K R" "polynomial K p1" "polynomial K p2" and "p1 \<noteq> []" and "p2 \<noteq> []"  | 
| 68578 | 1317  | 
shows "lead_coeff (poly_mult p1 p2) = (lead_coeff p1) \<otimes> (lead_coeff p2)"  | 
1318  | 
proof -  | 
|
1319  | 
have "poly_mult p1 p2 \<noteq> []"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1320  | 
using poly_mult_integral[OF assms(1-3)] assms(4-5) by auto  | 
| 68578 | 1321  | 
hence "lead_coeff (poly_mult p1 p2) = (coeff (poly_mult p1 p2)) (degree p1 + degree p2)"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1322  | 
using poly_mult_degree_eq[OF assms(1-3)] assms(4-5) by (metis coeff.simps(2) list.collapse)  | 
| 68578 | 1323  | 
thus ?thesis  | 
1324  | 
using poly_mult_lead_coeff_aux[OF assms] by simp  | 
|
1325  | 
qed  | 
|
1326  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1327  | 
lemma poly_mult_append_zero_lcancel:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1328  | 
assumes "subring K R" and "polynomial K p" "polynomial K q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1329  | 
shows "poly_mult (p @ [ \<zero> ]) q = r @ [ \<zero> ] \<Longrightarrow> poly_mult p q = r"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1330  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1331  | 
note in_carrier = assms(2-3)[THEN polynomial_in_carrier[OF assms(1)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1332  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1333  | 
assume pmult: "poly_mult (p @ [ \<zero> ]) q = r @ [ \<zero> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1334  | 
have "poly_mult (p @ [ \<zero> ]) q = []" if "q = []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1335  | 
using poly_mult_zero(2)[of "p @ [ \<zero> ]"] that in_carrier(1) by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1336  | 
moreover have "poly_mult (p @ [ \<zero> ]) q = []" if "p = []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1337  | 
using poly_mult_normalize[OF _ in_carrier(2), of "p @ [ \<zero> ]"] poly_mult_zero[OF in_carrier(2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1338  | 
unfolding that by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1339  | 
ultimately have "p \<noteq> []" and "q \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1340  | 
using pmult by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1341  | 
hence "poly_mult p q \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1342  | 
using poly_mult_integral[OF assms] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1343  | 
hence "normalize ((poly_mult p q) @ [ \<zero> ]) = (poly_mult p q) @ [ \<zero> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1344  | 
using normalize_polynomial[OF append_is_polynomial[OF assms(1) poly_mult_closed[OF assms], of "Suc 0"]] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1345  | 
thus "poly_mult p q = r"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1346  | 
using poly_mult_append_zero[OF assms(2-3)[THEN polynomial_in_carrier[OF assms(1)]]] pmult by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1347  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1348  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1349  | 
lemma poly_mult_append_zero_rcancel:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1350  | 
assumes "subring K R" and "polynomial K p" "polynomial K q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1351  | 
shows "poly_mult p (q @ [ \<zero> ]) = r @ [ \<zero> ] \<Longrightarrow> poly_mult p q = r"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1352  | 
using poly_mult_append_zero_lcancel[OF assms(1,3,2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1353  | 
poly_mult_comm[of p "q @ [ \<zero> ]"] poly_mult_comm[of p q]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1354  | 
assms(2-3)[THEN polynomial_in_carrier[OF assms(1)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1355  | 
by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1356  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1357  | 
end (* of domain context. *)  | 
| 68578 | 1358  | 
|
1359  | 
||
1360  | 
subsection \<open>Algebraic Structure of Polynomials\<close>  | 
|
1361  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1362  | 
definition univ_poly :: "('a, 'b) ring_scheme \<Rightarrow>'a set \<Rightarrow> ('a list) ring" ("_ [X]\<index>" 80)
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1363  | 
where "univ_poly R K =  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1364  | 
           \<lparr> carrier = { p. polynomial\<^bsub>R\<^esub> K p },
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1365  | 
mult = ring.poly_mult R,  | 
| 68578 | 1366  | 
one = [ \<one>\<^bsub>R\<^esub> ],  | 
1367  | 
zero = [],  | 
|
1368  | 
add = ring.poly_add R \<rparr>"  | 
|
1369  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1370  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1371  | 
text \<open>These lemmas allow you to unfold one field of the record at a time. \<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1372  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1373  | 
lemma univ_poly_carrier: "polynomial\<^bsub>R\<^esub> K p \<longleftrightarrow> p \<in> carrier (K[X]\<^bsub>R\<^esub>)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1374  | 
unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1375  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1376  | 
lemma univ_poly_mult: "mult (K[X]\<^bsub>R\<^esub>) = ring.poly_mult R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1377  | 
unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1378  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1379  | 
lemma univ_poly_one: "one (K[X]\<^bsub>R\<^esub>) = [ \<one>\<^bsub>R\<^esub> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1380  | 
unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1381  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1382  | 
lemma univ_poly_zero: "zero (K[X]\<^bsub>R\<^esub>) = []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1383  | 
unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1384  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1385  | 
lemma univ_poly_add: "add (K[X]\<^bsub>R\<^esub>) = ring.poly_add R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1386  | 
unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1387  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1388  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1389  | 
(* NEW ========== *)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1390  | 
lemma univ_poly_zero_closed [intro]: "[] \<in> carrier (K[X]\<^bsub>R\<^esub>)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1391  | 
unfolding sym[OF univ_poly_carrier] polynomial_def by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1392  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1393  | 
|
| 68578 | 1394  | 
context domain  | 
1395  | 
begin  | 
|
1396  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1397  | 
lemma poly_mult_monom_assoc:  | 
| 68578 | 1398  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "a \<in> carrier R"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1399  | 
shows "poly_mult (poly_mult (monom a n) p) q =  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1400  | 
poly_mult (monom a n) (poly_mult p q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1401  | 
proof (induct n)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1402  | 
case 0 thus ?case  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1403  | 
unfolding monom_def using poly_mult_semiassoc[OF assms] by (auto simp del: poly_mult.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1404  | 
next  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1405  | 
case (Suc n)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1406  | 
have "poly_mult (poly_mult (monom a (Suc n)) p) q =  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1407  | 
poly_mult (normalize ((poly_mult (monom a n) p) @ [ \<zero> ])) q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1408  | 
using poly_mult_append_zero[OF monom_in_carrier[OF assms(3), of n] assms(1)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1409  | 
unfolding monom_def by (auto simp del: poly_mult.simps simp add: replicate_append_same)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1410  | 
also have " ... = normalize ((poly_mult (poly_mult (monom a n) p) q) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1411  | 
using poly_mult_normalize[OF _ assms(2)] poly_mult_append_zero[OF _ assms(2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1412  | 
poly_mult_in_carrier[OF monom_in_carrier[OF assms(3), of n] assms(1)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1413  | 
also have " ... = normalize ((poly_mult (monom a n) (poly_mult p q)) @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1414  | 
using Suc by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1415  | 
also have " ... = poly_mult (monom a (Suc n)) (poly_mult p q)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1416  | 
using poly_mult_append_zero[OF monom_in_carrier[OF assms(3), of n]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1417  | 
poly_mult_in_carrier[OF assms(1-2)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1418  | 
unfolding monom_def by (simp add: replicate_append_same)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1419  | 
finally show ?case .  | 
| 68578 | 1420  | 
qed  | 
1421  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1422  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1423  | 
context  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1424  | 
fixes K :: "'a set" assumes K: "subring K R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1425  | 
begin  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1426  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1427  | 
lemma univ_poly_is_monoid: "monoid (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1428  | 
unfolding univ_poly_def using poly_mult_one[OF K]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1429  | 
proof (auto simp add: K poly_add_closed poly_mult_closed one_is_polynomial monoid_def)  | 
| 68578 | 1430  | 
fix p1 p2 p3  | 
1431  | 
let ?P = "poly_mult (poly_mult p1 p2) p3 = poly_mult p1 (poly_mult p2 p3)"  | 
|
1432  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1433  | 
assume A: "polynomial K p1" "polynomial K p2" "polynomial K p3"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1434  | 
show ?P using polynomial_in_carrier[OF K A(1)]  | 
| 68578 | 1435  | 
proof (induction p1)  | 
1436  | 
case Nil thus ?case by simp  | 
|
1437  | 
next  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1438  | 
next  | 
| 68578 | 1439  | 
case (Cons a p1) thus ?case  | 
1440  | 
proof (cases "a = \<zero>")  | 
|
1441  | 
assume eq_zero: "a = \<zero>"  | 
|
1442  | 
have p1: "set p1 \<subseteq> carrier R"  | 
|
1443  | 
using Cons(2) by simp  | 
|
1444  | 
have "poly_mult (poly_mult (a # p1) p2) p3 = poly_mult (poly_mult p1 p2) p3"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1445  | 
using poly_mult_prepend_replicate_zero[OF p1 polynomial_in_carrier[OF K A(2)], of "Suc 0"]  | 
| 68578 | 1446  | 
eq_zero by simp  | 
1447  | 
also have " ... = poly_mult p1 (poly_mult p2 p3)"  | 
|
1448  | 
using p1[THEN Cons(1)] by simp  | 
|
1449  | 
also have " ... = poly_mult (a # p1) (poly_mult p2 p3)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1450  | 
using poly_mult_prepend_replicate_zero[OF p1  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1451  | 
poly_mult_in_carrier[OF A(2-3)[THEN polynomial_in_carrier[OF K]]], of "Suc 0"] eq_zero  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1452  | 
by simp  | 
| 68578 | 1453  | 
finally show ?thesis .  | 
1454  | 
next  | 
|
1455  | 
assume "a \<noteq> \<zero>" hence in_carrier:  | 
|
1456  | 
        "set p1 \<subseteq> carrier R" "set p2 \<subseteq> carrier R" "set p3 \<subseteq> carrier R" "a \<in> carrier R - { \<zero> }"
 | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1457  | 
using A(2-3) polynomial_in_carrier[OF K] Cons by auto  | 
| 68578 | 1458  | 
|
1459  | 
let ?a_p2 = "(map (\<lambda>b. a \<otimes> b) p2) @ (replicate (length p1) \<zero>)"  | 
|
1460  | 
have a_p2_in_carrier: "set ?a_p2 \<subseteq> carrier R"  | 
|
1461  | 
using in_carrier by auto  | 
|
1462  | 
||
1463  | 
have "poly_mult (poly_mult (a # p1) p2) p3 = poly_mult (poly_add ?a_p2 (poly_mult p1 p2)) p3"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1464  | 
by simp  | 
| 68578 | 1465  | 
also have " ... = poly_add (poly_mult ?a_p2 p3) (poly_mult (poly_mult p1 p2) p3)"  | 
1466  | 
using poly_mult_l_distr'[OF a_p2_in_carrier poly_mult_in_carrier[OF in_carrier(1-2)] in_carrier(3)] .  | 
|
1467  | 
also have " ... = poly_add (poly_mult ?a_p2 p3) (poly_mult p1 (poly_mult p2 p3))"  | 
|
1468  | 
using Cons(1)[OF in_carrier(1)] by simp  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1469  | 
also have " ... = poly_add (poly_mult (normalize ?a_p2) p3) (poly_mult p1 (poly_mult p2 p3))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1470  | 
using poly_mult_normalize[OF a_p2_in_carrier in_carrier(3)] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1471  | 
also have " ... = poly_add (poly_mult (poly_mult (monom a (length p1)) p2) p3)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1472  | 
(poly_mult p1 (poly_mult p2 p3))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1473  | 
using poly_mult_monom'[OF in_carrier(2), of a "length p1"] in_carrier(4) by simp  | 
| 68578 | 1474  | 
also have " ... = poly_add (poly_mult (a # (replicate (length p1) \<zero>)) (poly_mult p2 p3))  | 
1475  | 
(poly_mult p1 (poly_mult p2 p3))"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1476  | 
using poly_mult_monom_assoc[of p2 p3 a "length p1"] in_carrier unfolding monom_def by simp  | 
| 68578 | 1477  | 
also have " ... = poly_mult (poly_add (a # (replicate (length p1) \<zero>)) p1) (poly_mult p2 p3)"  | 
1478  | 
using poly_mult_l_distr'[of "a # (replicate (length p1) \<zero>)" p1 "poly_mult p2 p3"]  | 
|
1479  | 
poly_mult_in_carrier[OF in_carrier(2-3)] in_carrier by force  | 
|
1480  | 
also have " ... = poly_mult (a # p1) (poly_mult p2 p3)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1481  | 
using poly_add_monom[OF in_carrier(1) in_carrier(4)] unfolding monom_def by simp  | 
| 68578 | 1482  | 
finally show ?thesis .  | 
1483  | 
qed  | 
|
1484  | 
qed  | 
|
1485  | 
qed  | 
|
1486  | 
||
1487  | 
declare poly_add.simps[simp del]  | 
|
1488  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1489  | 
lemma univ_poly_is_abelian_monoid: "abelian_monoid (K[X])"  | 
| 68578 | 1490  | 
unfolding univ_poly_def  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1491  | 
using poly_add_closed poly_add_zero zero_is_polynomial K  | 
| 68578 | 1492  | 
proof (auto simp add: abelian_monoid_def comm_monoid_def monoid_def comm_monoid_axioms_def)  | 
1493  | 
fix p1 p2 p3  | 
|
1494  | 
let ?c = "\<lambda>p. coeff p"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1495  | 
assume A: "polynomial K p1" "polynomial K p2" "polynomial K p3"  | 
| 68578 | 1496  | 
hence  | 
1497  | 
p1: "\<And>i. (?c p1) i \<in> carrier R" "set p1 \<subseteq> carrier R" and  | 
|
1498  | 
p2: "\<And>i. (?c p2) i \<in> carrier R" "set p2 \<subseteq> carrier R" and  | 
|
1499  | 
p3: "\<And>i. (?c p3) i \<in> carrier R" "set p3 \<subseteq> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1500  | 
using A[THEN polynomial_in_carrier[OF K]] coeff_in_carrier by auto  | 
| 68578 | 1501  | 
have "?c (poly_add (poly_add p1 p2) p3) = (\<lambda>i. (?c p1 i \<oplus> ?c p2 i) \<oplus> (?c p3 i))"  | 
1502  | 
using poly_add_coeff[OF poly_add_in_carrier[OF p1(2) p2(2)] p3(2)]  | 
|
1503  | 
poly_add_coeff[OF p1(2) p2(2)] by simp  | 
|
1504  | 
also have " ... = (\<lambda>i. (?c p1 i) \<oplus> ((?c p2 i) \<oplus> (?c p3 i)))"  | 
|
1505  | 
using p1 p2 p3 add.m_assoc by simp  | 
|
1506  | 
also have " ... = ?c (poly_add p1 (poly_add p2 p3))"  | 
|
1507  | 
using poly_add_coeff[OF p1(2) poly_add_in_carrier[OF p2(2) p3(2)]]  | 
|
1508  | 
poly_add_coeff[OF p2(2) p3(2)] by simp  | 
|
1509  | 
finally have "?c (poly_add (poly_add p1 p2) p3) = ?c (poly_add p1 (poly_add p2 p3))" .  | 
|
1510  | 
thus "poly_add (poly_add p1 p2) p3 = poly_add p1 (poly_add p2 p3)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1511  | 
using coeff_iff_polynomial_cond poly_add_closed[OF K] A by meson  | 
| 68578 | 1512  | 
show "poly_add p1 p2 = poly_add p2 p1"  | 
1513  | 
using poly_add_comm[OF p1(2) p2(2)] .  | 
|
1514  | 
qed  | 
|
1515  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1516  | 
lemma univ_poly_is_abelian_group: "abelian_group (K[X])"  | 
| 68578 | 1517  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1518  | 
interpret abelian_monoid "K[X]"  | 
| 68578 | 1519  | 
using univ_poly_is_abelian_monoid .  | 
1520  | 
show ?thesis  | 
|
1521  | 
proof (unfold_locales)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1522  | 
show "carrier (add_monoid (K[X])) \<subseteq> Units (add_monoid (K[X]))"  | 
| 68578 | 1523  | 
unfolding univ_poly_def Units_def  | 
1524  | 
proof (auto)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1525  | 
fix p assume p: "polynomial K p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1526  | 
have "polynomial K [ \<ominus> \<one> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1527  | 
unfolding polynomial_def using r_neg subringE(3,5)[OF K] by force  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1528  | 
hence cond0: "polynomial K (poly_mult [ \<ominus> \<one> ] p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1529  | 
using poly_mult_closed[OF K, of "[ \<ominus> \<one> ]" p] p by simp  | 
| 68578 | 1530  | 
|
1531  | 
have "poly_add p (poly_mult [ \<ominus> \<one> ] p) = poly_add (poly_mult [ \<one> ] p) (poly_mult [ \<ominus> \<one> ] p)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1532  | 
using poly_mult_one[OF K p] by simp  | 
| 68578 | 1533  | 
also have " ... = poly_mult (poly_add [ \<one> ] [ \<ominus> \<one> ]) p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1534  | 
using poly_mult_l_distr' polynomial_in_carrier[OF K p] by auto  | 
| 68578 | 1535  | 
also have " ... = poly_mult [] p"  | 
1536  | 
using poly_add.simps[of "[ \<one> ]" "[ \<ominus> \<one> ]"]  | 
|
1537  | 
by (simp add: case_prod_unfold r_neg)  | 
|
1538  | 
also have " ... = []" by simp  | 
|
1539  | 
finally have cond1: "poly_add p (poly_mult [ \<ominus> \<one> ] p) = []" .  | 
|
1540  | 
||
1541  | 
have "poly_add (poly_mult [ \<ominus> \<one> ] p) p = poly_add (poly_mult [ \<ominus> \<one> ] p) (poly_mult [ \<one> ] p)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1542  | 
using poly_mult_one[OF K p] by simp  | 
| 68578 | 1543  | 
also have " ... = poly_mult (poly_add [ \<ominus> \<one> ] [ \<one> ]) p"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1544  | 
using poly_mult_l_distr' polynomial_in_carrier[OF K p] by auto  | 
| 68578 | 1545  | 
also have " ... = poly_mult [] p"  | 
1546  | 
using \<open>poly_mult (poly_add [\<one>] [\<ominus> \<one>]) p = poly_mult [] p\<close> poly_add_comm by auto  | 
|
1547  | 
also have " ... = []" by simp  | 
|
1548  | 
finally have cond2: "poly_add (poly_mult [ \<ominus> \<one> ] p) p = []" .  | 
|
1549  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1550  | 
from cond0 cond1 cond2 show "\<exists>q. polynomial K q \<and> poly_add q p = [] \<and> poly_add p q = []"  | 
| 68578 | 1551  | 
by auto  | 
1552  | 
qed  | 
|
1553  | 
qed  | 
|
1554  | 
qed  | 
|
1555  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1556  | 
lemma univ_poly_is_ring: "ring (K[X])"  | 
| 68578 | 1557  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1558  | 
interpret UP: abelian_group "K[X]" + monoid "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1559  | 
using univ_poly_is_abelian_group univ_poly_is_monoid .  | 
| 68578 | 1560  | 
show ?thesis  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1561  | 
by (unfold_locales)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1562  | 
(auto simp add: univ_poly_def poly_mult_r_distr[OF K] poly_mult_l_distr[OF K])  | 
| 68578 | 1563  | 
qed  | 
1564  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1565  | 
lemma univ_poly_is_cring: "cring (K[X])"  | 
| 68578 | 1566  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1567  | 
interpret UP: ring "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1568  | 
using univ_poly_is_ring .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1569  | 
have "\<And>p q. \<lbrakk> p \<in> carrier (K[X]); q \<in> carrier (K[X]) \<rbrakk> \<Longrightarrow> p \<otimes>\<^bsub>K[X]\<^esub> q = q \<otimes>\<^bsub>K[X]\<^esub> p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1570  | 
unfolding univ_poly_def using poly_mult_comm polynomial_in_carrier[OF K] by auto  | 
| 68578 | 1571  | 
thus ?thesis  | 
1572  | 
by unfold_locales auto  | 
|
1573  | 
qed  | 
|
1574  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1575  | 
lemma univ_poly_is_domain: "domain (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1576  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1577  | 
interpret UP: cring "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1578  | 
using univ_poly_is_cring .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1579  | 
show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1580  | 
by (unfold_locales, auto simp add: univ_poly_def poly_mult_integral[OF K])  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1581  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1582  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1583  | 
declare poly_add.simps[simp]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1584  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1585  | 
lemma univ_poly_a_inv_def':  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1586  | 
assumes "p \<in> carrier (K[X])" shows "\<ominus>\<^bsub>K[X]\<^esub> p = map (\<lambda>a. \<ominus> a) p"  | 
| 68578 | 1587  | 
proof -  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1588  | 
have aux_lemma:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1589  | 
"\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> p \<oplus>\<^bsub>K[X]\<^esub> (map (\<lambda>a. \<ominus> a) p) = []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1590  | 
"\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> (map (\<lambda>a. \<ominus> a) p) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1591  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1592  | 
fix p assume p: "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1593  | 
hence set_p: "set p \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1594  | 
unfolding univ_poly_def using polynomial_incl by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1595  | 
show "(map (\<lambda>a. \<ominus> a) p) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1596  | 
proof (cases "p = []")  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1597  | 
assume "p = []" thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1598  | 
unfolding univ_poly_def polynomial_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1599  | 
next  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1600  | 
assume not_nil: "p \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1601  | 
hence "lead_coeff p \<noteq> \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1602  | 
using p unfolding univ_poly_def polynomial_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1603  | 
moreover have "lead_coeff (map (\<lambda>a. \<ominus> a) p) = \<ominus> (lead_coeff p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1604  | 
using not_nil by (simp add: hd_map)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1605  | 
ultimately have "lead_coeff (map (\<lambda>a. \<ominus> a) p) \<noteq> \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1606  | 
using hd_in_set local.minus_zero not_nil set_p subringE(1)[OF K] by force  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1607  | 
moreover have "set (map (\<lambda>a. \<ominus> a) p) \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1608  | 
using set_p subringE(5)[OF K] by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1609  | 
ultimately show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1610  | 
unfolding univ_poly_def polynomial_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1611  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1612  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1613  | 
have "map2 (\<oplus>) p (map (\<lambda>a. \<ominus> a) p) = replicate (length p) \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1614  | 
using set_p subringE(1)[OF K] by (induct p) (auto simp add: r_neg)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1615  | 
thus "p \<oplus>\<^bsub>K[X]\<^esub> (map (\<lambda>a. \<ominus> a) p) = []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1616  | 
unfolding univ_poly_def using normalize_replicate_zero[of "length p" "[]"] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1617  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1618  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1619  | 
interpret UP: ring "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1620  | 
using univ_poly_is_ring .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1621  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1622  | 
from aux_lemma  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1623  | 
have "\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> \<ominus>\<^bsub>K[X]\<^esub> p = map (\<lambda>a. \<ominus> a) p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1624  | 
by (metis Nil_is_map_conv UP.add.inv_closed UP.l_zero UP.r_neg1 UP.r_zero UP.zero_closed)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1625  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1626  | 
using assms by simp  | 
| 68578 | 1627  | 
qed  | 
1628  | 
||
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1629  | 
(* NEW ========== *)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1630  | 
corollary univ_poly_a_inv_length:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1631  | 
assumes "p \<in> carrier (K[X])" shows "length (\<ominus>\<^bsub>K[X]\<^esub> p) = length p"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1632  | 
unfolding univ_poly_a_inv_def'[OF assms] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1633  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1634  | 
(* NEW ========== *)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1635  | 
corollary univ_poly_a_inv_degree:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1636  | 
assumes "p \<in> carrier (K[X])" shows "degree (\<ominus>\<^bsub>K[X]\<^esub> p) = degree p"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1637  | 
using univ_poly_a_inv_length[OF assms] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1638  | 
|
| 68578 | 1639  | 
|
1640  | 
subsection \<open>Long Division Theorem\<close>  | 
|
1641  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1642  | 
lemma long_division_theorem:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1643  | 
assumes "polynomial K p" and "polynomial K b" "b \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1644  | 
and "lead_coeff b \<in> Units (R \<lparr> carrier := K \<rparr>)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1645  | 
shows "\<exists>q r. polynomial K q \<and> polynomial K r \<and>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1646  | 
p = (b \<otimes>\<^bsub>K[X]\<^esub> q) \<oplus>\<^bsub>K[X]\<^esub> r \<and> (r = [] \<or> degree r < degree b)"  | 
| 68578 | 1647  | 
(is "\<exists>q r. ?long_division p q r")  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1648  | 
using assms(1)  | 
| 68578 | 1649  | 
proof (induct "length p" arbitrary: p rule: less_induct)  | 
1650  | 
case less thus ?case  | 
|
1651  | 
proof (cases p)  | 
|
1652  | 
case Nil  | 
|
1653  | 
hence "?long_division p [] []"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1654  | 
using zero_is_polynomial poly_mult_zero[OF polynomial_in_carrier[OF K assms(2)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1655  | 
by (simp add: univ_poly_def)  | 
| 68578 | 1656  | 
thus ?thesis by blast  | 
1657  | 
next  | 
|
1658  | 
case (Cons a p') thus ?thesis  | 
|
1659  | 
proof (cases "length b > length p")  | 
|
1660  | 
assume "length b > length p"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1661  | 
hence "p = [] \<or> degree p < degree b"  | 
| 68578 | 1662  | 
by (meson diff_less_mono length_0_conv less_one not_le)  | 
1663  | 
hence "?long_division p [] p"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1664  | 
using poly_mult_zero(2)[OF polynomial_in_carrier[OF K assms(2)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1665  | 
poly_add_zero(2)[OF K less(2)] zero_is_polynomial less(2)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1666  | 
by (simp add: univ_poly_def)  | 
| 68578 | 1667  | 
thus ?thesis by blast  | 
1668  | 
next  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1669  | 
interpret UP: cring "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1670  | 
using univ_poly_is_cring .  | 
| 68578 | 1671  | 
|
1672  | 
assume "\<not> length b > length p"  | 
|
1673  | 
hence len_ge: "length p \<ge> length b" by simp  | 
|
1674  | 
obtain c b' where b: "b = c # b'"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1675  | 
using assms(3) list.exhaust_sel by blast  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1676  | 
then obtain c' where c': "c' \<in> carrier R" "c' \<in> K" "c' \<otimes> c = \<one>" "c \<otimes> c' = \<one>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1677  | 
using assms(4) subringE(1)[OF K] unfolding Units_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1678  | 
have c: "c \<in> carrier R" "c \<in> K" "c \<noteq> \<zero>" and a: "a \<in> carrier R" "a \<in> K" "a \<noteq> \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1679  | 
using less(2) assms(2) lead_coeff_not_zero subringE(1)[OF K] b Cons by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1680  | 
      hence lc: "c' \<otimes> (\<ominus> a) \<in> K - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1681  | 
using subringE(5-6)[OF K] c' add.inv_solve_right integral_iff by fastforce  | 
| 68578 | 1682  | 
|
1683  | 
let ?len = "length"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1684  | 
define s where "s = monom (c' \<otimes> (\<ominus> a)) (?len p - ?len b)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1685  | 
hence s: "polynomial K s" "s \<noteq> []" "degree s = ?len p - ?len b" "length s \<ge> 1"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1686  | 
using monom_is_polynomial[OF K lc] unfolding monom_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1687  | 
hence is_polynomial: "polynomial K (p \<oplus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1688  | 
using poly_add_closed[OF K less(2) poly_mult_closed[OF K assms(2), of s]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1689  | 
by (simp add: univ_poly_def)  | 
| 68578 | 1690  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1691  | 
have "lead_coeff (b \<otimes>\<^bsub>K[X]\<^esub> s) = \<ominus> a"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1692  | 
using poly_mult_lead_coeff[OF K assms(2) s(1) assms(3) s(2)] c c' a  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1693  | 
unfolding b s_def monom_def univ_poly_def by (auto simp del: poly_mult.simps, algebra)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1694  | 
then obtain s' where s': "b \<otimes>\<^bsub>K[X]\<^esub> s = (\<ominus> a) # s'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1695  | 
using poly_mult_integral[OF K assms(2) s(1)] assms(2-3) s(2)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1696  | 
by (simp add: univ_poly_def, metis hd_Cons_tl)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1697  | 
moreover have "degree p = degree (b \<otimes>\<^bsub>K[X]\<^esub> s)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1698  | 
using poly_mult_degree_eq[OF K assms(2) s(1)] assms(3) s(2-4) len_ge b Cons  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1699  | 
by (auto simp add: univ_poly_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1700  | 
hence "?len p = ?len (b \<otimes>\<^bsub>K[X]\<^esub> s)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1701  | 
unfolding Cons s' by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1702  | 
hence "?len (p \<oplus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s)) < ?len p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1703  | 
unfolding Cons s' using a normalize_length_le[of "map2 (\<oplus>) p' s'"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1704  | 
by (auto simp add: univ_poly_def r_neg)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1705  | 
then obtain q' r' where l_div: "?long_division (p \<oplus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s)) q' r'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1706  | 
using less(1)[OF _ is_polynomial] by blast  | 
| 68578 | 1707  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1708  | 
have in_carrier:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1709  | 
"p \<in> carrier (K[X])" "b \<in> carrier (K[X])" "s \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1710  | 
"q' \<in> carrier (K[X])" "r' \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1711  | 
using l_div assms less(2) s unfolding univ_poly_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1712  | 
have "(p \<oplus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s)) \<ominus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s) =  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1713  | 
((b \<otimes>\<^bsub>K[X]\<^esub> q') \<oplus>\<^bsub>K[X]\<^esub> r') \<ominus>\<^bsub>K[X]\<^esub> (b \<otimes>\<^bsub>K[X]\<^esub> s)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1714  | 
using l_div by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1715  | 
hence "p = (b \<otimes>\<^bsub>K[X]\<^esub> (q' \<ominus>\<^bsub>K[X]\<^esub> s)) \<oplus>\<^bsub>K[X]\<^esub> r'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1716  | 
using in_carrier by algebra  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1717  | 
moreover have "q' \<ominus>\<^bsub>K[X]\<^esub> s \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1718  | 
using in_carrier by algebra  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1719  | 
hence "polynomial K (q' \<ominus>\<^bsub>K[X]\<^esub> s)"  | 
| 68578 | 1720  | 
unfolding univ_poly_def by simp  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1721  | 
ultimately have "?long_division p (q' \<ominus>\<^bsub>K[X]\<^esub> s) r'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1722  | 
using l_div by auto  | 
| 68578 | 1723  | 
thus ?thesis by blast  | 
1724  | 
qed  | 
|
1725  | 
qed  | 
|
1726  | 
qed  | 
|
1727  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1728  | 
end (* of fixed K context. *)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1729  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1730  | 
end (* of domain context. *)  | 
| 68578 | 1731  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1732  | 
(* PROOF ========== *)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1733  | 
lemma (in domain) field_long_division_theorem:  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1734  | 
assumes "subfield K R" "polynomial K p" and "polynomial K b" "b \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1735  | 
shows "\<exists>q r. polynomial K q \<and> polynomial K r \<and>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1736  | 
p = (b \<otimes>\<^bsub>K[X]\<^esub> q) \<oplus>\<^bsub>K[X]\<^esub> r \<and> (r = [] \<or> degree r < degree b)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1737  | 
using long_division_theorem[OF subfieldE(1)[OF assms(1)] assms(2-4)] assms(3-4)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1738  | 
subfield.subfield_Units[OF assms(1)] lead_coeff_not_zero[of K "hd b" "tl b"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1739  | 
by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1740  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1741  | 
(* PROOF ========== *)  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1742  | 
text \<open>The same theorem as above, but now, everything is in a shell. \<close>  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1743  | 
lemma (in domain) field_long_division_theorem_shell:  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1744  | 
assumes "subfield K R" "p \<in> carrier (K[X])" and "b \<in> carrier (K[X])" "b \<noteq> \<zero>\<^bsub>K[X]\<^esub>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1745  | 
shows "\<exists>q r. q \<in> carrier (K[X]) \<and> r \<in> carrier (K[X]) \<and>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1746  | 
p = (b \<otimes>\<^bsub>K[X]\<^esub> q) \<oplus>\<^bsub>K[X]\<^esub> r \<and> (r = \<zero>\<^bsub>K[X]\<^esub> \<or> degree r < degree b)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1747  | 
using field_long_division_theorem assms by (auto simp add: univ_poly_def)  | 
| 68578 | 1748  | 
|
1749  | 
||
1750  | 
subsection \<open>Consistency Rules\<close>  | 
|
1751  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1752  | 
lemma polynomial_consistent [simp]:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1753  | 
shows "polynomial\<^bsub>(R \<lparr> carrier := K \<rparr>)\<^esub> K p \<Longrightarrow> polynomial\<^bsub>R\<^esub> K p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1754  | 
unfolding polynomial_def by auto  | 
| 68578 | 1755  | 
|
1756  | 
lemma (in ring) eval_consistent [simp]:  | 
|
1757  | 
assumes "subring K R" shows "ring.eval (R \<lparr> carrier := K \<rparr>) = eval"  | 
|
1758  | 
proof  | 
|
1759  | 
fix p show "ring.eval (R \<lparr> carrier := K \<rparr>) p = eval p"  | 
|
1760  | 
using nat_pow_consistent ring.eval.simps[OF subring_is_ring[OF assms]] by (induct p) (auto)  | 
|
1761  | 
qed  | 
|
1762  | 
||
1763  | 
lemma (in ring) coeff_consistent [simp]:  | 
|
1764  | 
assumes "subring K R" shows "ring.coeff (R \<lparr> carrier := K \<rparr>) = coeff"  | 
|
1765  | 
proof  | 
|
1766  | 
fix p show "ring.coeff (R \<lparr> carrier := K \<rparr>) p = coeff p"  | 
|
1767  | 
using ring.coeff.simps[OF subring_is_ring[OF assms]] by (induct p) (auto)  | 
|
1768  | 
qed  | 
|
1769  | 
||
1770  | 
lemma (in ring) normalize_consistent [simp]:  | 
|
1771  | 
assumes "subring K R" shows "ring.normalize (R \<lparr> carrier := K \<rparr>) = normalize"  | 
|
1772  | 
proof  | 
|
1773  | 
fix p show "ring.normalize (R \<lparr> carrier := K \<rparr>) p = normalize p"  | 
|
1774  | 
using ring.normalize.simps[OF subring_is_ring[OF assms]] by (induct p) (auto)  | 
|
1775  | 
qed  | 
|
1776  | 
||
1777  | 
lemma (in ring) poly_add_consistent [simp]:  | 
|
1778  | 
assumes "subring K R" shows "ring.poly_add (R \<lparr> carrier := K \<rparr>) = poly_add"  | 
|
1779  | 
proof -  | 
|
1780  | 
have "\<And>p q. ring.poly_add (R \<lparr> carrier := K \<rparr>) p q = poly_add p q"  | 
|
1781  | 
proof -  | 
|
1782  | 
fix p q show "ring.poly_add (R \<lparr> carrier := K \<rparr>) p q = poly_add p q"  | 
|
1783  | 
using ring.poly_add.simps[OF subring_is_ring[OF assms]] normalize_consistent[OF assms] by auto  | 
|
1784  | 
qed  | 
|
1785  | 
thus ?thesis by (auto simp del: poly_add.simps)  | 
|
1786  | 
qed  | 
|
1787  | 
||
1788  | 
lemma (in ring) poly_mult_consistent [simp]:  | 
|
1789  | 
assumes "subring K R" shows "ring.poly_mult (R \<lparr> carrier := K \<rparr>) = poly_mult"  | 
|
1790  | 
proof -  | 
|
1791  | 
have "\<And>p q. ring.poly_mult (R \<lparr> carrier := K \<rparr>) p q = poly_mult p q"  | 
|
1792  | 
proof -  | 
|
1793  | 
fix p q show "ring.poly_mult (R \<lparr> carrier := K \<rparr>) p q = poly_mult p q"  | 
|
1794  | 
using ring.poly_mult.simps[OF subring_is_ring[OF assms]] poly_add_consistent[OF assms]  | 
|
1795  | 
by (induct p) (auto)  | 
|
1796  | 
qed  | 
|
1797  | 
thus ?thesis by auto  | 
|
1798  | 
qed  | 
|
1799  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1800  | 
lemma (in domain) univ_poly_a_inv_consistent:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1801  | 
assumes "subring K R" "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1802  | 
shows "\<ominus>\<^bsub>K[X]\<^esub> p = \<ominus>\<^bsub>(carrier R)[X]\<^esub> p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1803  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1804  | 
have in_carrier: "p \<in> carrier ((carrier R)[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1805  | 
using assms carrier_polynomial by (auto simp add: univ_poly_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1806  | 
show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1807  | 
using univ_poly_a_inv_def'[OF assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1808  | 
univ_poly_a_inv_def'[OF carrier_is_subring in_carrier] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1809  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1810  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1811  | 
lemma (in domain) univ_poly_a_minus_consistent:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1812  | 
assumes "subring K R" "q \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1813  | 
shows "p \<ominus>\<^bsub>K[X]\<^esub> q = p \<ominus>\<^bsub>(carrier R)[X]\<^esub> q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1814  | 
using univ_poly_a_inv_consistent[OF assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1815  | 
unfolding a_minus_def univ_poly_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1816  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1817  | 
lemma (in ring) univ_poly_consistent:  | 
| 68578 | 1818  | 
assumes "subring K R"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1819  | 
shows "univ_poly (R \<lparr> carrier := K \<rparr>) = univ_poly R"  | 
| 68578 | 1820  | 
unfolding univ_poly_def polynomial_def  | 
1821  | 
using poly_add_consistent[OF assms]  | 
|
1822  | 
poly_mult_consistent[OF assms]  | 
|
1823  | 
subringE(1)[OF assms]  | 
|
1824  | 
by auto  | 
|
1825  | 
||
1826  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1827  | 
subsubsection \<open>Corollaries\<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1828  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1829  | 
(* PROOF ========== *)  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1830  | 
corollary (in ring) subfield_long_division_theorem_shell:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1831  | 
assumes "subfield K R" "p \<in> carrier (K[X])" and "b \<in> carrier (K[X])" "b \<noteq> \<zero>\<^bsub>K[X]\<^esub>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1832  | 
shows "\<exists>q r. q \<in> carrier (K[X]) \<and> r \<in> carrier (K[X]) \<and>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1833  | 
p = (b \<otimes>\<^bsub>K[X]\<^esub> q) \<oplus>\<^bsub>K[X]\<^esub> r \<and> (r = \<zero>\<^bsub>K[X]\<^esub> \<or> degree r < degree b)"  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1834  | 
using domain.field_long_division_theorem_shell[OF subdomain_is_domain[OF subfield.axioms(1)]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1835  | 
field.carrier_is_subfield[OF subfield_iff(2)[OF assms(1)]]] assms(1-4)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
1836  | 
unfolding univ_poly_consistent[OF subfieldE(1)[OF assms(1)]]  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1837  | 
by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1838  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1839  | 
corollary (in domain) univ_poly_is_euclidean:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1840  | 
assumes "subfield K R" shows "euclidean_domain (K[X]) degree"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1841  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1842  | 
interpret UP: domain "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1843  | 
using univ_poly_is_domain[OF subfieldE(1)[OF assms]] field_def by blast  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1844  | 
show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1845  | 
using subfield_long_division_theorem_shell[OF assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1846  | 
by (auto intro!: UP.euclidean_domainI)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1847  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1848  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1849  | 
corollary (in domain) univ_poly_is_principal:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1850  | 
assumes "subfield K R" shows "principal_domain (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1851  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1852  | 
interpret UP: euclidean_domain "K[X]" degree  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1853  | 
using univ_poly_is_euclidean[OF assms] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1854  | 
show ?thesis ..  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1855  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1856  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1857  | 
|
| 68578 | 1858  | 
subsection \<open>The Evaluation Homomorphism\<close>  | 
1859  | 
||
1860  | 
lemma (in ring) eval_replicate:  | 
|
1861  | 
assumes "set p \<subseteq> carrier R" "a \<in> carrier R"  | 
|
1862  | 
shows "eval ((replicate n \<zero>) @ p) a = eval p a"  | 
|
1863  | 
using assms eval_in_carrier by (induct n) (auto)  | 
|
1864  | 
||
1865  | 
lemma (in ring) eval_normalize:  | 
|
1866  | 
assumes "set p \<subseteq> carrier R" "a \<in> carrier R"  | 
|
1867  | 
shows "eval (normalize p) a = eval p a"  | 
|
1868  | 
using eval_replicate[OF normalize_in_carrier] normalize_def'[of p] assms by metis  | 
|
1869  | 
||
1870  | 
lemma (in ring) eval_poly_add_aux:  | 
|
1871  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "length p = length q" and "a \<in> carrier R"  | 
|
1872  | 
shows "eval (poly_add p q) a = (eval p a) \<oplus> (eval q a)"  | 
|
1873  | 
proof -  | 
|
1874  | 
have "eval (map2 (\<oplus>) p q) a = (eval p a) \<oplus> (eval q a)"  | 
|
1875  | 
using assms  | 
|
1876  | 
proof (induct p arbitrary: q)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1877  | 
case Nil thus ?case by simp  | 
| 68578 | 1878  | 
next  | 
1879  | 
case (Cons b1 p')  | 
|
1880  | 
then obtain b2 q' where q: "q = b2 # q'"  | 
|
1881  | 
by (metis length_Cons list.exhaust list.size(3) nat.simps(3))  | 
|
1882  | 
show ?case  | 
|
1883  | 
using eval_in_carrier[OF _ Cons(5), of q']  | 
|
1884  | 
eval_in_carrier[OF _ Cons(5), of p'] Cons unfolding q  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1885  | 
by (auto simp add: ring_simprules(7,13,22))  | 
| 68578 | 1886  | 
qed  | 
1887  | 
moreover have "set (map2 (\<oplus>) p q) \<subseteq> carrier R"  | 
|
1888  | 
using assms(1-2)  | 
|
1889  | 
by (induct p arbitrary: q) (auto, metis add.m_closed in_set_zipE set_ConsD subsetCE)  | 
|
1890  | 
ultimately show ?thesis  | 
|
1891  | 
using assms(3) eval_normalize[OF _ assms(4), of "map2 (\<oplus>) p q"] by auto  | 
|
1892  | 
qed  | 
|
1893  | 
||
1894  | 
lemma (in ring) eval_poly_add:  | 
|
1895  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "a \<in> carrier R"  | 
|
1896  | 
shows "eval (poly_add p q) a = (eval p a) \<oplus> (eval q a)"  | 
|
1897  | 
proof -  | 
|
1898  | 
  { fix p q assume A: "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" "length p \<ge> length q"
 | 
|
1899  | 
hence "eval (poly_add p ((replicate (length p - length q) \<zero>) @ q)) a =  | 
|
1900  | 
(eval p a) \<oplus> (eval ((replicate (length p - length q) \<zero>) @ q) a)"  | 
|
1901  | 
using eval_poly_add_aux[OF A(1) _ _ assms(3), of "(replicate (length p - length q) \<zero>) @ q"] by force  | 
|
1902  | 
hence "eval (poly_add p q) a = (eval p a) \<oplus> (eval q a)"  | 
|
1903  | 
using eval_replicate[OF A(2) assms(3)] A(3) by auto }  | 
|
1904  | 
note aux_lemma = this  | 
|
1905  | 
||
1906  | 
have ?thesis if "length q \<ge> length p"  | 
|
1907  | 
using assms(1-2)[THEN eval_in_carrier[OF _ assms(3)]] poly_add_comm[OF assms(1-2)]  | 
|
1908  | 
aux_lemma[OF assms(2,1) that]  | 
|
1909  | 
by (auto simp del: poly_add.simps simp add: add.m_comm)  | 
|
1910  | 
moreover have ?thesis if "length p \<ge> length q"  | 
|
1911  | 
using aux_lemma[OF assms(1-2) that] .  | 
|
1912  | 
ultimately show ?thesis by auto  | 
|
1913  | 
qed  | 
|
1914  | 
||
1915  | 
lemma (in ring) eval_append_aux:  | 
|
1916  | 
assumes "set p \<subseteq> carrier R" and "b \<in> carrier R" and "a \<in> carrier R"  | 
|
1917  | 
shows "eval (p @ [ b ]) a = ((eval p a) \<otimes> a) \<oplus> b"  | 
|
1918  | 
using assms(1)  | 
|
1919  | 
proof (induct p)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1920  | 
case Nil thus ?case by (auto simp add: assms(2-3))  | 
| 68578 | 1921  | 
next  | 
1922  | 
case (Cons l q)  | 
|
1923  | 
have "a [^] length q \<in> carrier R" "eval q a \<in> carrier R"  | 
|
1924  | 
using eval_in_carrier Cons(2) assms(2-3) by auto  | 
|
1925  | 
thus ?case  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1926  | 
using Cons assms(2-3) by (auto, algebra)  | 
| 68578 | 1927  | 
qed  | 
1928  | 
||
1929  | 
lemma (in ring) eval_append:  | 
|
1930  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "a \<in> carrier R"  | 
|
1931  | 
shows "eval (p @ q) a = ((eval p a) \<otimes> (a [^] (length q))) \<oplus> (eval q a)"  | 
|
1932  | 
using assms(2)  | 
|
1933  | 
proof (induct "length q" arbitrary: q)  | 
|
1934  | 
case 0 thus ?case  | 
|
1935  | 
using eval_in_carrier[OF assms(1,3)] by auto  | 
|
1936  | 
next  | 
|
1937  | 
case (Suc n)  | 
|
1938  | 
then obtain b q' where q: "q = q' @ [ b ]"  | 
|
1939  | 
by (metis length_Suc_conv list.simps(3) rev_exhaust)  | 
|
1940  | 
hence in_carrier: "eval p a \<in> carrier R" "eval q' a \<in> carrier R"  | 
|
1941  | 
"a [^] (length q') \<in> carrier R" "b \<in> carrier R"  | 
|
1942  | 
using assms(1,3) Suc(3) eval_in_carrier[OF _ assms(3)] by auto  | 
|
1943  | 
||
1944  | 
have "eval (p @ q) a = ((eval (p @ q') a) \<otimes> a) \<oplus> b"  | 
|
1945  | 
using eval_append_aux[OF _ _ assms(3), of "p @ q'" b] assms(1) Suc(3) unfolding q by auto  | 
|
1946  | 
also have " ... = ((((eval p a) \<otimes> (a [^] (length q'))) \<oplus> (eval q' a)) \<otimes> a) \<oplus> b"  | 
|
1947  | 
using Suc unfolding q by auto  | 
|
1948  | 
also have " ... = (((eval p a) \<otimes> ((a [^] (length q')) \<otimes> a))) \<oplus> (((eval q' a) \<otimes> a) \<oplus> b)"  | 
|
1949  | 
using assms(3) in_carrier by algebra  | 
|
1950  | 
also have " ... = (eval p a) \<otimes> (a [^] (length q)) \<oplus> (eval q a)"  | 
|
1951  | 
using eval_append_aux[OF _ in_carrier(4) assms(3), of q'] Suc(3) unfolding q by auto  | 
|
1952  | 
finally show ?case .  | 
|
1953  | 
qed  | 
|
1954  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1955  | 
lemma (in ring) eval_monom:  | 
| 68578 | 1956  | 
assumes "b \<in> carrier R" and "a \<in> carrier R"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1957  | 
shows "eval (monom b n) a = b \<otimes> (a [^] n)"  | 
| 68578 | 1958  | 
proof (induct n)  | 
1959  | 
case 0 thus ?case  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1960  | 
using assms unfolding monom_def by auto  | 
| 68578 | 1961  | 
next  | 
1962  | 
case (Suc n)  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1963  | 
have "monom b (Suc n) = (monom b n) @ [ \<zero> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1964  | 
unfolding monom_def by (simp add: replicate_append_same)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1965  | 
hence "eval (monom b (Suc n)) a = ((eval (monom b n) a) \<otimes> a) \<oplus> \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1966  | 
using eval_append_aux[OF monom_in_carrier[OF assms(1)] zero_closed assms(2), of n] by simp  | 
| 68578 | 1967  | 
also have " ... = b \<otimes> (a [^] (Suc n))"  | 
1968  | 
using Suc assms m_assoc by auto  | 
|
1969  | 
finally show ?case .  | 
|
1970  | 
qed  | 
|
1971  | 
||
1972  | 
lemma (in cring) eval_poly_mult:  | 
|
1973  | 
assumes "set p \<subseteq> carrier R" "set q \<subseteq> carrier R" and "a \<in> carrier R"  | 
|
1974  | 
shows "eval (poly_mult p q) a = (eval p a) \<otimes> (eval q a)"  | 
|
1975  | 
using assms(1)  | 
|
1976  | 
proof (induct p)  | 
|
1977  | 
case Nil thus ?case  | 
|
1978  | 
using eval_in_carrier[OF assms(2-3)] by simp  | 
|
1979  | 
next  | 
|
1980  | 
  { fix n b assume b: "b \<in> carrier R"
 | 
|
1981  | 
hence "set (map ((\<otimes>) b) q) \<subseteq> carrier R" and "set (replicate n \<zero>) \<subseteq> carrier R"  | 
|
1982  | 
using assms(2) by (induct q) (auto)  | 
|
1983  | 
hence "eval ((map ((\<otimes>) b) q) @ (replicate n \<zero>)) a = (eval ((map ((\<otimes>) b) q)) a) \<otimes> (a [^] n) \<oplus> \<zero>"  | 
|
1984  | 
using eval_append[OF _ _ assms(3), of "map ((\<otimes>) b) q" "replicate n \<zero>"]  | 
|
1985  | 
eval_replicate[OF _ assms(3), of "[]"] by auto  | 
|
1986  | 
moreover have "eval (map ((\<otimes>) b) q) a = b \<otimes> eval q a"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1987  | 
using assms(2-3) eval_in_carrier b by(induct q) (auto simp add: m_assoc r_distr)  | 
| 68578 | 1988  | 
ultimately have "eval ((map ((\<otimes>) b) q) @ (replicate n \<zero>)) a = (b \<otimes> eval q a) \<otimes> (a [^] n) \<oplus> \<zero>"  | 
1989  | 
by simp  | 
|
1990  | 
also have " ... = (b \<otimes> (a [^] n)) \<otimes> (eval q a)"  | 
|
1991  | 
using eval_in_carrier[OF assms(2-3)] b assms(3) m_assoc m_comm by auto  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1992  | 
finally have "eval ((map ((\<otimes>) b) q) @ (replicate n \<zero>)) a = (eval (monom b n) a) \<otimes> (eval q a)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1993  | 
using eval_monom[OF b assms(3)] by simp }  | 
| 68578 | 1994  | 
note aux_lemma = this  | 
1995  | 
||
1996  | 
case (Cons b p)  | 
|
1997  | 
hence in_carrier:  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1998  | 
"eval (monom b (length p)) a \<in> carrier R" "eval p a \<in> carrier R" "eval q a \<in> carrier R" "b \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
1999  | 
using eval_in_carrier monom_in_carrier assms by auto  | 
| 68578 | 2000  | 
have set_map: "set ((map ((\<otimes>) b) q) @ (replicate (length p) \<zero>)) \<subseteq> carrier R"  | 
2001  | 
using in_carrier(4) assms(2) by (induct q) (auto)  | 
|
2002  | 
have set_poly: "set (poly_mult p q) \<subseteq> carrier R"  | 
|
2003  | 
using poly_mult_in_carrier[OF _ assms(2), of p] Cons(2) by auto  | 
|
2004  | 
have "eval (poly_mult (b # p) q) a =  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2005  | 
((eval (monom b (length p)) a) \<otimes> (eval q a)) \<oplus> ((eval p a) \<otimes> (eval q a))"  | 
| 68578 | 2006  | 
using eval_poly_add[OF set_map set_poly assms(3)] aux_lemma[OF in_carrier(4), of "length p"] Cons  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2007  | 
by (auto simp del: poly_add.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2008  | 
also have " ... = ((eval (monom b (length p)) a) \<oplus> (eval p a)) \<otimes> (eval q a)"  | 
| 68578 | 2009  | 
using l_distr[OF in_carrier(1-3)] by simp  | 
2010  | 
also have " ... = (eval (b # p) a) \<otimes> (eval q a)"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2011  | 
unfolding eval_monom[OF in_carrier(4) assms(3), of "length p"] by auto  | 
| 68578 | 2012  | 
finally show ?case .  | 
2013  | 
qed  | 
|
2014  | 
||
2015  | 
proposition (in cring) eval_is_hom:  | 
|
2016  | 
assumes "subring K R" and "a \<in> carrier R"  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2017  | 
shows "(\<lambda>p. (eval p) a) \<in> ring_hom (K[X]) R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2018  | 
unfolding univ_poly_def  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2019  | 
using polynomial_in_carrier[OF assms(1)] eval_in_carrier  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2020  | 
eval_poly_add eval_poly_mult assms(2)  | 
| 68578 | 2021  | 
by (auto intro!: ring_hom_memI  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2022  | 
simp add: univ_poly_carrier  | 
| 68578 | 2023  | 
simp del: poly_add.simps poly_mult.simps)  | 
2024  | 
||
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2025  | 
theorem (in domain) eval_cring_hom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2026  | 
assumes "subring K R" and "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2027  | 
shows "ring_hom_cring (K[X]) R (\<lambda>p. (eval p) a)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2028  | 
unfolding ring_hom_cring_def ring_hom_cring_axioms_def  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2029  | 
using domain.axioms(1)[OF univ_poly_is_domain[OF assms(1)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2030  | 
eval_is_hom[OF assms] cring_axioms by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2031  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2032  | 
corollary (in domain) eval_ring_hom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2033  | 
assumes "subring K R" and "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2034  | 
shows "ring_hom_ring (K[X]) R (\<lambda>p. (eval p) a)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2035  | 
using eval_cring_hom[OF assms] ring_hom_ringI2  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2036  | 
unfolding ring_hom_cring_def ring_hom_cring_axioms_def cring_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2037  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2038  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2039  | 
subsection \<open>Homomorphisms\<close>  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2040  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2041  | 
lemma (in ring_hom_ring) eval_hom':  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2042  | 
assumes "a \<in> carrier R" and "set p \<subseteq> carrier R"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2043  | 
shows "h (R.eval p a) = eval (map h p) (h a)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2044  | 
using assms by (induct p, auto simp add: R.eval_in_carrier hom_nat_pow)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2045  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2046  | 
lemma (in ring_hom_ring) eval_hom:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2047  | 
assumes "subring K R" and "a \<in> carrier R" and "p \<in> carrier (K[X])"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2048  | 
shows "h (R.eval p a) = eval (map h p) (h a)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2049  | 
proof -  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2050  | 
have "set p \<subseteq> carrier R"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2051  | 
using subringE(1)[OF assms(1)] R.polynomial_incl assms(3)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2052  | 
unfolding sym[OF univ_poly_carrier[of R]] by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2053  | 
thus ?thesis  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2054  | 
using eval_hom'[OF assms(2)] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2055  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2056  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2057  | 
lemma (in ring_hom_ring) coeff_hom':  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2058  | 
assumes "set p \<subseteq> carrier R" shows "h (R.coeff p i) = coeff (map h p) i"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2059  | 
using assms by (induct p) (auto)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2060  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2061  | 
lemma (in ring_hom_ring) poly_add_hom':  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2062  | 
assumes "set p \<subseteq> carrier R" and "set q \<subseteq> carrier R"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2063  | 
shows "normalize (map h (R.poly_add p q)) = poly_add (map h p) (map h q)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2064  | 
proof -  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2065  | 
have set_map: "set (map h s) \<subseteq> carrier S" if "set s \<subseteq> carrier R" for s  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2066  | 
using that by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2067  | 
have "coeff (normalize (map h (R.poly_add p q))) = coeff (map h (R.poly_add p q))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2068  | 
using S.normalize_coeff by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2069  | 
also have " ... = (\<lambda>i. h ((R.coeff p i) \<oplus> (R.coeff q i)))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2070  | 
using coeff_hom'[OF R.poly_add_in_carrier[OF assms]] R.poly_add_coeff[OF assms] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2071  | 
also have " ... = (\<lambda>i. (coeff (map h p) i) \<oplus>\<^bsub>S\<^esub> (coeff (map h q) i))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2072  | 
using assms[THEN R.coeff_in_carrier] assms[THEN coeff_hom'] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2073  | 
also have " ... = (\<lambda>i. coeff (poly_add (map h p) (map h q)) i)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2074  | 
using S.poly_add_coeff[OF assms[THEN set_map]] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2075  | 
finally have "coeff (normalize (map h (R.poly_add p q))) = (\<lambda>i. coeff (poly_add (map h p) (map h q)) i)" .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2076  | 
thus ?thesis  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2077  | 
unfolding coeff_iff_polynomial_cond[OF  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2078  | 
normalize_gives_polynomial[OF set_map[OF R.poly_add_in_carrier[OF assms]]]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2079  | 
poly_add_is_polynomial[OF carrier_is_subring assms[THEN set_map]]] .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2080  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2081  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2082  | 
lemma (in ring_hom_ring) poly_mult_hom':  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2083  | 
assumes "set p \<subseteq> carrier R" and "set q \<subseteq> carrier R"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2084  | 
shows "normalize (map h (R.poly_mult p q)) = poly_mult (map h p) (map h q)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2085  | 
using assms(1)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2086  | 
proof (induct p, simp)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2087  | 
case (Cons a p)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2088  | 
have set_map: "set (map h s) \<subseteq> carrier S" if "set s \<subseteq> carrier R" for s  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2089  | 
using that by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2090  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2091  | 
let ?q_a = "(map ((\<otimes>) a) q) @ (replicate (length p) \<zero>)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2092  | 
have set_q_a: "set ?q_a \<subseteq> carrier R"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2093  | 
using assms(2) Cons(2) by (induct q) (auto)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2094  | 
have q_a_simp: "map h ?q_a = (map ((\<otimes>\<^bsub>S\<^esub>) (h a)) (map h q)) @ (replicate (length (map h p)) \<zero>\<^bsub>S\<^esub>)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2095  | 
using assms(2) Cons(2) by (induct q) (auto)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2096  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2097  | 
have "S.normalize (map h (R.poly_mult (a # p) q)) =  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2098  | 
S.normalize (map h (R.poly_add ?q_a (R.poly_mult p q)))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2099  | 
by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2100  | 
also have " ... = S.poly_add (map h ?q_a) (map h (R.poly_mult p q))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2101  | 
using poly_add_hom'[OF set_q_a R.poly_mult_in_carrier[OF _ assms(2)]] Cons by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2102  | 
also have " ... = S.poly_add (map h ?q_a) (S.normalize (map h (R.poly_mult p q)))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2103  | 
using poly_add_normalize(2)[OF set_map[OF set_q_a] set_map[OF R.poly_mult_in_carrier[OF _ assms(2)]]] Cons by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2104  | 
also have " ... = S.poly_add (map h ?q_a) (S.poly_mult (map h p) (map h q))"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2105  | 
using Cons by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2106  | 
also have " ... = S.poly_mult (map h (a # p)) (map h q)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2107  | 
unfolding q_a_simp by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2108  | 
finally show ?case .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2109  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2110  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2111  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2112  | 
subsection \<open>The X Variable\<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2113  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2114  | 
definition var :: "_ \<Rightarrow> 'a list" ("X\<index>")
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2115  | 
where "X\<^bsub>R\<^esub> = [ \<one>\<^bsub>R\<^esub>, \<zero>\<^bsub>R\<^esub> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2116  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2117  | 
lemma (in ring) eval_var:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2118  | 
assumes "x \<in> carrier R" shows "eval X x = x"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2119  | 
using assms unfolding var_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2120  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2121  | 
lemma (in domain) var_closed:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2122  | 
assumes "subring K R" shows "X \<in> carrier (K[X])" and "polynomial K X"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2123  | 
using subringE(2-3)[OF assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2124  | 
by (auto simp add: var_def univ_poly_def polynomial_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2125  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2126  | 
lemma (in domain) poly_mult_var':  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2127  | 
assumes "set p \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2128  | 
shows "poly_mult X p = normalize (p @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2129  | 
and "poly_mult p X = normalize (p @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2130  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2131  | 
from \<open>set p \<subseteq> carrier R\<close> have "poly_mult [ \<one> ] p = normalize p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2132  | 
using poly_mult_one' by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2133  | 
thus "poly_mult X p = normalize (p @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2134  | 
using poly_mult_append_zero[OF _ assms, of "[ \<one> ]"] normalize_idem  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2135  | 
unfolding var_def by (auto simp del: poly_mult.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2136  | 
thus "poly_mult p X = normalize (p @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2137  | 
using poly_mult_comm[OF assms] unfolding var_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2138  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2139  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2140  | 
lemma (in domain) poly_mult_var:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2141  | 
assumes "subring K R" "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2142  | 
shows "p \<otimes>\<^bsub>K[X]\<^esub> X = (if p = [] then [] else p @ [ \<zero> ])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2143  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2144  | 
have is_poly: "polynomial K p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2145  | 
using assms(2) unfolding univ_poly_def by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2146  | 
hence "polynomial K (p @ [ \<zero> ])" if "p \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2147  | 
using that subringE(2)[OF assms(1)] unfolding polynomial_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2148  | 
thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2149  | 
using poly_mult_var'(2)[OF polynomial_in_carrier[OF assms(1) is_poly]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2150  | 
normalize_polynomial[of K "p @ [ \<zero> ]"]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2151  | 
by (auto simp add: univ_poly_mult[of R K])  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2152  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2153  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2154  | 
lemma (in domain) var_pow_closed:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2155  | 
assumes "subring K R" shows "X [^]\<^bsub>K[X]\<^esub> (n :: nat) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2156  | 
using monoid.nat_pow_closed[OF univ_poly_is_monoid[OF assms] var_closed(1)[OF assms]] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2157  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2158  | 
lemma (in domain) unitary_monom_eq_var_pow:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2159  | 
assumes "subring K R" shows "monom \<one> n = X [^]\<^bsub>K[X]\<^esub> n"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2160  | 
using poly_mult_var[OF assms var_pow_closed[OF assms]] unfolding nat_pow_def monom_def  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2161  | 
by (induct n) (auto simp add: univ_poly_one, metis append_Cons replicate_append_same)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2162  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2163  | 
lemma (in domain) monom_eq_var_pow:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2164  | 
  assumes "subring K R" "a \<in> carrier R - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2165  | 
shows "monom a n = [ a ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> n)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2166  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2167  | 
have "monom a n = map ((\<otimes>) a) (monom \<one> n)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2168  | 
unfolding monom_def using assms(2) by (induct n) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2169  | 
also have " ... = poly_mult [ a ] (monom \<one> n)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2170  | 
using poly_mult_const(1)[OF _ monom_is_polynomial assms(2)] carrier_is_subring by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2171  | 
also have " ... = [ a ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> n)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2172  | 
unfolding unitary_monom_eq_var_pow[OF assms(1)] univ_poly_mult[of R K] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2173  | 
finally show ?thesis .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2174  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2175  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2176  | 
lemma (in domain) eval_rewrite:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2177  | 
assumes "subring K R" and "p \<in> carrier (K[X])"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2178  | 
shows "p = (ring.eval (K[X])) (map poly_of_const p) X"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2179  | 
proof -  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2180  | 
let ?map_norm = "\<lambda>p. map poly_of_const p"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2181  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2182  | 
interpret UP: domain "K[X]"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2183  | 
using univ_poly_is_domain[OF assms(1)] .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2184  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2185  | 
  { fix l assume "set l \<subseteq> K"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2186  | 
hence "poly_of_const a \<in> carrier (K[X])" if "a \<in> set l" for a  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2187  | 
using that normalize_gives_polynomial[of "[ a ]" K]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2188  | 
unfolding univ_poly_carrier poly_of_const_def by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2189  | 
hence "set (?map_norm l) \<subseteq> carrier (K[X])"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2190  | 
by auto }  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2191  | 
note aux_lemma1 = this  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2192  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2193  | 
  { fix q l assume set_l: "set l \<subseteq> K" and q: "q \<in> carrier (K[X])"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2194  | 
from set_l have "UP.eval (?map_norm l) q = UP.eval (?map_norm ((replicate n \<zero>) @ l)) q" for n  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2195  | 
proof (induct n, simp)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2196  | 
case (Suc n)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2197  | 
from \<open>set l \<subseteq> K\<close> have set_replicate: "set ((replicate n \<zero>) @ l) \<subseteq> K"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2198  | 
using subringE(2)[OF assms(1)] by (induct n) (auto)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2199  | 
have step: "UP.eval (?map_norm l') q = UP.eval (?map_norm (\<zero> # l')) q" if "set l' \<subseteq> K" for l'  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2200  | 
using UP.eval_in_carrier[OF aux_lemma1[OF that]] q unfolding poly_of_const_def  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2201  | 
by (simp, simp add: sym[OF univ_poly_zero[of R K]])  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2202  | 
have "UP.eval (?map_norm l) q = UP.eval (?map_norm ((replicate n \<zero>) @ l)) q"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2203  | 
using Suc by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2204  | 
also have " ... = UP.eval (map poly_of_const ((replicate (Suc n) \<zero>) @ l)) q"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2205  | 
using step[OF set_replicate] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2206  | 
finally show ?case .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2207  | 
qed }  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2208  | 
note aux_lemma2 = this  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2209  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2210  | 
  { fix q l assume "set l \<subseteq> K" and q: "q \<in> carrier (K[X])"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2211  | 
from \<open>set l \<subseteq> K\<close> have set_norm: "set (normalize l) \<subseteq> K"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2212  | 
by (induct l) (auto)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2213  | 
have "UP.eval (?map_norm l) q = UP.eval (?map_norm (normalize l)) q"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2214  | 
using aux_lemma2[OF set_norm q, of "length l - length (local.normalize l)"]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2215  | 
unfolding sym[OF normalize_trick[of l]] .. }  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2216  | 
note aux_lemma3 = this  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2217  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2218  | 
from \<open>p \<in> carrier (K[X])\<close> show ?thesis  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2219  | 
proof (induct "length p" arbitrary: p rule: less_induct)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2220  | 
case less thus ?case  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2221  | 
proof (cases p, simp add: univ_poly_zero)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2222  | 
case (Cons a l)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2223  | 
      hence a: "a \<in> carrier R - { \<zero> }" and set_l: "set l \<subseteq> carrier R" "set l \<subseteq> K"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2224  | 
using less(2) subringE(1)[OF assms(1)] unfolding sym[OF univ_poly_carrier] polynomial_def by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2225  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2226  | 
have "a # l = poly_add (monom a (length l)) l"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2227  | 
using poly_add_monom[OF set_l(1) a] ..  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2228  | 
also have " ... = poly_add (monom a (length l)) (normalize l)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2229  | 
using poly_add_normalize(2)[OF monom_in_carrier[of a] set_l(1)] a by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2230  | 
also have " ... = poly_add (monom a (length l)) (UP.eval (?map_norm (normalize l)) X)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2231  | 
using less(1)[of "normalize l"] normalize_gives_polynomial[OF set_l(2)] normalize_length_le[of l]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2232  | 
by (auto simp add: univ_poly_carrier Cons(1))  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2233  | 
also have " ... = poly_add ([ a ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> (length l))) (UP.eval (?map_norm l) X)"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2234  | 
unfolding monom_eq_var_pow[OF assms(1) a] aux_lemma3[OF set_l(2) var_closed(1)[OF assms(1)]] ..  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2235  | 
also have " ... = UP.eval (?map_norm (a # l)) X"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2236  | 
using a unfolding sym[OF univ_poly_add[of R K]] unfolding poly_of_const_def by auto  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2237  | 
finally show ?thesis  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2238  | 
unfolding Cons(1) .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2239  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2240  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2241  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2242  | 
|
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2243  | 
lemma (in ring) dense_repr_set_fst:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2244  | 
  assumes "set p \<subseteq> K" shows "fst ` (set (dense_repr p)) \<subseteq> K - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2245  | 
using assms by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2246  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2247  | 
lemma (in ring) dense_repr_set_snd:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2248  | 
  shows "snd ` (set (dense_repr p)) \<subseteq> {..< length p}"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2249  | 
by (induct p) (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2250  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2251  | 
lemma (in domain) dense_repr_monom_closed:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2252  | 
assumes "subring K R" "set p \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2253  | 
shows "t \<in> set (dense_repr p) \<Longrightarrow> monom (fst t) (snd t) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2254  | 
using dense_repr_set_fst[OF assms(2)] monom_is_polynomial[OF assms(1)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2255  | 
by (auto simp add: univ_poly_carrier)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2256  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2257  | 
lemma (in domain) monom_finsum_decomp:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2258  | 
assumes "subring K R" "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2259  | 
shows "p = (\<Oplus>\<^bsub>K[X]\<^esub> t \<in> set (dense_repr p). monom (fst t) (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2260  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2261  | 
interpret UP: domain "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2262  | 
using univ_poly_is_domain[OF assms(1)] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2263  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2264  | 
from \<open>p \<in> carrier (K[X])\<close> show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2265  | 
proof (induct "length p" arbitrary: p rule: less_induct)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2266  | 
case less thus ?case  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2267  | 
proof (cases p)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2268  | 
case Nil thus ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2269  | 
using UP.finsum_empty univ_poly_zero[of R K] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2270  | 
next  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2271  | 
case (Cons a l)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2272  | 
hence in_carrier:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2273  | 
"normalize l \<in> carrier (K[X])" "polynomial K (normalize l)" "polynomial K (a # l)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2274  | 
using normalize_gives_polynomial polynomial_incl[of K p] less(2)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2275  | 
unfolding univ_poly_carrier by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2276  | 
have len_lt: "length (local.normalize l) < length p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2277  | 
using normalize_length_le by (simp add: Cons le_imp_less_Suc)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2278  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2279  | 
      have a: "a \<in> K - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2280  | 
using less(2) subringE(1)[OF assms(1)] unfolding Cons univ_poly_def polynomial_def by auto  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2281  | 
hence "p = (monom a (length l)) \<oplus>\<^bsub>K[X]\<^esub> (poly_of_dense (dense_repr (normalize l)))"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2282  | 
using monom_decomp[OF assms(1), of p] less(2) dense_repr_normalize  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2283  | 
unfolding univ_poly_add univ_poly_carrier Cons by (auto simp del: poly_add.simps)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2284  | 
also have " ... = (monom a (length l)) \<oplus>\<^bsub>K[X]\<^esub> (normalize l)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2285  | 
using monom_decomp[OF assms(1) in_carrier(2)] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2286  | 
finally have "p = monom a (length l) \<oplus>\<^bsub>K[X]\<^esub>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2287  | 
(\<Oplus>\<^bsub>K[X]\<^esub> t \<in> set (dense_repr l). monom (fst t) (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2288  | 
using less(1)[OF len_lt in_carrier(1)] dense_repr_normalize by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2289  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2290  | 
moreover have "(a, (length l)) \<notin> set (dense_repr l)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2291  | 
using dense_repr_set_snd[of l] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2292  | 
moreover have "monom a (length l) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2293  | 
using monom_is_polynomial[OF assms(1) a] unfolding univ_poly_carrier by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2294  | 
moreover have "\<And>t. t \<in> set (dense_repr l) \<Longrightarrow> monom (fst t) (snd t) \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2295  | 
using dense_repr_monom_closed[OF assms(1)] polynomial_incl[OF in_carrier(3)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2296  | 
ultimately have "p = (\<Oplus>\<^bsub>K[X]\<^esub> t \<in> set (dense_repr (a # l)). monom (fst t) (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2297  | 
using UP.add.finprod_insert a by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2298  | 
thus ?thesis unfolding Cons .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2299  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2300  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2301  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2302  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2303  | 
lemma (in domain) var_pow_finsum_decomp:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2304  | 
assumes "subring K R" "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2305  | 
shows "p = (\<Oplus>\<^bsub>K[X]\<^esub> t \<in> set (dense_repr p). [ fst t ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> (snd t)))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2306  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2307  | 
let ?f = "\<lambda>t. monom (fst t) (snd t)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2308  | 
let ?g = "\<lambda>t. [ fst t ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2309  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2310  | 
interpret UP: domain "K[X]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2311  | 
using univ_poly_is_domain[OF assms(1)] .  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2312  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2313  | 
have set_p: "set p \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2314  | 
using polynomial_incl assms(2) by (simp add: univ_poly_carrier)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2315  | 
hence f: "?f \<in> set (dense_repr p) \<rightarrow> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2316  | 
using dense_repr_monom_closed[OF assms(1)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2317  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2318  | 
moreover  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2319  | 
  have "\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> fst t \<in> carrier R - { \<zero> }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2320  | 
using dense_repr_set_fst[OF set_p] subringE(1)[OF assms(1)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2321  | 
hence "\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> monom (fst t) (snd t) = [ fst t ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2322  | 
using monom_eq_var_pow[OF assms(1)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2323  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2324  | 
ultimately show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2325  | 
using UP.add.finprod_cong[of _ _ ?f ?g] monom_finsum_decomp[OF assms] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2326  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2327  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2328  | 
corollary (in domain) hom_var_pow_finsum:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2329  | 
assumes "subring K R" and "p \<in> carrier (K[X])" "ring_hom_ring (K[X]) A h"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2330  | 
shows "h p = (\<Oplus>\<^bsub>A\<^esub> t \<in> set (dense_repr p). h [ fst t ] \<otimes>\<^bsub>A\<^esub> (h X [^]\<^bsub>A\<^esub> (snd t)))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2331  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2332  | 
let ?f = "\<lambda>t. [ fst t ] \<otimes>\<^bsub>K[X]\<^esub> (X [^]\<^bsub>K[X]\<^esub> (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2333  | 
let ?g = "\<lambda>t. h [ fst t ] \<otimes>\<^bsub>A\<^esub> (h X [^]\<^bsub>A\<^esub> (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2334  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2335  | 
interpret UP: domain "K[X]" + A: ring A  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2336  | 
using univ_poly_is_domain[OF assms(1)] ring_hom_ring.axioms(2)[OF assms(3)] by simp+  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2337  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2338  | 
have const_in_carrier:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2339  | 
"\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> [ fst t ] \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2340  | 
using dense_repr_set_fst[OF polynomial_incl, of K p] assms(2) const_is_polynomial[of _ K]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2341  | 
by (auto simp add: univ_poly_carrier)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2342  | 
hence f: "?f: set (dense_repr p) \<rightarrow> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2343  | 
using UP.m_closed[OF _ var_pow_closed[OF assms(1)]] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2344  | 
hence h: "h \<circ> ?f: set (dense_repr p) \<rightarrow> carrier A"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2345  | 
using ring_hom_memE(1)[OF ring_hom_ring.homh[OF assms(3)]] by (auto simp add: Pi_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2346  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2347  | 
have hp: "h p = (\<Oplus>\<^bsub>A\<^esub> t \<in> set (dense_repr p). (h \<circ> ?f) t)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2348  | 
using ring_hom_ring.hom_finsum[OF assms(3) f] var_pow_finsum_decomp[OF assms(1-2)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2349  | 
by (auto, meson o_apply)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2350  | 
have eq: "\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> h [ fst t ] \<otimes>\<^bsub>A\<^esub> (h X [^]\<^bsub>A\<^esub> (snd t)) = (h \<circ> ?f) t"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2351  | 
using ring_hom_memE(2)[OF ring_hom_ring.homh[OF assms(3)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2352  | 
const_in_carrier var_pow_closed[OF assms(1)]]  | 
| 
70019
 
095dce9892e8
A few results in Algebra, and bits for Analysis
 
paulson <lp15@cam.ac.uk> 
parents: 
69712 
diff
changeset
 | 
2353  | 
ring_hom_ring.hom_nat_pow[OF assms(3) var_closed(1)[OF assms(1)]] by auto  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2354  | 
show ?thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2355  | 
using A.add.finprod_cong'[OF _ h eq] hp by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2356  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2357  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2358  | 
corollary (in domain) determination_of_hom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2359  | 
assumes "subring K R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2360  | 
and "ring_hom_ring (K[X]) A h" "ring_hom_ring (K[X]) A g"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2361  | 
and "\<And>k. k \<in> K \<Longrightarrow> h [ k ] = g [ k ]" and "h X = g X"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2362  | 
shows "\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> h p = g p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2363  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2364  | 
interpret A: ring A  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2365  | 
using ring_hom_ring.axioms(2)[OF assms(2)] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2366  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2367  | 
fix p assume p: "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2368  | 
hence  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2369  | 
"\<And>t. t \<in> set (dense_repr p) \<Longrightarrow> [ fst t ] \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2370  | 
using dense_repr_set_fst[OF polynomial_incl, of K p] const_is_polynomial[of _ K]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2371  | 
by (auto simp add: univ_poly_carrier)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2372  | 
hence f: "(\<lambda>t. h [ fst t ] \<otimes>\<^bsub>A\<^esub> (h X [^]\<^bsub>A\<^esub> (snd t))): set (dense_repr p) \<rightarrow> carrier A"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2373  | 
using ring_hom_memE(1)[OF ring_hom_ring.homh[OF assms(2)]] var_closed(1)[OF assms(1)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2374  | 
A.m_closed[OF _ A.nat_pow_closed]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2375  | 
by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2376  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2377  | 
have eq: "\<And>t. t \<in> set (dense_repr p) \<Longrightarrow>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2378  | 
g [ fst t ] \<otimes>\<^bsub>A\<^esub> (g X [^]\<^bsub>A\<^esub> (snd t)) = h [ fst t ] \<otimes>\<^bsub>A\<^esub> (h X [^]\<^bsub>A\<^esub> (snd t))"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2379  | 
using dense_repr_set_fst[OF polynomial_incl, of K p] p assms(4-5)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2380  | 
by (auto simp add: univ_poly_carrier)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2381  | 
show "h p = g p"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2382  | 
unfolding assms(2-3)[THEN hom_var_pow_finsum[OF assms(1) p]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2383  | 
using A.add.finprod_cong'[OF _ f eq] by simp  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2384  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2385  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2386  | 
corollary (in domain) eval_as_unique_hom:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2387  | 
assumes "subring K R" "x \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2388  | 
and "ring_hom_ring (K[X]) R h"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2389  | 
and "\<And>k. k \<in> K \<Longrightarrow> h [ k ] = k" and "h X = x"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2390  | 
shows "\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> h p = eval p x"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2391  | 
using determination_of_hom[OF assms(1,3) eval_ring_hom[OF assms(1-2)]]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2392  | 
eval_var[OF assms(2)] assms(4-5) subringE(1)[OF assms(1)]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2393  | 
by fastforce  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2394  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2395  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2396  | 
subsection \<open>The Constant Term\<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2397  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2398  | 
definition (in ring) const_term :: "'a list \<Rightarrow> 'a"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2399  | 
where "const_term p = eval p \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2400  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2401  | 
lemma (in ring) const_term_eq_last:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2402  | 
assumes "set p \<subseteq> carrier R" and "a \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2403  | 
shows "const_term (p @ [ a ]) = a"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2404  | 
using assms by (induct p) (auto simp add: const_term_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2405  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2406  | 
lemma (in ring) const_term_not_zero:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2407  | 
assumes "const_term p \<noteq> \<zero>" shows "p \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2408  | 
using assms by (auto simp add: const_term_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2409  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2410  | 
lemma (in ring) const_term_explicit:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2411  | 
assumes "set p \<subseteq> carrier R" "p \<noteq> []" and "const_term p = a"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2412  | 
obtains p' where "set p' \<subseteq> carrier R" and "p = p' @ [ a ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2413  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2414  | 
obtain a' p' where p: "p = p' @ [ a' ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2415  | 
using assms(2) rev_exhaust by blast  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2416  | 
have p': "set p' \<subseteq> carrier R" and a: "a = a'"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2417  | 
using assms const_term_eq_last[of p' a'] unfolding p by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2418  | 
show thesis  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2419  | 
using p p' that unfolding a by blast  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2420  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2421  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2422  | 
lemma (in ring) const_term_zero:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2423  | 
assumes "subring K R" "polynomial K p" "p \<noteq> []" and "const_term p = \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2424  | 
obtains p' where "polynomial K p'" "p' \<noteq> []" and "p = p' @ [ \<zero> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2425  | 
proof -  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2426  | 
obtain p' where p': "p = p' @ [ \<zero> ]"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2427  | 
using const_term_explicit[OF polynomial_in_carrier[OF assms(1-2)] assms(3-4)] by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2428  | 
have "polynomial K p'" "p' \<noteq> []"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2429  | 
using assms(2) unfolding p' polynomial_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2430  | 
thus thesis using p' ..  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2431  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2432  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2433  | 
lemma (in cring) const_term_simprules:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2434  | 
shows "\<And>p. set p \<subseteq> carrier R \<Longrightarrow> const_term p \<in> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2435  | 
and "\<And>p q. \<lbrakk> set p \<subseteq> carrier R; set q \<subseteq> carrier R \<rbrakk> \<Longrightarrow>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2436  | 
const_term (poly_mult p q) = const_term p \<otimes> const_term q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2437  | 
and "\<And>p q. \<lbrakk> set p \<subseteq> carrier R; set q \<subseteq> carrier R \<rbrakk> \<Longrightarrow>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2438  | 
const_term (poly_add p q) = const_term p \<oplus> const_term q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2439  | 
using eval_poly_mult eval_poly_add eval_in_carrier zero_closed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2440  | 
unfolding const_term_def by auto  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2441  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2442  | 
lemma (in domain) const_term_simprules_shell:  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2443  | 
assumes "subring K R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2444  | 
shows "\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> const_term p \<in> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2445  | 
and "\<And>p q. \<lbrakk> p \<in> carrier (K[X]); q \<in> carrier (K[X]) \<rbrakk> \<Longrightarrow>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2446  | 
const_term (p \<otimes>\<^bsub>K[X]\<^esub> q) = const_term p \<otimes> const_term q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2447  | 
and "\<And>p q. \<lbrakk> p \<in> carrier (K[X]); q \<in> carrier (K[X]) \<rbrakk> \<Longrightarrow>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2448  | 
const_term (p \<oplus>\<^bsub>K[X]\<^esub> q) = const_term p \<oplus> const_term q"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2449  | 
and "\<And>p. p \<in> carrier (K[X]) \<Longrightarrow> const_term (\<ominus>\<^bsub>K[X]\<^esub> p) = \<ominus> (const_term p)"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2450  | 
using eval_is_hom[OF assms(1) zero_closed]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2451  | 
unfolding ring_hom_def const_term_def  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2452  | 
proof (auto)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2453  | 
fix p assume p: "p \<in> carrier (K[X])"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2454  | 
hence "set p \<subseteq> carrier R"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2455  | 
using polynomial_in_carrier[OF assms(1)] by (auto simp add: univ_poly_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2456  | 
thus "eval (\<ominus>\<^bsub>K [X]\<^esub> p) \<zero> = \<ominus> local.eval p \<zero>"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2457  | 
unfolding univ_poly_a_inv_def'[OF assms(1) p]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2458  | 
by (induct p) (auto simp add: eval_in_carrier l_minus local.minus_add)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2459  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2460  | 
have "set p \<subseteq> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2461  | 
using p by (auto simp add: univ_poly_def polynomial_def)  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2462  | 
thus "eval p \<zero> \<in> K"  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2463  | 
using subringE(1-2,6-7)[OF assms]  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2464  | 
by (induct p) (auto, metis assms nat_pow_0 nat_pow_zero subringE(3))  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2465  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2466  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2467  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2468  | 
subsection \<open>The Canonical Embedding of K in K[X]\<close>  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2469  | 
|
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2470  | 
lemma (in ring) poly_of_const_consistent:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2471  | 
assumes "subring K R" shows "ring.poly_of_const (R \<lparr> carrier := K \<rparr>) = poly_of_const"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2472  | 
unfolding ring.poly_of_const_def[OF subring_is_ring[OF assms]]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2473  | 
normalize_consistent[OF assms] poly_of_const_def ..  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2474  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2475  | 
lemma (in domain) canonical_embedding_is_hom:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2476  | 
assumes "subring K R" shows "poly_of_const \<in> ring_hom (R \<lparr> carrier := K \<rparr>) (K[X])"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2477  | 
using subringE(1)[OF assms] unfolding subset_iff poly_of_const_def  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2478  | 
by (auto intro!: ring_hom_memI simp add: univ_poly_def)  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2479  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2480  | 
lemma (in domain) canonical_embedding_ring_hom:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2481  | 
assumes "subring K R" shows "ring_hom_ring (R \<lparr> carrier := K \<rparr>) (K[X]) poly_of_const"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2482  | 
using canonical_embedding_is_hom[OF assms] unfolding symmetric[OF ring_hom_ring_axioms_def]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2483  | 
by (rule ring_hom_ring.intro[OF subring_is_ring[OF assms] univ_poly_is_ring[OF assms]])  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2484  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2485  | 
lemma (in field) poly_of_const_over_carrier:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2486  | 
  shows "poly_of_const ` (carrier R) = { p \<in> carrier ((carrier R)[X]). degree p = 0 }"
 | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2487  | 
proof -  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2488  | 
  have "poly_of_const ` (carrier R) = insert [] { [ k ] | k. k \<in> carrier R - { \<zero> } }"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2489  | 
unfolding poly_of_const_def by auto  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2490  | 
  also have " ... = { p \<in> carrier ((carrier R)[X]). degree p = 0 }"
 | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2491  | 
unfolding univ_poly_def polynomial_def  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2492  | 
by (auto, metis le_Suc_eq le_zero_eq length_0_conv length_Suc_conv list.sel(1) list.set_sel(1) subsetCE)  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2493  | 
finally show ?thesis .  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2494  | 
qed  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2495  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2496  | 
lemma (in ring) poly_of_const_over_subfield:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2497  | 
  assumes "subfield K R" shows "poly_of_const ` K = { p \<in> carrier (K[X]). degree p = 0 }"
 | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2498  | 
using field.poly_of_const_over_carrier[OF subfield_iff(2)[OF assms]]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2499  | 
poly_of_const_consistent[OF subfieldE(1)[OF assms]]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2500  | 
univ_poly_consistent[OF subfieldE(1)[OF assms]] by simp  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2501  | 
|
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2502  | 
lemma (in field) univ_poly_carrier_subfield_of_consts:  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2503  | 
"subfield (poly_of_const ` (carrier R)) ((carrier R)[X])"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2504  | 
proof -  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2505  | 
have ring_hom: "ring_hom_ring R ((carrier R)[X]) poly_of_const"  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2506  | 
using canonical_embedding_ring_hom[OF carrier_is_subring] by simp  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2507  | 
thus ?thesis  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2508  | 
using ring_hom_ring.img_is_subfield(2)[OF ring_hom carrier_is_subfield]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2509  | 
unfolding univ_poly_def by auto  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2510  | 
qed  | 
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2511  | 
|
| 
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2512  | 
proposition (in ring) univ_poly_subfield_of_consts:  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2513  | 
assumes "subfield K R" shows "subfield (poly_of_const ` K) (K[X])"  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2514  | 
using field.univ_poly_carrier_subfield_of_consts[OF subfield_iff(2)[OF assms]]  | 
| 
70160
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2515  | 
unfolding poly_of_const_consistent[OF subfieldE(1)[OF assms]]  | 
| 
 
8e9100dcde52
Towards a proof of algebraic closure (NB not finished)
 
paulson <lp15@cam.ac.uk> 
parents: 
70019 
diff
changeset
 | 
2516  | 
univ_poly_consistent[OF subfieldE(1)[OF assms]] by simp  | 
| 
68664
 
bd0df72c16d5
updated material concerning Algebra
 
paulson <lp15@cam.ac.uk> 
parents: 
68605 
diff
changeset
 | 
2517  | 
|
| 68583 | 2518  | 
end  |